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