Author: jannis
Date: 2007-02-06 21:33:13 +0000 (Tue, 06 Feb 2007)
New Revision: 24870

Modified:
   libfrap/trunk/libfrap/menu/ChangeLog
   libfrap/trunk/libfrap/menu/frap-menu-directory.c
   libfrap/trunk/libfrap/menu/frap-menu-directory.h
   libfrap/trunk/libfrap/menu/frap-menu-item.c
   libfrap/trunk/libfrap/menu/frap-menu.c
   libfrap/trunk/libfrap/menu/tests/test-menu-spec.c
Log:
        * frap-menu-directory.{c,h}: Add support for NoDisplay, Hidden and
          partial support for OnlyShowIn/NotShowIn to menu directories. Fix
          memory leaks when the filename of a FrapMenuDirectory is redefined
          and the menu directory has to be reloaded (note: Hidden attributes
          won't be recognized by the related menu after reloading).
        * frap-menu.c: Handle Hidden attribute of menu directories in 
          frap_menu_resolve_deleted() to delete menus if necessary (gives us
          another passed test in the fd.o test suite).
        * tests/test-menu-spec.c: Handle NoDisplay attributes of menu
          directories when printing the menus.

Modified: libfrap/trunk/libfrap/menu/ChangeLog
===================================================================
--- libfrap/trunk/libfrap/menu/ChangeLog        2007-02-06 19:50:55 UTC (rev 
24869)
+++ libfrap/trunk/libfrap/menu/ChangeLog        2007-02-06 21:33:13 UTC (rev 
24870)
@@ -1,5 +1,18 @@
 2007-02-06     Jannis Pohlmann <[EMAIL PROTECTED]>
 
+       * frap-menu-directory.{c,h}: Add support for NoDisplay, Hidden and
+         partial support for OnlyShowIn/NotShowIn to menu directories. Fix
+         memory leaks when the filename of a FrapMenuDirectory is redefined
+         and the menu directory has to be reloaded (note: Hidden attributes
+         won't be recognized by the related menu after reloading).
+       * frap-menu.c: Handle Hidden attribute of menu directories in 
+         frap_menu_resolve_deleted() to delete menus if necessary (gives us
+         another passed test in the fd.o test suite).
+       * tests/test-menu-spec.c: Handle NoDisplay attributes of menu
+         directories when printing the menus.
+
+2007-02-06     Jannis Pohlmann <[EMAIL PROTECTED]>
+
        * frap-menu-item-cache.c: Also acquire mutex lock in 
          frap_menu_item_cache_foreach() as the item cache hash table could 
          be modified by other threads during this call otherwise.

Modified: libfrap/trunk/libfrap/menu/frap-menu-directory.c
===================================================================
--- libfrap/trunk/libfrap/menu/frap-menu-directory.c    2007-02-06 19:50:55 UTC 
(rev 24869)
+++ libfrap/trunk/libfrap/menu/frap-menu-directory.c    2007-02-06 21:33:13 UTC 
(rev 24870)
@@ -60,6 +60,8 @@
   "Categories",
   "OnlyShowIn",
   "NotShowIn",
+  "NoDisplay",
+  "Hidden",
   NULL
 };
 
@@ -72,6 +74,7 @@
   PROP_FILENAME,
   PROP_NAME,
   PROP_COMMENT,
+  PROP_NO_DISPLAY,
   PROP_ICON,
 };
 
@@ -88,7 +91,7 @@
                                                         guint                  
       prop_id,
                                                         const GValue           
      *value,
                                                         GParamSpec             
      *pspec);
-
+static void       frap_menu_directory_free_private     (FrapMenuDirectory      
      *directory);
 static void       frap_menu_directory_load             (FrapMenuDirectory      
      *directory);
 
 
@@ -107,7 +110,17 @@
   /* Icon */
   gchar             *icon;
 
-  /* TODO: OnlyShowIn, Categories */
+  /* Environments in which the menu should be displayed only */
+  gchar            **only_show_in;
+
+  /* Environments in which the menu should be hidden */
+  gchar            **not_show_in;
+
+  /* Whether the menu should be ignored completely */
+  guint              hidden : 1;
+
+  /* Whether the menu should be hidden */
+  guint              no_display : 1;
 };
 
 struct _FrapMenuDirectoryClass
@@ -225,6 +238,20 @@
                                                         _("Directory icon"),
                                                         NULL,
                                                         G_PARAM_READWRITE));
+
+  /**
+   * FrapMenuDirectory:no-display:
+   *
+   * Whether this menu item is hidden in menus.
+   **/
+  g_object_class_install_property (gobject_class,
+                                   PROP_NO_DISPLAY,
+                                   g_param_spec_boolean ("no-display",
+                                                         _("No Display"),
+                                                         _("Visibility state 
of the related menu"),
+                                                         FALSE,
+                                                         G_PARAM_READWRITE));
+
 }
 
 
@@ -236,6 +263,10 @@
   directory->priv->filename = NULL;
   directory->priv->name = NULL;
   directory->priv->icon = NULL;
+  directory->priv->only_show_in = NULL;
+  directory->priv->not_show_in = NULL;
+  directory->priv->hidden = FALSE;
+  directory->priv->no_display = FALSE;
 }
 
 
@@ -245,22 +276,13 @@
 {
   FrapMenuDirectory *directory = FRAP_MENU_DIRECTORY (object);
 
+  /* Free private data */
+  frap_menu_directory_free_private (directory);
+
   /* Free filename */
   if (G_LIKELY (directory->priv->filename != NULL))
     g_free (directory->priv->filename);
 
-  /* Free name */
-  if (G_LIKELY (directory->priv->name != NULL))
-    g_free (directory->priv->name);
-
-  /* Free comment */
-  if (G_LIKELY (directory->priv->comment != NULL))
-    g_free (directory->priv->comment);
-
-  /* Free icon */
-  if (G_LIKELY (directory->priv->icon != NULL))
-    g_free (directory->priv->icon);
-
   (*G_OBJECT_CLASS (frap_menu_directory_parent_class)->finalize) (object);
 }
 
@@ -292,6 +314,10 @@
       g_value_set_string (value, frap_menu_directory_get_icon (directory));
       break;
 
+    case PROP_NO_DISPLAY:
+      g_value_set_boolean (value, frap_menu_directory_get_no_display 
(directory));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -326,6 +352,10 @@
       frap_menu_directory_set_icon (directory, g_value_get_string (value));
       break;
 
+    case PROP_NO_DISPLAY:
+      frap_menu_directory_set_no_display (directory, g_value_get_boolean 
(value));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -349,13 +379,22 @@
   g_return_if_fail (FRAP_IS_MENU_DIRECTORY (directory));
   g_return_if_fail (filename != NULL);
 
-  /* Free old filename */
+  /* Check if there is an old filename */
   if (G_UNLIKELY (directory->priv->filename != NULL))
-    g_free (directory->priv->filename);
+    {
+      if (G_UNLIKELY (filename != NULL && g_utf8_collate 
(directory->priv->filename, filename) == 0))
+        return;
 
+      /* Free old filename */
+      g_free (directory->priv->filename);
+    }
+
   /* Set the new filename */
   directory->priv->filename = g_strdup (filename);
 
+  /* Free private data before reloading the directory */
+  frap_menu_directory_free_private (directory);
+
   /* Reload the menu */
   frap_menu_directory_load (directory);
 
@@ -447,15 +486,69 @@
 
 
 
+gboolean
+frap_menu_directory_get_no_display (FrapMenuDirectory *directory)
+{
+  g_return_val_if_fail (FRAP_IS_MENU_DIRECTORY (directory), FALSE);
+  return directory->priv->no_display;
+}
+
+
+
+void        
+frap_menu_directory_set_no_display (FrapMenuDirectory *directory,
+                                    gboolean           no_display)
+{
+  g_return_if_fail (FRAP_IS_MENU_DIRECTORY (directory));
+  
+  /* Abort if old and new value are equal */
+  if (directory->priv->no_display == no_display)
+    return;
+
+  /* Assign new value */
+  directory->priv->no_display = no_display;
+
+  /* Notify listeners */
+  g_object_notify (G_OBJECT (directory), "no-display");
+}
+
+
+
 static void
+frap_menu_directory_free_private (FrapMenuDirectory *directory)
+{
+  g_return_if_fail (FRAP_IS_MENU_DIRECTORY (directory));
+
+  /* Free name */
+  if (G_LIKELY (directory->priv->name != NULL))
+    g_free (directory->priv->name);
+
+  /* Free comment */
+  if (G_LIKELY (directory->priv->comment != NULL))
+    g_free (directory->priv->comment);
+
+  /* Free icon */
+  if (G_LIKELY (directory->priv->icon != NULL))
+    g_free (directory->priv->icon);
+
+  /* Free environment lists */
+  if (G_LIKELY (directory->priv->only_show_in != NULL))
+    g_strfreev (directory->priv->only_show_in);
+  if (G_LIKELY (directory->priv->not_show_in != NULL))
+    g_strfreev (directory->priv->not_show_in);
+}
+
+
+
+static void
 frap_menu_directory_load (FrapMenuDirectory *directory)
 {
   XfceRc      *entry;
   gchar      **values;
 
-  const gchar *name;
-  const gchar *comment;
-  const gchar *icon;
+  const gchar  *name;
+  const gchar  *comment;
+  const gchar  *icon;
 
   g_return_if_fail (FRAP_IS_MENU_DIRECTORY (directory));
   g_return_if_fail (directory->priv->filename != NULL);
@@ -476,13 +569,25 @@
   comment = xfce_rc_read_entry (entry, "Comment", NULL);
   icon = xfce_rc_read_entry (entry, "Icon", NULL);
 
-  /* Pass data over to the directory */
+  /* Pass data to the directory */
   frap_menu_directory_set_name (directory, name);
   frap_menu_directory_set_comment (directory, comment);
   frap_menu_directory_set_icon (directory, icon);
+  frap_menu_directory_set_no_display (directory, xfce_rc_read_bool_entry 
(entry, "NoDisplay", FALSE));
 
+  /* Set rest of the private data directly */
+  directory->priv->only_show_in = xfce_rc_read_list_entry (entry, 
"OnlyShowIn", ";");
+  directory->priv->not_show_in = xfce_rc_read_list_entry (entry, "NotShowIn", 
";");
+  directory->priv->hidden = xfce_rc_read_bool_entry (entry, "Hidden", FALSE);
+
   xfce_rc_close (entry);
 }
 
 
 
+gboolean
+frap_menu_directory_get_hidden (FrapMenuDirectory *directory)
+{
+  g_return_val_if_fail (FRAP_IS_MENU_DIRECTORY (directory), FALSE);
+  return directory->priv->hidden;
+}

Modified: libfrap/trunk/libfrap/menu/frap-menu-directory.h
===================================================================
--- libfrap/trunk/libfrap/menu/frap-menu-directory.h    2007-02-06 19:50:55 UTC 
(rev 24869)
+++ libfrap/trunk/libfrap/menu/frap-menu-directory.h    2007-02-06 21:33:13 UTC 
(rev 24870)
@@ -55,6 +55,10 @@
 const gchar             *frap_menu_directory_get_icon        
(FrapMenuDirectory *directory);
 void                     frap_menu_directory_set_icon        
(FrapMenuDirectory *directory,
                                                               const gchar      
 *icon);
+gboolean                 frap_menu_directory_get_no_display  
(FrapMenuDirectory *directory);
+void                     frap_menu_directory_set_no_display  
(FrapMenuDirectory *directory,
+                                                              gboolean         
  no_display);
+gboolean                 frap_menu_directory_get_hidden      
(FrapMenuDirectory *directory);
 
 #if defined(LIBFRAPMENU_COMPILATION)
 void _frap_menu_directory_init     (void) G_GNUC_INTERNAL;

Modified: libfrap/trunk/libfrap/menu/frap-menu-item.c
===================================================================
--- libfrap/trunk/libfrap/menu/frap-menu-item.c 2007-02-06 19:50:55 UTC (rev 
24869)
+++ libfrap/trunk/libfrap/menu/frap-menu-item.c 2007-02-06 21:33:13 UTC (rev 
24870)
@@ -209,7 +209,7 @@
   /**
    * FrapMenuItem:no-display:
    *
-   * Whether this menu item is displayed in menus.
+   * Whether this menu item is hidden in menus.
    **/
   g_object_class_install_property (gobject_class,
                                    PROP_NO_DISPLAY,
@@ -639,7 +639,7 @@
   g_return_if_fail (filename != NULL);
   g_return_if_fail (g_path_is_absolute (filename));
 
-  /* Free old filename */
+  /* Check if there is an old filename */
   if (G_UNLIKELY (item->priv->filename != NULL))
     {
       /* Abort if old and new filename are equal */

Modified: libfrap/trunk/libfrap/menu/frap-menu.c
===================================================================
--- libfrap/trunk/libfrap/menu/frap-menu.c      2007-02-06 19:50:55 UTC (rev 
24869)
+++ libfrap/trunk/libfrap/menu/frap-menu.c      2007-02-06 21:33:13 UTC (rev 
24870)
@@ -801,6 +801,7 @@
   if (G_UNLIKELY (directory == menu->priv->directory))
     return;
   
+  /* Destroy old directory */
   if (G_UNLIKELY (menu->priv->directory != NULL))
     g_object_unref (menu->priv->directory);
 
@@ -2351,20 +2352,25 @@
 static void
 frap_menu_resolve_deleted (FrapMenu *menu)
 {
-  GSList *iter;
+  GSList  *iter;
+  gboolean deleted;
 
   g_return_if_fail (FRAP_IS_MENU (menu));
 
-  /* Note: There's a limitation here. If the root menu has a <Deleted /> we
-   * can't just free the pointer here. Therefor we just check child menus. */
+  /* Note: There's a limitation: if the root menu has a <Deleted /> we
+   * can't just free the pointer here. Therefor we only check child menus. */
 
   for (iter = menu->priv->submenus; iter != NULL; iter = g_slist_next (iter))
     {
       FrapMenu *submenu = iter->data;
 
-      /* Remove submenu if it is deleted, otherwise check submenus of the
-       * submenu. */
-      if (G_UNLIKELY (submenu->priv->deleted))
+      /* Determine whether this submenu was deleted */
+      deleted = submenu->priv->deleted;
+      if (G_LIKELY (submenu->priv->directory != NULL))
+        deleted = deleted || frap_menu_directory_get_hidden 
(submenu->priv->directory);
+
+      /* Remove submenu if it is deleted, otherwise check submenus of the 
submenu */
+      if (G_UNLIKELY (deleted))
         {
           /* Remove submenu from the list ... */
           menu->priv->submenus = g_slist_remove_link (menu->priv->submenus, 
iter);

Modified: libfrap/trunk/libfrap/menu/tests/test-menu-spec.c
===================================================================
--- libfrap/trunk/libfrap/menu/tests/test-menu-spec.c   2007-02-06 19:50:55 UTC 
(rev 24869)
+++ libfrap/trunk/libfrap/menu/tests/test-menu-spec.c   2007-02-06 21:33:13 UTC 
(rev 24870)
@@ -61,17 +61,21 @@
 
   /* Print child menus */
   for (iter = g_slist_sort (frap_menu_get_menus (menu), (GCompareFunc) 
compare_menus); iter != NULL; iter = g_slist_next (iter)) 
-    print_menu (FRAP_MENU (iter->data), FALSE);
+    {
+      FrapMenuDirectory *submenu_directory = frap_menu_get_directory 
(FRAP_MENU (iter->data));
 
+      /* Don't display hidden menus */
+      if (G_LIKELY (submenu_directory == NULL || 
!frap_menu_directory_get_no_display (submenu_directory)))
+        print_menu (FRAP_MENU (iter->data), FALSE);
+    }
+
   /* Print menu items */
   for (iter = g_slist_sort (frap_menu_get_items (menu), (GCompareFunc) 
compare_menu_items); iter != NULL; iter = g_slist_next (iter)) 
     {
       FrapMenuItem      *item = iter->data;
 
-      if (G_UNLIKELY (frap_menu_item_get_no_display (item)))
-        continue;
-
-      g_printf ("%s/\t%s\t%s\n", name, frap_menu_item_get_desktop_id (item), 
frap_menu_item_get_filename (item));
+      if (G_UNLIKELY (!frap_menu_item_get_no_display (item)))
+        g_printf ("%s/\t%s\t%s\n", name, frap_menu_item_get_desktop_id (item), 
frap_menu_item_get_filename (item));
     }
 }
 

_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to