static void _proxy_items_removed_cb (DBusGProxy *proxy, GPtrArray *items, gpointer userdata) { SwClientItemView *view = SW_CLIENT_ITEM_VIEW (userdata); SwClientItemViewPrivate *priv = GET_PRIVATE (view); gint i = 0; GList *items_list = NULL; for (i = 0; i < items->len; i++) { GValueArray *varray = (GValueArray *)g_ptr_array_index (items, i); const gchar *uid; SwItem *item; uid = g_value_get_string (g_value_array_get_nth (varray, 1)); item = g_hash_table_lookup (priv->uuid_to_items, uid); if (item) { /* Must ref up because g_hash_table_remove drops ref */ items_list = g_list_append (items_list, sw_item_ref (item)); g_hash_table_remove (priv->uuid_to_items, uid); } } /* If handler wants a ref then it should ref it up */ g_signal_emit (view, signals[ITEMS_REMOVED_SIGNAL], 0, items_list); g_list_foreach (items_list, (GFunc)sw_item_unref, NULL); g_list_free (items_list); }
static void _proxy_items_added_cb (DBusGProxy *proxy, GPtrArray *items, gpointer userdata) { SwClientItemView *view = SW_CLIENT_ITEM_VIEW (userdata); SwClientItemViewPrivate *priv = GET_PRIVATE (view); gint i = 0; GList *items_list = NULL; for (i = 0; i < items->len; i++) { GValueArray *varray = (GValueArray *)g_ptr_array_index (items, i); SwItem *item; /* First reference dropped when list freed */ item = _sw_item_from_value_array (varray); g_hash_table_insert (priv->uuid_to_items, g_strdup (item->uuid), sw_item_ref (item)); items_list = g_list_append (items_list, item); } /* If handler wants a ref then it should ref it up */ g_signal_emit (view, signals[ITEMS_ADDED_SIGNAL], 0, items_list); g_list_foreach (items_list, (GFunc)sw_item_unref, NULL); g_list_free (items_list); }
static void _view_items_added_cb (SwClientItemView *view, GList *items, gpointer userdata) { PengeEverythingPane *pane = PENGE_EVERYTHING_PANE (userdata); PengeEverythingPanePrivate *priv = GET_PRIVATE (pane); GList *l; for (l = items; l; l = l->next) { SwItem *item = (SwItem *)l->data; g_debug (G_STRLOC ": Item added: %s", item->uuid); g_hash_table_insert (priv->uuid_to_sw_items, g_strdup (item->uuid), sw_item_ref (item)); } penge_everything_pane_queue_update (pane); }
static void _proxy_items_changed_cb (DBusGProxy *proxy, GPtrArray *items, gpointer userdata) { SwClientItemView *view = SW_CLIENT_ITEM_VIEW (userdata); SwClientItemViewPrivate *priv = GET_PRIVATE (view); gint i = 0; GList *items_list = NULL; for (i = 0; i < items->len; i++) { GValueArray *varray = (GValueArray *)g_ptr_array_index (items, i); SwItem *item; const gchar *uid; uid = g_value_get_string (g_value_array_get_nth (varray, 1)); item = g_hash_table_lookup (priv->uuid_to_items, uid); if (item) { _sw_item_update_from_value_array (item, varray); items_list = g_list_append (items_list, sw_item_ref (item)); } else { g_critical (G_STRLOC ": Item changed before added: %s", uid); } } /* If handler wants a ref then it should ref it up */ g_signal_emit (view, signals[ITEMS_CHANGED_SIGNAL], 0, items_list); g_list_foreach (items_list, (GFunc)sw_item_unref, NULL); g_list_free (items_list); }