1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
// Copyright 2013-2016, The Gtk-rs Project Developers. // See the COPYRIGHT file at the top-level directory of this distribution. // Licensed under the MIT license, see the LICENSE file or <http://opensource.org/licenses/MIT> //! # **glib**, **gobject** and **gio** bindings for Rust //! //! This library contains //! //! - bindings to some essential GLib, GObject, GIO types and APIs, //! //! - common building blocks used in both handmade and machine generated //! bindings to GTK+ and other GLib-based libraries. //! //! It is the foundation for higher level libraries with uniform Rusty (safe and //! strongly typed) APIs. It avoids exposing GLib-specific data types where //! possible and is not meant to provide comprehensive GLib bindings, which //! would often amount to duplicating the Rust Standard Library or other utility //! crates. //! //! The library is a work in progress: expect missing functionality and breaking //! changes. //! //! # Dynamic typing //! //! Most types in the GLib family have type identifiers //! ([`Type`](types/enum.Type.html)). Their corresponding Rust types implement //! the [`StaticType`](types/trait.StaticType.html) trait. //! //! Dynamically typed [`Value`](value/index.html) can carry values of any `T: //! StaticType`. //! //! [`Variant`](variant/index.html) can carry values of `T: StaticVariantType`. //! //! # Errors //! //! Errors are represented by [`Error`](error/struct.Error.html), which can //! carry values from various [error //! domains](error/trait.ErrorDomain.html#implementors) (such as //! [`FileError`](enum.FileError.html)). //! //! # Objects //! //! Each class and interface has a corresponding smart pointer struct //! representing an instance of that type (e.g. `Object` for `GObject`, //! `gtk::Widget` for `GtkWidget`). They are reference counted and feature //! interior mutability similarly to Rust's `Rc<RefCell<T>>` idiom. //! Consequently, cloning objects is cheap and their methods never require //! mutable borrows. Two smart pointers are equal iff they point to the same //! object. //! //! The root of the object hierarchy is [`Object`](object/struct.Object.html). //! Inheritance and subtyping is denoted with the [`IsA`](object/trait.IsA.html) //! marker trait. The [`Cast`](object/trait.Cast.html) trait enables upcasting //! and downcasting. //! //! Interfaces and non-leaf classes also have corresponding traits (e.g. //! `ObjectExt` and `gtk::WidgetExt`), which are blanketly implemented for all //! their subtypes. //! //! For creating new subclasses of `Object` or other object types this crate has to be compiled //! with the `subclassing` feature to enable the [`subclass`](subclass/index.html) module. Check //! the module's documentation for further details and a code example. //! //! # Under the hood //! //! GLib-based libraries largely operate on pointers to various boxed or //! reference counted structures so the bindings have to implement corresponding //! smart pointers (wrappers), which encapsulate resource management and safety //! checks. Such wrappers are defined via the //! [`glib_wrapper!`](macro.glib_wrapper!.html) macro, which uses abstractions //! defined in the [`wrapper`](wrapper/index.html), [`boxed`](boxed/index.html), //! [`shared`](shared/index.html) and [`object`](object/index.html) modules. //! //! The [`translate`](translate/index.html) module defines and partly implements //! conversions between high level Rust types (including the aforementioned //! wrappers) and their FFI counterparts. #![allow(clippy::doc_markdown)] #![allow(clippy::unreadable_literal)] #[macro_use] extern crate bitflags; #[macro_use] extern crate lazy_static; extern crate libc; #[doc(hidden)] pub extern crate glib_sys; #[doc(hidden)] pub extern crate gobject_sys; #[cfg(feature = "futures")] pub extern crate futures; pub use byte_array::ByteArray; pub use bytes::Bytes; pub use closure::Closure; pub use error::{BoolError, Error}; pub use file_error::FileError; pub use object::{ Cast, InitiallyUnowned, InitiallyUnownedClass, IsA, IsClassFor, Object, ObjectClass, ObjectExt, ObjectType, SendWeakRef, WeakRef, }; pub use signal::{ signal_handler_block, signal_handler_disconnect, signal_handler_unblock, signal_stop_emission_by_name, SignalHandlerId, }; use std::ffi::CStr; pub use string::String; pub use enums::{EnumClass, EnumValue, FlagsBuilder, FlagsClass, FlagsValue, UserDirectory}; pub use time_val::{get_current_time, TimeVal}; pub use types::{StaticType, Type}; pub use value::{SendValue, ToSendValue, ToValue, TypedValue, Value}; pub use variant::{StaticVariantType, ToVariant, Variant}; pub use variant_type::{VariantTy, VariantType}; #[macro_use] pub mod wrapper; #[macro_use] pub mod boxed; #[macro_use] pub mod shared; #[macro_use] pub mod error; #[macro_use] pub mod object; pub use auto::functions::*; pub use auto::*; #[allow(clippy::let_and_return)] #[allow(clippy::let_unit_value)] #[allow(clippy::too_many_arguments)] #[allow(non_upper_case_globals)] mod auto; pub use gobject::*; mod gobject; mod byte_array; mod bytes; pub mod char; mod string; pub use char::*; mod checksum; pub mod closure; mod enums; mod file_error; mod key_file; pub mod prelude; pub mod signal; pub mod source; pub use source::*; mod time_val; #[macro_use] pub mod translate; mod gstring; pub use gstring::GString; pub mod types; mod utils; pub use utils::*; mod main_context; mod main_context_channel; pub mod value; pub mod variant; mod variant_type; pub use main_context_channel::{Receiver, Sender, SyncSender}; mod date; pub use date::Date; mod value_array; pub use value_array::ValueArray; mod param_spec; pub use param_spec::ParamSpec; mod quark; pub use quark::Quark; pub mod send_unique; pub use send_unique::{SendUnique, SendUniqueCell}; #[cfg(feature = "futures")] mod main_context_futures; #[cfg(feature = "futures")] mod source_futures; #[cfg(feature = "futures")] pub use source_futures::*; // Actual thread IDs can be reused by the OS once the old thread finished. // This works around it by using our own counter for threads. // // Taken from the fragile crate use std::sync::atomic::{AtomicUsize, Ordering}; fn next_thread_id() -> usize { static mut COUNTER: AtomicUsize = AtomicUsize::new(0); unsafe { COUNTER.fetch_add(1, Ordering::SeqCst) } } pub(crate) fn get_thread_id() -> usize { thread_local!(static THREAD_ID: usize = next_thread_id()); THREAD_ID.with(|&x| x) } #[macro_use] #[cfg(any(feature = "dox", feature = "subclassing"))] pub mod subclass;