A Application is the foundation of an application, unique for a given application
identifier. The GApplication class wraps some low-level platform-specific services and is intended to act as the foundation for
higher-level application classes such as GtkApplication or MxApplication. In general, you should not use this
class outside of a higher level framework.
One of the core features that GApplication provides is process uniqueness, in the context of a "session". The session concept is platform-dependent, but corresponds roughly to a graphical desktop login. When your application is launched again, its arguments are passed through platform communication to the already running program. The already running instance of the program is called the primary instance.
Before using GApplication, you must choose an "application identifier". The expected form of an application identifier is very close to that of of a DBus bus name. Examples include: "com.example.MyApp", "org.example.internal-apps.Calculator". For details on valid application identifiers, see id_is_valid.
The application identifier is claimed by the application as a well-known bus name on the user's session bus. This means that the uniqueness of your application is scoped to the current session. It also means that your application may provide additional services (through registration of other object paths) at that bus name.
The registration of these object paths should be done with the shared GDBus session bus. Note that due to the internal architecture of GDBus, method calls can be dispatched at any time (even if a main loop is not running). For this reason, you must ensure that any object paths that you wish to register are registered before Application attempts to acquire the bus name of your application (which happens in register). Unfortunately, this means that you cannot use get_is_remote to decide if you want to register object paths.
GApplication provides convenient life cycle management by maintaining a use count for the primary application instance. The use count can be changed using hold and release. If it drops to zero, the application exits.
GApplication also implements the ActionGroup interface and lets you easily export actions by adding them with set_action_group. When invoking an action by calling activate_action on the application, it is always invoked in the primary instance.
There is a number of different entry points into a Application:
The startup signal lets you handle the application initialization for all of these in a single place.
Regardless of which of these entry points is used to start the application, GApplication passes some platform data from the
launching instance to the primary instance, in the form of a Variant dictionary
mapping strings to variants. To use platform data, override the before_emit or after_emit virtual functions in
your Application subclass. When dealing with GApplicationCommandline
objects, the platform data is directly available via get_cwd,
get_environ and
get_platform_data.
As the name indicates, the platform data may vary depending on the operating system, but it always includes the current directory (key
"cwd"), and optionally the environment (ie the set of environment variables and their values) of the calling process (key "environ"). The
environment is only added to the platform data if the G_APPLICATION_SEND_ENVIONMENT flag is set. GApplication subclasses can
add their own platform data by overriding the add_platform_data virtual function. For instance, GtkApplication
adds startup notification data in this way.
To parse commandline arguments you may handle the command_line signal or
override the local_command_line vfunc, to parse them in either the primary instance or the local instance, respectively.
Opening files with a GApplication:
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" parse="text" href="../../../../gio/tests/gapplication-example-open.c">
<xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback>
</xi:include>
A GApplication with actions:
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" parse="text" href="../../../../gio/tests/gapplication-example-actions.c">
<xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback>
</xi:include>