Ubuntu Pastebin

Paste from eric at Mon, 2 Feb 2015 13:15:17 +0000

Download as text
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
From d2b0b7391d318fd7b79ae5935c2bfec003756a87 Mon Sep 17 00:00:00 2001
From: Eric Koegel <eric.koegel@gmail.com>
Date: Mon, 2 Feb 2015 16:09:40 +0300
Subject: [PATCH] Fix crash in xfdesktop's metadata monitor

First, we need to disconnect the metadata monitors when finalizing
the file icon manager. Next, the metadata_changed function has been
rewirtten to filter out events we don't respond to.
---
 src/xfdesktop-file-icon-manager.c | 57 ++++++++++++++++++++++++++-------------
 1 file changed, 39 insertions(+), 18 deletions(-)

diff --git a/src/xfdesktop-file-icon-manager.c b/src/xfdesktop-file-icon-manager.c
index ccfd91e..de2d979 100644
--- a/src/xfdesktop-file-icon-manager.c
+++ b/src/xfdesktop-file-icon-manager.c
@@ -231,6 +231,7 @@ G_DEFINE_TYPE_EXTENDED(XfdesktopFileIconManager,
                        G_IMPLEMENT_INTERFACE(XFDESKTOP_TYPE_ICON_VIEW_MANAGER,
                                              xfdesktop_file_icon_manager_icon_view_manager_init))
 
+#define XFDESKTOP_FILE_ICON_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), XFDESKTOP_TYPE_ICON_VIEW_MANAGER, XfdesktopFileIconManagerPrivate))
 
 typedef struct
 {
@@ -2661,33 +2662,38 @@ xfdesktop_file_icon_manager_metadata_changed(GFileMonitor     *monitor,
                                              GFileMonitorEvent event,
                                              gpointer          user_data)
 {
-    XfdesktopFileIconManager *fmanager;
+    XfdesktopFileIconManager        *fmanager;
+    XfdesktopFileIconManagerPrivate *priv;
+    guint timer;
+
+    /* We only care about changed events */
+    if(event != G_FILE_MONITOR_EVENT_CHANGED)
+        return;
 
     /* Sanity check */
     if(user_data == NULL || !XFDESKTOP_IS_FILE_ICON_MANAGER(user_data))
         return;
 
     fmanager = XFDESKTOP_FILE_ICON_MANAGER(user_data);
+    priv = XFDESKTOP_FILE_ICON_MANAGER_GET_PRIVATE(fmanager);
 
-    switch(event) {
-        case G_FILE_MONITOR_EVENT_CHANGED:
-            XF_DEBUG("metadata file changed event");
-
-            /* cool down timer so we don't call this due to multiple file
-             * changes at the same time. */
-            if(fmanager->priv->metadata_timer == 0) {
-                guint timer;
+    if(!priv)
+        return;
 
-                timer = g_timeout_add_seconds(5,
-                                              (GSourceFunc)xfdesktop_file_icon_manager_metadata_timer,
-                                              fmanager);
+    XF_DEBUG("metadata file changed event");
 
-                fmanager->priv->metadata_timer = timer;
-            }
-            break;
-        default:
-            break;
+     /* remove any pending metadata changes */
+    if(priv->metadata_timer != 0) {
+        g_source_remove(priv->metadata_timer);
     }
+
+    /* cool down timer so we don't call this due to multiple file
+     * changes at the same time. */
+    timer = g_timeout_add_seconds(5,
+                                  (GSourceFunc)xfdesktop_file_icon_manager_metadata_timer,
+                                  fmanager);
+
+    priv->metadata_timer = timer;
 }
 
 static void
@@ -3112,7 +3118,22 @@ xfdesktop_file_icon_manager_fini(XfdesktopIconViewManager *manager)
         g_object_unref(fmanager->priv->monitor);
         fmanager->priv->monitor = NULL;
     }
-    
+
+    /* Same for the file metadata monitor */
+    if(fmanager->priv->metadata_monitor) {
+        g_signal_handlers_disconnect_by_func(fmanager->priv->metadata_monitor,
+                                             G_CALLBACK(xfdesktop_file_icon_manager_metadata_changed),
+                                             fmanager);
+        g_object_unref(fmanager->priv->metadata_monitor);
+        fmanager->priv->metadata_monitor = NULL;
+    }
+
+    /* remove any pending metadata changes */
+    if(fmanager->priv->metadata_timer != 0) {
+        g_source_remove(fmanager->priv->metadata_timer);
+        fmanager->priv->metadata_timer = 0;
+    }
+
     g_object_unref(G_OBJECT(fmanager->priv->desktop_icon));
     fmanager->priv->desktop_icon = NULL;
     
-- 
2.2.2
Download as text