← Back to team overview

ayatana-commits team mailing list archive

[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