mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-10 03:16:17 +01:00
GApplication: allow null application_id
GApplication application ID is now permitted to be NULL, in which case G_APPLICATION_NON_UNIQUE will be implicitly enabled. https://bugzilla.gnome.org/show_bug.cgi?id=671249
This commit is contained in:
parent
d959ace72c
commit
16f92a33ac
@ -46,22 +46,12 @@
|
|||||||
* @title: GApplication
|
* @title: GApplication
|
||||||
* @short_description: Core application class
|
* @short_description: Core application class
|
||||||
*
|
*
|
||||||
* A #GApplication is the foundation of an application, unique for a
|
* A #GApplication is the foundation of an application. It wraps some
|
||||||
* given application identifier. The GApplication class wraps some
|
|
||||||
* low-level platform-specific services and is intended to act as the
|
* low-level platform-specific services and is intended to act as the
|
||||||
* foundation for higher-level application classes such as
|
* foundation for higher-level application classes such as
|
||||||
* #GtkApplication or #MxApplication. In general, you should not use
|
* #GtkApplication or #MxApplication. In general, you should not use
|
||||||
* this class outside of a higher level framework.
|
* 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
|
|
||||||
* <firstterm>primary instance</firstterm>. On Linux, the D-Bus session
|
|
||||||
* bus is used for communication.
|
|
||||||
*
|
|
||||||
* GApplication provides convenient life cycle management by maintaining
|
* GApplication provides convenient life cycle management by maintaining
|
||||||
* a <firstterm>use count</firstterm> for the primary application instance.
|
* a <firstterm>use count</firstterm> for the primary application instance.
|
||||||
* The use count can be changed using g_application_hold() and
|
* The use count can be changed using g_application_hold() and
|
||||||
@ -70,9 +60,20 @@
|
|||||||
* ensure that the application stays alive as long as it has any opened
|
* ensure that the application stays alive as long as it has any opened
|
||||||
* windows.
|
* windows.
|
||||||
*
|
*
|
||||||
* Before using GApplication, you must choose an "application identifier".
|
* Another feature that GApplication (optionally) provides is process
|
||||||
* The expected form of an application identifier is very close to that of
|
* uniqueness. Applications can make use of this functionality by
|
||||||
* of a <ulink url="http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names-interface">DBus bus name</ulink>.
|
* 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 <firstterm>primary instance</firstterm>. On Linux, the
|
||||||
|
* D-Bus session bus is used for communication.
|
||||||
|
*
|
||||||
|
* If used, the expected form of an application identifier is very close
|
||||||
|
* to that of of a
|
||||||
|
* <ulink url="http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names-interface">DBus bus name</ulink>.
|
||||||
* Examples include: "com.example.MyApp", "org.example.internal-apps.Calculator".
|
* Examples include: "com.example.MyApp", "org.example.internal-apps.Calculator".
|
||||||
* For details on valid application identifiers, see g_application_id_is_valid().
|
* For details on valid application identifiers, see g_application_id_is_valid().
|
||||||
*
|
*
|
||||||
@ -616,8 +617,6 @@ g_application_constructed (GObject *object)
|
|||||||
{
|
{
|
||||||
GApplication *application = G_APPLICATION (object);
|
GApplication *application = G_APPLICATION (object);
|
||||||
|
|
||||||
g_assert (application->priv->id != NULL);
|
|
||||||
|
|
||||||
if (g_application_get_default () == NULL)
|
if (g_application_get_default () == NULL)
|
||||||
g_application_set_default (application);
|
g_application_set_default (application);
|
||||||
}
|
}
|
||||||
@ -905,14 +904,18 @@ g_application_id_is_valid (const gchar *application_id)
|
|||||||
/* Public Constructor {{{1 */
|
/* Public Constructor {{{1 */
|
||||||
/**
|
/**
|
||||||
* g_application_new:
|
* g_application_new:
|
||||||
* @application_id: the application id
|
* @application_id: (allow-none): the application id
|
||||||
* @flags: the application flags
|
* @flags: the application flags
|
||||||
*
|
*
|
||||||
* Creates a new #GApplication instance.
|
* Creates a new #GApplication instance.
|
||||||
*
|
*
|
||||||
* This function calls g_type_init() for you.
|
* This function calls g_type_init() for you.
|
||||||
*
|
*
|
||||||
* The application id must be valid. See g_application_id_is_valid().
|
* If non-%NULL, the application id must be valid. See
|
||||||
|
* g_application_id_is_valid().
|
||||||
|
*
|
||||||
|
* If no application ID is given then some features of #GApplication
|
||||||
|
* (most notably application uniqueness) will be disabled.
|
||||||
*
|
*
|
||||||
* Returns: a new #GApplication instance
|
* Returns: a new #GApplication instance
|
||||||
**/
|
**/
|
||||||
@ -920,7 +923,7 @@ GApplication *
|
|||||||
g_application_new (const gchar *application_id,
|
g_application_new (const gchar *application_id,
|
||||||
GApplicationFlags flags)
|
GApplicationFlags flags)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (g_application_id_is_valid (application_id), NULL);
|
g_return_val_if_fail (application_id == NULL || g_application_id_is_valid (application_id), NULL);
|
||||||
|
|
||||||
g_type_init ();
|
g_type_init ();
|
||||||
|
|
||||||
@ -952,14 +955,15 @@ g_application_get_application_id (GApplication *application)
|
|||||||
/**
|
/**
|
||||||
* g_application_set_application_id:
|
* g_application_set_application_id:
|
||||||
* @application: a #GApplication
|
* @application: a #GApplication
|
||||||
* @application_id: the identifier for @application
|
* @application_id: (allow-none): the identifier for @application
|
||||||
*
|
*
|
||||||
* Sets the unique identifier for @application.
|
* Sets the unique identifier for @application.
|
||||||
*
|
*
|
||||||
* The application id can only be modified if @application has not yet
|
* The application id can only be modified if @application has not yet
|
||||||
* been registered.
|
* been registered.
|
||||||
*
|
*
|
||||||
* The application id must be valid. See g_application_id_is_valid().
|
* If non-%NULL, the application id must be valid. See
|
||||||
|
* g_application_id_is_valid().
|
||||||
*
|
*
|
||||||
* Since: 2.28
|
* Since: 2.28
|
||||||
**/
|
**/
|
||||||
@ -971,7 +975,7 @@ g_application_set_application_id (GApplication *application,
|
|||||||
|
|
||||||
if (g_strcmp0 (application->priv->id, application_id) != 0)
|
if (g_strcmp0 (application->priv->id, application_id) != 0)
|
||||||
{
|
{
|
||||||
g_return_if_fail (g_application_id_is_valid (application_id));
|
g_return_if_fail (application_id == NULL || g_application_id_is_valid (application_id));
|
||||||
g_return_if_fail (!application->priv->is_registered);
|
g_return_if_fail (!application->priv->is_registered);
|
||||||
|
|
||||||
g_free (application->priv->id);
|
g_free (application->priv->id);
|
||||||
@ -1146,6 +1150,9 @@ g_application_get_is_remote (GApplication *application)
|
|||||||
* application identifier as a unique bus name on the session bus using
|
* application identifier as a unique bus name on the session bus using
|
||||||
* GDBus.
|
* GDBus.
|
||||||
*
|
*
|
||||||
|
* If there is no application ID or if %G_APPLICATION_NON_UNIQUE was
|
||||||
|
* given, then this process will always become the primary instance.
|
||||||
|
*
|
||||||
* Due to the internal architecture of GDBus, method calls can be
|
* Due to the internal architecture of GDBus, method calls can be
|
||||||
* dispatched at any time (even if a main loop is not running). For
|
* 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
|
* this reason, you must ensure that any object paths that you wish to
|
||||||
@ -1155,7 +1162,8 @@ g_application_get_is_remote (GApplication *application)
|
|||||||
* returned with no work performed.
|
* returned with no work performed.
|
||||||
*
|
*
|
||||||
* The #GApplication::startup signal is emitted if registration succeeds
|
* The #GApplication::startup signal is emitted if registration succeeds
|
||||||
* and @application is the primary instance.
|
* and @application is the primary instance (including the non-unique
|
||||||
|
* case).
|
||||||
*
|
*
|
||||||
* In the event of an error (such as @cancellable being cancelled, or a
|
* In the event of an error (such as @cancellable being cancelled, or a
|
||||||
* failure to connect to the session bus), %FALSE is returned and @error
|
* failure to connect to the session bus), %FALSE is returned and @error
|
||||||
@ -1178,6 +1186,9 @@ g_application_register (GApplication *application,
|
|||||||
|
|
||||||
if (!application->priv->is_registered)
|
if (!application->priv->is_registered)
|
||||||
{
|
{
|
||||||
|
if (application->priv->id == NULL)
|
||||||
|
application->priv->flags |= G_APPLICATION_NON_UNIQUE;
|
||||||
|
|
||||||
application->priv->impl =
|
application->priv->impl =
|
||||||
g_application_impl_register (application, application->priv->id,
|
g_application_impl_register (application, application->priv->id,
|
||||||
application->priv->flags,
|
application->priv->flags,
|
||||||
|
@ -194,6 +194,10 @@ application_path_from_appid (const gchar *appid)
|
|||||||
{
|
{
|
||||||
gchar *appid_path, *iter;
|
gchar *appid_path, *iter;
|
||||||
|
|
||||||
|
if (appid == NULL)
|
||||||
|
/* this is a private implementation detail */
|
||||||
|
return g_strdup ("/org/gtk/Application/anonymous");
|
||||||
|
|
||||||
appid_path = g_strconcat ("/", appid, NULL);
|
appid_path = g_strconcat ("/", appid, NULL);
|
||||||
for (iter = appid_path; *iter; iter++)
|
for (iter = appid_path; *iter; iter++)
|
||||||
{
|
{
|
||||||
@ -358,6 +362,8 @@ g_application_impl_register (GApplication *application,
|
|||||||
GDBusActionGroup *actions;
|
GDBusActionGroup *actions;
|
||||||
GApplicationImpl *impl;
|
GApplicationImpl *impl;
|
||||||
|
|
||||||
|
g_assert ((flags & G_APPLICATION_NON_UNIQUE) || appid != NULL);
|
||||||
|
|
||||||
impl = g_slice_new0 (GApplicationImpl);
|
impl = g_slice_new0 (GApplicationImpl);
|
||||||
|
|
||||||
impl->app = application;
|
impl->app = application;
|
||||||
|
@ -1355,10 +1355,11 @@ typedef enum
|
|||||||
* to the #GApplication::command-line signal handler, via
|
* to the #GApplication::command-line signal handler, via
|
||||||
* g_application_command_line_getenv().
|
* g_application_command_line_getenv().
|
||||||
* @G_APPLICATION_NON_UNIQUE: Make no attempts to do any of the typical
|
* @G_APPLICATION_NON_UNIQUE: Make no attempts to do any of the typical
|
||||||
* single-instance application negotiation. The application neither
|
* single-instance application negotiation, even if the application
|
||||||
* attempts to become the owner of the application ID nor does it
|
* ID is given. The application neither attempts to become the
|
||||||
* check if an existing owner already exists. Everything occurs in
|
* owner of the application ID nor does it check if an existing
|
||||||
* the local process. Since: 2.30.
|
* owner already exists. Everything occurs in the local process.
|
||||||
|
* Since: 2.30.
|
||||||
*
|
*
|
||||||
* Flags used to define the behaviour of a #GApplication.
|
* Flags used to define the behaviour of a #GApplication.
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user