GApplication: add a "resource base path"

We don't use this for anything inside of GApplication yet, but Gtk is
about to start using it to find various bits of the application (such as
its menus, icons, etc.).

By default, we form the base path from the application ID to end up with
the familiar /org/example/app style.

https://bugzilla.gnome.org/show_bug.cgi?id=722092
This commit is contained in:
Ryan Lortie 2014-07-04 09:53:51 -04:00
parent 60226a0386
commit cea9de93c8
3 changed files with 113 additions and 0 deletions

View File

@ -3016,6 +3016,9 @@ g_application_set_inactivity_timeout
g_application_get_flags
g_application_set_flags
<SUBSECTION>
g_application_get_resource_base_path
g_application_set_resource_base_path
<SUBSECTION>
g_application_get_dbus_connection
g_application_get_dbus_object_path
<SUBSECTION>

View File

@ -212,6 +212,7 @@ struct _GApplicationPrivate
{
GApplicationFlags flags;
gchar *id;
gchar *resource_path;
GActionGroup *actions;
GMenuModel *app_menu;
@ -245,6 +246,7 @@ enum
PROP_NONE,
PROP_APPLICATION_ID,
PROP_FLAGS,
PROP_RESOURCE_BASE_PATH,
PROP_IS_REGISTERED,
PROP_IS_REMOTE,
PROP_INACTIVITY_TIMEOUT,
@ -1011,6 +1013,10 @@ g_application_set_property (GObject *object,
g_application_set_flags (application, g_value_get_flags (value));
break;
case PROP_RESOURCE_BASE_PATH:
g_application_set_resource_base_path (application, g_value_get_string (value));
break;
case PROP_INACTIVITY_TIMEOUT:
g_application_set_inactivity_timeout (application,
g_value_get_uint (value));
@ -1078,6 +1084,10 @@ g_application_get_property (GObject *object,
g_application_get_flags (application));
break;
case PROP_RESOURCE_BASE_PATH:
g_value_set_string (value, g_application_get_resource_base_path (application));
break;
case PROP_IS_REGISTERED:
g_value_set_boolean (value,
g_application_get_is_registered (application));
@ -1105,6 +1115,20 @@ g_application_constructed (GObject *object)
if (g_application_get_default () == NULL)
g_application_set_default (application);
/* People should not set properties from _init... */
g_assert (application->priv->resource_path == NULL);
if (application->priv->id != NULL)
{
gint i;
application->priv->resource_path = g_strconcat ("/", application->priv->id, NULL);
for (i = 1; application->priv->resource_path[i]; i++)
if (application->priv->resource_path[i] == '.')
application->priv->resource_path[i] = '/';
}
}
static void
@ -1206,6 +1230,12 @@ g_application_class_init (GApplicationClass *class)
G_TYPE_APPLICATION_FLAGS, G_APPLICATION_FLAGS_NONE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (object_class, PROP_RESOURCE_BASE_PATH,
g_param_spec_string ("resource-base-path",
P_("Resource base path"),
P_("The base resource path for the application"),
NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (object_class, PROP_IS_REGISTERED,
g_param_spec_boolean ("is-registered",
P_("Is registered"),
@ -1571,6 +1601,79 @@ g_application_set_flags (GApplication *application,
}
}
/**
* g_application_get_resource_base_path:
* @application: a #GApplication
*
* Gets the resource base path of @application.
*
* See g_application_set_resource_base_path() for more information.
*
* Returns: (nullable): the base resource path, if one is set
*
* Since: 2.42
*/
const gchar *
g_application_get_resource_base_path (GApplication *application)
{
g_return_val_if_fail (G_IS_APPLICATION (application), NULL);
return application->priv->resource_path;
}
/**
* g_application_set_resource_base_path:
* @application: a #GApplication
* @resource_path: (nullable): the resource path to use
*
* Sets (or unsets) the base resource path of @application.
*
* The path is used to automatically load various [application
* resources][gresource] such as menu layouts and action descriptions.
* The various types of resources will be found at fixed names relative
* to the given base path.
*
* By default, the resource base path is determined from the application
* ID by prefixing '/' and replacing each '.' with '/'. This is done at
* the time that the #GApplication object is constructed. Changes to
* the application ID after that point will not have an impact on the
* resource base path.
*
* As an example, if the application has an ID of "org.example.app" then
* the default resource base path will be "/org/example/app". If this
* is a #GtkApplication (and you have not manually changed the path)
* then Gtk will then search for the menus of the application at
* "/org/example/app/gtk/menus.ui".
*
* See #GResource for more information about adding resources to your
* application.
*
* You can disable automatic resource loading functionality by setting
* the path to %NULL.
*
* Changing the resource base path once the application is running is
* not recommended. The point at which the resource path is consulted
* for forming paths for various purposes is unspecified.
*
* Since: 2.42
*/
void
g_application_set_resource_base_path (GApplication *application,
const gchar *resource_path)
{
g_return_if_fail (G_IS_APPLICATION (application));
g_return_if_fail (resource_path == NULL || g_str_has_prefix (resource_path, "/"));
if (g_strcmp0 (application->priv->resource_path, resource_path) != 0)
{
g_free (application->priv->resource_path);
application->priv->resource_path = g_strdup (resource_path);
g_object_notify (G_OBJECT (application), "resource-base-path");
}
}
/**
* g_application_get_inactivity_timeout:
* @application: a #GApplication
@ -1734,6 +1837,7 @@ g_application_get_dbus_object_path (GApplication *application)
return g_application_impl_get_dbus_object_path (application->priv->impl);
}
/* Register {{{1 */
/**
* g_application_register:

View File

@ -155,6 +155,12 @@ GLIB_AVAILABLE_IN_ALL
void g_application_set_flags (GApplication *application,
GApplicationFlags flags);
GLIB_AVAILABLE_IN_2_42
const gchar * g_application_get_resource_base_path (GApplication *application);
GLIB_AVAILABLE_IN_2_42
void g_application_set_resource_base_path (GApplication *application,
const gchar *resource_base_path);
GLIB_DEPRECATED
void g_application_set_action_group (GApplication *application,
GActionGroup *action_group);