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