glib/auto/main_context.rs
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 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281
// This file was generated by gir (https://github.com/gtk-rs/gir)
// from gir-files (https://github.com/gtk-rs/gir-files)
// DO NOT EDIT
#[cfg(feature = "v2_72")]
#[cfg_attr(docsrs, doc(cfg(feature = "v2_72")))]
use crate::MainContextFlags;
use crate::{ffi, translate::*};
crate::wrapper! {
/// The `GMainContext` struct is an opaque data
/// type representing a set of sources to be handled in a main loop.
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct MainContext(Shared<ffi::GMainContext>);
match fn {
ref => |ptr| ffi::g_main_context_ref(ptr),
unref => |ptr| ffi::g_main_context_unref(ptr),
type_ => || ffi::g_main_context_get_type(),
}
}
impl MainContext {
/// Creates a new [`MainContext`][crate::MainContext] structure.
///
/// # Returns
///
/// the new #GMainContext
#[doc(alias = "g_main_context_new")]
pub fn new() -> MainContext {
unsafe { from_glib_full(ffi::g_main_context_new()) }
}
/// Creates a new [`MainContext`][crate::MainContext] structure.
/// ## `flags`
/// a bitwise-OR combination of #GMainContextFlags flags that can only be
/// set at creation time.
///
/// # Returns
///
/// the new #GMainContext
#[cfg(feature = "v2_72")]
#[cfg_attr(docsrs, doc(cfg(feature = "v2_72")))]
#[doc(alias = "g_main_context_new_with_flags")]
#[doc(alias = "new_with_flags")]
pub fn with_flags(flags: MainContextFlags) -> MainContext {
unsafe { from_glib_full(ffi::g_main_context_new_with_flags(flags.into_glib())) }
}
//#[doc(alias = "g_main_context_add_poll")]
//pub fn add_poll(&self, fd: /*Ignored*/&mut PollFD, priority: i32) {
// unsafe { TODO: call ffi:g_main_context_add_poll() }
//}
//#[doc(alias = "g_main_context_check")]
//pub fn check(&self, max_priority: i32, fds: /*Ignored*/&[PollFD]) -> bool {
// unsafe { TODO: call ffi:g_main_context_check() }
//}
/// Dispatches all pending sources.
///
/// You must have successfully acquired the context with
/// [`acquire()`][Self::acquire()] before you may call this function.
///
/// Since 2.76 @self can be [`None`] to use the global-default
/// main context.
#[doc(alias = "g_main_context_dispatch")]
pub fn dispatch(&self) {
unsafe {
ffi::g_main_context_dispatch(self.to_glib_none().0);
}
}
//#[doc(alias = "g_main_context_find_source_by_funcs_user_data")]
//pub fn find_source_by_funcs_user_data(&self, funcs: /*Ignored*/&mut SourceFuncs, user_data: /*Unimplemented*/Option<Basic: Pointer>) -> Source {
// unsafe { TODO: call ffi:g_main_context_find_source_by_funcs_user_data() }
//}
//#[doc(alias = "g_main_context_find_source_by_user_data")]
//pub fn find_source_by_user_data(&self, user_data: /*Unimplemented*/Option<Basic: Pointer>) -> Source {
// unsafe { TODO: call ffi:g_main_context_find_source_by_user_data() }
//}
//#[doc(alias = "g_main_context_get_poll_func")]
//#[doc(alias = "get_poll_func")]
//pub fn poll_func(&self) -> /*Unimplemented*/Fn(/*Ignored*/PollFD, u32) -> i32 {
// unsafe { TODO: call ffi:g_main_context_get_poll_func() }
//}
/// Determines whether this thread holds the (recursive)
/// ownership of this [`MainContext`][crate::MainContext]. This is useful to
/// know before waiting on another thread that may be
/// blocking to get ownership of @self.
///
/// # Returns
///
/// [`true`] if current thread is owner of @self.
#[doc(alias = "g_main_context_is_owner")]
pub fn is_owner(&self) -> bool {
unsafe { from_glib(ffi::g_main_context_is_owner(self.to_glib_none().0)) }
}
/// Runs a single iteration for the given main loop. This involves
/// checking to see if any event sources are ready to be processed,
/// then if no events sources are ready and @may_block is [`true`], waiting
/// for a source to become ready, then dispatching the highest priority
/// events sources that are ready. Otherwise, if @may_block is [`false`]
/// sources are not waited to become ready, only those highest priority
/// events sources will be dispatched (if any), that are ready at this
/// given moment without further waiting.
///
/// Note that even when @may_block is [`true`], it is still possible for
/// [`iteration()`][Self::iteration()] to return [`false`], since the wait may
/// be interrupted for other reasons than an event source becoming ready.
/// ## `may_block`
/// whether the call may block.
///
/// # Returns
///
/// [`true`] if events were dispatched.
#[doc(alias = "g_main_context_iteration")]
pub fn iteration(&self, may_block: bool) -> bool {
unsafe {
from_glib(ffi::g_main_context_iteration(
self.to_glib_none().0,
may_block.into_glib(),
))
}
}
/// Checks if any sources have pending events for the given context.
///
/// # Returns
///
/// [`true`] if events are pending.
#[doc(alias = "g_main_context_pending")]
pub fn pending(&self) -> bool {
unsafe { from_glib(ffi::g_main_context_pending(self.to_glib_none().0)) }
}
//#[cfg(feature = "v2_64")]
//#[cfg_attr(docsrs, doc(cfg(feature = "v2_64")))]
//#[doc(alias = "g_main_context_pusher_new")]
//pub fn pusher_new(&self) -> /*Unknown conversion*//*Unimplemented*/MainContextPusher {
// unsafe { TODO: call ffi:g_main_context_pusher_new() }
//}
//#[doc(alias = "g_main_context_query")]
//pub fn query(&self, max_priority: i32, fds: /*Ignored*/Vec<PollFD>) -> (i32, i32) {
// unsafe { TODO: call ffi:g_main_context_query() }
//}
//#[doc(alias = "g_main_context_remove_poll")]
//pub fn remove_poll(&self, fd: /*Ignored*/&mut PollFD) {
// unsafe { TODO: call ffi:g_main_context_remove_poll() }
//}
//#[doc(alias = "g_main_context_set_poll_func")]
//pub fn set_poll_func(&self, func: /*Unimplemented*/Fn(/*Ignored*/PollFD, u32) -> i32) {
// unsafe { TODO: call ffi:g_main_context_set_poll_func() }
//}
//#[cfg_attr(feature = "v2_58", deprecated = "Since 2.58")]
//#[allow(deprecated)]
//#[doc(alias = "g_main_context_wait")]
//pub fn wait(&self, cond: /*Ignored*/&mut Cond, mutex: /*Ignored*/&mut Mutex) -> bool {
// unsafe { TODO: call ffi:g_main_context_wait() }
//}
/// If @self is currently blocking in [`iteration()`][Self::iteration()]
/// waiting for a source to become ready, cause it to stop blocking
/// and return. Otherwise, cause the next invocation of
/// [`iteration()`][Self::iteration()] to return without blocking.
///
/// This API is useful for low-level control over [`MainContext`][crate::MainContext]; for
/// example, integrating it with main loop implementations such as
/// [`MainLoop`][crate::MainLoop].
///
/// Another related use for this function is when implementing a main
/// loop with a termination condition, computed from multiple threads:
///
///
///
/// **⚠️ The following code is in C ⚠️**
///
/// ```C
/// #define NUM_TASKS 10
/// static gint tasks_remaining = NUM_TASKS; // (atomic)
/// ...
///
/// while (g_atomic_int_get (&tasks_remaining) != 0)
/// g_main_context_iteration (NULL, TRUE);
/// ```
///
/// Then in a thread:
///
///
/// **⚠️ The following code is in C ⚠️**
///
/// ```C
/// perform_work();
///
/// if (g_atomic_int_dec_and_test (&tasks_remaining))
/// g_main_context_wakeup (NULL);
/// ```
#[doc(alias = "g_main_context_wakeup")]
pub fn wakeup(&self) {
unsafe {
ffi::g_main_context_wakeup(self.to_glib_none().0);
}
}
/// Returns the global-default main context. This is the main context
/// used for main loop functions when a main loop is not explicitly
/// specified, and corresponds to the "main" main loop. See also
/// [`thread_default()`][Self::thread_default()].
///
/// # Returns
///
/// the global-default main context.
#[doc(alias = "g_main_context_default")]
#[allow(clippy::should_implement_trait)]
pub fn default() -> MainContext {
unsafe { from_glib_none(ffi::g_main_context_default()) }
}
/// Gets the thread-default #GMainContext for this thread. Asynchronous
/// operations that want to be able to be run in contexts other than
/// the default one should call this method or
/// [`ref_thread_default()`][Self::ref_thread_default()] to get a
/// [`MainContext`][crate::MainContext] to add their [`Source`][crate::Source]s to. (Note that
/// even in single-threaded programs applications may sometimes want to
/// temporarily push a non-default context, so it is not safe to assume that
/// this will always return [`None`] if you are running in the default thread.)
///
/// If you need to hold a reference on the context, use
/// [`ref_thread_default()`][Self::ref_thread_default()] instead.
///
/// # Returns
///
/// the thread-default #GMainContext, or
/// [`None`] if the thread-default context is the global-default main context.
#[doc(alias = "g_main_context_get_thread_default")]
#[doc(alias = "get_thread_default")]
pub fn thread_default() -> Option<MainContext> {
unsafe { from_glib_none(ffi::g_main_context_get_thread_default()) }
}
//#[cfg(feature = "v2_64")]
//#[cfg_attr(docsrs, doc(cfg(feature = "v2_64")))]
//#[doc(alias = "g_main_context_pusher_free")]
//pub fn pusher_free(pusher: /*Unknown conversion*//*Unimplemented*/MainContextPusher) {
// unsafe { TODO: call ffi:g_main_context_pusher_free() }
//}
/// Gets the thread-default [`MainContext`][crate::MainContext] for this thread, as with
/// [`thread_default()`][Self::thread_default()], but also adds a reference to
/// it with `GLib::MainContext::ref()`. In addition, unlike
/// [`thread_default()`][Self::thread_default()], if the thread-default context
/// is the global-default context, this will return that
/// [`MainContext`][crate::MainContext] (with a ref added to it) rather than returning
/// [`None`].
///
/// # Returns
///
/// the thread-default #GMainContext. Unref
/// with `GLib::MainContext::unref()` when you are done with it.
#[doc(alias = "g_main_context_ref_thread_default")]
pub fn ref_thread_default() -> MainContext {
unsafe { from_glib_full(ffi::g_main_context_ref_thread_default()) }
}
}
impl Default for MainContext {
fn default() -> Self {
Self::new()
}
}
unsafe impl Send for MainContext {}
unsafe impl Sync for MainContext {}