Application is:module

This module corresponds to section 3.8.15 (Texture Application) of the OpenGL 2.1 specs.
GApplication is the core class for application support. A GApplication is the foundation of an application. It 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. GApplication provides convenient life-cycle management by maintaining a "use count" for the primary application instance. The use count can be changed using applicationHold and applicationRelease. If it drops to zero, the application exits. Higher-level classes such as GtkApplication employ the use count to ensure that the application stays alive as long as it has any opened windows. Another feature that GApplication (optionally) provides is process uniqueness. Applications can make use of this functionality by providing a unique application ID. If given, only one application with this ID can be running at a time per 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"; for non-unique applications this is always the current instance. On Linux, the D-Bus session bus is used for communication. The use of GApplication differs from some other commonly-used uniqueness libraries (such as libunique) in important ways. The application is not expected to manually register itself and check if it is the primary instance. Instead, the main() function of a GApplication should do very little more than instantiating the application instance, possibly connecting signal handlers, then calling applicationRun. All checks for uniqueness are done internally. If the application is the primary instance then the startup signal is emitted and the mainloop runs. If the application is not the primary instance then a signal is sent to the primary instance and applicationRun promptly returns. See the code examples below. If used, the expected form of an application identifier is the same as that of a D-Bus well-known bus name. Examples include: com.example.MyApp, org.example.internal_apps.Calculator, org._7_zip.Archiver. For details on valid application identifiers, see applicationIdIsValid. On Linux, the application identifier is claimed 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 applicationRegister). Unfortunately, this means that you cannot use Application:isRemote to decide if you want to register object paths. GApplication also implements the ActionGroup and ActionMap interfaces and lets you easily export actions by adding them with actionMapAddAction. When invoking an action by calling actionGroupActivateAction on the application, it is always invoked in the primary instance. The actions are also exported on the session bus, and GIO provides the DBusActionGroup wrapper to conveniently access them remotely. GIO provides a DBusMenuModel wrapper for remote access to exported MenuModels. Note: Due to the fact that actions are exported on the session bus, using maybe parameters is not supported, since D-Bus does not support maybe types. There is a number of different entry points into a GApplication:
  • via 'Activate' (i.e. just starting the application)
  • via 'Open' (i.e. opening some files)
  • by handling a command-line
  • via activating an action
The Application::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 GVariant dictionary mapping strings to variants. To use platform data, override the Application.before_emit() or Application.after_emit() virtual functions in your GApplication subclass. When dealing with ApplicationCommandLine objects, the platform data is directly available via applicationCommandLineGetCwd, applicationCommandLineGetEnviron and applicationCommandLineGetPlatformData. 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_ENVIRONMENT flag is set. GApplication subclasses can add their own platform data by overriding the Application.add_platform_data() virtual function. For instance, GtkApplication adds startup notification data in this way. To parse commandline arguments you may handle the Application::commandLine signal or override the Application.local_command_line() virtual function, to parse them in either the primary instance or the local instance, respectively. For an example of opening files with a GApplication, see gapplication-example-open.c. For an example of using actions with GApplication, see gapplication-example-actions.c. For an example of using extra D-Bus hooks with GApplication, see gapplication-example-dbushooks.c. Since: 2.28
GtkApplication is a high-level API for writing applications. It supports many aspects of writing a GTK application in a convenient fashion, without enforcing a one-size-fits-all model. Currently, GtkApplication handles GTK initialization, application uniqueness, session management, provides some basic scriptability and desktop shell integration by exporting actions and menus and manages a list of toplevel windows whose life-cycle is automatically tied to the life-cycle of your application. While GtkApplication works fine with plain Windows, it is recommended to use it together with ApplicationWindow.

Automatic resources

GtkApplication will automatically load menus from the GtkBuilder resource located at "gtk/menus.ui", relative to the application's resource base path (see applicationSetResourceBasePath). The menu with the ID "menubar" is taken as the application's menubar. Additional menus (most interesting submenus) can be named and accessed via applicationGetMenuById which allows for dynamic population of a part of the menu structure. Note that automatic resource loading uses the resource base path that is set at construction time and will not work if the resource base path is changed at a later time. It is also possible to provide the menubar manually using applicationSetMenubar. GtkApplication will also automatically setup an icon search path for the default icon theme by appending "icons" to the resource base path. This allows your application to easily store its icons as resources. See iconThemeAddResourcePath for more information. If there is a resource located at gtk/help-overlay.ui which defines a ShortcutsWindow with ID help_overlay then GtkApplication associates an instance of this shortcuts window with each ApplicationWindow and sets up the keyboard accelerator <kbd>Control</kbd>+<kbd>?</kbd> to open it. To create a menu item that displays the shortcuts window, associate the item with the action win.show-help-overlay.

A simple application

A simple example is available in the GTK source code repository GtkApplication optionally registers with a session manager of the users session (if you set the Application:registerSession property) and offers various functionality related to the session life-cycle. An application can block various ways to end the session with the applicationInhibit function. Typical use cases for this kind of inhibiting are long-running, uninterruptible operations, such as burning a CD or performing a disk backup. The session manager may not honor the inhibitor, but it can be expected to inform the user about the negative consequences of ending the session while inhibitors are present.

See Also

A high-level API for writing applications. GtkApplication supports many aspects of writing a GTK application in a convenient fashion, without enforcing a one-size-fits-all model. Currently, it handles GTK initialization, application uniqueness, session management, provides some basic scriptability and desktop shell integration by exporting actions and menus and manages a list of toplevel windows whose life-cycle is automatically tied to the life-cycle of your application. While GtkApplication works fine with plain Windows, it is recommended to use it together with ApplicationWindow.

Automatic resources

GtkApplication will automatically load menus from the GtkBuilder resource located at "gtk/menus.ui", relative to the application's resource base path (see applicationSetResourceBasePath). The menu with the ID "menubar" is taken as the application's menubar. Additional menus (most interesting submenus) can be named and accessed via applicationGetMenuById which allows for dynamic population of a part of the menu structure. Note that automatic resource loading uses the resource base path that is set at construction time and will not work if the resource base path is changed at a later time. It is also possible to provide the menubar manually using applicationSetMenubar. GtkApplication will also automatically setup an icon search path for the default icon theme by appending "icons" to the resource base path. This allows your application to easily store its icons as resources. See iconThemeAddResourcePath for more information. If there is a resource located at gtk/help-overlay.ui which defines a ShortcutsWindow with ID help_overlay then GtkApplication associates an instance of this shortcuts window with each ApplicationWindow and sets up the keyboard accelerator <kbd>Control</kbd>+<kbd>?</kbd> to open it. To create a menu item that displays the shortcuts window, associate the item with the action win.show-help-overlay. GtkApplication will also automatically set the application id as the default window icon. Use windowSetDefaultIconName or Window:iconName to override that behavior.

A simple application

A simple example is available in the GTK source code repository GtkApplication optionally registers with a session manager of the users session (if you set the Application:registerSession property) and offers various functionality related to the session life-cycle. An application can block various ways to end the session with the applicationInhibit function. Typical use cases for this kind of inhibiting are long-running, uninterruptible operations, such as burning a CD or performing a disk backup. The session manager may not honor the inhibitor, but it can be expected to inform the user about the negative consequences of ending the session while inhibitors are present.

See Also

Complete the definition of the web app begun in App.hs. This is always done in two files for (TH?) reasons.
GApplicationCommandLine represents a command-line invocation of an application. It is created by Application and emitted in the Application::commandLine signal and virtual function. The class contains the list of arguments that the program was invoked with. It is also possible to query if the commandline invocation was local (ie: the current process is running in direct response to the invocation) or remote (ie: some other process forwarded the commandline to this process). The GApplicationCommandLine object can provide the argc and argv parameters for use with the OptionContext command-line parsing API, with the applicationCommandLineGetArguments function. See gapplication-example-cmdline3.c for an example. The exit status of the originally-invoked process may be set and messages can be printed to stdout or stderr of that process. For remote invocation, the originally-invoked process exits when applicationCommandLineDone method is called. This method is also automatically called when the object is disposed. The main use for GApplicationCommandLine (and the Application::commandLine signal) is 'Emacs server' like use cases: You can set the EDITOR environment variable to have e.g. git use your favourite editor to edit commit messages, and if you already have an instance of the editor running, the editing will happen in the running instance, instead of opening a new one. An important aspect of this use case is that the process that gets started by git does not return until the editing is done. Normally, the commandline is completely handled in the Application::commandLine handler. The launching instance exits once the signal handler in the primary instance has returned, and the return value of the signal handler becomes the exit status of the launching instance.

c code

static int
command_line (GApplication            *application,
GApplicationCommandLine *cmdline)
{
gchar **argv;
gint argc;
gint i;

argv = g_application_command_line_get_arguments (cmdline, &argc);

g_application_command_line_print (cmdline,
"This text is written back\n"
"to stdout of the caller\n");

for (i = 0; i < argc; i++)
g_print ("argument %d: %s\n", i, argv[i]);

g_strfreev (argv);

return 0;
}
The complete example can be found here: gapplication-example-cmdline.c In more complicated cases, the handling of the commandline can be split between the launcher and the primary instance.

c code

static gboolean
test_local_cmdline (GApplication   *application,
gchar        ***arguments,
gint           *exit_status)
{
gint i, j;
gchar **argv;

argv = *arguments;

if (argv[0] == NULL)
{
*exit_status = 0;
return FALSE;
}

i = 1;
while (argv[i])
{
if (g_str_has_prefix (argv[i], "--local-"))
{
g_print ("handling argument %s locally\n", argv[i]);
g_free (argv[i]);
for (j = i; argv[j]; j++)
argv[j] = argv[j + 1];
}
else
{
g_print ("not handling argument %s locally\n", argv[i]);
i++;
}
}

*exit_status = 0;

return FALSE;
}

static void
test_application_class_init (TestApplicationClass *class)
{
G_APPLICATION_CLASS (class)->local_command_line = test_local_cmdline;

...
}
In this example of split commandline handling, options that start with --local- are handled locally, all other options are passed to the Application::commandLine handler which runs in the primary instance. The complete example can be found here: gapplication-example-cmdline2.c If handling the commandline requires a lot of work, it may be better to defer it.

c code

static gboolean
my_cmdline_handler (gpointer data)
{
GApplicationCommandLine *cmdline = data;

// do the heavy lifting in an idle

g_application_command_line_set_exit_status (cmdline, 0);
g_object_unref (cmdline); // this releases the application

return G_SOURCE_REMOVE;
}

static int
command_line (GApplication            *application,
GApplicationCommandLine *cmdline)
{
// keep the application running until we are done with this commandline
g_application_hold (application);

g_object_set_data_full (G_OBJECT (cmdline),
"application", application,
(GDestroyNotify)g_application_release);

g_object_ref (cmdline);
g_idle_add (my_cmdline_handler, cmdline);

return 0;
}
In this example the commandline is not completely handled before the Application::commandLine handler returns. Instead, we keep a reference to the GApplicationCommandLine object and handle it later (in this example, in an idle). Note that it is necessary to hold the application until you are done with the commandline. The complete example can be found here: gapplication-example-cmdline3.c
GtkApplicationWindow is a GtkWindow subclass that integrates with GtkApplication. Notably, GtkApplicationWindow can handle an application menubar. This class implements the GActionGroup and GActionMap interfaces, to let you add window-specific actions that will be exported by the associated Application, together with its application-wide actions. Window-specific actions are prefixed with the “win.” prefix and application-wide actions are prefixed with the “app.” prefix. Actions must be addressed with the prefixed name when referring to them from a GMenuModel. Note that widgets that are placed inside a GtkApplicationWindow can also activate these actions, if they implement the Actionable interface. The settings Settings:gtkShellShowsAppMenu and Settings:gtkShellShowsMenubar tell GTK whether the desktop environment is showing the application menu and menubar models outside the application as part of the desktop shell. For instance, on OS X, both menus will be displayed remotely; on Windows neither will be. If the desktop environment does not display the menubar, then GtkApplicationWindow will automatically show a menubar for it. This behaviour can be overridden with the ApplicationWindow:showMenubar property. If the desktop environment does not display the application menu, then it will automatically be included in the menubar or in the windows client-side decorations. See PopoverMenu for information about the XML language used by GtkBuilder for menu models. See also: applicationSetMenubar.

A GtkApplicationWindow with a menubar

The code sample below shows how to set up a GtkApplicationWindow with a menu bar defined on the Application:

c code

GtkApplication *app = gtk_application_new ("org.gtk.test", 0);

GtkBuilder *builder = gtk_builder_new_from_string (
"<interface>"
"  <menu id='menubar'>"
"    <submenu>"
"      <attribute name='label' translatable='yes'>_Edit</attribute>"
"      <item>"
"        <attribute name='label' translatable='yes'>_Copy</attribute>"
"        <attribute name='action'>win.copy</attribute>"
"      </item>"
"      <item>"
"        <attribute name='label' translatable='yes'>_Paste</attribute>"
"        <attribute name='action'>win.paste</attribute>"
"      </item>"
"    </submenu>"
"  </menu>"
"</interface>",
-1);

GMenuModel *menubar = G_MENU_MODEL (gtk_builder_get_object (builder, "menubar"));
gtk_application_set_menubar (GTK_APPLICATION (app), menubar);
g_object_unref (builder);

// ...

GtkWidget *window = gtk_application_window_new (app);
A GtkWindow subclass that integrates with GtkApplication. Notably, GtkApplicationWindow can handle an application menubar. This class implements the ActionGroup and ActionMap interfaces, to let you add window-specific actions that will be exported by the associated Application, together with its application-wide actions. Window-specific actions are prefixed with the “win.” prefix and application-wide actions are prefixed with the “app.” prefix. Actions must be addressed with the prefixed name when referring to them from a menu model. Note that widgets that are placed inside a GtkApplicationWindow can also activate these actions, if they implement the Actionable interface. The settings Settings:gtkShellShowsAppMenu and Settings:gtkShellShowsMenubar tell GTK whether the desktop environment is showing the application menu and menubar models outside the application as part of the desktop shell. For instance, on OS X, both menus will be displayed remotely; on Windows neither will be. If the desktop environment does not display the menubar, it can be shown in the GtkApplicationWindow by setting the ApplicationWindow:showMenubar property to true. If the desktop environment does not display the application menu, then it will automatically be included in the menubar or in the window’s client-side decorations. See PopoverMenu for information about the XML language used by GtkBuilder for menu models. See also: applicationSetMenubar.

A GtkApplicationWindow with a menubar

The code sample below shows how to set up a GtkApplicationWindow with a menu bar defined on the Application:

c code

GtkApplication *app = gtk_application_new ("org.gtk.test", 0);

GtkBuilder *builder = gtk_builder_new_from_string (
"<interface>"
"  <menu id='menubar'>"
"    <submenu>"
"      <attribute name='label' translatable='yes'>_Edit</attribute>"
"      <item>"
"        <attribute name='label' translatable='yes'>_Copy</attribute>"
"        <attribute name='action'>win.copy</attribute>"
"      </item>"
"      <item>"
"        <attribute name='label' translatable='yes'>_Paste</attribute>"
"        <attribute name='action'>win.paste</attribute>"
"      </item>"
"    </submenu>"
"  </menu>"
"</interface>",
-1);

GMenuModel *menubar = G_MENU_MODEL (gtk_builder_get_object (builder, "menubar"));
gtk_application_set_menubar (GTK_APPLICATION (app), menubar);
g_object_unref (builder);

// ...

GtkWidget *window = gtk_application_window_new (app);
Application Default Credentials are suited for cases when access to a Google service needs to have the same identity and authorization level for the application independent of the user. This is Google's the recommended approach to authorize calls to Google Cloud APIs, particularly when you're building an application that is deployed to Google App Engine or Google Compute Engine virtual machines. See: Application Default Documentation.
Credentials for applications that are installed on devices such as computers, cell phones, or a tablet. Installed apps are distributed to individual machines, and it is assumed that these apps securely store secrets. These apps might access a Google service while the user is present at the application, or when the application is running in the background. See: Installed Application Documentation.