ayatana-commits team mailing list archive
-
ayatana-commits team
-
Mailing list archive
-
Message #01791
[Merge] lp:~bratsche/appmenu-gtk/timer-per-toplevel into lp:appmenu-gtk
Cody Russell has proposed merging lp:~bratsche/appmenu-gtk/timer-per-toplevel into lp:appmenu-gtk.
Requested reviews:
Canonical Desktop Experience Team (canonical-dx-team)
Related bugs:
#592848 Tabs menu in gnome-terminal does not display correctly
https://bugs.launchpad.net/bugs/592848
--
https://code.launchpad.net/~bratsche/appmenu-gtk/timer-per-toplevel/+merge/29050
Your team ayatana-commits is subscribed to branch lp:appmenu-gtk.
=== modified file 'src/bridge.c'
--- src/bridge.c 2010-06-29 16:08:41 +0000
+++ src/bridge.c 2010-07-02 05:01:23 +0000
@@ -96,7 +96,7 @@
G_DEFINE_DYNAMIC_TYPE(AppMenuBridge, app_menu_bridge, UBUNTU_TYPE_MENU_PROXY)
-static guint rebuild_id = 0;
+static GHashTable *rebuild_ids = NULL;
static void
app_menu_bridge_setup_proxy (AppMenuBridge *bridge)
@@ -447,6 +447,27 @@
dbusmenu_menuitem_property_set_shortcut_menuitem (mi, GTK_MENU_ITEM (widget));
}
+static void
+action_notify_cb (GtkAction *action,
+ GParamSpec *pspec,
+ gpointer data)
+{
+ DbusmenuMenuitem *mi = (DbusmenuMenuitem *)data;
+
+ if (pspec->name == g_intern_static_string ("active"))
+ {
+ dbusmenu_menuitem_property_set_bool (mi,
+ DBUSMENU_MENUITEM_PROP_TOGGLE_STATE,
+ gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
+ }
+ else if (pspec->name == g_intern_static_string ("label"))
+ {
+ dbusmenu_menuitem_property_set (mi,
+ DBUSMENU_MENUITEM_PROP_LABEL,
+ gtk_action_get_label (action));
+ }
+}
+
static DbusmenuMenuitem *
construct_dbusmenu_for_widget (GtkWidget *widget)
{
@@ -502,8 +523,26 @@
G_CALLBACK (widget_notify_cb),
mi);
+ if (GTK_IS_ACTIVATABLE (widget))
+ {
+ GtkActivatable *activatable = GTK_ACTIVATABLE (widget);
+
+ if (gtk_activatable_get_use_action_appearance (activatable))
+ {
+ GtkAction *action = gtk_activatable_get_related_action (activatable);
+
+ if (action)
+ {
+ g_signal_connect_object (action, "notify",
+ G_CALLBACK (action_notify_cb),
+ mi,
+ G_CONNECT_AFTER);
+ }
+ }
+ }
+
g_signal_connect (G_OBJECT (mi),
- "item_activated",
+ DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
G_CALLBACK (item_activated),
widget);
}
@@ -599,6 +638,13 @@
{
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);
return FALSE;
@@ -608,19 +654,34 @@
rebuild (AppMenuBridge *bridge,
GtkWidget *toplevel)
{
- if (rebuild_id > 0)
+ guint id = 0;
+
+ if (rebuild_ids != NULL)
{
- g_source_remove (rebuild_id);
- rebuild_id = 0;
+ id = GPOINTER_TO_UINT (g_hash_table_lookup (rebuild_ids, toplevel));
+
+ if (id > 0)
+ {
+ g_source_remove (id);
+ g_hash_table_remove (rebuild_ids, toplevel);
+ id = 0;
+ }
}
RebuildData *data = g_new0 (RebuildData, 1);
data->bridge = bridge;
data->widget = toplevel;
- rebuild_id = g_timeout_add (500,
- (GSourceFunc)do_rebuild,
- data);
+ id = g_timeout_add (500,
+ (GSourceFunc)do_rebuild,
+ data);
+
+ if (rebuild_ids == NULL)
+ {
+ rebuild_ids = g_hash_table_new (g_direct_hash, g_direct_equal);
+ }
+
+ g_hash_table_insert (rebuild_ids, GUINT_TO_POINTER (id), toplevel);
}
static void
@@ -774,9 +835,6 @@
GtkWidget *toplevel = NULL;
gboolean append = FALSE;
- if (GTK_IS_TEAROFF_MENU_ITEM (child))
- return;
-
bridge = APP_MENU_BRIDGE (proxy);
priv = bridge->priv;
@@ -821,9 +879,16 @@
if (GTK_IS_WINDOW (toplevel))
{
- g_signal_connect (toplevel, "realize",
- G_CALLBACK (toplevel_realized),
- bridge);
+ if (!gtk_widget_get_realized (toplevel))
+ {
+ g_signal_connect (toplevel, "realize",
+ G_CALLBACK (toplevel_realized),
+ bridge);
+ }
+ else
+ {
+ rebuild (bridge, toplevel);
+ }
}
}