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 44 /** Get the main Gtk struct */ 45 public GSource* getSourceStruct() 46 { 47 return gSource; 48 } 49 50 /** the main Gtk struct as a void* */ 51 protected void* getStruct() 52 { 53 return cast(void*)gSource; 54 } 55 56 /** 57 * Sets our main struct and passes it to the parent class. 58 */ 59 public this (GSource* gSource) 60 { 61 this.gSource = gSource; 62 } 63 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); 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 * Typically, you won't use this function. Instead use functions specific 522 * to the type of source you are using. 523 * 524 * Params: 525 * func = a callback function 526 * data = the data to pass to callback function 527 * notify = a function to call when @data is no longer in use, or %NULL. 528 */ 529 public void setCallback(GSourceFunc func, void* data, GDestroyNotify notify) 530 { 531 g_source_set_callback(gSource, func, data, notify); 532 } 533 534 /** 535 * Sets the callback function storing the data as a refcounted callback 536 * "object". This is used internally. Note that calling 537 * g_source_set_callback_indirect() assumes 538 * an initial reference count on @callback_data, and thus 539 * @callback_funcs->unref will eventually be called once more 540 * than @callback_funcs->ref. 541 * 542 * Params: 543 * callbackData = pointer to callback data "object" 544 * callbackFuncs = functions for reference counting @callback_data 545 * and getting the callback and data 546 */ 547 public void setCallbackIndirect(void* callbackData, GSourceCallbackFuncs* callbackFuncs) 548 { 549 g_source_set_callback_indirect(gSource, callbackData, callbackFuncs); 550 } 551 552 /** 553 * Sets whether a source can be called recursively. If @can_recurse is 554 * %TRUE, then while the source is being dispatched then this source 555 * will be processed normally. Otherwise, all processing of this 556 * source is blocked until the dispatch function returns. 557 * 558 * Params: 559 * canRecurse = whether recursion is allowed for this source 560 */ 561 public void setCanRecurse(bool canRecurse) 562 { 563 g_source_set_can_recurse(gSource, canRecurse); 564 } 565 566 /** 567 * Sets the source functions (can be used to override 568 * default implementations) of an unattached source. 569 * 570 * Params: 571 * funcs = the new #GSourceFuncs 572 * 573 * Since: 2.12 574 */ 575 public void setFuncs(GSourceFuncs* funcs) 576 { 577 g_source_set_funcs(gSource, funcs); 578 } 579 580 /** 581 * Sets a name for the source, used in debugging and profiling. 582 * The name defaults to #NULL. 583 * 584 * The source name should describe in a human-readable way 585 * what the source does. For example, "X11 event queue" 586 * or "GTK+ repaint idle handler" or whatever it is. 587 * 588 * It is permitted to call this function multiple times, but is not 589 * recommended due to the potential performance impact. For example, 590 * one could change the name in the "check" function of a #GSourceFuncs 591 * to include details like the event type in the source name. 592 * 593 * Use caution if changing the name while another thread may be 594 * accessing it with g_source_get_name(); that function does not copy 595 * the value, and changing the value will free it while the other thread 596 * may be attempting to use it. 597 * 598 * Params: 599 * name = debug name for the source 600 * 601 * Since: 2.26 602 */ 603 public void setName(string name) 604 { 605 g_source_set_name(gSource, Str.toStringz(name)); 606 } 607 608 /** 609 * Sets the priority of a source. While the main loop is being run, a 610 * source will be dispatched if it is ready to be dispatched and no 611 * sources at a higher (numerically smaller) priority are ready to be 612 * dispatched. 613 * 614 * A child source always has the same priority as its parent. It is not 615 * permitted to change the priority of a source once it has been added 616 * as a child of another source. 617 * 618 * Params: 619 * priority = the new priority. 620 */ 621 public void setPriority(int priority) 622 { 623 g_source_set_priority(gSource, priority); 624 } 625 626 /** 627 * Sets a #GSource to be dispatched when the given monotonic time is 628 * reached (or passed). If the monotonic time is in the past (as it 629 * always will be if @ready_time is 0) then the source will be 630 * dispatched immediately. 631 * 632 * If @ready_time is -1 then the source is never woken up on the basis 633 * of the passage of time. 634 * 635 * Dispatching the source does not reset the ready time. You should do 636 * so yourself, from the source dispatch function. 637 * 638 * Note that if you have a pair of sources where the ready time of one 639 * suggests that it will be delivered first but the priority for the 640 * other suggests that it would be delivered first, and the ready time 641 * for both sources is reached during the same main context iteration 642 * then the order of dispatch is undefined. 643 * 644 * This API is only intended to be used by implementations of #GSource. 645 * Do not call this API on a #GSource that you did not create. 646 * 647 * Params: 648 * readyTime = the monotonic time at which the source will be ready, 649 * 0 for "immediately", -1 for "never" 650 * 651 * Since: 2.36 652 */ 653 public void setReadyTime(long readyTime) 654 { 655 g_source_set_ready_time(gSource, readyTime); 656 } 657 658 /** 659 * Decreases the reference count of a source by one. If the 660 * resulting reference count is zero the source and associated 661 * memory will be destroyed. 662 */ 663 public void unref() 664 { 665 g_source_unref(gSource); 666 } 667 668 /** 669 * Removes the source with the given id from the default main context. 670 * 671 * The id of a #GSource is given by g_source_get_id(), or will be 672 * returned by the functions g_source_attach(), g_idle_add(), 673 * g_idle_add_full(), g_timeout_add(), g_timeout_add_full(), 674 * g_child_watch_add(), g_child_watch_add_full(), g_io_add_watch(), and 675 * g_io_add_watch_full(). 676 * 677 * See also g_source_destroy(). You must use g_source_destroy() for sources 678 * added to a non-default main context. 679 * 680 * It is a programmer error to attempt to remove a non-existent source. 681 * 682 * More specifically: source IDs can be reissued after a source has been 683 * destroyed and therefore it is never valid to use this function with a 684 * source ID which may have already been removed. An example is when 685 * scheduling an idle to run in another thread with g_idle_add(): the 686 * idle may already have run and been removed by the time this function 687 * is called on its (now invalid) source ID. This source ID may have 688 * been reissued, leading to the operation being performed against the 689 * wrong source. 690 * 691 * Params: 692 * tag = the ID of the source to remove. 693 * 694 * Return: For historical reasons, this function always returns %TRUE 695 */ 696 public static bool remove(uint tag) 697 { 698 return g_source_remove(tag) != 0; 699 } 700 701 /** 702 * Removes a source from the default main loop context given the 703 * source functions and user data. If multiple sources exist with the 704 * same source functions and user data, only one will be destroyed. 705 * 706 * Params: 707 * funcs = The @source_funcs passed to g_source_new() 708 * userData = the user data for the callback 709 * 710 * Return: %TRUE if a source was found and removed. 711 */ 712 public static bool removeByFuncsUserData(GSourceFuncs* funcs, void* userData) 713 { 714 return g_source_remove_by_funcs_user_data(funcs, userData) != 0; 715 } 716 717 /** 718 * Removes a source from the default main loop context given the user 719 * data for the callback. If multiple sources exist with the same user 720 * data, only one will be destroyed. 721 * 722 * Params: 723 * userData = the user_data for the callback. 724 * 725 * Return: %TRUE if a source was found and removed. 726 */ 727 public static bool removeByUserData(void* userData) 728 { 729 return g_source_remove_by_user_data(userData) != 0; 730 } 731 732 /** 733 * Sets the name of a source using its ID. 734 * 735 * This is a convenience utility to set source names from the return 736 * value of g_idle_add(), g_timeout_add(), etc. 737 * 738 * It is a programmer error to attempt to set the name of a non-existent 739 * source. 740 * 741 * More specifically: source IDs can be reissued after a source has been 742 * destroyed and therefore it is never valid to use this function with a 743 * source ID which may have already been removed. An example is when 744 * scheduling an idle to run in another thread with g_idle_add(): the 745 * idle may already have run and been removed by the time this function 746 * is called on its (now invalid) source ID. This source ID may have 747 * been reissued, leading to the operation being performed against the 748 * wrong source. 749 * 750 * Params: 751 * tag = a #GSource ID 752 * name = debug name for the source 753 * 754 * Since: 2.26 755 */ 756 public static void setNameById(uint tag, string name) 757 { 758 g_source_set_name_by_id(tag, Str.toStringz(name)); 759 } 760 }