Keep a timestamp of KatzeArray changes around
To avoid re-populating array actions when unneeded. This also increases compatibility with global menubar support which otherwise flickers.
This commit is contained in:
parent
5c0255f7cb
commit
90ee1384a7
3 changed files with 55 additions and 14 deletions
|
@ -84,6 +84,8 @@ _katze_array_add_item (KatzeArray* array,
|
||||||
katze_item_set_parent (item, array);
|
katze_item_set_parent (item, array);
|
||||||
|
|
||||||
array->items = g_list_append (array->items, item);
|
array->items = g_list_append (array->items, item);
|
||||||
|
g_object_set_data (G_OBJECT (array), "last-update",
|
||||||
|
GINT_TO_POINTER (time (NULL)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -95,6 +97,8 @@ _katze_array_remove_item (KatzeArray* array,
|
||||||
if (KATZE_IS_ITEM (item))
|
if (KATZE_IS_ITEM (item))
|
||||||
katze_item_set_parent (item, NULL);
|
katze_item_set_parent (item, NULL);
|
||||||
g_object_unref (item);
|
g_object_unref (item);
|
||||||
|
g_object_set_data (G_OBJECT (array), "last-update",
|
||||||
|
GINT_TO_POINTER (time (NULL)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -104,6 +108,8 @@ _katze_array_move_item (KatzeArray* array,
|
||||||
{
|
{
|
||||||
array->items = g_list_remove (array->items, item);
|
array->items = g_list_remove (array->items, item);
|
||||||
array->items = g_list_insert (array->items, item, position);
|
array->items = g_list_insert (array->items, item, position);
|
||||||
|
g_object_set_data (G_OBJECT (array), "last-update",
|
||||||
|
GINT_TO_POINTER (time (NULL)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -115,6 +121,15 @@ _katze_array_clear (KatzeArray* array)
|
||||||
g_signal_emit (array, signals[REMOVE_ITEM], 0, item);
|
g_signal_emit (array, signals[REMOVE_ITEM], 0, item);
|
||||||
g_list_free (array->items);
|
g_list_free (array->items);
|
||||||
array->items = NULL;
|
array->items = NULL;
|
||||||
|
g_object_set_data (G_OBJECT (array), "last-update",
|
||||||
|
GINT_TO_POINTER (time (NULL)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_katze_array_update (KatzeArray* array)
|
||||||
|
{
|
||||||
|
g_object_set_data (G_OBJECT (array), "last-update",
|
||||||
|
GINT_TO_POINTER (time (NULL)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -192,7 +207,7 @@ katze_array_class_init (KatzeArrayClass* class)
|
||||||
"update",
|
"update",
|
||||||
G_TYPE_FROM_CLASS (class),
|
G_TYPE_FROM_CLASS (class),
|
||||||
(GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
|
(GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
|
||||||
0,
|
G_STRUCT_OFFSET (KatzeArrayClass, update),
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
g_cclosure_marshal_VOID__VOID,
|
g_cclosure_marshal_VOID__VOID,
|
||||||
|
@ -205,6 +220,7 @@ katze_array_class_init (KatzeArrayClass* class)
|
||||||
class->remove_item = _katze_array_remove_item;
|
class->remove_item = _katze_array_remove_item;
|
||||||
class->move_item = _katze_array_move_item;
|
class->move_item = _katze_array_move_item;
|
||||||
class->clear = _katze_array_clear;
|
class->clear = _katze_array_clear;
|
||||||
|
class->update = _katze_array_update;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -408,21 +408,39 @@ katze_array_action_generate_menu (KatzeArrayAction* array_action,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
katze_array_action_menu_item_select_cb (GtkWidget* proxy,
|
katze_array_action_menu_item_need_update (KatzeArrayAction* array_action,
|
||||||
KatzeArrayAction* array_action)
|
GtkWidget* proxy)
|
||||||
{
|
{
|
||||||
GtkWidget* menu;
|
GtkWidget* menu;
|
||||||
KatzeArray* array;
|
KatzeArray* array;
|
||||||
|
gint last_array_update, last_proxy_update;
|
||||||
gboolean handled;
|
gboolean handled;
|
||||||
|
|
||||||
|
array = g_object_get_data (G_OBJECT (proxy), "KatzeItem");
|
||||||
|
/* last-update is set on all arrays; consider public API */
|
||||||
|
last_array_update = GPOINTER_TO_INT (
|
||||||
|
g_object_get_data (G_OBJECT (array), "last-update"));
|
||||||
|
last_proxy_update = GPOINTER_TO_INT (
|
||||||
|
g_object_get_data (G_OBJECT (proxy), "last-update"));
|
||||||
|
if (last_proxy_update >= last_array_update)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (proxy));
|
menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (proxy));
|
||||||
gtk_container_foreach (GTK_CONTAINER (menu),
|
gtk_container_foreach (GTK_CONTAINER (menu),
|
||||||
(GtkCallback)(gtk_widget_destroy), NULL);
|
(GtkCallback)(gtk_widget_destroy), NULL);
|
||||||
|
|
||||||
array = g_object_get_data (G_OBJECT (proxy), "KatzeItem");
|
|
||||||
katze_array_action_generate_menu (array_action, array, GTK_MENU_SHELL (menu), proxy);
|
katze_array_action_generate_menu (array_action, array, GTK_MENU_SHELL (menu), proxy);
|
||||||
g_signal_emit (array_action, signals[POPULATE_FOLDER], 0, menu, array, &handled);
|
g_signal_emit (array_action, signals[POPULATE_FOLDER], 0, menu, array, &handled);
|
||||||
|
g_object_set_data (G_OBJECT (proxy), "last-update",
|
||||||
|
GINT_TO_POINTER (time (NULL)));
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
katze_array_action_menu_item_select_cb (GtkWidget* proxy,
|
||||||
|
KatzeArrayAction* array_action)
|
||||||
|
{
|
||||||
|
katze_array_action_menu_item_need_update (array_action, proxy);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -448,13 +466,15 @@ katze_array_action_proxy_clicked_cb (GtkWidget* proxy,
|
||||||
if (GTK_IS_MENU_ITEM (proxy))
|
if (GTK_IS_MENU_ITEM (proxy))
|
||||||
{
|
{
|
||||||
g_object_set_data (G_OBJECT (proxy), "KatzeItem", array_action->array);
|
g_object_set_data (G_OBJECT (proxy), "KatzeItem", array_action->array);
|
||||||
katze_array_action_menu_item_select_cb (proxy, array_action);
|
if (katze_array_action_menu_item_need_update (array_action, proxy))
|
||||||
g_signal_emit (array_action, signals[POPULATE_FOLDER], 0,
|
{
|
||||||
gtk_menu_item_get_submenu (GTK_MENU_ITEM (proxy)),
|
g_signal_emit (array_action, signals[POPULATE_FOLDER], 0,
|
||||||
array_action->array, &handled);
|
gtk_menu_item_get_submenu (GTK_MENU_ITEM (proxy)),
|
||||||
if (!handled)
|
array_action->array, &handled);
|
||||||
g_signal_emit (array_action, signals[POPULATE_POPUP], 0,
|
if (!handled)
|
||||||
gtk_menu_item_get_submenu (GTK_MENU_ITEM (proxy)));
|
g_signal_emit (array_action, signals[POPULATE_POPUP], 0,
|
||||||
|
gtk_menu_item_get_submenu (GTK_MENU_ITEM (proxy)));
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -711,9 +731,10 @@ katze_array_action_connect_proxy (GtkAction* action,
|
||||||
else if (GTK_IS_MENU_ITEM (proxy))
|
else if (GTK_IS_MENU_ITEM (proxy))
|
||||||
{
|
{
|
||||||
gtk_menu_item_set_submenu (GTK_MENU_ITEM (proxy), gtk_menu_new ());
|
gtk_menu_item_set_submenu (GTK_MENU_ITEM (proxy), gtk_menu_new ());
|
||||||
/* FIXME: 'select' doesn't cover all ways of selection */
|
|
||||||
g_signal_connect (proxy, "select",
|
g_signal_connect (proxy, "select",
|
||||||
G_CALLBACK (katze_array_action_proxy_clicked_cb), action);
|
G_CALLBACK (katze_array_action_proxy_clicked_cb), action);
|
||||||
|
g_signal_connect (proxy, "activate",
|
||||||
|
G_CALLBACK (katze_array_action_proxy_clicked_cb), action);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -315,6 +315,8 @@ katze_item_set_name (KatzeItem* item,
|
||||||
g_return_if_fail (KATZE_IS_ITEM (item));
|
g_return_if_fail (KATZE_IS_ITEM (item));
|
||||||
|
|
||||||
katze_assign (item->name, g_strdup (name));
|
katze_assign (item->name, g_strdup (name));
|
||||||
|
if (item->parent)
|
||||||
|
katze_array_update ((KatzeArray*)item->parent);
|
||||||
g_object_notify (G_OBJECT (item), "name");
|
g_object_notify (G_OBJECT (item), "name");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,6 +416,8 @@ katze_item_set_icon (KatzeItem* item,
|
||||||
g_return_if_fail (KATZE_IS_ITEM (item));
|
g_return_if_fail (KATZE_IS_ITEM (item));
|
||||||
|
|
||||||
katze_item_set_meta_string (item, "icon", icon);
|
katze_item_set_meta_string (item, "icon", icon);
|
||||||
|
if (item->parent)
|
||||||
|
katze_array_update ((KatzeArray*)item->parent);
|
||||||
g_object_notify (G_OBJECT (item), "icon");
|
g_object_notify (G_OBJECT (item), "icon");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue