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 glib.Source;
26 
27 private import glib.ConstructionException;
28 private import glib.MainContext;
29 private import glib.Str;
30 private import glib.TimeVal;
31 private import gtkc.glib;
32 public  import gtkc.glibtypes;
33 
34 
35 /**
36  * The `GSource` struct is an opaque data type
37  * representing an event source.
38  */
39 public class Source
40 {
41 	/** the main Gtk struct */
42 	protected GSource* gSource;
43 	protected bool ownedRef;
44 
45 	/** Get the main Gtk struct */
46 	public GSource* getSourceStruct()
47 	{
48 		return gSource;
49 	}
50 
51 	/** the main Gtk struct as a void* */
52 	protected void* getStruct()
53 	{
54 		return cast(void*)gSource;
55 	}
56 
57 	/**
58 	 * Sets our main struct and passes it to the parent class.
59 	 */
60 	public this (GSource* gSource, bool ownedRef = false)
61 	{
62 		this.gSource = gSource;
63 		this.ownedRef = ownedRef;
64 	}
65 
66 
67 	/**
68 	 * Creates a new #GSource structure. The size is specified to
69 	 * allow creating structures derived from #GSource that contain
70 	 * additional data. The size passed in must be at least
71 	 * `sizeof (GSource)`.
72 	 *
73 	 * The source will not initially be associated with any #GMainContext
74 	 * and must be added to one with g_source_attach() before it will be
75 	 * executed.
76 	 *
77 	 * Params:
78 	 *     sourceFuncs = structure containing functions that implement
79 	 *         the sources behavior.
80 	 *     structSize = size of the #GSource structure to create.
81 	 *
82 	 * Return: the newly-created #GSource.
83 	 *
84 	 * Throws: ConstructionException GTK+ fails to create the object.
85 	 */
86 	public this(GSourceFuncs* sourceFuncs, uint structSize)
87 	{
88 		auto p = g_source_new(sourceFuncs, structSize);
89 		
90 		if(p is null)
91 		{
92 			throw new ConstructionException("null returned by new");
93 		}
94 		
95 		this(cast(GSource*) p);
96 	}
97 
98 	/**
99 	 * Adds @child_source to @source as a "polled" source; when @source is
100 	 * added to a #GMainContext, @child_source will be automatically added
101 	 * with the same priority, when @child_source is triggered, it will
102 	 * cause @source to dispatch (in addition to calling its own
103 	 * callback), and when @source is destroyed, it will destroy
104 	 * @child_source as well. (@source will also still be dispatched if
105 	 * its own prepare/check functions indicate that it is ready.)
106 	 *
107 	 * If you don't need @child_source to do anything on its own when it
108 	 * triggers, you can call g_source_set_dummy_callback() on it to set a
109 	 * callback that does nothing (except return %TRUE if appropriate).
110 	 *
111 	 * @source will hold a reference on @child_source while @child_source
112 	 * is attached to it.
113 	 *
114 	 * This API is only intended to be used by implementations of #GSource.
115 	 * Do not call this API on a #GSource that you did not create.
116 	 *
117 	 * Params:
118 	 *     childSource = a second #GSource that @source should "poll"
119 	 *
120 	 * Since: 2.28
121 	 */
122 	public void addChildSource(Source childSource)
123 	{
124 		g_source_add_child_source(gSource, (childSource is null) ? null : childSource.getSourceStruct());
125 	}
126 
127 	/**
128 	 * Adds a file descriptor to the set of file descriptors polled for
129 	 * this source. This is usually combined with g_source_new() to add an
130 	 * event source. The event source's check function will typically test
131 	 * the @revents field in the #GPollFD struct and return %TRUE if events need
132 	 * to be processed.
133 	 *
134 	 * This API is only intended to be used by implementations of #GSource.
135 	 * Do not call this API on a #GSource that you did not create.
136 	 *
137 	 * Using this API forces the linear scanning of event sources on each
138 	 * main loop iteration.  Newly-written event sources should try to use
139 	 * g_source_add_unix_fd() instead of this API.
140 	 *
141 	 * Params:
142 	 *     fd = a #GPollFD structure holding information about a file
143 	 *         descriptor to watch.
144 	 */
145 	public void addPoll(GPollFD* fd)
146 	{
147 		g_source_add_poll(gSource, fd);
148 	}
149 
150 	/**
151 	 * Monitors @fd for the IO events in @events.
152 	 *
153 	 * The tag returned by this function can be used to remove or modify the
154 	 * monitoring of the fd using g_source_remove_unix_fd() or
155 	 * g_source_modify_unix_fd().
156 	 *
157 	 * It is not necessary to remove the fd before destroying the source; it
158 	 * will be cleaned up automatically.
159 	 *
160 	 * This API is only intended to be used by implementations of #GSource.
161 	 * Do not call this API on a #GSource that you did not create.
162 	 *
163 	 * As the name suggests, this function is not available on Windows.
164 	 *
165 	 * Params:
166 	 *     fd = the fd to monitor
167 	 *     events = an event mask
168 	 *
169 	 * Return: an opaque tag
170 	 *
171 	 * Since: 2.36
172 	 */
173 	public void* addUnixFd(int fd, GIOCondition events)
174 	{
175 		return g_source_add_unix_fd(gSource, fd, events);
176 	}
177 
178 	/**
179 	 * Adds a #GSource to a @context so that it will be executed within
180 	 * that context. Remove it by calling g_source_destroy().
181 	 *
182 	 * Params:
183 	 *     context = a #GMainContext (if %NULL, the default context will be used)
184 	 *
185 	 * Return: the ID (greater than 0) for the source within the
186 	 *     #GMainContext.
187 	 */
188 	public uint attach(MainContext context)
189 	{
190 		return g_source_attach(gSource, (context is null) ? null : context.getMainContextStruct());
191 	}
192 
193 	/**
194 	 * Removes a source from its #GMainContext, if any, and mark it as
195 	 * destroyed.  The source cannot be subsequently added to another
196 	 * context. It is safe to call this on sources which have already been
197 	 * removed from their context.
198 	 */
199 	public void destroy()
200 	{
201 		g_source_destroy(gSource);
202 	}
203 
204 	/**
205 	 * Checks whether a source is allowed to be called recursively.
206 	 * see g_source_set_can_recurse().
207 	 *
208 	 * Return: whether recursion is allowed.
209 	 */
210 	public bool getCanRecurse()
211 	{
212 		return g_source_get_can_recurse(gSource) != 0;
213 	}
214 
215 	/**
216 	 * Gets the #GMainContext with which the source is associated.
217 	 *
218 	 * You can call this on a source that has been destroyed, provided
219 	 * that the #GMainContext it was attached to still exists (in which
220 	 * case it will return that #GMainContext). In particular, you can
221 	 * always call this function on the source returned from
222 	 * g_main_current_source(). But calling this function on a source
223 	 * whose #GMainContext has been destroyed is an error.
224 	 *
225 	 * Return: the #GMainContext with which the
226 	 *     source is associated, or %NULL if the context has not
227 	 *     yet been added to a source.
228 	 */
229 	public MainContext getContext()
230 	{
231 		auto p = g_source_get_context(gSource);
232 		
233 		if(p is null)
234 		{
235 			return null;
236 		}
237 		
238 		return new MainContext(cast(GMainContext*) p);
239 	}
240 
241 	/**
242 	 * This function ignores @source and is otherwise the same as
243 	 * g_get_current_time().
244 	 *
245 	 * Deprecated: use g_source_get_time() instead
246 	 *
247 	 * Params:
248 	 *     timeval = #GTimeVal structure in which to store current time.
249 	 */
250 	public void getCurrentTime(TimeVal timeval)
251 	{
252 		g_source_get_current_time(gSource, (timeval is null) ? null : timeval.getTimeValStruct());
253 	}
254 
255 	/**
256 	 * Returns the numeric ID for a particular source. The ID of a source
257 	 * is a positive integer which is unique within a particular main loop
258 	 * context. The reverse
259 	 * mapping from ID to source is done by g_main_context_find_source_by_id().
260 	 *
261 	 * Return: the ID (greater than 0) for the source
262 	 */
263 	public uint getId()
264 	{
265 		return g_source_get_id(gSource);
266 	}
267 
268 	/**
269 	 * Gets a name for the source, used in debugging and profiling.  The
270 	 * name may be #NULL if it has never been set with g_source_set_name().
271 	 *
272 	 * Return: the name of the source
273 	 *
274 	 * Since: 2.26
275 	 */
276 	public string getName()
277 	{
278 		return Str.toString(g_source_get_name(gSource));
279 	}
280 
281 	/**
282 	 * Gets the priority of a source.
283 	 *
284 	 * Return: the priority of the source
285 	 */
286 	public int getPriority()
287 	{
288 		return g_source_get_priority(gSource);
289 	}
290 
291 	/**
292 	 * Gets the "ready time" of @source, as set by
293 	 * g_source_set_ready_time().
294 	 *
295 	 * Any time before the current monotonic time (including 0) is an
296 	 * indication that the source will fire immediately.
297 	 *
298 	 * Return: the monotonic ready time, -1 for "never"
299 	 */
300 	public long getReadyTime()
301 	{
302 		return g_source_get_ready_time(gSource);
303 	}
304 
305 	/**
306 	 * Gets the time to be used when checking this source. The advantage of
307 	 * calling this function over calling g_get_monotonic_time() directly is
308 	 * that when checking multiple sources, GLib can cache a single value
309 	 * instead of having to repeatedly get the system monotonic time.
310 	 *
311 	 * The time here is the system monotonic time, if available, or some
312 	 * other reasonable alternative otherwise.  See g_get_monotonic_time().
313 	 *
314 	 * Return: the monotonic time in microseconds
315 	 *
316 	 * Since: 2.28
317 	 */
318 	public long getTime()
319 	{
320 		return g_source_get_time(gSource);
321 	}
322 
323 	/**
324 	 * Returns whether @source has been destroyed.
325 	 *
326 	 * This is important when you operate upon your objects
327 	 * from within idle handlers, but may have freed the object
328 	 * before the dispatch of your idle handler.
329 	 *
330 	 * |[<!-- language="C" -->
331 	 * static gboolean
332 	 * idle_callback (gpointer data)
333 	 * {
334 	 * SomeWidget *self = data;
335 	 *
336 	 * GDK_THREADS_ENTER ();
337 	 * // do stuff with self
338 	 * self->idle_id = 0;
339 	 * GDK_THREADS_LEAVE ();
340 	 *
341 	 * return G_SOURCE_REMOVE;
342 	 * }
343 	 *
344 	 * static void
345 	 * some_widget_do_stuff_later (SomeWidget *self)
346 	 * {
347 	 * self->idle_id = g_idle_add (idle_callback, self);
348 	 * }
349 	 *
350 	 * static void
351 	 * some_widget_finalize (GObject *object)
352 	 * {
353 	 * SomeWidget *self = SOME_WIDGET (object);
354 	 *
355 	 * if (self->idle_id)
356 	 * g_source_remove (self->idle_id);
357 	 *
358 	 * G_OBJECT_CLASS (parent_class)->finalize (object);
359 	 * }
360 	 * ]|
361 	 *
362 	 * This will fail in a multi-threaded application if the
363 	 * widget is destroyed before the idle handler fires due
364 	 * to the use after free in the callback. A solution, to
365 	 * this particular problem, is to check to if the source
366 	 * has already been destroy within the callback.
367 	 *
368 	 * |[<!-- language="C" -->
369 	 * static gboolean
370 	 * idle_callback (gpointer data)
371 	 * {
372 	 * SomeWidget *self = data;
373 	 *
374 	 * GDK_THREADS_ENTER ();
375 	 * if (!g_source_is_destroyed (g_main_current_source ()))
376 	 * {
377 	 * // do stuff with self
378 	 * }
379 	 * GDK_THREADS_LEAVE ();
380 	 *
381 	 * return FALSE;
382 	 * }
383 	 * ]|
384 	 *
385 	 * Return: %TRUE if the source has been destroyed
386 	 *
387 	 * Since: 2.12
388 	 */
389 	public bool isDestroyed()
390 	{
391 		return g_source_is_destroyed(gSource) != 0;
392 	}
393 
394 	/**
395 	 * Updates the event mask to watch for the fd identified by @tag.
396 	 *
397 	 * @tag is the tag returned from g_source_add_unix_fd().
398 	 *
399 	 * If you want to remove a fd, don't set its event mask to zero.
400 	 * Instead, call g_source_remove_unix_fd().
401 	 *
402 	 * This API is only intended to be used by implementations of #GSource.
403 	 * Do not call this API on a #GSource that you did not create.
404 	 *
405 	 * As the name suggests, this function is not available on Windows.
406 	 *
407 	 * Params:
408 	 *     tag = the tag from g_source_add_unix_fd()
409 	 *     newEvents = the new event mask to watch
410 	 *
411 	 * Since: 2.36
412 	 */
413 	public void modifyUnixFd(void* tag, GIOCondition newEvents)
414 	{
415 		g_source_modify_unix_fd(gSource, tag, newEvents);
416 	}
417 
418 	/**
419 	 * Queries the events reported for the fd corresponding to @tag on
420 	 * @source during the last poll.
421 	 *
422 	 * The return value of this function is only defined when the function
423 	 * is called from the check or dispatch functions for @source.
424 	 *
425 	 * This API is only intended to be used by implementations of #GSource.
426 	 * Do not call this API on a #GSource that you did not create.
427 	 *
428 	 * As the name suggests, this function is not available on Windows.
429 	 *
430 	 * Params:
431 	 *     tag = the tag from g_source_add_unix_fd()
432 	 *
433 	 * Return: the conditions reported on the fd
434 	 *
435 	 * Since: 2.36
436 	 */
437 	public GIOCondition queryUnixFd(void* tag)
438 	{
439 		return g_source_query_unix_fd(gSource, tag);
440 	}
441 
442 	/**
443 	 * Increases the reference count on a source by one.
444 	 *
445 	 * Return: @source
446 	 */
447 	public Source doref()
448 	{
449 		auto p = g_source_ref(gSource);
450 		
451 		if(p is null)
452 		{
453 			return null;
454 		}
455 		
456 		return new Source(cast(GSource*) p, true);
457 	}
458 
459 	/**
460 	 * Detaches @child_source from @source and destroys it.
461 	 *
462 	 * This API is only intended to be used by implementations of #GSource.
463 	 * Do not call this API on a #GSource that you did not create.
464 	 *
465 	 * Params:
466 	 *     childSource = a #GSource previously passed to
467 	 *         g_source_add_child_source().
468 	 *
469 	 * Since: 2.28
470 	 */
471 	public void removeChildSource(Source childSource)
472 	{
473 		g_source_remove_child_source(gSource, (childSource is null) ? null : childSource.getSourceStruct());
474 	}
475 
476 	/**
477 	 * Removes a file descriptor from the set of file descriptors polled for
478 	 * this source.
479 	 *
480 	 * This API is only intended to be used by implementations of #GSource.
481 	 * Do not call this API on a #GSource that you did not create.
482 	 *
483 	 * Params:
484 	 *     fd = a #GPollFD structure previously passed to g_source_add_poll().
485 	 */
486 	public void removePoll(GPollFD* fd)
487 	{
488 		g_source_remove_poll(gSource, fd);
489 	}
490 
491 	/**
492 	 * Reverses the effect of a previous call to g_source_add_unix_fd().
493 	 *
494 	 * You only need to call this if you want to remove an fd from being
495 	 * watched while keeping the same source around.  In the normal case you
496 	 * will just want to destroy the source.
497 	 *
498 	 * This API is only intended to be used by implementations of #GSource.
499 	 * Do not call this API on a #GSource that you did not create.
500 	 *
501 	 * As the name suggests, this function is not available on Windows.
502 	 *
503 	 * Params:
504 	 *     tag = the tag from g_source_add_unix_fd()
505 	 *
506 	 * Since: 2.36
507 	 */
508 	public void removeUnixFd(void* tag)
509 	{
510 		g_source_remove_unix_fd(gSource, tag);
511 	}
512 
513 	/**
514 	 * Sets the callback function for a source. The callback for a source is
515 	 * called from the source's dispatch function.
516 	 *
517 	 * The exact type of @func depends on the type of source; ie. you
518 	 * should not count on @func being called with @data as its first
519 	 * parameter.
520 	 *
521 	 * See [memory management of sources][mainloop-memory-management] for details
522 	 * on how to handle memory management of @data.
523 	 *
524 	 * Typically, you won't use this function. Instead use functions specific
525 	 * to the type of source you are using.
526 	 *
527 	 * Params:
528 	 *     func = a callback function
529 	 *     data = the data to pass to callback function
530 	 *     notify = a function to call when @data is no longer in use, or %NULL.
531 	 */
532 	public void setCallback(GSourceFunc func, void* data, GDestroyNotify notify)
533 	{
534 		g_source_set_callback(gSource, func, data, notify);
535 	}
536 
537 	/**
538 	 * Sets the callback function storing the data as a refcounted callback
539 	 * "object". This is used internally. Note that calling
540 	 * g_source_set_callback_indirect() assumes
541 	 * an initial reference count on @callback_data, and thus
542 	 * @callback_funcs->unref will eventually be called once more
543 	 * than @callback_funcs->ref.
544 	 *
545 	 * Params:
546 	 *     callbackData = pointer to callback data "object"
547 	 *     callbackFuncs = functions for reference counting @callback_data
548 	 *         and getting the callback and data
549 	 */
550 	public void setCallbackIndirect(void* callbackData, GSourceCallbackFuncs* callbackFuncs)
551 	{
552 		g_source_set_callback_indirect(gSource, callbackData, callbackFuncs);
553 	}
554 
555 	/**
556 	 * Sets whether a source can be called recursively. If @can_recurse is
557 	 * %TRUE, then while the source is being dispatched then this source
558 	 * will be processed normally. Otherwise, all processing of this
559 	 * source is blocked until the dispatch function returns.
560 	 *
561 	 * Params:
562 	 *     canRecurse = whether recursion is allowed for this source
563 	 */
564 	public void setCanRecurse(bool canRecurse)
565 	{
566 		g_source_set_can_recurse(gSource, canRecurse);
567 	}
568 
569 	/**
570 	 * Sets the source functions (can be used to override
571 	 * default implementations) of an unattached source.
572 	 *
573 	 * Params:
574 	 *     funcs = the new #GSourceFuncs
575 	 *
576 	 * Since: 2.12
577 	 */
578 	public void setFuncs(GSourceFuncs* funcs)
579 	{
580 		g_source_set_funcs(gSource, funcs);
581 	}
582 
583 	/**
584 	 * Sets a name for the source, used in debugging and profiling.
585 	 * The name defaults to #NULL.
586 	 *
587 	 * The source name should describe in a human-readable way
588 	 * what the source does. For example, "X11 event queue"
589 	 * or "GTK+ repaint idle handler" or whatever it is.
590 	 *
591 	 * It is permitted to call this function multiple times, but is not
592 	 * recommended due to the potential performance impact.  For example,
593 	 * one could change the name in the "check" function of a #GSourceFuncs
594 	 * to include details like the event type in the source name.
595 	 *
596 	 * Use caution if changing the name while another thread may be
597 	 * accessing it with g_source_get_name(); that function does not copy
598 	 * the value, and changing the value will free it while the other thread
599 	 * may be attempting to use it.
600 	 *
601 	 * Params:
602 	 *     name = debug name for the source
603 	 *
604 	 * Since: 2.26
605 	 */
606 	public void setName(string name)
607 	{
608 		g_source_set_name(gSource, Str.toStringz(name));
609 	}
610 
611 	/**
612 	 * Sets the priority of a source. While the main loop is being run, a
613 	 * source will be dispatched if it is ready to be dispatched and no
614 	 * sources at a higher (numerically smaller) priority are ready to be
615 	 * dispatched.
616 	 *
617 	 * A child source always has the same priority as its parent.  It is not
618 	 * permitted to change the priority of a source once it has been added
619 	 * as a child of another source.
620 	 *
621 	 * Params:
622 	 *     priority = the new priority.
623 	 */
624 	public void setPriority(int priority)
625 	{
626 		g_source_set_priority(gSource, priority);
627 	}
628 
629 	/**
630 	 * Sets a #GSource to be dispatched when the given monotonic time is
631 	 * reached (or passed).  If the monotonic time is in the past (as it
632 	 * always will be if @ready_time is 0) then the source will be
633 	 * dispatched immediately.
634 	 *
635 	 * If @ready_time is -1 then the source is never woken up on the basis
636 	 * of the passage of time.
637 	 *
638 	 * Dispatching the source does not reset the ready time.  You should do
639 	 * so yourself, from the source dispatch function.
640 	 *
641 	 * Note that if you have a pair of sources where the ready time of one
642 	 * suggests that it will be delivered first but the priority for the
643 	 * other suggests that it would be delivered first, and the ready time
644 	 * for both sources is reached during the same main context iteration
645 	 * then the order of dispatch is undefined.
646 	 *
647 	 * This API is only intended to be used by implementations of #GSource.
648 	 * Do not call this API on a #GSource that you did not create.
649 	 *
650 	 * Params:
651 	 *     readyTime = the monotonic time at which the source will be ready,
652 	 *         0 for "immediately", -1 for "never"
653 	 *
654 	 * Since: 2.36
655 	 */
656 	public void setReadyTime(long readyTime)
657 	{
658 		g_source_set_ready_time(gSource, readyTime);
659 	}
660 
661 	/**
662 	 * Decreases the reference count of a source by one. If the
663 	 * resulting reference count is zero the source and associated
664 	 * memory will be destroyed.
665 	 */
666 	public void unref()
667 	{
668 		g_source_unref(gSource);
669 	}
670 
671 	/**
672 	 * Removes the source with the given id from the default main context.
673 	 *
674 	 * The id of a #GSource is given by g_source_get_id(), or will be
675 	 * returned by the functions g_source_attach(), g_idle_add(),
676 	 * g_idle_add_full(), g_timeout_add(), g_timeout_add_full(),
677 	 * g_child_watch_add(), g_child_watch_add_full(), g_io_add_watch(), and
678 	 * g_io_add_watch_full().
679 	 *
680 	 * See also g_source_destroy(). You must use g_source_destroy() for sources
681 	 * added to a non-default main context.
682 	 *
683 	 * It is a programmer error to attempt to remove a non-existent source.
684 	 *
685 	 * More specifically: source IDs can be reissued after a source has been
686 	 * destroyed and therefore it is never valid to use this function with a
687 	 * source ID which may have already been removed.  An example is when
688 	 * scheduling an idle to run in another thread with g_idle_add(): the
689 	 * idle may already have run and been removed by the time this function
690 	 * is called on its (now invalid) source ID.  This source ID may have
691 	 * been reissued, leading to the operation being performed against the
692 	 * wrong source.
693 	 *
694 	 * Params:
695 	 *     tag = the ID of the source to remove.
696 	 *
697 	 * Return: For historical reasons, this function always returns %TRUE
698 	 */
699 	public static bool remove(uint tag)
700 	{
701 		return g_source_remove(tag) != 0;
702 	}
703 
704 	/**
705 	 * Removes a source from the default main loop context given the
706 	 * source functions and user data. If multiple sources exist with the
707 	 * same source functions and user data, only one will be destroyed.
708 	 *
709 	 * Params:
710 	 *     funcs = The @source_funcs passed to g_source_new()
711 	 *     userData = the user data for the callback
712 	 *
713 	 * Return: %TRUE if a source was found and removed.
714 	 */
715 	public static bool removeByFuncsUserData(GSourceFuncs* funcs, void* userData)
716 	{
717 		return g_source_remove_by_funcs_user_data(funcs, userData) != 0;
718 	}
719 
720 	/**
721 	 * Removes a source from the default main loop context given the user
722 	 * data for the callback. If multiple sources exist with the same user
723 	 * data, only one will be destroyed.
724 	 *
725 	 * Params:
726 	 *     userData = the user_data for the callback.
727 	 *
728 	 * Return: %TRUE if a source was found and removed.
729 	 */
730 	public static bool removeByUserData(void* userData)
731 	{
732 		return g_source_remove_by_user_data(userData) != 0;
733 	}
734 
735 	/**
736 	 * Sets the name of a source using its ID.
737 	 *
738 	 * This is a convenience utility to set source names from the return
739 	 * value of g_idle_add(), g_timeout_add(), etc.
740 	 *
741 	 * It is a programmer error to attempt to set the name of a non-existent
742 	 * source.
743 	 *
744 	 * More specifically: source IDs can be reissued after a source has been
745 	 * destroyed and therefore it is never valid to use this function with a
746 	 * source ID which may have already been removed.  An example is when
747 	 * scheduling an idle to run in another thread with g_idle_add(): the
748 	 * idle may already have run and been removed by the time this function
749 	 * is called on its (now invalid) source ID.  This source ID may have
750 	 * been reissued, leading to the operation being performed against the
751 	 * wrong source.
752 	 *
753 	 * Params:
754 	 *     tag = a #GSource ID
755 	 *     name = debug name for the source
756 	 *
757 	 * Since: 2.26
758 	 */
759 	public static void setNameById(uint tag, string name)
760 	{
761 		g_source_set_name_by_id(tag, Str.toStringz(name));
762 	}
763 }