diff options
author | Javier <dev.git@javispedro.com> | 2015-01-23 01:11:07 +0100 |
---|---|---|
committer | Javier <dev.git@javispedro.com> | 2015-01-23 01:11:07 +0100 |
commit | b711fa350a4aec9d9584e6b3623290201f7273a2 (patch) | |
tree | f58b38cfd6216dd01dc6be82017c694f34ee9382 /libmdock/mdock-widget.c | |
parent | ca5aefe54c314f8dbbf3f09b55ebf9aa07ffbfd0 (diff) | |
download | mdock-b711fa350a4aec9d9584e6b3623290201f7273a2.tar.gz mdock-b711fa350a4aec9d9584e6b3623290201f7273a2.zip |
loading gsettings
Diffstat (limited to 'libmdock/mdock-widget.c')
-rw-r--r-- | libmdock/mdock-widget.c | 89 |
1 files changed, 84 insertions, 5 deletions
diff --git a/libmdock/mdock-widget.c b/libmdock/mdock-widget.c index 27f8f50..06080bf 100644 --- a/libmdock/mdock-widget.c +++ b/libmdock/mdock-widget.c @@ -76,8 +76,8 @@ static void handle_window_closed(MDockWidget *self, WnckWindow *window, WnckScre mdock_item_remove_window(item, window); g_hash_table_remove(self->priv->window_to_item, window); - if (mdock_item_get_num_windows(item) == 0) { - // Removing window! + if (mdock_item_get_num_windows(item) == 0 && !mdock_item_get_pinned(item)) { + // Removing item from dock g_hash_table_foreach_remove(self->priv->appid_to_item, filter_deleted_group, iter); g_hash_table_foreach_remove(self->priv->desktopid_to_item, filter_deleted_group, iter); g_sequence_remove(iter); @@ -137,6 +137,81 @@ static void handle_window_opened(MDockWidget *self, WnckWindow *window, WnckScre gtk_box_pack_start(GTK_BOX(self), GTK_WIDGET(item), TRUE, FALSE, 0); } +static void load_items_from_settings(MDockWidget *self, GSettings *settings) +{ + GVariantIter *set_iter; + GVariant *set_value; + GSequenceIter *seq_iter = g_sequence_get_begin_iter(self->priv->items); + + g_settings_get(settings, "items", "as", &set_iter); + set_value = g_variant_iter_next_value(set_iter); + + g_debug("Loading settings %p %p", set_value, seq_iter); + + while (set_value || !g_sequence_iter_is_end(seq_iter)) { + gboolean advance_set = FALSE, advance_seq = FALSE; + MDockItem *item = NULL; + GDesktopAppInfo *seq_appinfo = NULL; + GDesktopAppInfo *set_appinfo = NULL; + + g_debug("Iteration %p %p", set_value, seq_iter); + + if (!g_sequence_iter_is_end(seq_iter)) { + item = MDOCK_ITEM(g_sequence_get(seq_iter)); + seq_appinfo = mdock_item_get_desktop_app_info(item); + } + if (set_value) { + set_appinfo = g_desktop_app_info_new_from_filename(g_variant_get_string(set_value, NULL)); + } + + if (set_appinfo && seq_appinfo) { + const gchar *set_desktopid = g_app_info_get_id(G_APP_INFO(set_appinfo)); + const gchar *seq_desktopid = g_app_info_get_id(G_APP_INFO(seq_appinfo)); + const gboolean seq_pinned = mdock_item_get_pinned(item); + + // TODO broken + g_warning("broken"); + } else if (set_appinfo) { + g_debug("from set only"); + item = mdock_item_new(); + mdock_item_set_desktop_app_info(item, set_appinfo); + mdock_item_set_pinned(item, TRUE); + + GSequenceIter *iter = g_sequence_append(self->priv->items, item); + const gchar *desktopid = g_app_info_get_id(G_APP_INFO(set_appinfo)); + g_hash_table_insert(self->priv->desktopid_to_item, g_strdup(desktopid), iter); + gtk_widget_show(GTK_WIDGET(item)); + gtk_box_pack_start(GTK_BOX(self), GTK_WIDGET(item), TRUE, FALSE, 0); + + advance_set = TRUE; + } else if (seq_appinfo) { + g_debug("from seq only"); + if (mdock_item_get_pinned(item)) { + mdock_item_set_pinned(item, FALSE); + } + advance_seq = TRUE; + } + + g_object_unref(set_appinfo); + + if (advance_set && set_appinfo) { + g_variant_unref(set_value); + set_value = g_variant_iter_next_value(set_iter); + + } + if (advance_seq && !g_sequence_iter_is_end(seq_iter)) { + seq_iter = g_sequence_iter_next(seq_iter); + } + } + + g_variant_iter_free(set_iter); +} + +static void handle_settings_items_changed(MDockWidget *self, gchar *key, GSettings *settings) +{ + load_items_from_settings(self, settings); +} + static void mdock_widget_constructed(GObject *obj) { MDockWidget *self = MDOCK_WIDGET(obj); @@ -144,14 +219,16 @@ static void mdock_widget_constructed(GObject *obj) g_debug("Constructing with path: %s", self->priv->settings_path); self->priv->settings = g_settings_new_with_path("com.javispedro.mdock.widget", self->priv->settings_path); + g_signal_connect_object(self->priv->settings, "changed::items", + G_CALLBACK(handle_settings_items_changed), self, G_CONNECT_SWAPPED); self->priv->wnck_screen = wnck_screen_get_default(); g_signal_connect_object(self->priv->wnck_screen, "active-window-changed", - G_CALLBACK(handle_active_window_changed), self, G_CONNECT_SWAPPED); + G_CALLBACK(handle_active_window_changed), self, G_CONNECT_SWAPPED); g_signal_connect_object(self->priv->wnck_screen, "window-closed", - G_CALLBACK(handle_window_closed), self, G_CONNECT_SWAPPED); + G_CALLBACK(handle_window_closed), self, G_CONNECT_SWAPPED); g_signal_connect_object(self->priv->wnck_screen, "window-opened", - G_CALLBACK(handle_window_opened), self, G_CONNECT_SWAPPED); + G_CALLBACK(handle_window_opened), self, G_CONNECT_SWAPPED); self->priv->items = g_sequence_new(NULL); self->priv->appid_to_item = g_hash_table_new_full(app_id_hash, app_id_equal, @@ -161,6 +238,8 @@ static void mdock_widget_constructed(GObject *obj) self->priv->window_to_item = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); + load_items_from_settings(self, self->priv->settings); + GList *windows = wnck_screen_get_windows_stacked(self->priv->wnck_screen); for (GList *l = windows; l; l = g_list_next(l)) { WnckWindow *window = l->data; |