ayatana-commits team mailing list archive
-
ayatana-commits team
-
Mailing list archive
-
Message #02064
[Merge] lp:~bratsche/appmenu-gtk/performance-improvements into lp:appmenu-gtk
Cody Russell has proposed merging lp:~bratsche/appmenu-gtk/performance-improvements into lp:appmenu-gtk.
Requested reviews:
Canonical Desktop Experience Team (canonical-dx-team)
--
https://code.launchpad.net/~bratsche/appmenu-gtk/performance-improvements/+merge/32586
Your team ayatana-commits is subscribed to branch lp:appmenu-gtk.
=== modified file 'src/bridge.c'
--- src/bridge.c 2010-08-12 16:45:15 +0000
+++ src/bridge.c 2010-08-13 14:11:40 +0000
@@ -73,6 +73,7 @@
gchar *path;
gboolean registered;
AppMenuBridge *bridge;
+ GHashTable *lookup;
};
struct _AppMenuBridgePrivate
@@ -91,6 +92,7 @@
AppWindowContext *context;
gint count;
+ gboolean previous;
DbusmenuMenuitem *stack[30];
gboolean mode[30];
} RecurseContext;
@@ -203,6 +205,11 @@
context->server = NULL;
}
+ if (context->lookup)
+ {
+ g_hash_table_unref (context->lookup);
+ }
+
g_free (context);
}
@@ -766,7 +773,13 @@
}
}
- recurse->stack[recurse->count] = construct_dbusmenu_for_widget (widget, previous_separator);
+ recurse->stack[recurse->count] = g_hash_table_lookup (recurse->context->lookup, widget);
+ if (!recurse->stack[recurse->count])
+ {
+ recurse->stack[recurse->count] = construct_dbusmenu_for_widget (widget, previous_separator);
+
+ g_hash_table_insert (recurse->context->lookup, widget, recurse->stack[recurse->count]);
+ }
if (GTK_IS_SEPARATOR_MENU_ITEM (widget))
{
@@ -800,8 +813,44 @@
if (recurse->count > 0)
{
- dbusmenu_menuitem_child_append (recurse->stack[recurse->count - 1],
- recurse->stack[recurse->count]);
+ GList *children = NULL;
+ GList *peek = NULL;
+
+ if (recurse->stack[recurse->count -1])
+ {
+ children = dbusmenu_menuitem_get_children (recurse->stack[recurse->count - 1]);
+
+ if (children)
+ {
+ peek = g_list_find (children, recurse->stack[recurse->count]);
+ }
+
+ if (!peek)
+ {
+ dbusmenu_menuitem_child_append (recurse->stack[recurse->count - 1],
+ recurse->stack[recurse->count]);
+ }
+ }
+ else
+ {
+ DbusmenuMenuitem *item = g_hash_table_lookup (recurse->context->lookup,
+ gtk_widget_get_parent (widget));
+
+ if (item)
+ {
+ children = dbusmenu_menuitem_get_children (item);
+
+ if (children)
+ {
+ peek = g_list_find (children, recurse->stack[recurse->count]);
+ }
+
+ if (!peek)
+ {
+ dbusmenu_menuitem_child_append (item, recurse->stack[recurse->count]);
+ }
+ }
+ }
}
}
@@ -832,13 +881,16 @@
static gboolean
do_rebuild (RebuildData *data)
{
- rebuild_window_items (data->bridge,
- data->widget);
-
- g_hash_table_remove (rebuild_ids, data->widget);
- if (g_hash_table_size (rebuild_ids) == 0)
+ if (gtk_widget_is_toplevel (data->widget))
{
- g_hash_table_destroy (rebuild_ids);
+ rebuild_window_items (data->bridge,
+ data->widget);
+
+ g_hash_table_remove (rebuild_ids, data->widget);
+ if (g_hash_table_size (rebuild_ids) == 0)
+ {
+ g_hash_table_destroy (rebuild_ids);
+ }
}
g_free (data);
@@ -868,7 +920,7 @@
data->bridge = bridge;
data->widget = toplevel;
- id = g_timeout_add (500,
+ id = g_timeout_add (100,
(GSourceFunc)do_rebuild,
data);
@@ -949,7 +1001,16 @@
{
context = g_new0 (AppWindowContext, 1);
context->bridge = bridge;
+ context->lookup = g_hash_table_new (g_direct_hash, g_direct_equal);
bridge->priv->windows = g_list_prepend (bridge->priv->windows, context);
+
+ recurse.previous = FALSE;
+ recurse.count = -1;
+ }
+ else
+ {
+ recurse.previous = TRUE;
+ recurse.count = 0;
}
context->window = toplevel;
@@ -962,7 +1023,6 @@
recurse.bridge = bridge;
recurse.context = context;
- recurse.count = -1;
gtk_container_foreach (GTK_CONTAINER (toplevel),
(GtkCallback)rebuild_item,
Follow ups