[gnome-applets/wip-geiger-task-item] fixup! window-picker: handle item lifecycle in TaskList



commit cf2ec598c18ce61f5f4f110b436fe0e0836545ab
Author: Sebastian Geiger <sbastig gmx net>
Date:   Thu Apr 2 23:26:41 2020 +0200

    fixup! window-picker: handle item lifecycle in TaskList

 gnome-applets/window-picker/task-item.c |  2 +
 gnome-applets/window-picker/task-list.c | 78 ++++++++++++++++-----------------
 2 files changed, 40 insertions(+), 40 deletions(-)
---
diff --git a/gnome-applets/window-picker/task-item.c b/gnome-applets/window-picker/task-item.c
index 143994dda..b190f447b 100644
--- a/gnome-applets/window-picker/task-item.c
+++ b/gnome-applets/window-picker/task-item.c
@@ -952,6 +952,8 @@ static void task_item_finalize (GObject *object) {
     g_clear_object (&item->window);
 
     G_OBJECT_CLASS (task_item_parent_class)->finalize (object);
+
+    g_print ("TaskItem finalized: %p\n", object);
 }
 
 static void task_item_class_init (TaskItemClass *klass) {
diff --git a/gnome-applets/window-picker/task-list.c b/gnome-applets/window-picker/task-list.c
index 393b4a518..28d331858 100644
--- a/gnome-applets/window-picker/task-list.c
+++ b/gnome-applets/window-picker/task-list.c
@@ -71,6 +71,14 @@ get_task_list_for_monitor (GdkMonitor *monitor)
     return task_lists->data;
 }
 
+static void on_task_item_closed (
+        TaskItem *item,
+        TaskList *list)
+{
+    gtk_container_remove (GTK_CONTAINER (list),
+                          GTK_WIDGET (item));
+}
+
 static GdkMonitor *
 window_get_monitor (WnckWindow *window)
 {
@@ -110,10 +118,17 @@ on_task_item_monitor_changed_cb (TaskItem *item,
                                               on_task_item_monitor_changed_cb,
                                               current_list);
 
+        g_signal_handlers_disconnect_by_func (item,
+                                              on_task_item_closed,
+                                              current_list);
+
         gtk_container_add (GTK_CONTAINER (list), GTK_WIDGET (item));
 
-        g_signal_connect (TASK_ITEM (item), "monitor-changed",
-                          G_CALLBACK (on_task_item_monitor_changed_cb), list);
+        g_signal_connect_object (TASK_ITEM (item), "task-item-closed",
+                                 G_CALLBACK (on_task_item_closed), list, 0);
+
+        g_signal_connect_object (TASK_ITEM (item), "monitor-changed",
+                                 G_CALLBACK (on_task_item_monitor_changed_cb), list, 0);
 
         g_object_unref (item);
 
@@ -148,6 +163,10 @@ create_task_item (TaskList   *taskList,
       {
         gtk_container_add (GTK_CONTAINER (taskList), item);
 
+        g_signal_connect_object (TASK_ITEM (item), "task-item-closed",
+                                 G_CALLBACK (on_task_item_closed),
+                                 taskList, 0);
+
         g_signal_connect_object (TASK_ITEM (item), "monitor-changed",
                                  G_CALLBACK (on_task_item_monitor_changed_cb),
                                  taskList, 0);
@@ -156,20 +175,25 @@ create_task_item (TaskList   *taskList,
     return item;
 }
 
-static void type_changed (WnckWindow *window,
-                          gpointer user_data)
+static void
+on_window_type_changed (WnckWindow *window,
+                        TaskList *list)
 {
-    TaskList *taskList = TASK_LIST (user_data);
+  GtkWidget *item;
 
-    if (!window_is_special (window))
-      {
-        GtkWidget * item;
+  if (window_is_special (window))
+    {
+      item = g_hash_table_lookup (list->items, window);
 
-        item = create_task_item (taskList, window);
+      g_hash_table_remove(list->items, item);
+    }
+  else
+    {
+      item = create_task_item (list, window);
 
-        if (item)
-          g_hash_table_insert (taskList->items, window, item);
-      }
+      if (item)
+        g_hash_table_insert (list->items, window, item);
+    }
 }
 
 static void
@@ -205,8 +229,8 @@ add_window (TaskList *list, WnckWindow *window)
 {
   GtkWidget *item;
 
-  g_signal_connect_object (window, "type-changed", G_CALLBACK (type_changed),
-                           list, 0);
+  g_signal_connect_object (window, "type-changed",
+                           G_CALLBACK (on_window_type_changed), list, 0);
 
   if (window_is_special (window))
     return NULL;
@@ -232,38 +256,12 @@ add_windows (TaskList *list)
   }
 }
 
-static void
-on_window_type_changed (WnckWindow *window,
-                        TaskList *list)
-{
-    TaskItem *item;
-    WnckWindowType type;
-
-    item = g_hash_table_lookup (list->items, window);
-
-    if (!item)
-        return;
-
-    type = wnck_window_get_window_type (window);
-
-    if (type == WNCK_WINDOW_DESKTOP ||
-        type == WNCK_WINDOW_DOCK ||
-        type == WNCK_WINDOW_SPLASHSCREEN ||
-        type == WNCK_WINDOW_MENU)
-    {
-        g_hash_table_remove (list->items, item);
-    }
-}
-
 static void
 on_window_opened (WnckScreen *screen,
                   WnckWindow *window,
                   TaskList   *taskList)
 {
   add_window (taskList, window);
-
-  g_signal_connect_object (window, "type-changed",
-                           G_CALLBACK (on_window_type_changed), taskList, 0);
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]