[glib/wip/menus-rebase3] GApplication: make distinction about menus



commit 0f0f0dbc96061c91575e71053aa94a2abac93665
Author: Ryan Lortie <desrt desrt ca>
Date:   Thu Dec 1 12:14:04 2011 -0500

    GApplication: make distinction about menus
    
    Rename g_application_set_menu to g_application_set_app_menu and make a
    couple of fixups.  Clarify the documentation about exactly what this
    menu is meant to be.
    
    Add g_application_set_menubar and document that as well.

 docs/reference/gio/gio-sections.txt   |    6 +-
 gio/gapplication.c                    |  139 ++++++++++++++++++++++++++------
 gio/gapplication.h                    |   10 ++-
 gio/gapplicationimpl-dbus.c           |   10 +-
 gio/tests/gapplication-example-menu.c |    2 +-
 5 files changed, 130 insertions(+), 37 deletions(-)
---
diff --git a/docs/reference/gio/gio-sections.txt b/docs/reference/gio/gio-sections.txt
index 15e6c33..6c332d7 100644
--- a/docs/reference/gio/gio-sections.txt
+++ b/docs/reference/gio/gio-sections.txt
@@ -2815,8 +2815,10 @@ g_application_get_flags
 g_application_set_flags
 <SUBSECTION>
 g_application_set_action_group
-g_application_set_menu
-g_application_get_menu
+g_application_set_app_menu
+g_application_get_app_menu
+g_application_set_menubar
+g_application_get_menubar
 <SUBSECTION>
 g_application_get_is_registered
 g_application_get_is_remote
diff --git a/gio/gapplication.c b/gio/gapplication.c
index 31e0c7b..b9594fb 100644
--- a/gio/gapplication.c
+++ b/gio/gapplication.c
@@ -162,7 +162,8 @@ struct _GApplicationPrivate
   gchar             *id;
 
   GActionGroup      *actions;
-  GMenuModel        *menu;
+  GMenuModel        *app_menu;
+  GMenuModel        *menubar;
 
   guint              inactivity_timeout_id;
   guint              inactivity_timeout;
@@ -186,7 +187,8 @@ enum
   PROP_IS_REMOTE,
   PROP_INACTIVITY_TIMEOUT,
   PROP_ACTION_GROUP,
-  PROP_MENU
+  PROP_APP_MENU,
+  PROP_MENUBAR
 };
 
 enum
@@ -408,9 +410,12 @@ g_application_set_property (GObject      *object,
                                       g_value_get_object (value));
       break;
 
-    case PROP_MENU:
-      g_application_set_menu (application,
-                              g_value_get_object (value));
+    case PROP_APP_MENU:
+      g_application_set_app_menu (application, g_value_get_object (value));
+      break;
+
+    case PROP_MENUBAR:
+      g_application_set_menubar (application, g_value_get_object (value));
       break;
 
     default:
@@ -449,12 +454,82 @@ g_application_set_action_group (GApplication *application,
 }
 
 /**
- * g_application_set_menu:
+ * g_application_set_app_menu:
+ * @application: a #GApplication
+ * @app_menu: (allow-none): a #GMenuModel, or %NULL
+ *
+ * Sets or unsets the application menu for @application.
+ *
+ * The application menu is a single menu containing items that typically
+ * impact the application as a whole, rather than acting on a specific
+ * window or document.  For example, you would expect to see
+ * "Preferences" or "Quit" in an application menu, but not "Save" or
+ * "Print".
+ *
+ * If supported, the application menu will be rendered by the desktop
+ * environment.
+ *
+ * It is an error to call this function after the application has been
+ * registered.
+ *
+ * Since: 2.32
+ */
+void
+g_application_set_app_menu (GApplication *application,
+                            GMenuModel   *app_menu)
+{
+  g_return_if_fail (G_IS_APPLICATION (application));
+  g_return_if_fail (!application->priv->is_registered);
+
+  if (app_menu != application->priv->app_menu)
+    {
+      if (application->priv->app_menu != NULL)
+        g_object_unref (application->priv->app_menu);
+
+      application->priv->app_menu = app_menu;
+
+      if (application->priv->app_menu != NULL)
+        g_object_ref (application->priv->app_menu);
+
+      g_object_notify (G_OBJECT (application), "app-menu");
+    }
+}
+
+/**
+ * g_application_get_app_menu:
  * @application: a #GApplication
- * @menu: (allow-none): a #GMenuModel, or %NULL
  *
- * Sets or unsets the menu associated with the application. The menu
- * provides representation data for the exported actions of @application.
+ * Returns the menu model that has been set with
+ * g_application_set_app_menu().
+ *
+ * Returns: the application menu of @application
+ *
+ * Since: 2.32
+ */
+GMenuModel *
+g_application_get_app_menu (GApplication *application)
+{
+  g_return_val_if_fail (G_IS_APPLICATION (application), NULL);
+
+  return application->priv->app_menu;
+}
+
+/**
+ * g_application_set_menubar:
+ * @application: a #GApplication
+ * @menubar: (allow-none): a #GMenuModel, or %NULL
+ *
+ * Sets or unsets the menubar for windows of @application.
+ *
+ * This is a menubar in the traditional sense.
+ *
+ * Depending on the desktop environment, this may appear at the top of
+ * each window, or at the top of the screen.  In some environments, if
+ * both the application menu and the menubar are set, the application
+ * menu will be presented as if it were the first item of the menubar.
+ * Other environments treat the two as completely separate -- for
+ * example, the application menu may be rendered by the desktop shell
+ * while the menubar (if set) remains in each individual window.
  *
  * It is an error to call this function after the application has been
  * registered.
@@ -462,38 +537,43 @@ g_application_set_action_group (GApplication *application,
  * Since: 2.32
  */
 void
-g_application_set_menu (GApplication *application,
-                        GMenuModel   *menu)
+g_application_set_menubar (GApplication *application,
+                            GMenuModel   *menubar)
 {
   g_return_if_fail (G_IS_APPLICATION (application));
   g_return_if_fail (!application->priv->is_registered);
 
-  if (application->priv->menu != NULL)
-    g_object_unref (application->priv->menu);
+  if (menubar != application->priv->menubar)
+    {
+      if (application->priv->menubar != NULL)
+        g_object_unref (application->priv->menubar);
 
-  application->priv->menu = menu;
+      application->priv->menubar = menubar;
 
-  if (application->priv->menu != NULL)
-    g_object_ref (application->priv->menu);
+      if (application->priv->menubar != NULL)
+        g_object_ref (application->priv->menubar);
+
+      g_object_notify (G_OBJECT (application), "menubar");
+    }
 }
 
 /**
- * g_application_get_menu:
+ * g_application_get_menubar:
  * @application: a #GApplication
  *
- * Returns the menu model that has been set
- * with g_application_set_menu().
+ * Returns the menu model that has been set with
+ * g_application_set_menubar().
  *
- * Returns: the #GMenuModel associated with @application
+ * Returns: the menubar for windows of @application
  *
  * Since: 2.32
  */
 GMenuModel *
-g_application_get_menu (GApplication *application)
+g_application_get_menubar (GApplication *application)
 {
   g_return_val_if_fail (G_IS_APPLICATION (application), NULL);
 
-  return application->priv->menu;
+  return application->priv->menubar;
 }
 
 static void
@@ -631,10 +711,17 @@ g_application_class_init (GApplicationClass *class)
                          G_TYPE_ACTION_GROUP,
                          G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
 
-  g_object_class_install_property (object_class, PROP_MENU,
-    g_param_spec_object ("menu",
-                         P_("Menu model"),
-                         P_("The menu that the application exports"),
+  g_object_class_install_property (object_class, PROP_APP_MENU,
+    g_param_spec_object ("app-menu",
+                         P_("Application menu"),
+                         P_("The GMenuModel for the application menu"),
+                         G_TYPE_MENU_MODEL,
+                         G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_property (object_class, PROP_MENUBAR,
+    g_param_spec_object ("menubar",
+                         P_("Menubar"),
+                         P_("The GMenuModel for the menubar"),
                          G_TYPE_MENU_MODEL,
                          G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
 
diff --git a/gio/gapplication.h b/gio/gapplication.h
index 3beb330..455b74e 100644
--- a/gio/gapplication.h
+++ b/gio/gapplication.h
@@ -148,9 +148,13 @@ void                    g_application_set_flags                         (GApplic
 void                    g_application_set_action_group                  (GApplication             *application,
                                                                          GActionGroup             *action_group);
 
-void                    g_application_set_menu                          (GApplication             *application,
-                                                                         GMenuModel                *menu);
-GMenuModel             *g_application_get_menu                          (GApplication             *application);
+void                    g_application_set_app_menu                      (GApplication             *application,
+                                                                         GMenuModel               *app_menu);
+GMenuModel             *g_application_get_app_menu                      (GApplication             *application);
+
+void                    g_application_set_menubar                       (GApplication             *application,
+                                                                         GMenuModel               *menubar);
+GMenuModel *            g_application_get_menubar                       (GApplication             *application);
 
 gboolean                g_application_get_is_registered                 (GApplication             *application);
 gboolean                g_application_get_is_remote                     (GApplication             *application);
diff --git a/gio/gapplicationimpl-dbus.c b/gio/gapplicationimpl-dbus.c
index 0046534..9d8961a 100644
--- a/gio/gapplicationimpl-dbus.c
+++ b/gio/gapplicationimpl-dbus.c
@@ -241,7 +241,7 @@ g_application_impl_destroy (GApplicationImpl *impl)
       if (impl->actions_exported)
         g_action_group_dbus_export_stop (impl->app);
       if (impl->menu_exported)
-        g_menu_model_dbus_export_stop (g_application_get_menu (impl->app));
+        g_menu_model_dbus_export_stop (g_application_get_app_menu (impl->app));
 
       g_dbus_connection_call (impl->session_bus,
                               "org.freedesktop.DBus",
@@ -341,11 +341,11 @@ g_application_impl_register (GApplication       *application,
         }
       impl->actions_exported = TRUE;
 
-      if (g_application_get_menu (impl->app))
+      if (g_application_get_app_menu (impl->app))
         {
           if (!g_menu_model_dbus_export_start (impl->session_bus,
                                                impl->object_path,
-                                               g_application_get_menu (impl->app),
+                                               g_application_get_app_menu (impl->app),
                                                error))
             {
               g_action_group_dbus_export_stop (impl->app);
@@ -388,7 +388,7 @@ g_application_impl_register (GApplication       *application,
 
           if (impl->menu_exported)
             {
-              g_menu_model_dbus_export_stop (g_application_get_menu (impl->app));
+              g_menu_model_dbus_export_stop (g_application_get_app_menu (impl->app));
               impl->menu_exported = FALSE;
             }
 
@@ -428,7 +428,7 @@ g_application_impl_register (GApplication       *application,
       impl->actions_exported = FALSE;
       if (impl->menu_exported)
         {
-          g_menu_model_dbus_export_stop (g_application_get_menu (impl->app));
+          g_menu_model_dbus_export_stop (g_application_get_app_menu (impl->app));
           impl->menu_exported = FALSE;
         }
 
diff --git a/gio/tests/gapplication-example-menu.c b/gio/tests/gapplication-example-menu.c
index 13c7e03..e1dd427 100644
--- a/gio/tests/gapplication-example-menu.c
+++ b/gio/tests/gapplication-example-menu.c
@@ -68,7 +68,7 @@ add_menu (GApplication *app)
   g_menu_append (menu, "About Example", "about");
   g_menu_append (menu, "Quit", "quit");
 
-  g_application_set_menu (app, G_MENU_MODEL (menu));
+  g_application_set_app_menu (app, G_MENU_MODEL (menu));
 
   g_object_unref (menu);
 }



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