[gnome-applets] window-title: disconnect signal handlers from WnckScreen



commit 9e0ecd0f0efe924521983a689c16f8067ed48e4f
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Tue Mar 10 16:28:36 2020 +0200

    window-title: disconnect signal handlers from WnckScreen
    
    https://gitlab.gnome.org/GNOME/gnome-applets/issues/6

 window-title/windowtitle.c | 80 ++++++++++++++++++++++++++++++++++++++++++----
 window-title/windowtitle.h |  7 ++++
 2 files changed, 80 insertions(+), 7 deletions(-)
---
diff --git a/window-title/windowtitle.c b/window-title/windowtitle.c
index abc397999..e103d67a5 100755
--- a/window-title/windowtitle.c
+++ b/window-title/windowtitle.c
@@ -69,8 +69,59 @@ WTApplet* wt_applet_new (void) {
         return g_object_new (WT_TYPE_APPLET, NULL);
 }
 
-static void wt_applet_class_init (WTAppletClass *klass) {
-       // Not required
+static void
+wt_applet_dispose (GObject *object)
+{
+  WTApplet *self;
+
+  self = WT_APPLET (object);
+
+  if (self->active_window_changed_id != 0)
+    {
+      g_signal_handler_disconnect (self->activescreen,
+                                   self->active_window_changed_id);
+      self->active_window_changed_id = 0;
+    }
+
+  if (self->viewports_changed_id != 0)
+    {
+      g_signal_handler_disconnect (self->activescreen,
+                                   self->viewports_changed_id);
+      self->viewports_changed_id = 0;
+    }
+
+  if (self->active_workspace_changed_id != 0)
+    {
+      g_signal_handler_disconnect (self->activescreen,
+                                   self->active_workspace_changed_id);
+      self->active_workspace_changed_id = 0;
+    }
+
+  if (self->window_closed_id != 0)
+    {
+      g_signal_handler_disconnect (self->activescreen,
+                                   self->window_closed_id);
+      self->window_closed_id = 0;
+    }
+
+  if (self->window_opened_id != 0)
+    {
+      g_signal_handler_disconnect (self->activescreen,
+                                   self->window_opened_id);
+      self->window_opened_id = 0;
+    }
+
+  G_OBJECT_CLASS (wt_applet_parent_class)->dispose (object);
+}
+
+static void
+wt_applet_class_init (WTAppletClass *self_class)
+{
+  GObjectClass *object_class;
+
+  object_class = G_OBJECT_CLASS (self_class);
+
+  object_class->dispose = wt_applet_dispose;
 }
 
 static void wt_applet_init(WTApplet *wtapplet) {
@@ -707,11 +758,26 @@ static void init_wtapplet (PanelApplet *applet) {
        g_signal_connect(G_OBJECT (wtapplet->eb_title), "button-press-event", G_CALLBACK (title_clicked), 
wtapplet);
 
        // Global window tracking
-       g_signal_connect(wtapplet->activescreen, "active-window-changed", G_CALLBACK (active_window_changed), 
wtapplet); // <-- this thing is crashing with compiz !!!
-       g_signal_connect(wtapplet->activescreen, "viewports-changed", G_CALLBACK (viewports_changed), 
wtapplet);
-       g_signal_connect(wtapplet->activescreen, "active-workspace-changed", G_CALLBACK 
(active_workspace_changed), wtapplet);
-       g_signal_connect(wtapplet->activescreen, "window-closed", G_CALLBACK (window_closed), wtapplet);
-       g_signal_connect(wtapplet->activescreen, "window-opened", G_CALLBACK (window_opened), wtapplet);
+       wtapplet->active_window_changed_id = g_signal_connect (wtapplet->activescreen,
+                                                              "active-window-changed",
+                                                              G_CALLBACK (active_window_changed),
+                                                              wtapplet); // <-- this thing is crashing with 
compiz !!!
+       wtapplet->viewports_changed_id = g_signal_connect (wtapplet->activescreen,
+                                                          "viewports-changed",
+                                                          G_CALLBACK (viewports_changed),
+                                                          wtapplet);
+       wtapplet->active_workspace_changed_id = g_signal_connect (wtapplet->activescreen,
+                                                                 "active-workspace-changed",
+                                                                 G_CALLBACK (active_workspace_changed),
+                                                                 wtapplet);
+       wtapplet->window_closed_id = g_signal_connect (wtapplet->activescreen,
+                                                      "window-closed",
+                                                      G_CALLBACK (window_closed),
+                                                      wtapplet);
+       wtapplet->window_opened_id = g_signal_connect (wtapplet->activescreen,
+                                                      "window-opened",
+                                                      G_CALLBACK (window_opened),
+                                                      wtapplet);
 
        // g_signal_connect(G_OBJECT (wtapplet->title), "size-request", G_CALLBACK 
(applet_title_size_request), wtapplet);
        g_signal_connect(G_OBJECT (wtapplet), "size-allocate", G_CALLBACK (applet_size_allocate), wtapplet);
diff --git a/window-title/windowtitle.h b/window-title/windowtitle.h
index 492d99923..da7ab906c 100755
--- a/window-title/windowtitle.h
+++ b/window-title/windowtitle.h
@@ -115,6 +115,13 @@ typedef struct {
        /* Variables */
        WTPreferences   *prefs;                                 // Main properties
        WnckScreen              *activescreen;                  // Active screen
+
+       gulong active_window_changed_id;
+       gulong viewports_changed_id;
+       gulong active_workspace_changed_id;
+       gulong window_closed_id;
+       gulong window_opened_id;
+
        WnckWorkspace   *activeworkspace;               // Active workspace
        WnckWindow              *umaxedwindow,                  // Upper-most maximized window
                                        *activewindow,                  // Active window


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