[glib] GApplication: add a "resource base path"



commit cea9de93c8838099661f5b54462f9c4b6410bfc9
Author: Ryan Lortie <desrt desrt ca>
Date:   Fri Jul 4 09:53:51 2014 -0400

    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(+), 0 deletions(-)
---
diff --git a/docs/reference/gio/gio-sections.txt b/docs/reference/gio/gio-sections.txt
index 18a1f2a..e89c8c2 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
 <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>
diff --git a/gio/gapplication.c b/gio/gapplication.c
index aa963c4..6c33f73 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"),
@@ -1572,6 +1602,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 7ffaf41..b2b6a8a 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);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]