static void g_menu_exporter_remote_subscribe (GMenuExporterRemote *remote, guint group_id, GVariantBuilder *builder) { GMenuExporterGroup *group; guint count; count = (gsize) g_hash_table_lookup (remote->watches, GINT_TO_POINTER (group_id)); g_hash_table_insert (remote->watches, GINT_TO_POINTER (group_id), GINT_TO_POINTER (count + 1)); group = g_menu_exporter_lookup_group (remote->exporter, group_id); g_menu_exporter_group_subscribe (group, builder); }
static void g_menu_exporter_remote_subscribe (GMenuExporterRemote *remote, guint group_id, GVariantBuilder *builder) { GMenuExporterGroup *group; guint count; count = (gsize) g_hash_table_lookup (remote->watches, GINT_TO_POINTER (group_id)); g_hash_table_insert (remote->watches, GINT_TO_POINTER (group_id), GINT_TO_POINTER (count + 1)); /* Group will be created (as empty/unsubscribed if it does not exist) */ group = g_menu_exporter_lookup_group (remote->exporter, group_id); g_menu_exporter_group_subscribe (group, builder); }
static void g_menu_exporter_remote_unsubscribe (GMenuExporterRemote *remote, guint group_id) { GMenuExporterGroup *group; guint count; count = (gsize) g_hash_table_lookup (remote->watches, GINT_TO_POINTER (group_id)); if (count == 0) return; if (count != 1) g_hash_table_insert (remote->watches, GINT_TO_POINTER (group_id), GINT_TO_POINTER (count - 1)); else g_hash_table_remove (remote->watches, GINT_TO_POINTER (group_id)); group = g_menu_exporter_lookup_group (remote->exporter, group_id); g_menu_exporter_group_unsubscribe (group, 1); }
static void g_menu_exporter_remote_free (gpointer data) { GMenuExporterRemote *remote = data; GHashTableIter iter; gpointer key, val; g_hash_table_iter_init (&iter, remote->watches); while (g_hash_table_iter_next (&iter, &key, &val)) { GMenuExporterGroup *group; group = g_menu_exporter_lookup_group (remote->exporter, GPOINTER_TO_INT (key)); g_menu_exporter_group_unsubscribe (group, GPOINTER_TO_INT (val)); } g_bus_unwatch_name (remote->watch_id); g_hash_table_unref (remote->watches); g_slice_free (GMenuExporterRemote, remote); }