summaryrefslogtreecommitdiff
path: root/libmdock/mdock-widget.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmdock/mdock-widget.c')
-rw-r--r--libmdock/mdock-widget.c89
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;