1 /*
2  * This file is part of gtkD.
3  *
4  * gtkD is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License
6  * as published by the Free Software Foundation; either version 3
7  * of the License, or (at your option) any later version, with
8  * some exceptions, please read the COPYING file.
9  *
10  * gtkD is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with gtkD; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
18  */
19 
20 // generated automatically - do not change
21 // find conversion definition on APILookup.txt
22 // implement new conversion functionalities on the wrap.utils pakage
23 
24 
25 module gdk.Threads;
26 
27 private import gdk.c.functions;
28 public  import gdk.c.types;
29 public  import gtkc.gdktypes;
30 
31 
32 /** */
33 
34 /**
35  * A wrapper for the common usage of gdk_threads_add_idle_full()
36  * assigning the default priority, #G_PRIORITY_DEFAULT_IDLE.
37  *
38  * See gdk_threads_add_idle_full().
39  *
40  * Params:
41  *     funct = function to call
42  *     data = data to pass to @function
43  *
44  * Returns: the ID (greater than 0) of the event source.
45  *
46  * Since: 2.12
47  */
48 public uint threadsAddIdle(GSourceFunc funct, void* data)
49 {
50 	return gdk_threads_add_idle(funct, data);
51 }
52 
53 /**
54  * Adds a function to be called whenever there are no higher priority
55  * events pending.  If the function returns %FALSE it is automatically
56  * removed from the list of event sources and will not be called again.
57  *
58  * This variant of g_idle_add_full() calls @function with the GDK lock
59  * held. It can be thought of a MT-safe version for GTK+ widgets for the
60  * following use case, where you have to worry about idle_callback()
61  * running in thread A and accessing @self after it has been finalized
62  * in thread B:
63  *
64  * |[<!-- language="C" -->
65  * static gboolean
66  * idle_callback (gpointer data)
67  * {
68  * // gdk_threads_enter(); would be needed for g_idle_add()
69  *
70  * SomeWidget *self = data;
71  * // do stuff with self
72  *
73  * self->idle_id = 0;
74  *
75  * // gdk_threads_leave(); would be needed for g_idle_add()
76  * return FALSE;
77  * }
78  *
79  * static void
80  * some_widget_do_stuff_later (SomeWidget *self)
81  * {
82  * self->idle_id = gdk_threads_add_idle (idle_callback, self)
83  * // using g_idle_add() here would require thread protection in the callback
84  * }
85  *
86  * static void
87  * some_widget_finalize (GObject *object)
88  * {
89  * SomeWidget *self = SOME_WIDGET (object);
90  * if (self->idle_id)
91  * g_source_remove (self->idle_id);
92  * G_OBJECT_CLASS (parent_class)->finalize (object);
93  * }
94  * ]|
95  *
96  * Params:
97  *     priority = the priority of the idle source. Typically this will be in the
98  *         range between #G_PRIORITY_DEFAULT_IDLE and #G_PRIORITY_HIGH_IDLE
99  *     funct = function to call
100  *     data = data to pass to @function
101  *     notify = function to call when the idle is removed, or %NULL
102  *
103  * Returns: the ID (greater than 0) of the event source.
104  *
105  * Since: 2.12
106  */
107 public uint threadsAddIdleFull(int priority, GSourceFunc funct, void* data, GDestroyNotify notify)
108 {
109 	return gdk_threads_add_idle_full(priority, funct, data, notify);
110 }
111 
112 /**
113  * A wrapper for the common usage of gdk_threads_add_timeout_full()
114  * assigning the default priority, #G_PRIORITY_DEFAULT.
115  *
116  * See gdk_threads_add_timeout_full().
117  *
118  * Params:
119  *     interval = the time between calls to the function, in milliseconds
120  *         (1/1000ths of a second)
121  *     funct = function to call
122  *     data = data to pass to @function
123  *
124  * Returns: the ID (greater than 0) of the event source.
125  *
126  * Since: 2.12
127  */
128 public uint threadsAddTimeout(uint interval, GSourceFunc funct, void* data)
129 {
130 	return gdk_threads_add_timeout(interval, funct, data);
131 }
132 
133 /**
134  * Sets a function to be called at regular intervals holding the GDK lock,
135  * with the given priority.  The function is called repeatedly until it
136  * returns %FALSE, at which point the timeout is automatically destroyed
137  * and the function will not be called again.  The @notify function is
138  * called when the timeout is destroyed.  The first call to the
139  * function will be at the end of the first @interval.
140  *
141  * Note that timeout functions may be delayed, due to the processing of other
142  * event sources. Thus they should not be relied on for precise timing.
143  * After each call to the timeout function, the time of the next
144  * timeout is recalculated based on the current time and the given interval
145  * (it does not try to “catch up” time lost in delays).
146  *
147  * This variant of g_timeout_add_full() can be thought of a MT-safe version
148  * for GTK+ widgets for the following use case:
149  *
150  * |[<!-- language="C" -->
151  * static gboolean timeout_callback (gpointer data)
152  * {
153  * SomeWidget *self = data;
154  *
155  * // do stuff with self
156  *
157  * self->timeout_id = 0;
158  *
159  * return G_SOURCE_REMOVE;
160  * }
161  *
162  * static void some_widget_do_stuff_later (SomeWidget *self)
163  * {
164  * self->timeout_id = g_timeout_add (timeout_callback, self)
165  * }
166  *
167  * static void some_widget_finalize (GObject *object)
168  * {
169  * SomeWidget *self = SOME_WIDGET (object);
170  *
171  * if (self->timeout_id)
172  * g_source_remove (self->timeout_id);
173  *
174  * G_OBJECT_CLASS (parent_class)->finalize (object);
175  * }
176  * ]|
177  *
178  * Params:
179  *     priority = the priority of the timeout source. Typically this will be in the
180  *         range between #G_PRIORITY_DEFAULT_IDLE and #G_PRIORITY_HIGH_IDLE.
181  *     interval = the time between calls to the function, in milliseconds
182  *         (1/1000ths of a second)
183  *     funct = function to call
184  *     data = data to pass to @function
185  *     notify = function to call when the timeout is removed, or %NULL
186  *
187  * Returns: the ID (greater than 0) of the event source.
188  *
189  * Since: 2.12
190  */
191 public uint threadsAddTimeoutFull(int priority, uint interval, GSourceFunc funct, void* data, GDestroyNotify notify)
192 {
193 	return gdk_threads_add_timeout_full(priority, interval, funct, data, notify);
194 }
195 
196 /**
197  * A wrapper for the common usage of gdk_threads_add_timeout_seconds_full()
198  * assigning the default priority, #G_PRIORITY_DEFAULT.
199  *
200  * For details, see gdk_threads_add_timeout_full().
201  *
202  * Params:
203  *     interval = the time between calls to the function, in seconds
204  *     funct = function to call
205  *     data = data to pass to @function
206  *
207  * Returns: the ID (greater than 0) of the event source.
208  *
209  * Since: 2.14
210  */
211 public uint threadsAddTimeoutSeconds(uint interval, GSourceFunc funct, void* data)
212 {
213 	return gdk_threads_add_timeout_seconds(interval, funct, data);
214 }
215 
216 /**
217  * A variant of gdk_threads_add_timeout_full() with second-granularity.
218  * See g_timeout_add_seconds_full() for a discussion of why it is
219  * a good idea to use this function if you don’t need finer granularity.
220  *
221  * Params:
222  *     priority = the priority of the timeout source. Typically this will be in the
223  *         range between #G_PRIORITY_DEFAULT_IDLE and #G_PRIORITY_HIGH_IDLE.
224  *     interval = the time between calls to the function, in seconds
225  *     funct = function to call
226  *     data = data to pass to @function
227  *     notify = function to call when the timeout is removed, or %NULL
228  *
229  * Returns: the ID (greater than 0) of the event source.
230  *
231  * Since: 2.14
232  */
233 public uint threadsAddTimeoutSecondsFull(int priority, uint interval, GSourceFunc funct, void* data, GDestroyNotify notify)
234 {
235 	return gdk_threads_add_timeout_seconds_full(priority, interval, funct, data, notify);
236 }
237 
238 /**
239  * This function marks the beginning of a critical section in which
240  * GDK and GTK+ functions can be called safely and without causing race
241  * conditions. Only one thread at a time can be in such a critial
242  * section.
243  *
244  * Deprecated: All GDK and GTK+ calls should be made from the main
245  * thread
246  */
247 public void threadsEnter()
248 {
249 	gdk_threads_enter();
250 }
251 
252 /**
253  * Initializes GDK so that it can be used from multiple threads
254  * in conjunction with gdk_threads_enter() and gdk_threads_leave().
255  *
256  * This call must be made before any use of the main loop from
257  * GTK+; to be safe, call it before gtk_init().
258  *
259  * Deprecated: All GDK and GTK+ calls should be made from the main
260  * thread
261  */
262 public void threadsInit()
263 {
264 	gdk_threads_init();
265 }
266 
267 /**
268  * Leaves a critical region begun with gdk_threads_enter().
269  *
270  * Deprecated: All GDK and GTK+ calls should be made from the main
271  * thread
272  */
273 public void threadsLeave()
274 {
275 	gdk_threads_leave();
276 }
277 
278 /**
279  * Allows the application to replace the standard method that
280  * GDK uses to protect its data structures. Normally, GDK
281  * creates a single #GMutex that is locked by gdk_threads_enter(),
282  * and released by gdk_threads_leave(); using this function an
283  * application provides, instead, a function @enter_fn that is
284  * called by gdk_threads_enter() and a function @leave_fn that is
285  * called by gdk_threads_leave().
286  *
287  * The functions must provide at least same locking functionality
288  * as the default implementation, but can also do extra application
289  * specific processing.
290  *
291  * As an example, consider an application that has its own recursive
292  * lock that when held, holds the GTK+ lock as well. When GTK+ unlocks
293  * the GTK+ lock when entering a recursive main loop, the application
294  * must temporarily release its lock as well.
295  *
296  * Most threaded GTK+ apps won’t need to use this method.
297  *
298  * This method must be called before gdk_threads_init(), and cannot
299  * be called multiple times.
300  *
301  * Deprecated: All GDK and GTK+ calls should be made from the main
302  * thread
303  *
304  * Params:
305  *     enterFn = function called to guard GDK
306  *     leaveFn = function called to release the guard
307  *
308  * Since: 2.4
309  */
310 public void threadsSetLockFunctions(GCallback enterFn, GCallback leaveFn)
311 {
312 	gdk_threads_set_lock_functions(enterFn, leaveFn);
313 }