[gnome-panel] menu: add two properties to GpMenu



commit 4b6e93014e631143ba0bb43b5c4bff86825581f9
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Sun Feb 4 22:39:38 2018 +0200

    menu: add two properties to GpMenu

 modules/menu/gp-menu-bar-applet.c |    2 +-
 modules/menu/gp-menu.c            |   76 +++++++++++++++++++++++++++++++++----
 modules/menu/gp-menu.h            |    3 +-
 3 files changed, 71 insertions(+), 10 deletions(-)
---
diff --git a/modules/menu/gp-menu-bar-applet.c b/modules/menu/gp-menu-bar-applet.c
index 6c52641..3d29312 100644
--- a/modules/menu/gp-menu-bar-applet.c
+++ b/modules/menu/gp-menu-bar-applet.c
@@ -123,7 +123,7 @@ append_applications_item (GpMenuBarApplet *applet)
 
   menu = get_applications_menu ();
 
-  applet->applications_menu = gp_menu_new (GP_APPLET (applet), menu);
+  applet->applications_menu = gp_menu_new (GP_APPLET (applet), menu, TRUE);
   g_free (menu);
 
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (applet->applications_item),
diff --git a/modules/menu/gp-menu.c b/modules/menu/gp-menu.c
index 64f708e..6976d80 100644
--- a/modules/menu/gp-menu.c
+++ b/modules/menu/gp-menu.c
@@ -30,9 +30,12 @@ struct _GpMenu
 
   gchar     *name;
   GpApplet  *applet;
+  gboolean   required;
 
   GMenuTree *tree;
 
+  gboolean   empty;
+
   guint      reload_id;
 
   gulong     locked_down_id;
@@ -45,6 +48,9 @@ enum
 
   PROP_NAME,
   PROP_APPLET,
+  PROP_REQUIRED,
+
+  PROP_EMPTY,
 
   LAST_PROP
 };
@@ -274,22 +280,42 @@ static void
 menu_reload (GpMenu *menu)
 {
   GError *error;
-  GMenuTreeDirectory *directory;
+  gboolean loaded;
+  GList *children;
+  gboolean empty;
 
   gtk_container_foreach (GTK_CONTAINER (menu), remove_item, NULL);
 
   error = NULL;
-  if (!gmenu_tree_load_sync (menu->tree, &error))
+  loaded = gmenu_tree_load_sync (menu->tree, &error);
+
+  if (error != NULL)
     {
-      g_warning ("Failed to load menu: %s", error->message);
+      if (menu->required)
+        g_warning ("%s", error->message);
+
       g_clear_error (&error);
+    }
+
+  if (loaded)
+    {
+      GMenuTreeDirectory *directory;
 
-      return;
+      directory = gmenu_tree_get_directory_from_path (menu->tree, "/");
+      directory_to_menu_items (directory, GTK_WIDGET (menu), menu);
+      gmenu_tree_item_unref (directory);
     }
 
-  directory = gmenu_tree_get_directory_from_path (menu->tree, "/");
-  directory_to_menu_items (directory, GTK_WIDGET (menu), menu);
-  gmenu_tree_item_unref (directory);
+  children = gtk_container_get_children (GTK_CONTAINER (menu));
+  empty = g_list_length (children) == 0;
+  g_list_free (children);
+
+  if (menu->empty == empty)
+    return;
+
+  menu->empty = empty;
+
+  g_object_notify_by_pspec (G_OBJECT (menu), menu_properties[PROP_EMPTY]);
 }
 
 static gboolean
@@ -418,6 +444,10 @@ gp_menu_get_property (GObject    *object,
                       GValue     *value,
                       GParamSpec *pspec)
 {
+  GpMenu *menu;
+
+  menu = GP_MENU (object);
+
   switch (property_id)
     {
       case PROP_NAME:
@@ -428,6 +458,14 @@ gp_menu_get_property (GObject    *object,
         g_assert_not_reached ();
         break;
 
+      case PROP_REQUIRED:
+        g_assert_not_reached ();
+        break;
+
+      case PROP_EMPTY:
+        g_value_set_boolean (value, menu->empty);
+        break;
+
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
         break;
@@ -456,6 +494,14 @@ gp_menu_set_property (GObject      *object,
         menu->applet = g_value_get_object (value);
         break;
 
+      case PROP_REQUIRED:
+        menu->required = g_value_get_boolean (value);
+        break;
+
+      case PROP_EMPTY:
+        g_assert_not_reached ();
+        break;
+
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
         break;
@@ -477,6 +523,18 @@ install_properties (GObjectClass *object_class)
                          G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE |
                          G_PARAM_STATIC_STRINGS);
 
+  menu_properties[PROP_REQUIRED] =
+    g_param_spec_boolean ("required", "Required", "Required",
+                          TRUE,
+                          G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE |
+                          G_PARAM_STATIC_STRINGS);
+
+  menu_properties[PROP_EMPTY] =
+    g_param_spec_boolean ("empty", "Empty", "Empty",
+                          TRUE,
+                          G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY |
+                          G_PARAM_STATIC_STRINGS);
+
   g_object_class_install_properties (object_class, LAST_PROP, menu_properties);
 }
 
@@ -503,10 +561,12 @@ gp_menu_init (GpMenu *menu)
 
 GtkWidget *
 gp_menu_new (GpApplet    *applet,
-             const gchar *name)
+             const gchar *name,
+             gboolean     required)
 {
   return g_object_new (GP_TYPE_MENU,
                        "applet", applet,
                        "name", name,
+                       "required", required,
                        NULL);
 }
diff --git a/modules/menu/gp-menu.h b/modules/menu/gp-menu.h
index 8f468b6..9367545 100644
--- a/modules/menu/gp-menu.h
+++ b/modules/menu/gp-menu.h
@@ -26,7 +26,8 @@ G_BEGIN_DECLS
 G_DECLARE_FINAL_TYPE (GpMenu, gp_menu, GP, MENU, GtkMenu)
 
 GtkWidget *gp_menu_new (GpApplet    *applet,
-                        const gchar *name);
+                        const gchar *name,
+                        gboolean     required);
 
 G_END_DECLS
 


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