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);