[Xfce4-commits] <garcon:master> Add hidden property to GarconMenuItem.
Nick Schermer
nick at xfce.org
Sat Aug 29 19:02:11 CEST 2009
Updating branch refs/heads/master
to 19743f27e2994a30bf12e629306ccca4af275818 (commit)
from f41a2d03030871f77bbb205a8c0ed625bb52aa86 (commit)
commit 19743f27e2994a30bf12e629306ccca4af275818
Author: Nick Schermer <nick at xfce.org>
Date: Sat Aug 29 18:44:03 2009 +0200
Add hidden property to GarconMenuItem.
Because of file monitoring we'd like to know all the
changes of a file, so also if it is hidden/deleted.
garcon/garcon-menu-item.c | 89 ++++++++++++++++++++++++++++++++++++++-------
garcon/garcon-menu-item.h | 3 ++
2 files changed, 79 insertions(+), 13 deletions(-)
diff --git a/garcon/garcon-menu-item.c b/garcon/garcon-menu-item.c
index 5f5a2d2..83e0a3a 100644
--- a/garcon/garcon-menu-item.c
+++ b/garcon/garcon-menu-item.c
@@ -56,6 +56,7 @@ enum
PROP_ICON_NAME,
PROP_COMMAND,
PROP_TRY_EXEC,
+ PROP_HIDDEN,
PROP_PATH,
};
@@ -131,6 +132,9 @@ struct _GarconMenuItemPrivate
/* Working directory */
gchar *path;
+ /* Hidden value */
+ guint hidden : 1;
+
/* Counter keeping the number of menus which use this item. This works
* like a reference counter and should be increased / decreased by GarconMenu
* items whenever the item is added to or removed from the menu. */
@@ -295,13 +299,17 @@ garcon_menu_item_class_init (GarconMenuItemClass *klass)
/**
* GarconMenuItem:try-exec:
*
- * TryExec value of the item's desktop entry.
+ * Path to an executable file on disk used to determine if the program
+ * is actually installed. If the path is not an absolute path, the file
+ * is looked up in the $PATH environment variable. If the file is not
+ * present or if it is not executable, the entry may be ignored (not be
+ * used in menus, for example).
**/
g_object_class_install_property (gobject_class,
PROP_TRY_EXEC,
g_param_spec_string ("try-exec",
"TryExec",
- "TryExec",
+ "Command to check if application is installed",
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
@@ -320,7 +328,23 @@ garcon_menu_item_class_init (GarconMenuItemClass *klass)
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
- /**
+ /**
+ * GarconMenuItem:hidden:
+ *
+ * It means the user deleted (at his level) something that was present
+ * (at an upper level, e.g. in the system dirs). It's strictly equivalent
+ * to the .desktop file not existing at all, as far as that user is concerned.
+ **/
+ g_object_class_install_property (gobject_class,
+ PROP_HIDDEN,
+ g_param_spec_boolean ("hidden",
+ "Hidden",
+ "Whether the application has been deleted",
+ FALSE,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
* GarconMenuItem:path:
*
* Working directory the application should be started in.
@@ -440,6 +464,10 @@ garcon_menu_item_get_property (GObject *object,
g_value_set_string (value, garcon_menu_item_get_try_exec (item));
break;
+ case PROP_HIDDEN:
+ g_value_set_boolean (value, garcon_menu_item_get_hidden (item));
+ break;
+
case PROP_PATH:
g_value_set_string (value, garcon_menu_item_get_path (item));
break;
@@ -506,6 +534,10 @@ garcon_menu_item_set_property (GObject *object,
garcon_menu_item_set_icon_name (item, g_value_get_string (value));
break;
+ case PROP_HIDDEN:
+ garcon_menu_item_set_hidden (item, g_value_get_boolean (value));
+ break;
+
case PROP_PATH:
garcon_menu_item_set_path (item, g_value_get_string (value));
break;
@@ -531,9 +563,9 @@ garcon_menu_item_get_element_visible (GarconMenuElement *element)
item = GARCON_MENU_ITEM (element);
- if (!garcon_menu_item_get_show_in_environment (item))
- return FALSE;
- else if (garcon_menu_item_get_no_display (item))
+ if (garcon_menu_item_get_hidden (item)
+ || garcon_menu_item_get_no_display (item)
+ || !garcon_menu_item_get_show_in_environment (item))
return FALSE;
/* Check the TryExec field */
@@ -615,6 +647,7 @@ garcon_menu_item_new (GFile *file)
gboolean terminal;
gboolean no_display;
gboolean startup_notify;
+ gboolean hidden;
gchar *path;
gchar *name;
gchar *generic_name;
@@ -636,11 +669,8 @@ garcon_menu_item_new (GFile *file)
rc = g_key_file_new ();
succeed = g_key_file_load_from_data (rc, contents, length, G_KEY_FILE_NONE, NULL);
g_free (contents);
-
- /* Abort if loading failed or the file has been marked as "deleted"/hidden */
- if (!succeed || GET_KEY (boolean, G_KEY_FILE_DESKTOP_KEY_HIDDEN))
+ if (G_UNLIKELY (!succeed))
{
- /* Cleanup and leave */
g_key_file_free (rc);
return NULL;
}
@@ -662,6 +692,7 @@ garcon_menu_item_new (GFile *file)
no_display = GET_KEY (boolean, G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY);
startup_notify = GET_KEY (boolean, G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY)
|| GET_KEY (boolean, "X-KDE-StartupNotify");
+ hidden = GET_KEY (boolean, G_KEY_FILE_DESKTOP_KEY_HIDDEN);
/* Allocate a new menu item instance */
item = g_object_new (GARCON_TYPE_MENU_ITEM,
@@ -676,6 +707,7 @@ garcon_menu_item_new (GFile *file)
"no-display", no_display,
"supports-startup-notification", startup_notify,
"path", path,
+ "hidden", hidden,
NULL);
/* Free strings */
@@ -851,6 +883,9 @@ garcon_menu_item_reload_from_file (GarconMenuItem *item,
|| GET_KEY (boolean, "X-KDE-StartupNotify");
garcon_menu_item_set_supports_startup_notification (item, boolean);
+ boolean = GET_KEY (boolean, G_KEY_FILE_DESKTOP_KEY_HIDDEN);
+ garcon_menu_item_set_hidden (item, boolean);
+
/* Flush property notifications */
g_object_thaw_notify (G_OBJECT (item));
@@ -1152,6 +1187,34 @@ garcon_menu_item_set_path (GarconMenuItem *item,
gboolean
+garcon_menu_item_get_hidden (GarconMenuItem *item)
+{
+ g_return_val_if_fail (GARCON_IS_MENU_ITEM (item), TRUE);
+ return item->priv->hidden;
+}
+
+
+
+void
+garcon_menu_item_set_hidden (GarconMenuItem *item,
+ gboolean hidden)
+{
+ g_return_if_fail (GARCON_IS_MENU_ITEM (item));
+
+ /* Abort if old and new value are equal */
+ if (item->priv->hidden == hidden)
+ return;
+
+ /* Assign new value */
+ item->priv->hidden = !!hidden;
+
+ /* Notify listeners */
+ g_object_notify (G_OBJECT (item), "hidden");
+}
+
+
+
+gboolean
garcon_menu_item_requires_terminal (GarconMenuItem *item)
{
g_return_val_if_fail (GARCON_IS_MENU_ITEM (item), FALSE);
@@ -1171,7 +1234,7 @@ garcon_menu_item_set_requires_terminal (GarconMenuItem *item,
return;
/* Assign new value */
- item->priv->requires_terminal = requires_terminal;
+ item->priv->requires_terminal = !!requires_terminal;
/* Notify listeners */
g_object_notify (G_OBJECT (item), "requires-terminal");
@@ -1199,7 +1262,7 @@ garcon_menu_item_set_no_display (GarconMenuItem *item,
return;
/* Assign new value */
- item->priv->no_display = no_display;
+ item->priv->no_display = !!no_display;
/* Notify listeners */
g_object_notify (G_OBJECT (item), "no-display");
@@ -1227,7 +1290,7 @@ garcon_menu_item_set_supports_startup_notification (GarconMenuItem *item,
return;
/* Assign new value */
- item->priv->supports_startup_notification = supports_startup_notification;
+ item->priv->supports_startup_notification = !!supports_startup_notification;
/* Notify listeners */
g_object_notify (G_OBJECT (item), "supports-startup-notification");
diff --git a/garcon/garcon-menu-item.h b/garcon/garcon-menu-item.h
index a4f543a..48b975d 100644
--- a/garcon/garcon-menu-item.h
+++ b/garcon/garcon-menu-item.h
@@ -85,6 +85,9 @@ void garcon_menu_item_set_icon_name (GarconMenuIt
const gchar *garcon_menu_item_get_path (GarconMenuItem *item);
void garcon_menu_item_set_path (GarconMenuItem *item,
const gchar *path);
+gboolean garcon_menu_item_get_hidden (GarconMenuItem *item);
+void garcon_menu_item_set_hidden (GarconMenuItem *item,
+ gboolean hidden);
gboolean garcon_menu_item_requires_terminal (GarconMenuItem *item);
void garcon_menu_item_set_requires_terminal (GarconMenuItem *item,
gboolean requires_terminal);
More information about the Xfce4-commits
mailing list