[Xfce4-commits] r26912 - xfdesktop/trunk/modules/menu
Brian Tarricone
kelnos at xfce.org
Thu May 1 09:03:41 CEST 2008
Author: kelnos
Date: 2008-05-01 07:03:41 +0000 (Thu, 01 May 2008)
New Revision: 26912
Modified:
xfdesktop/trunk/modules/menu/desktop-menu.c
Log:
regenerate new desktop menu every time the old one is destroyed
it'll eat up a little more RAM, but menu display shouldn't ever lag now
Modified: xfdesktop/trunk/modules/menu/desktop-menu.c
===================================================================
--- xfdesktop/trunk/modules/menu/desktop-menu.c 2008-05-01 07:03:30 UTC (rev 26911)
+++ xfdesktop/trunk/modules/menu/desktop-menu.c 2008-05-01 07:03:41 UTC (rev 26912)
@@ -72,6 +72,9 @@
typedef struct
{
XfceMenu *xfce_menu;
+
+ gboolean cache_menu_items;
+ GList *menu_item_cache;
gchar *filename; /* file the menu is currently using */
gboolean using_default_menu;
@@ -96,7 +99,8 @@
gboolean deferred);
static void desktop_menu_add_items(XfceDesktopMenu *desktop_menu,
XfceMenu *xfce_menu,
- GtkWidget *menu);
+ GtkWidget *menu,
+ GList **menu_items_return);
static void
itheme_changed_cb(GtkIconTheme *itheme, gpointer user_data)
@@ -198,10 +202,17 @@
#endif
+/*
+ * this is a bit of a kludge. in order to support the cache and be a bit
+ * faster, we either want to build a GtkMenu, or we want to just build
+ * the GtkMenuItems and store them in a GList for later. only one
+ * of |menu| or |menu_items_return| should be non-NULL
+ */
static void
desktop_menu_add_items(XfceDesktopMenu *desktop_menu,
XfceMenu *xfce_menu,
- GtkWidget *menu)
+ GtkWidget *menu,
+ GList **menu_items_return)
{
GSList *items, *l;
GtkWidget *submenu, *mi, *img;
@@ -209,6 +220,9 @@
XfceMenuDirectory *xfce_directory;
XfceMenuItem *xfce_item;
const gchar *name, *icon_name;
+
+ g_return_if_fail((menu && !menu_items_return)
+ || (!menu && menu_items_return));
if(xfce_menu_has_layout(xfce_menu))
items = xfce_menu_get_layout_elements(xfce_menu);
@@ -247,10 +261,15 @@
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
}
gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(mi), submenu);
+
+ if(menu)
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+ else
+ *menu_items_return = g_list_prepend(*menu_items_return, mi);
- desktop_menu_add_items(desktop_menu, xfce_submenu, submenu);
+ desktop_menu_add_items(desktop_menu, xfce_submenu,
+ submenu, NULL);
/* we have to check emptiness down here instead of at the top of the
* loop because there may be further submenus that are empty */
@@ -259,7 +278,11 @@
} else if(XFCE_IS_MENU_SEPARATOR(l->data)) {
mi = gtk_separator_menu_item_new();
gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+
+ if(menu)
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+ else
+ *menu_items_return = g_list_prepend(*menu_items_return, mi);
} else if(XFCE_IS_MENU_ITEM(l->data)) {
const gchar *name = NULL;
@@ -282,10 +305,17 @@
xfce_menu_item_requires_terminal(xfce_item),
xfce_menu_item_supports_startup_notification(xfce_item));
gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+
+ if(menu)
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+ else
+ *menu_items_return = g_list_prepend(*menu_items_return, mi);
}
}
g_slist_free(items);
+
+ if(menu_items_return)
+ *menu_items_return = g_list_reverse(*menu_items_return);
}
static gboolean
@@ -318,6 +348,11 @@
g_error_free(error);
return FALSE;
}
+
+ if(desktop_menu->cache_menu_items) {
+ desktop_menu_add_items(desktop_menu, desktop_menu->xfce_menu,
+ NULL, &desktop_menu->menu_item_cache);
+ }
return ret;
}
@@ -325,6 +360,13 @@
static void
_xfce_desktop_menu_free_menudata(XfceDesktopMenu *desktop_menu)
{
+ if(desktop_menu->menu_item_cache) {
+ g_list_foreach(desktop_menu->menu_item_cache,
+ (GFunc)gtk_widget_destroy, NULL);
+ g_list_free(desktop_menu->menu_item_cache);
+ desktop_menu->menu_item_cache = NULL;
+ }
+
if(desktop_menu->xfce_menu) {
g_object_unref(G_OBJECT(desktop_menu->xfce_menu));
desktop_menu->xfce_menu = NULL;
@@ -345,6 +387,17 @@
return FALSE;
}
+static void
+desktop_menu_recache(gpointer data,
+ GObject *where_the_object_was)
+{
+ XfceDesktopMenu *desktop_menu = data;
+ if(!desktop_menu->menu_item_cache) {
+ desktop_menu_add_items(desktop_menu, desktop_menu->xfce_menu,
+ NULL, &desktop_menu->menu_item_cache);
+ }
+}
+
G_MODULE_EXPORT XfceDesktopMenu *
xfce_desktop_menu_new_impl(const gchar *menu_file,
gboolean deferred)
@@ -359,6 +412,7 @@
XfceDesktopMenu *desktop_menu = g_new0(XfceDesktopMenu, 1);
desktop_menu->use_menu_icons = TRUE;
+ desktop_menu->cache_menu_items = TRUE; /* FIXME: hidden pref? */
if(menu_file)
desktop_menu->filename = g_strdup(menu_file);
@@ -401,9 +455,19 @@
if(!desktop_menu->xfce_menu)
return;
}
-
- desktop_menu_add_items(desktop_menu, desktop_menu->xfce_menu,
- GTK_WIDGET(menu));
+
+ if(desktop_menu->menu_item_cache) {
+ GList *l;
+ for(l = desktop_menu->menu_item_cache; l; l = l->next)
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), l->data);
+ g_list_free(desktop_menu->menu_item_cache);
+ desktop_menu->menu_item_cache = NULL;
+ g_object_weak_ref(G_OBJECT(menu), desktop_menu_recache,
+ desktop_menu);
+ } else {
+ desktop_menu_add_items(desktop_menu, desktop_menu->xfce_menu,
+ GTK_WIDGET(menu), NULL);
+ }
}
G_MODULE_EXPORT GtkWidget *
More information about the Xfce4-commits
mailing list