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 gio.Application; 26 27 private import gio.ActionGroupIF; 28 private import gio.ActionGroupT; 29 private import gio.ActionMapIF; 30 private import gio.ActionMapT; 31 private import gio.ApplicationCommandLine; 32 private import gio.Cancellable; 33 private import gio.DBusConnection; 34 private import gio.File; 35 private import gio.FileIF; 36 private import gio.Notification; 37 private import glib.ConstructionException; 38 private import glib.ErrorG; 39 private import glib.GException; 40 private import glib.OptionGroup; 41 private import glib.Str; 42 private import glib.VariantDict; 43 private import gobject.ObjectG; 44 private import gobject.Signals; 45 public import gtkc.gdktypes; 46 private import gtkc.gio; 47 public import gtkc.giotypes; 48 49 50 /** 51 * A #GApplication is the foundation of an application. It wraps some 52 * low-level platform-specific services and is intended to act as the 53 * foundation for higher-level application classes such as 54 * #GtkApplication or #MxApplication. In general, you should not use 55 * this class outside of a higher level framework. 56 * 57 * GApplication provides convenient life cycle management by maintaining 58 * a "use count" for the primary application instance. The use count can 59 * be changed using g_application_hold() and g_application_release(). If 60 * it drops to zero, the application exits. Higher-level classes such as 61 * #GtkApplication employ the use count to ensure that the application 62 * stays alive as long as it has any opened windows. 63 * 64 * Another feature that GApplication (optionally) provides is process 65 * uniqueness. Applications can make use of this functionality by 66 * providing a unique application ID. If given, only one application 67 * with this ID can be running at a time per session. The session 68 * concept is platform-dependent, but corresponds roughly to a graphical 69 * desktop login. When your application is launched again, its 70 * arguments are passed through platform communication to the already 71 * running program. The already running instance of the program is 72 * called the "primary instance"; for non-unique applications this is 73 * the always the current instance. On Linux, the D-Bus session bus 74 * is used for communication. 75 * 76 * The use of #GApplication differs from some other commonly-used 77 * uniqueness libraries (such as libunique) in important ways. The 78 * application is not expected to manually register itself and check 79 * if it is the primary instance. Instead, the main() function of a 80 * #GApplication should do very little more than instantiating the 81 * application instance, possibly connecting signal handlers, then 82 * calling g_application_run(). All checks for uniqueness are done 83 * internally. If the application is the primary instance then the 84 * startup signal is emitted and the mainloop runs. If the application 85 * is not the primary instance then a signal is sent to the primary 86 * instance and g_application_run() promptly returns. See the code 87 * examples below. 88 * 89 * If used, the expected form of an application identifier is very close 90 * to that of of a 91 * [DBus bus name](http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names-interface). 92 * Examples include: "com.example.MyApp", "org.example.internal-apps.Calculator". 93 * For details on valid application identifiers, see g_application_id_is_valid(). 94 * 95 * On Linux, the application identifier is claimed as a well-known bus name 96 * on the user's session bus. This means that the uniqueness of your 97 * application is scoped to the current session. It also means that your 98 * application may provide additional services (through registration of other 99 * object paths) at that bus name. The registration of these object paths 100 * should be done with the shared GDBus session bus. Note that due to the 101 * internal architecture of GDBus, method calls can be dispatched at any time 102 * (even if a main loop is not running). For this reason, you must ensure that 103 * any object paths that you wish to register are registered before #GApplication 104 * attempts to acquire the bus name of your application (which happens in 105 * g_application_register()). Unfortunately, this means that you cannot use 106 * g_application_get_is_remote() to decide if you want to register object paths. 107 * 108 * GApplication also implements the #GActionGroup and #GActionMap 109 * interfaces and lets you easily export actions by adding them with 110 * g_action_map_add_action(). When invoking an action by calling 111 * g_action_group_activate_action() on the application, it is always 112 * invoked in the primary instance. The actions are also exported on 113 * the session bus, and GIO provides the #GDBusActionGroup wrapper to 114 * conveniently access them remotely. GIO provides a #GDBusMenuModel wrapper 115 * for remote access to exported #GMenuModels. 116 * 117 * There is a number of different entry points into a GApplication: 118 * 119 * - via 'Activate' (i.e. just starting the application) 120 * 121 * - via 'Open' (i.e. opening some files) 122 * 123 * - by handling a command-line 124 * 125 * - via activating an action 126 * 127 * The #GApplication::startup signal lets you handle the application 128 * initialization for all of these in a single place. 129 * 130 * Regardless of which of these entry points is used to start the 131 * application, GApplication passes some "platform data from the 132 * launching instance to the primary instance, in the form of a 133 * #GVariant dictionary mapping strings to variants. To use platform 134 * data, override the @before_emit or @after_emit virtual functions 135 * in your #GApplication subclass. When dealing with 136 * #GApplicationCommandLine objects, the platform data is 137 * directly available via g_application_command_line_get_cwd(), 138 * g_application_command_line_get_environ() and 139 * g_application_command_line_get_platform_data(). 140 * 141 * As the name indicates, the platform data may vary depending on the 142 * operating system, but it always includes the current directory (key 143 * "cwd"), and optionally the environment (ie the set of environment 144 * variables and their values) of the calling process (key "environ"). 145 * The environment is only added to the platform data if the 146 * %G_APPLICATION_SEND_ENVIRONMENT flag is set. #GApplication subclasses 147 * can add their own platform data by overriding the @add_platform_data 148 * virtual function. For instance, #GtkApplication adds startup notification 149 * data in this way. 150 * 151 * To parse commandline arguments you may handle the 152 * #GApplication::command-line signal or override the local_command_line() 153 * vfunc, to parse them in either the primary instance or the local instance, 154 * respectively. 155 * 156 * For an example of opening files with a GApplication, see 157 * [gapplication-example-open.c](https://git.gnome.org/browse/glib/tree/gio/tests/gapplication-example-open.c). 158 * 159 * For an example of using actions with GApplication, see 160 * [gapplication-example-actions.c](https://git.gnome.org/browse/glib/tree/gio/tests/gapplication-example-actions.c). 161 * 162 * For an example of using extra D-Bus hooks with GApplication, see 163 * [gapplication-example-dbushooks.c](https://git.gnome.org/browse/glib/tree/gio/tests/gapplication-example-dbushooks.c). 164 * 165 * Since: 2.28 166 */ 167 public class Application : ObjectG, ActionGroupIF, ActionMapIF 168 { 169 /** the main Gtk struct */ 170 protected GApplication* gApplication; 171 172 /** Get the main Gtk struct */ 173 public GApplication* getApplicationStruct() 174 { 175 return gApplication; 176 } 177 178 /** the main Gtk struct as a void* */ 179 protected override void* getStruct() 180 { 181 return cast(void*)gApplication; 182 } 183 184 protected override void setStruct(GObject* obj) 185 { 186 gApplication = cast(GApplication*)obj; 187 super.setStruct(obj); 188 } 189 190 /** 191 * Sets our main struct and passes it to the parent class. 192 */ 193 public this (GApplication* gApplication, bool ownedRef = false) 194 { 195 this.gApplication = gApplication; 196 super(cast(GObject*)gApplication, ownedRef); 197 } 198 199 // add the ActionGroup capabilities 200 mixin ActionGroupT!(GApplication); 201 202 // add the ActionMap capabilities 203 mixin ActionMapT!(GApplication); 204 205 int delegate(Scoped!ApplicationCommandLine, Application)[] scopedOnCommandLineListeners; 206 /** 207 * The ::command-line signal is emitted on the primary instance when 208 * a commandline is not handled locally. See g_application_run() and 209 * the #GApplicationCommandLine documentation for more information. 210 * 211 * Params: 212 * commandLine = a #GApplicationCommandLine representing the 213 * passed commandline 214 * 215 * Return: An integer that is set as the exit status for the calling 216 * process. See g_application_command_line_set_exit_status(). 217 */ 218 void addOnCommandLine(int delegate(Scoped!ApplicationCommandLine, Application) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0) 219 { 220 if ( "command-line-scoped" !in connectedSignals ) 221 { 222 Signals.connectData( 223 this, 224 "command-line", 225 cast(GCallback)&callBackScopedCommandLine, 226 cast(void*)this, 227 null, 228 connectFlags); 229 connectedSignals["command-line-scoped"] = 1; 230 } 231 scopedOnCommandLineListeners ~= dlg; 232 } 233 extern(C) static int callBackScopedCommandLine(GApplication* applicationStruct, GApplicationCommandLine* commandLine, Application _application) 234 { 235 return _application.onCommandLineListeners[0](scoped!ApplicationCommandLine(commandLine), _application); 236 } 237 238 /** 239 */ 240 241 /** */ 242 public static GType getType() 243 { 244 return g_application_get_type(); 245 } 246 247 /** 248 * Creates a new #GApplication instance. 249 * 250 * If non-%NULL, the application id must be valid. See 251 * g_application_id_is_valid(). 252 * 253 * If no application ID is given then some features of #GApplication 254 * (most notably application uniqueness) will be disabled. 255 * 256 * Params: 257 * applicationId = the application id 258 * flags = the application flags 259 * 260 * Return: a new #GApplication instance 261 * 262 * Throws: ConstructionException GTK+ fails to create the object. 263 */ 264 public this(string applicationId, GApplicationFlags flags) 265 { 266 auto p = g_application_new(Str.toStringz(applicationId), flags); 267 268 if(p is null) 269 { 270 throw new ConstructionException("null returned by new"); 271 } 272 273 this(cast(GApplication*) p, true); 274 } 275 276 /** 277 * Returns the default #GApplication instance for this process. 278 * 279 * Normally there is only one #GApplication per process and it becomes 280 * the default when it is created. You can exercise more control over 281 * this by using g_application_set_default(). 282 * 283 * If there is no default application then %NULL is returned. 284 * 285 * Return: the default application for this process, or %NULL 286 * 287 * Since: 2.32 288 */ 289 public static Application getDefault() 290 { 291 auto p = g_application_get_default(); 292 293 if(p is null) 294 { 295 return null; 296 } 297 298 return ObjectG.getDObject!(Application)(cast(GApplication*) p); 299 } 300 301 /** 302 * Checks if @application_id is a valid application identifier. 303 * 304 * A valid ID is required for calls to g_application_new() and 305 * g_application_set_application_id(). 306 * 307 * For convenience, the restrictions on application identifiers are 308 * reproduced here: 309 * 310 * - Application identifiers must contain only the ASCII characters 311 * "[A-Z][a-z][0-9]_-." and must not begin with a digit. 312 * 313 * - Application identifiers must contain at least one '.' (period) 314 * character (and thus at least three elements). 315 * 316 * - Application identifiers must not begin or end with a '.' (period) 317 * character. 318 * 319 * - Application identifiers must not contain consecutive '.' (period) 320 * characters. 321 * 322 * - Application identifiers must not exceed 255 characters. 323 * 324 * Params: 325 * applicationId = a potential application identifier 326 * 327 * Return: %TRUE if @application_id is valid 328 */ 329 public static bool idIsValid(string applicationId) 330 { 331 return g_application_id_is_valid(Str.toStringz(applicationId)) != 0; 332 } 333 334 /** 335 * Activates the application. 336 * 337 * In essence, this results in the #GApplication::activate signal being 338 * emitted in the primary instance. 339 * 340 * The application must be registered before calling this function. 341 * 342 * Since: 2.28 343 */ 344 public void activate() 345 { 346 g_application_activate(gApplication); 347 } 348 349 /** 350 * Add an option to be handled by @application. 351 * 352 * Calling this function is the equivalent of calling 353 * g_application_add_main_option_entries() with a single #GOptionEntry 354 * that has its arg_data member set to %NULL. 355 * 356 * The parsed arguments will be packed into a #GVariantDict which 357 * is passed to #GApplication::handle-local-options. If 358 * %G_APPLICATION_HANDLES_COMMAND_LINE is set, then it will also 359 * be sent to the primary instance. See 360 * g_application_add_main_option_entries() for more details. 361 * 362 * See #GOptionEntry for more documentation of the arguments. 363 * 364 * Params: 365 * longName = the long name of an option used to specify it in a commandline 366 * shortName = the short name of an option 367 * flags = flags from #GOptionFlags 368 * arg = the type of the option, as a #GOptionArg 369 * description = the description for the option in `--help` output 370 * argDescription = the placeholder to use for the extra argument 371 * parsed by the option in `--help` output 372 * 373 * Since: 2.42 374 */ 375 public void addMainOption(string longName, char shortName, GOptionFlags flags, GOptionArg arg, string description, string argDescription) 376 { 377 g_application_add_main_option(gApplication, Str.toStringz(longName), shortName, flags, arg, Str.toStringz(description), Str.toStringz(argDescription)); 378 } 379 380 /** 381 * Adds main option entries to be handled by @application. 382 * 383 * This function is comparable to g_option_context_add_main_entries(). 384 * 385 * After the commandline arguments are parsed, the 386 * #GApplication::handle-local-options signal will be emitted. At this 387 * point, the application can inspect the values pointed to by @arg_data 388 * in the given #GOptionEntrys. 389 * 390 * Unlike #GOptionContext, #GApplication supports giving a %NULL 391 * @arg_data for a non-callback #GOptionEntry. This results in the 392 * argument in question being packed into a #GVariantDict which is also 393 * passed to #GApplication::handle-local-options, where it can be 394 * inspected and modified. If %G_APPLICATION_HANDLES_COMMAND_LINE is 395 * set, then the resulting dictionary is sent to the primary instance, 396 * where g_application_command_line_get_options_dict() will return it. 397 * This "packing" is done according to the type of the argument -- 398 * booleans for normal flags, strings for strings, bytestrings for 399 * filenames, etc. The packing only occurs if the flag is given (ie: we 400 * do not pack a "false" #GVariant in the case that a flag is missing). 401 * 402 * In general, it is recommended that all commandline arguments are 403 * parsed locally. The options dictionary should then be used to 404 * transmit the result of the parsing to the primary instance, where 405 * g_variant_dict_lookup() can be used. For local options, it is 406 * possible to either use @arg_data in the usual way, or to consult (and 407 * potentially remove) the option from the options dictionary. 408 * 409 * This function is new in GLib 2.40. Before then, the only real choice 410 * was to send all of the commandline arguments (options and all) to the 411 * primary instance for handling. #GApplication ignored them completely 412 * on the local side. Calling this function "opts in" to the new 413 * behaviour, and in particular, means that unrecognised options will be 414 * treated as errors. Unrecognised options have never been ignored when 415 * %G_APPLICATION_HANDLES_COMMAND_LINE is unset. 416 * 417 * If #GApplication::handle-local-options needs to see the list of 418 * filenames, then the use of %G_OPTION_REMAINING is recommended. If 419 * @arg_data is %NULL then %G_OPTION_REMAINING can be used as a key into 420 * the options dictionary. If you do use %G_OPTION_REMAINING then you 421 * need to handle these arguments for yourself because once they are 422 * consumed, they will no longer be visible to the default handling 423 * (which treats them as filenames to be opened). 424 * 425 * Params: 426 * entries = a 427 * %NULL-terminated list of #GOptionEntrys 428 * 429 * Since: 2.40 430 */ 431 public void addMainOptionEntries(GOptionEntry[] entries) 432 { 433 g_application_add_main_option_entries(gApplication, entries.ptr); 434 } 435 436 /** 437 * Adds a #GOptionGroup to the commandline handling of @application. 438 * 439 * This function is comparable to g_option_context_add_group(). 440 * 441 * Unlike g_application_add_main_option_entries(), this function does 442 * not deal with %NULL @arg_data and never transmits options to the 443 * primary instance. 444 * 445 * The reason for that is because, by the time the options arrive at the 446 * primary instance, it is typically too late to do anything with them. 447 * Taking the GTK option group as an example: GTK will already have been 448 * initialised by the time the #GApplication::command-line handler runs. 449 * In the case that this is not the first-running instance of the 450 * application, the existing instance may already have been running for 451 * a very long time. 452 * 453 * This means that the options from #GOptionGroup are only really usable 454 * in the case that the instance of the application being run is the 455 * first instance. Passing options like `--display=` or `--gdk-debug=` 456 * on future runs will have no effect on the existing primary instance. 457 * 458 * Calling this function will cause the options in the supplied option 459 * group to be parsed, but it does not cause you to be "opted in" to the 460 * new functionality whereby unrecognised options are rejected even if 461 * %G_APPLICATION_HANDLES_COMMAND_LINE was given. 462 * 463 * Params: 464 * group = a #GOptionGroup 465 * 466 * Since: 2.40 467 */ 468 public void addOptionGroup(OptionGroup group) 469 { 470 g_application_add_option_group(gApplication, (group is null) ? null : group.getOptionGroupStruct()); 471 } 472 473 /** 474 * Marks @application as busy (see g_application_mark_busy()) while 475 * @property on @object is %TRUE. 476 * 477 * The binding holds a reference to @application while it is active, but 478 * not to @object. Instead, the binding is destroyed when @object is 479 * finalized. 480 * 481 * Params: 482 * object = a #GObject 483 * property = the name of a boolean property of @object 484 * 485 * Since: 2.44 486 */ 487 public void bindBusyProperty(ObjectG object, string property) 488 { 489 g_application_bind_busy_property(gApplication, (object is null) ? null : object.getObjectGStruct(), Str.toStringz(property)); 490 } 491 492 /** 493 * Gets the unique identifier for @application. 494 * 495 * Return: the identifier for @application, owned by @application 496 * 497 * Since: 2.28 498 */ 499 public string getApplicationId() 500 { 501 return Str.toString(g_application_get_application_id(gApplication)); 502 } 503 504 /** 505 * Gets the #GDBusConnection being used by the application, or %NULL. 506 * 507 * If #GApplication is using its D-Bus backend then this function will 508 * return the #GDBusConnection being used for uniqueness and 509 * communication with the desktop environment and other instances of the 510 * application. 511 * 512 * If #GApplication is not using D-Bus then this function will return 513 * %NULL. This includes the situation where the D-Bus backend would 514 * normally be in use but we were unable to connect to the bus. 515 * 516 * This function must not be called before the application has been 517 * registered. See g_application_get_is_registered(). 518 * 519 * Return: a #GDBusConnection, or %NULL 520 * 521 * Since: 2.34 522 */ 523 public DBusConnection getDbusConnection() 524 { 525 auto p = g_application_get_dbus_connection(gApplication); 526 527 if(p is null) 528 { 529 return null; 530 } 531 532 return ObjectG.getDObject!(DBusConnection)(cast(GDBusConnection*) p); 533 } 534 535 /** 536 * Gets the D-Bus object path being used by the application, or %NULL. 537 * 538 * If #GApplication is using its D-Bus backend then this function will 539 * return the D-Bus object path that #GApplication is using. If the 540 * application is the primary instance then there is an object published 541 * at this path. If the application is not the primary instance then 542 * the result of this function is undefined. 543 * 544 * If #GApplication is not using D-Bus then this function will return 545 * %NULL. This includes the situation where the D-Bus backend would 546 * normally be in use but we were unable to connect to the bus. 547 * 548 * This function must not be called before the application has been 549 * registered. See g_application_get_is_registered(). 550 * 551 * Return: the object path, or %NULL 552 * 553 * Since: 2.34 554 */ 555 public string getDbusObjectPath() 556 { 557 return Str.toString(g_application_get_dbus_object_path(gApplication)); 558 } 559 560 /** 561 * Gets the flags for @application. 562 * 563 * See #GApplicationFlags. 564 * 565 * Return: the flags for @application 566 * 567 * Since: 2.28 568 */ 569 public GApplicationFlags getFlags() 570 { 571 return g_application_get_flags(gApplication); 572 } 573 574 /** 575 * Gets the current inactivity timeout for the application. 576 * 577 * This is the amount of time (in milliseconds) after the last call to 578 * g_application_release() before the application stops running. 579 * 580 * Return: the timeout, in milliseconds 581 * 582 * Since: 2.28 583 */ 584 public uint getInactivityTimeout() 585 { 586 return g_application_get_inactivity_timeout(gApplication); 587 } 588 589 /** 590 * Gets the application's current busy state, as set through 591 * g_application_mark_busy() or g_application_bind_busy_property(). 592 * 593 * Return: %TRUE if @application is currenty marked as busy 594 * 595 * Since: 2.44 596 */ 597 public bool getIsBusy() 598 { 599 return g_application_get_is_busy(gApplication) != 0; 600 } 601 602 /** 603 * Checks if @application is registered. 604 * 605 * An application is registered if g_application_register() has been 606 * successfully called. 607 * 608 * Return: %TRUE if @application is registered 609 * 610 * Since: 2.28 611 */ 612 public bool getIsRegistered() 613 { 614 return g_application_get_is_registered(gApplication) != 0; 615 } 616 617 /** 618 * Checks if @application is remote. 619 * 620 * If @application is remote then it means that another instance of 621 * application already exists (the 'primary' instance). Calls to 622 * perform actions on @application will result in the actions being 623 * performed by the primary instance. 624 * 625 * The value of this property cannot be accessed before 626 * g_application_register() has been called. See 627 * g_application_get_is_registered(). 628 * 629 * Return: %TRUE if @application is remote 630 * 631 * Since: 2.28 632 */ 633 public bool getIsRemote() 634 { 635 return g_application_get_is_remote(gApplication) != 0; 636 } 637 638 /** 639 * Gets the resource base path of @application. 640 * 641 * See g_application_set_resource_base_path() for more information. 642 * 643 * Return: the base resource path, if one is set 644 * 645 * Since: 2.42 646 */ 647 public string getResourceBasePath() 648 { 649 return Str.toString(g_application_get_resource_base_path(gApplication)); 650 } 651 652 /** 653 * Increases the use count of @application. 654 * 655 * Use this function to indicate that the application has a reason to 656 * continue to run. For example, g_application_hold() is called by GTK+ 657 * when a toplevel window is on the screen. 658 * 659 * To cancel the hold, call g_application_release(). 660 */ 661 public void hold() 662 { 663 g_application_hold(gApplication); 664 } 665 666 /** 667 * Increases the busy count of @application. 668 * 669 * Use this function to indicate that the application is busy, for instance 670 * while a long running operation is pending. 671 * 672 * The busy state will be exposed to other processes, so a session shell will 673 * use that information to indicate the state to the user (e.g. with a 674 * spinner). 675 * 676 * To cancel the busy indication, use g_application_unmark_busy(). 677 * 678 * Since: 2.38 679 */ 680 public void markBusy() 681 { 682 g_application_mark_busy(gApplication); 683 } 684 685 /** 686 * Opens the given files. 687 * 688 * In essence, this results in the #GApplication::open signal being emitted 689 * in the primary instance. 690 * 691 * @n_files must be greater than zero. 692 * 693 * @hint is simply passed through to the ::open signal. It is 694 * intended to be used by applications that have multiple modes for 695 * opening files (eg: "view" vs "edit", etc). Unless you have a need 696 * for this functionality, you should use "". 697 * 698 * The application must be registered before calling this function 699 * and it must have the %G_APPLICATION_HANDLES_OPEN flag set. 700 * 701 * Params: 702 * files = an array of #GFiles to open 703 * nFiles = the length of the @files array 704 * hint = a hint (or ""), but never %NULL 705 * 706 * Since: 2.28 707 */ 708 public void open(FileIF[] files, string hint) 709 { 710 GFile*[] filesArray = new GFile*[files.length]; 711 for ( int i = 0; i < files.length; i++ ) 712 { 713 filesArray[i] = files[i].getFileStruct(); 714 } 715 716 g_application_open(gApplication, filesArray.ptr, cast(int)files.length, Str.toStringz(hint)); 717 } 718 719 /** 720 * Immediately quits the application. 721 * 722 * Upon return to the mainloop, g_application_run() will return, 723 * calling only the 'shutdown' function before doing so. 724 * 725 * The hold count is ignored. 726 * 727 * The result of calling g_application_run() again after it returns is 728 * unspecified. 729 * 730 * Since: 2.32 731 */ 732 public void quit() 733 { 734 g_application_quit(gApplication); 735 } 736 737 /** 738 * Attempts registration of the application. 739 * 740 * This is the point at which the application discovers if it is the 741 * primary instance or merely acting as a remote for an already-existing 742 * primary instance. This is implemented by attempting to acquire the 743 * application identifier as a unique bus name on the session bus using 744 * GDBus. 745 * 746 * If there is no application ID or if %G_APPLICATION_NON_UNIQUE was 747 * given, then this process will always become the primary instance. 748 * 749 * Due to the internal architecture of GDBus, method calls can be 750 * dispatched at any time (even if a main loop is not running). For 751 * this reason, you must ensure that any object paths that you wish to 752 * register are registered before calling this function. 753 * 754 * If the application has already been registered then %TRUE is 755 * returned with no work performed. 756 * 757 * The #GApplication::startup signal is emitted if registration succeeds 758 * and @application is the primary instance (including the non-unique 759 * case). 760 * 761 * In the event of an error (such as @cancellable being cancelled, or a 762 * failure to connect to the session bus), %FALSE is returned and @error 763 * is set appropriately. 764 * 765 * Note: the return value of this function is not an indicator that this 766 * instance is or is not the primary instance of the application. See 767 * g_application_get_is_remote() for that. 768 * 769 * Params: 770 * cancellable = a #GCancellable, or %NULL 771 * 772 * Return: %TRUE if registration succeeded 773 * 774 * Since: 2.28 775 * 776 * Throws: GException on failure. 777 */ 778 public bool register(Cancellable cancellable) 779 { 780 GError* err = null; 781 782 auto p = g_application_register(gApplication, (cancellable is null) ? null : cancellable.getCancellableStruct(), &err) != 0; 783 784 if (err !is null) 785 { 786 throw new GException( new ErrorG(err) ); 787 } 788 789 return p; 790 } 791 792 /** 793 * Decrease the use count of @application. 794 * 795 * When the use count reaches zero, the application will stop running. 796 * 797 * Never call this function except to cancel the effect of a previous 798 * call to g_application_hold(). 799 */ 800 public void release() 801 { 802 g_application_release(gApplication); 803 } 804 805 /** 806 * Runs the application. 807 * 808 * This function is intended to be run from main() and its return value 809 * is intended to be returned by main(). Although you are expected to pass 810 * the @argc, @argv parameters from main() to this function, it is possible 811 * to pass %NULL if @argv is not available or commandline handling is not 812 * required. Note that on Windows, @argc and @argv are ignored, and 813 * g_win32_get_command_line() is called internally (for proper support 814 * of Unicode commandline arguments). 815 * 816 * #GApplication will attempt to parse the commandline arguments. You 817 * can add commandline flags to the list of recognised options by way of 818 * g_application_add_main_option_entries(). After this, the 819 * #GApplication::handle-local-options signal is emitted, from which the 820 * application can inspect the values of its #GOptionEntrys. 821 * 822 * #GApplication::handle-local-options is a good place to handle options 823 * such as `--version`, where an immediate reply from the local process is 824 * desired (instead of communicating with an already-running instance). 825 * A #GApplication::handle-local-options handler can stop further processing 826 * by returning a non-negative value, which then becomes the exit status of 827 * the process. 828 * 829 * What happens next depends on the flags: if 830 * %G_APPLICATION_HANDLES_COMMAND_LINE was specified then the remaining 831 * commandline arguments are sent to the primary instance, where a 832 * #GApplication::command-line signal is emitted. Otherwise, the 833 * remaining commandline arguments are assumed to be a list of files. 834 * If there are no files listed, the application is activated via the 835 * #GApplication::activate signal. If there are one or more files, and 836 * %G_APPLICATION_HANDLES_OPEN was specified then the files are opened 837 * via the #GApplication::open signal. 838 * 839 * If you are interested in doing more complicated local handling of the 840 * commandline then you should implement your own #GApplication subclass 841 * and override local_command_line(). In this case, you most likely want 842 * to return %TRUE from your local_command_line() implementation to 843 * suppress the default handling. See 844 * [gapplication-example-cmdline2.c][gapplication-example-cmdline2] 845 * for an example. 846 * 847 * If, after the above is done, the use count of the application is zero 848 * then the exit status is returned immediately. If the use count is 849 * non-zero then the default main context is iterated until the use count 850 * falls to zero, at which point 0 is returned. 851 * 852 * If the %G_APPLICATION_IS_SERVICE flag is set, then the service will 853 * run for as much as 10 seconds with a use count of zero while waiting 854 * for the message that caused the activation to arrive. After that, 855 * if the use count falls to zero the application will exit immediately, 856 * except in the case that g_application_set_inactivity_timeout() is in 857 * use. 858 * 859 * This function sets the prgname (g_set_prgname()), if not already set, 860 * to the basename of argv[0]. 861 * 862 * Since 2.40, applications that are not explicitly flagged as services 863 * or launchers (ie: neither %G_APPLICATION_IS_SERVICE or 864 * %G_APPLICATION_IS_LAUNCHER are given as flags) will check (from the 865 * default handler for local_command_line) if "--gapplication-service" 866 * was given in the command line. If this flag is present then normal 867 * commandline processing is interrupted and the 868 * %G_APPLICATION_IS_SERVICE flag is set. This provides a "compromise" 869 * solution whereby running an application directly from the commandline 870 * will invoke it in the normal way (which can be useful for debugging) 871 * while still allowing applications to be D-Bus activated in service 872 * mode. The D-Bus service file should invoke the executable with 873 * "--gapplication-service" as the sole commandline argument. This 874 * approach is suitable for use by most graphical applications but 875 * should not be used from applications like editors that need precise 876 * control over when processes invoked via the commandline will exit and 877 * what their exit status will be. 878 * 879 * Params: 880 * argc = the argc from main() (or 0 if @argv is %NULL) 881 * argv = the argv from main(), or %NULL 882 * 883 * Return: the exit status 884 * 885 * Since: 2.28 886 */ 887 public int run(string[] argv) 888 { 889 return g_application_run(gApplication, cast(int)argv.length, Str.toStringzArray(argv)); 890 } 891 892 /** 893 * Sends a notification on behalf of @application to the desktop shell. 894 * There is no guarantee that the notification is displayed immediately, 895 * or even at all. 896 * 897 * Notifications may persist after the application exits. It will be 898 * D-Bus-activated when the notification or one of its actions is 899 * activated. 900 * 901 * Modifying @notification after this call has no effect. However, the 902 * object can be reused for a later call to this function. 903 * 904 * @id may be any string that uniquely identifies the event for the 905 * application. It does not need to be in any special format. For 906 * example, "new-message" might be appropriate for a notification about 907 * new messages. 908 * 909 * If a previous notification was sent with the same @id, it will be 910 * replaced with @notification and shown again as if it was a new 911 * notification. This works even for notifications sent from a previous 912 * execution of the application, as long as @id is the same string. 913 * 914 * @id may be %NULL, but it is impossible to replace or withdraw 915 * notifications without an id. 916 * 917 * If @notification is no longer relevant, it can be withdrawn with 918 * g_application_withdraw_notification(). 919 * 920 * Params: 921 * id = id of the notification, or %NULL 922 * notification = the #GNotification to send 923 * 924 * Since: 2.40 925 */ 926 public void sendNotification(string id, Notification notification) 927 { 928 g_application_send_notification(gApplication, Str.toStringz(id), (notification is null) ? null : notification.getNotificationStruct()); 929 } 930 931 /** 932 * This used to be how actions were associated with a #GApplication. 933 * Now there is #GActionMap for that. 934 * 935 * Deprecated: Use the #GActionMap interface instead. Never ever 936 * mix use of this API with use of #GActionMap on the same @application 937 * or things will go very badly wrong. This function is known to 938 * introduce buggy behaviour (ie: signals not emitted on changes to the 939 * action group), so you should really use #GActionMap instead. 940 * 941 * Params: 942 * actionGroup = a #GActionGroup, or %NULL 943 * 944 * Since: 2.28 945 */ 946 public void setActionGroup(ActionGroupIF actionGroup) 947 { 948 g_application_set_action_group(gApplication, (actionGroup is null) ? null : actionGroup.getActionGroupStruct()); 949 } 950 951 /** 952 * Sets the unique identifier for @application. 953 * 954 * The application id can only be modified if @application has not yet 955 * been registered. 956 * 957 * If non-%NULL, the application id must be valid. See 958 * g_application_id_is_valid(). 959 * 960 * Params: 961 * applicationId = the identifier for @application 962 * 963 * Since: 2.28 964 */ 965 public void setApplicationId(string applicationId) 966 { 967 g_application_set_application_id(gApplication, Str.toStringz(applicationId)); 968 } 969 970 /** 971 * Sets or unsets the default application for the process, as returned 972 * by g_application_get_default(). 973 * 974 * This function does not take its own reference on @application. If 975 * @application is destroyed then the default application will revert 976 * back to %NULL. 977 * 978 * Since: 2.32 979 */ 980 public void setDefault() 981 { 982 g_application_set_default(gApplication); 983 } 984 985 /** 986 * Sets the flags for @application. 987 * 988 * The flags can only be modified if @application has not yet been 989 * registered. 990 * 991 * See #GApplicationFlags. 992 * 993 * Params: 994 * flags = the flags for @application 995 * 996 * Since: 2.28 997 */ 998 public void setFlags(GApplicationFlags flags) 999 { 1000 g_application_set_flags(gApplication, flags); 1001 } 1002 1003 /** 1004 * Sets the current inactivity timeout for the application. 1005 * 1006 * This is the amount of time (in milliseconds) after the last call to 1007 * g_application_release() before the application stops running. 1008 * 1009 * This call has no side effects of its own. The value set here is only 1010 * used for next time g_application_release() drops the use count to 1011 * zero. Any timeouts currently in progress are not impacted. 1012 * 1013 * Params: 1014 * inactivityTimeout = the timeout, in milliseconds 1015 * 1016 * Since: 2.28 1017 */ 1018 public void setInactivityTimeout(uint inactivityTimeout) 1019 { 1020 g_application_set_inactivity_timeout(gApplication, inactivityTimeout); 1021 } 1022 1023 /** 1024 * Sets (or unsets) the base resource path of @application. 1025 * 1026 * The path is used to automatically load various [application 1027 * resources][gresource] such as menu layouts and action descriptions. 1028 * The various types of resources will be found at fixed names relative 1029 * to the given base path. 1030 * 1031 * By default, the resource base path is determined from the application 1032 * ID by prefixing '/' and replacing each '.' with '/'. This is done at 1033 * the time that the #GApplication object is constructed. Changes to 1034 * the application ID after that point will not have an impact on the 1035 * resource base path. 1036 * 1037 * As an example, if the application has an ID of "org.example.app" then 1038 * the default resource base path will be "/org/example/app". If this 1039 * is a #GtkApplication (and you have not manually changed the path) 1040 * then Gtk will then search for the menus of the application at 1041 * "/org/example/app/gtk/menus.ui". 1042 * 1043 * See #GResource for more information about adding resources to your 1044 * application. 1045 * 1046 * You can disable automatic resource loading functionality by setting 1047 * the path to %NULL. 1048 * 1049 * Changing the resource base path once the application is running is 1050 * not recommended. The point at which the resource path is consulted 1051 * for forming paths for various purposes is unspecified. 1052 * 1053 * Params: 1054 * resourcePath = the resource path to use 1055 * 1056 * Since: 2.42 1057 */ 1058 public void setResourceBasePath(string resourcePath) 1059 { 1060 g_application_set_resource_base_path(gApplication, Str.toStringz(resourcePath)); 1061 } 1062 1063 /** 1064 * Destroys a binding between @property and the busy state of 1065 * @application that was previously created with 1066 * g_application_bind_busy_property(). 1067 * 1068 * Params: 1069 * object = a #GObject 1070 * property = the name of a boolean property of @object 1071 * 1072 * Since: 2.44 1073 */ 1074 public void unbindBusyProperty(ObjectG object, string property) 1075 { 1076 g_application_unbind_busy_property(gApplication, (object is null) ? null : object.getObjectGStruct(), Str.toStringz(property)); 1077 } 1078 1079 /** 1080 * Decreases the busy count of @application. 1081 * 1082 * When the busy count reaches zero, the new state will be propagated 1083 * to other processes. 1084 * 1085 * This function must only be called to cancel the effect of a previous 1086 * call to g_application_mark_busy(). 1087 * 1088 * Since: 2.38 1089 */ 1090 public void unmarkBusy() 1091 { 1092 g_application_unmark_busy(gApplication); 1093 } 1094 1095 /** 1096 * Withdraws a notification that was sent with 1097 * g_application_send_notification(). 1098 * 1099 * This call does nothing if a notification with @id doesn't exist or 1100 * the notification was never sent. 1101 * 1102 * This function works even for notifications sent in previous 1103 * executions of this application, as long @id is the same as it was for 1104 * the sent notification. 1105 * 1106 * Note that notifications are dismissed when the user clicks on one 1107 * of the buttons in a notification or triggers its default action, so 1108 * there is no need to explicitly withdraw the notification in that case. 1109 * 1110 * Params: 1111 * id = id of a previously sent notification 1112 * 1113 * Since: 2.40 1114 */ 1115 public void withdrawNotification(string id) 1116 { 1117 g_application_withdraw_notification(gApplication, Str.toStringz(id)); 1118 } 1119 1120 int[string] connectedSignals; 1121 1122 void delegate(Application)[] onActivateListeners; 1123 /** 1124 * The ::activate signal is emitted on the primary instance when an 1125 * activation occurs. See g_application_activate(). 1126 */ 1127 void addOnActivate(void delegate(Application) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0) 1128 { 1129 if ( "activate" !in connectedSignals ) 1130 { 1131 Signals.connectData( 1132 this, 1133 "activate", 1134 cast(GCallback)&callBackActivate, 1135 cast(void*)this, 1136 null, 1137 connectFlags); 1138 connectedSignals["activate"] = 1; 1139 } 1140 onActivateListeners ~= dlg; 1141 } 1142 extern(C) static void callBackActivate(GApplication* applicationStruct, Application _application) 1143 { 1144 foreach ( void delegate(Application) dlg; _application.onActivateListeners ) 1145 { 1146 dlg(_application); 1147 } 1148 } 1149 1150 int delegate(ApplicationCommandLine, Application)[] onCommandLineListeners; 1151 /** 1152 * The ::command-line signal is emitted on the primary instance when 1153 * a commandline is not handled locally. See g_application_run() and 1154 * the #GApplicationCommandLine documentation for more information. 1155 * 1156 * Params: 1157 * commandLine = a #GApplicationCommandLine representing the 1158 * passed commandline 1159 * 1160 * Return: An integer that is set as the exit status for the calling 1161 * process. See g_application_command_line_set_exit_status(). 1162 */ 1163 void addOnCommandLine(int delegate(ApplicationCommandLine, Application) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0) 1164 { 1165 if ( "command-line" !in connectedSignals ) 1166 { 1167 Signals.connectData( 1168 this, 1169 "command-line", 1170 cast(GCallback)&callBackCommandLine, 1171 cast(void*)this, 1172 null, 1173 connectFlags); 1174 connectedSignals["command-line"] = 1; 1175 } 1176 onCommandLineListeners ~= dlg; 1177 } 1178 extern(C) static int callBackCommandLine(GApplication* applicationStruct, GApplicationCommandLine* commandLine, Application _application) 1179 { 1180 return _application.onCommandLineListeners[0](ObjectG.getDObject!(ApplicationCommandLine)(commandLine), _application); 1181 } 1182 1183 int delegate(VariantDict, Application)[] onHandleLocalOptionsListeners; 1184 /** 1185 * The ::handle-local-options signal is emitted on the local instance 1186 * after the parsing of the commandline options has occurred. 1187 * 1188 * You can add options to be recognised during commandline option 1189 * parsing using g_application_add_main_option_entries() and 1190 * g_application_add_option_group(). 1191 * 1192 * Signal handlers can inspect @options (along with values pointed to 1193 * from the @arg_data of an installed #GOptionEntrys) in order to 1194 * decide to perform certain actions, including direct local handling 1195 * (which may be useful for options like --version). 1196 * 1197 * In the event that the application is marked 1198 * %G_APPLICATION_HANDLES_COMMAND_LINE the "normal processing" will 1199 * send the @options dictionary to the primary instance where it can be 1200 * read with g_application_command_line_get_options_dict(). The signal 1201 * handler can modify the dictionary before returning, and the 1202 * modified dictionary will be sent. 1203 * 1204 * In the event that %G_APPLICATION_HANDLES_COMMAND_LINE is not set, 1205 * "normal processing" will treat the remaining uncollected command 1206 * line arguments as filenames or URIs. If there are no arguments, 1207 * the application is activated by g_application_activate(). One or 1208 * more arguments results in a call to g_application_open(). 1209 * 1210 * If you want to handle the local commandline arguments for yourself 1211 * by converting them to calls to g_application_open() or 1212 * g_action_group_activate_action() then you must be sure to register 1213 * the application first. You should probably not call 1214 * g_application_activate() for yourself, however: just return -1 and 1215 * allow the default handler to do it for you. This will ensure that 1216 * the `--gapplication-service` switch works properly (i.e. no activation 1217 * in that case). 1218 * 1219 * Note that this signal is emitted from the default implementation of 1220 * local_command_line(). If you override that function and don't 1221 * chain up then this signal will never be emitted. 1222 * 1223 * You can override local_command_line() if you need more powerful 1224 * capabilities than what is provided here, but this should not 1225 * normally be required. 1226 * 1227 * Params: 1228 * options = the options dictionary 1229 * 1230 * Return: an exit code. If you have handled your options and want 1231 * to exit the process, return a non-negative option, 0 for success, 1232 * and a positive value for failure. To continue, return -1 to let 1233 * the default option processing continue. 1234 * 1235 * Since: 2.40 1236 */ 1237 void addOnHandleLocalOptions(int delegate(VariantDict, Application) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0) 1238 { 1239 if ( "handle-local-options" !in connectedSignals ) 1240 { 1241 Signals.connectData( 1242 this, 1243 "handle-local-options", 1244 cast(GCallback)&callBackHandleLocalOptions, 1245 cast(void*)this, 1246 null, 1247 connectFlags); 1248 connectedSignals["handle-local-options"] = 1; 1249 } 1250 onHandleLocalOptionsListeners ~= dlg; 1251 } 1252 extern(C) static int callBackHandleLocalOptions(GApplication* applicationStruct, GVariantDict* options, Application _application) 1253 { 1254 return _application.onHandleLocalOptionsListeners[0](new VariantDict(options), _application); 1255 } 1256 1257 void delegate(void*, int, string, Application)[] onOpenListeners; 1258 /** 1259 * The ::open signal is emitted on the primary instance when there are 1260 * files to open. See g_application_open() for more information. 1261 * 1262 * Params: 1263 * files = an array of #GFiles 1264 * nFiles = the length of @files 1265 * hint = a hint provided by the calling instance 1266 */ 1267 void addOnOpen(void delegate(void*, int, string, Application) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0) 1268 { 1269 if ( "open" !in connectedSignals ) 1270 { 1271 Signals.connectData( 1272 this, 1273 "open", 1274 cast(GCallback)&callBackOpen, 1275 cast(void*)this, 1276 null, 1277 connectFlags); 1278 connectedSignals["open"] = 1; 1279 } 1280 onOpenListeners ~= dlg; 1281 } 1282 extern(C) static void callBackOpen(GApplication* applicationStruct, void* files, int nFiles, char* hint, Application _application) 1283 { 1284 foreach ( void delegate(void*, int, string, Application) dlg; _application.onOpenListeners ) 1285 { 1286 dlg(files, nFiles, Str.toString(hint), _application); 1287 } 1288 } 1289 1290 void delegate(Application)[] onShutdownListeners; 1291 /** 1292 * The ::shutdown signal is emitted only on the registered primary instance 1293 * immediately after the main loop terminates. 1294 */ 1295 void addOnShutdown(void delegate(Application) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0) 1296 { 1297 if ( "shutdown" !in connectedSignals ) 1298 { 1299 Signals.connectData( 1300 this, 1301 "shutdown", 1302 cast(GCallback)&callBackShutdown, 1303 cast(void*)this, 1304 null, 1305 connectFlags); 1306 connectedSignals["shutdown"] = 1; 1307 } 1308 onShutdownListeners ~= dlg; 1309 } 1310 extern(C) static void callBackShutdown(GApplication* applicationStruct, Application _application) 1311 { 1312 foreach ( void delegate(Application) dlg; _application.onShutdownListeners ) 1313 { 1314 dlg(_application); 1315 } 1316 } 1317 1318 void delegate(Application)[] onStartupListeners; 1319 /** 1320 * The ::startup signal is emitted on the primary instance immediately 1321 * after registration. See g_application_register(). 1322 */ 1323 void addOnStartup(void delegate(Application) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0) 1324 { 1325 if ( "startup" !in connectedSignals ) 1326 { 1327 Signals.connectData( 1328 this, 1329 "startup", 1330 cast(GCallback)&callBackStartup, 1331 cast(void*)this, 1332 null, 1333 connectFlags); 1334 connectedSignals["startup"] = 1; 1335 } 1336 onStartupListeners ~= dlg; 1337 } 1338 extern(C) static void callBackStartup(GApplication* applicationStruct, Application _application) 1339 { 1340 foreach ( void delegate(Application) dlg; _application.onStartupListeners ) 1341 { 1342 dlg(_application); 1343 } 1344 } 1345 }