From cea9de93c8838099661f5b54462f9c4b6410bfc9 Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Fri, 4 Jul 2014 09:53:51 -0400 Subject: [PATCH] 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 --- docs/reference/gio/gio-sections.txt | 3 + gio/gapplication.c | 104 ++++++++++++++++++++++++++++ gio/gapplication.h | 6 ++ 3 files changed, 113 insertions(+) diff --git a/docs/reference/gio/gio-sections.txt b/docs/reference/gio/gio-sections.txt index 18a1f2a00..e89c8c2f4 100644 --- a/docs/reference/gio/gio-sections.txt +++ b/docs/reference/gio/gio-sections.txt @@ -3016,6 +3016,9 @@ g_application_set_inactivity_timeout g_application_get_flags g_application_set_flags +g_application_get_resource_base_path +g_application_set_resource_base_path + g_application_get_dbus_connection g_application_get_dbus_object_path diff --git a/gio/gapplication.c b/gio/gapplication.c index aa963c499..6c33f737b 100644 --- a/gio/gapplication.c +++ b/gio/gapplication.c @@ -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: diff --git a/gio/gapplication.h b/gio/gapplication.h index 7ffaf41fd..b2b6a8a52 100644 --- a/gio/gapplication.h +++ b/gio/gapplication.h @@ -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);