[Xfce4-commits] <thunar:nick/patch-queue> Add startup notification to the UCA plugin.

Nick Schermer noreply at xfce.org
Thu Dec 17 22:12:01 CET 2009


Updating branch refs/heads/nick/patch-queue
         to 758f2ceed69f1ff1a02b41e04eb38af239bfb8c2 (commit)
       from 1b9bca8093fc7a0695db7f2365833fbb14cf93a2 (commit)

commit 758f2ceed69f1ff1a02b41e04eb38af239bfb8c2
Author: Nick Schermer <nick at xfce.org>
Date:   Thu Dec 17 22:10:23 2009 +0100

    Add startup notification to the UCA plugin.

 add-startup-notification-to-the-uca-plugin.patch |  509 ++++++++++++++++++++++
 1 files changed, 509 insertions(+), 0 deletions(-)

diff --git a/add-startup-notification-to-the-uca-plugin.patch b/add-startup-notification-to-the-uca-plugin.patch
new file mode 100644
index 0000000..0103df1
--- /dev/null
+++ b/add-startup-notification-to-the-uca-plugin.patch
@@ -0,0 +1,509 @@
+From 9ca920912a7bedf6ed47935dac3f60388375448c Mon Sep 17 00:00:00 2001
+From: Nick Schermer <nick at xfce.org>
+Date: Thu, 17 Dec 2009 22:08:23 +0100
+Subject: [PATCH] Add startup notification to the UCA plugin.
+
+This makes the UCA plugin work properly with focus stealing. It
+requires a version of libxfce4ui with the
+xfce_spawn_on_screen_with_child_watch() function.
+
+Signed-off-by: Nick Schermer <nick at xfce.org>
+---
+ plugins/thunar-uca/Makefile.am           |    6 ++
+ plugins/thunar-uca/thunar-uca-editor.c   |   22 ++++-
+ plugins/thunar-uca/thunar-uca-model.c    |   27 +++++++
+ plugins/thunar-uca/thunar-uca-model.h    |    2 +
+ plugins/thunar-uca/thunar-uca-provider.c |  122 +++++++++++++++++-------------
+ 5 files changed, 120 insertions(+), 59 deletions(-)
+
+diff --git a/plugins/thunar-uca/Makefile.am b/plugins/thunar-uca/Makefile.am
+index e9a05a4..2e37016 100644
+--- a/plugins/thunar-uca/Makefile.am
++++ b/plugins/thunar-uca/Makefile.am
+@@ -33,8 +33,14 @@ thunar_uca_la_SOURCES =							\
+ thunar_uca_la_CFLAGS =							\
+ 	$(EXO_CFLAGS)							\
+ 	$(LIBXFCE4UTIL_CFLAGS)						\
++	$(LIBXFCE4UI_CFLAGS)						\
+ 	$(PLATFORM_CFLAGS)
+ 
++thunar_uca_la_LIBADD =							\
++	$(EXO_LIBS)							\
++	$(LIBXFCE4UTIL_LIBS)						\
++	$(LIBXFCE4UI_LIBS)
++
+ thunar_uca_la_LDFLAGS =							\
+ 	-avoid-version							\
+ 	-export-dynamic							\
+diff --git a/plugins/thunar-uca/thunar-uca-editor.c b/plugins/thunar-uca/thunar-uca-editor.c
+index e513fbd..eac1241 100644
+--- a/plugins/thunar-uca/thunar-uca-editor.c
++++ b/plugins/thunar-uca/thunar-uca-editor.c
+@@ -59,6 +59,7 @@ struct _ThunarUcaEditor
+   GtkWidget   *description_entry;
+   GtkWidget   *icon_button;
+   GtkWidget   *command_entry;
++  GtkWidget   *sn_button;
+   GtkWidget   *parameter_entry;
+   GtkWidget   *patterns_entry;
+   GtkWidget   *directories_button;
+@@ -119,7 +120,7 @@ thunar_uca_editor_init (ThunarUcaEditor *uca_editor)
+      Basic
+    */
+   label = gtk_label_new (_("Basic"));
+-  table = gtk_table_new (6, 2, FALSE);
++  table = gtk_table_new (7, 2, FALSE);
+   gtk_table_set_col_spacings (GTK_TABLE (table), 12);
+   gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+   gtk_container_set_border_width (GTK_CONTAINER (table), 12);
+@@ -199,12 +200,19 @@ thunar_uca_editor_init (ThunarUcaEditor *uca_editor)
+   atk_relation_set_add (relations, relation);
+   g_object_unref (G_OBJECT (relation));
+ 
++  uca_editor->sn_button = gtk_check_button_new_with_label (_("Use Startup Notification"));
++  gtk_widget_set_tooltip_text (uca_editor->sn_button, _("Enable this option if you want a waiting cursor when the action "
++                                                        "is launched. This is also highly recommended when you have focus "
++                                                        "stealing enabled in your window manager."));
++  gtk_table_attach (GTK_TABLE (table), uca_editor->sn_button, 1, 2, 3, 4, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
++  gtk_widget_show (uca_editor->sn_button);
++
+   label = g_object_new (GTK_TYPE_LABEL, "label", _("_Icon:"), "use-underline", TRUE, "xalign", 0.0f, NULL);
+-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 3, 4, GTK_FILL, GTK_FILL, 0, 0);
++  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 4, 5, GTK_FILL, GTK_FILL, 0, 0);
+   gtk_widget_show (label);
+ 
+   align = gtk_alignment_new (0.0f, 0.5f, 0.0f, 0.0f);
+-  gtk_table_attach (GTK_TABLE (table), align, 1, 2, 3, 4, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
++  gtk_table_attach (GTK_TABLE (table), align, 1, 2, 4, 5, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
+   gtk_widget_show (align);
+ 
+   uca_editor->icon_button = gtk_button_new_with_label (_("No icon"));
+@@ -223,11 +231,11 @@ thunar_uca_editor_init (ThunarUcaEditor *uca_editor)
+   g_object_unref (G_OBJECT (relation));
+ 
+   align = g_object_new (GTK_TYPE_ALIGNMENT, "height-request", 12, NULL);
+-  gtk_table_attach (GTK_TABLE (table), align, 0, 2, 4, 5, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
++  gtk_table_attach (GTK_TABLE (table), align, 0, 2, 5, 6, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
+   gtk_widget_show (align);
+ 
+   hbox = gtk_hbox_new (FALSE, 6);
+-  gtk_table_attach (GTK_TABLE (table), hbox, 0, 2, 5, 6, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
++  gtk_table_attach (GTK_TABLE (table), hbox, 0, 2, 6, 7, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
+   gtk_widget_show (hbox);
+ 
+   image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DND);
+@@ -763,6 +771,7 @@ thunar_uca_editor_load (ThunarUcaEditor *uca_editor,
+   gchar         *command;
+   gchar         *icon;
+   gchar         *name;
++  gboolean       startup_notify;
+ 
+   g_return_if_fail (THUNAR_UCA_IS_EDITOR (uca_editor));
+   g_return_if_fail (THUNAR_UCA_IS_MODEL (uca_model));
+@@ -776,6 +785,7 @@ thunar_uca_editor_load (ThunarUcaEditor *uca_editor,
+                       THUNAR_UCA_MODEL_COLUMN_TYPES, &types,
+                       THUNAR_UCA_MODEL_COLUMN_ICON, &icon,
+                       THUNAR_UCA_MODEL_COLUMN_NAME, &name,
++                      THUNAR_UCA_MODEL_COLUMN_STARTUP_NOTIFY, &startup_notify,
+                       -1);
+ 
+   /* setup the new selection */
+@@ -789,6 +799,7 @@ thunar_uca_editor_load (ThunarUcaEditor *uca_editor,
+   gtk_entry_set_text (GTK_ENTRY (uca_editor->patterns_entry), (patterns != NULL) ? patterns : "");
+   gtk_entry_set_text (GTK_ENTRY (uca_editor->command_entry), (command != NULL) ? command : "");
+   gtk_entry_set_text (GTK_ENTRY (uca_editor->name_entry), (name != NULL) ? name : "");
++  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (uca_editor->sn_button), startup_notify);
+ 
+   /* cleanup */
+   g_free (description);
+@@ -823,6 +834,7 @@ thunar_uca_editor_save (ThunarUcaEditor *uca_editor,
+                            gtk_entry_get_text (GTK_ENTRY (uca_editor->description_entry)),
+                            thunar_uca_editor_get_icon_name (uca_editor),
+                            gtk_entry_get_text (GTK_ENTRY (uca_editor->command_entry)),
++                           gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (uca_editor->sn_button)),
+                            gtk_entry_get_text (GTK_ENTRY (uca_editor->patterns_entry)),
+                            thunar_uca_editor_get_types (uca_editor));
+ }
+diff --git a/plugins/thunar-uca/thunar-uca-model.c b/plugins/thunar-uca/thunar-uca-model.c
+index fefb101..d5cb8e4 100644
+--- a/plugins/thunar-uca/thunar-uca-model.c
++++ b/plugins/thunar-uca/thunar-uca-model.c
+@@ -74,6 +74,7 @@ typedef enum
+   PARSER_ICON,
+   PARSER_NAME,
+   PARSER_COMMAND,
++  PARSER_STARTUP_NOTIFY,
+   PARSER_PATTERNS,
+   PARSER_DESCRIPTION,
+   PARSER_DIRECTORIES,
+@@ -161,6 +162,7 @@ struct _ThunarUcaModelItem
+   gchar         *description;
+   gchar         *icon;
+   gchar         *command;
++  guint          startup_notify : 1;
+   gchar        **patterns;
+   ThunarUcaTypes types;
+ 
+@@ -182,6 +184,7 @@ typedef struct
+   GString        *command;
+   GString        *patterns;
+   GString        *description;
++  gboolean        startup_notify;
+   gboolean        description_use;
+   guint           description_match;
+   ThunarUcaTypes  types;
+@@ -323,6 +326,9 @@ thunar_uca_model_get_column_type (GtkTreeModel *tree_model,
+     case THUNAR_UCA_MODEL_COLUMN_COMMAND:
+       return G_TYPE_STRING;
+ 
++    case THUNAR_UCA_MODEL_COLUMN_STARTUP_NOTIFY:
++      return G_TYPE_BOOLEAN;
++
+     case THUNAR_UCA_MODEL_COLUMN_PATTERNS:
+       return G_TYPE_STRING;
+ 
+@@ -412,6 +418,10 @@ thunar_uca_model_get_value (GtkTreeModel *tree_model,
+       g_value_set_static_string (value, item->command);
+       break;
+ 
++    case THUNAR_UCA_MODEL_COLUMN_STARTUP_NOTIFY:
++      g_value_set_boolean (value, item->startup_notify);
++      break;
++
+     case THUNAR_UCA_MODEL_COLUMN_PATTERNS:
+       str = g_strjoinv (";", item->patterns);
+       g_value_take_string (value, str);
+@@ -549,6 +559,7 @@ thunar_uca_model_load_from_file (ThunarUcaModel *uca_model,
+   parser.command = g_string_new (NULL);
+   parser.patterns = g_string_new (NULL);
+   parser.description = g_string_new (NULL);
++  parser.startup_notify = FALSE;
+   xfce_stack_push (parser.stack, PARSER_START);
+ 
+   /* parse the file */
+@@ -622,6 +633,7 @@ start_element_handler (GMarkupParseContext *context,
+           parser->name_match = XFCE_LOCALE_NO_MATCH;
+           parser->description_match = XFCE_LOCALE_NO_MATCH;
+           parser->types = 0;
++          parser->startup_notify = FALSE;
+           g_string_truncate (parser->icon, 0);
+           g_string_truncate (parser->name, 0);
+           g_string_truncate (parser->command, 0);
+@@ -707,6 +719,11 @@ start_element_handler (GMarkupParseContext *context,
+ 
+           xfce_stack_push (parser->stack, PARSER_DESCRIPTION);
+         }
++      else if (strcmp (element_name, "startup-notify") == 0)
++        {
++          parser->startup_notify = TRUE;
++          xfce_stack_push (parser->stack, PARSER_STARTUP_NOTIFY);
++        }
+       else if (strcmp (element_name, "directories") == 0)
+         {
+           parser->types |= THUNAR_UCA_TYPE_DIRECTORIES;
+@@ -784,6 +801,7 @@ end_element_handler (GMarkupParseContext *context,
+                                    parser->description->str,
+                                    parser->icon->str,
+                                    parser->command->str,
++                                   parser->startup_notify,
+                                    parser->patterns->str,
+                                    parser->types);
+         }
+@@ -816,6 +834,11 @@ end_element_handler (GMarkupParseContext *context,
+         goto unknown_element;
+       break;
+ 
++    case PARSER_STARTUP_NOTIFY:
++      if (strcmp (element_name, "startup-notify") != 0)
++        goto unknown_element;
++      break;
++
+     case PARSER_DIRECTORIES:
+       if (strcmp (element_name, "directories") != 0)
+         goto unknown_element;
+@@ -1215,6 +1238,7 @@ thunar_uca_model_update (ThunarUcaModel *uca_model,
+                          const gchar    *description,
+                          const gchar    *icon,
+                          const gchar    *command,
++                         gboolean        startup_notify,
+                          const gchar    *patterns,
+                          ThunarUcaTypes  types)
+ {
+@@ -1239,6 +1263,7 @@ thunar_uca_model_update (ThunarUcaModel *uca_model,
+   if (G_LIKELY (description != NULL && *description != '\0'))
+     item->description = g_strdup (description);
+   item->types = types;
++  item->startup_notify = startup_notify;
+ 
+   /* setup the patterns */
+   item->patterns = g_strsplit ((patterns != NULL && *patterns != '\0') ? patterns : "*", ";", -1);
+@@ -1334,6 +1359,8 @@ thunar_uca_model_save (ThunarUcaModel *uca_model,
+       fprintf (fp, "%s", escaped);
+       g_free (patterns);
+       g_free (escaped);
++      if (item->startup_notify)
++        fprintf (fp, "<startup-notify/>");
+       if ((item->types & THUNAR_UCA_TYPE_DIRECTORIES) != 0)
+         fprintf (fp, "<directories/>");
+       if ((item->types & THUNAR_UCA_TYPE_AUDIO_FILES) != 0)
+diff --git a/plugins/thunar-uca/thunar-uca-model.h b/plugins/thunar-uca/thunar-uca-model.h
+index d778270..9bef6df 100644
+--- a/plugins/thunar-uca/thunar-uca-model.h
++++ b/plugins/thunar-uca/thunar-uca-model.h
+@@ -41,6 +41,7 @@ typedef enum
+   THUNAR_UCA_MODEL_COLUMN_DESCRIPTION,
+   THUNAR_UCA_MODEL_COLUMN_ICON,
+   THUNAR_UCA_MODEL_COLUMN_COMMAND,
++  THUNAR_UCA_MODEL_COLUMN_STARTUP_NOTIFY,
+   THUNAR_UCA_MODEL_COLUMN_PATTERNS,
+   THUNAR_UCA_MODEL_COLUMN_TYPES,
+   THUNAR_UCA_MODEL_COLUMN_STOCK_LABEL,
+@@ -90,6 +91,7 @@ void            thunar_uca_model_update         (ThunarUcaModel         *uca_mod
+                                                  const gchar            *description,
+                                                  const gchar            *icon,
+                                                  const gchar            *command,
++                                                 gboolean                startup_notify,
+                                                  const gchar            *patterns,
+                                                  ThunarUcaTypes          types);
+ 
+diff --git a/plugins/thunar-uca/thunar-uca-provider.c b/plugins/thunar-uca/thunar-uca-provider.c
+index 3c5550a..bfaeb85 100644
+--- a/plugins/thunar-uca/thunar-uca-provider.c
++++ b/plugins/thunar-uca/thunar-uca-provider.c
+@@ -23,8 +23,8 @@
+ #include <config.h>
+ #endif
+ 
+-#include <glib/gi18n.h>
+ #include <gio/gio.h>
++#include <libxfce4ui/libxfce4ui.h>
+ 
+ #include <thunar-uca/thunar-uca-chooser.h>
+ #include <thunar-uca/thunar-uca-context.h>
+@@ -47,10 +47,10 @@ static GList *thunar_uca_provider_get_folder_actions        (ThunarxMenuProvider
+                                                              ThunarxFileInfo                  *folder);
+ static void   thunar_uca_provider_activated                 (ThunarUcaProvider                *uca_provider,
+                                                              GtkAction                        *action);
+-static void   thunar_uca_provider_child_watch               (GPid                              pid,
+-                                                             gint                              status,
+-                                                             gpointer                          user_data);
+-static void   thunar_uca_provider_child_watch_destroy       (gpointer                          user_data);
++static void   thunar_uca_provider_child_watch               (ThunarUcaProvider                *uca_provider,
++                                                             gint                              exit_status);
++static void   thunar_uca_provider_child_watch_destroy       (gpointer                          user_data,
++                                                             GClosure                         *closure);
+ 
+ 
+ 
+@@ -71,7 +71,7 @@ struct _ThunarUcaProvider
+    * child process has terminated.
+    */
+   gchar          *child_watch_path;
+-  gint            child_watch_id;
++  GClosure       *child_watch;
+ };
+ 
+ 
+@@ -133,10 +133,6 @@ thunar_uca_provider_init (ThunarUcaProvider *uca_provider)
+ 
+   /* grab a reference on the default model */
+   uca_provider->model = thunar_uca_model_get_default ();
+-
+-  /* initialize child watch support */
+-  uca_provider->child_watch_path = NULL;
+-  uca_provider->child_watch_id = -1;
+ }
+ 
+ 
+@@ -145,18 +141,9 @@ static void
+ thunar_uca_provider_finalize (GObject *object)
+ {
+   ThunarUcaProvider *uca_provider = THUNAR_UCA_PROVIDER (object);
+-  GSource           *source;
+ 
+   /* give up maintaince of any pending child watch */
+-  if (G_UNLIKELY (uca_provider->child_watch_id >= 0))
+-    {
+-      /* reset the callback function to g_spawn_close_pid() so the plugin can be
+-       * safely unloaded and the child will still not become a zombie afterwards.
+-       * This also resets the child_watch_id and child_watch_path properties.
+-       */
+-      source = g_main_context_find_source_by_id (NULL, uca_provider->child_watch_id);
+-      g_source_set_callback (source, (GSourceFunc) g_spawn_close_pid, NULL, NULL);
+-    }
++  thunar_uca_provider_child_watch_destroy (uca_provider, NULL);
+ 
+   /* drop our reference on the model */
+   g_object_unref (G_OBJECT (uca_provider->model));
+@@ -307,7 +294,6 @@ thunar_uca_provider_activated (ThunarUcaProvider *uca_provider,
+   GtkWidget           *dialog;
+   GtkWidget           *window;
+   gboolean             succeed;
+-  GSource             *source;
+   GError              *error = NULL;
+   GList               *files;
+   gchar              **argv;
+@@ -316,7 +302,9 @@ thunar_uca_provider_activated (ThunarUcaProvider *uca_provider,
+   gchar               *label;
+   gchar               *uri;
+   gint                 argc;
+-  gint                 pid;
++  gchar               *icon_name = NULL;
++  gboolean             startup_notify;
++  GClosure            *child_watch;
+ 
+   g_return_if_fail (THUNAR_UCA_IS_PROVIDER (uca_provider));
+   g_return_if_fail (GTK_IS_ACTION (action));
+@@ -340,6 +328,12 @@ thunar_uca_provider_activated (ThunarUcaProvider *uca_provider,
+   succeed = thunar_uca_model_parse_argv (uca_provider->model, &iter, files, &argc, &argv, &error);
+   if (G_LIKELY (succeed))
+     {
++      /* get the icon name and whether startup notification is active */
++      gtk_tree_model_get (GTK_TREE_MODEL (uca_provider->model), &iter,
++                          THUNAR_UCA_MODEL_COLUMN_ICON, &icon_name,
++                          THUNAR_UCA_MODEL_COLUMN_STARTUP_NOTIFY, &startup_notify,
++                          -1);
++
+       /* determine the working from the first file */
+       if (G_LIKELY (files != NULL))
+         {
+@@ -363,36 +357,45 @@ thunar_uca_provider_activated (ThunarUcaProvider *uca_provider,
+           g_free (uri);
+         }
+ 
++      /* build closre for child watch */
++      child_watch = g_cclosure_new_swap (G_CALLBACK (thunar_uca_provider_child_watch),
++                                         uca_provider, thunar_uca_provider_child_watch_destroy);
++      g_closure_ref (child_watch);
++      g_closure_sink (child_watch);
++
+       /* spawn the command on the window's screen */
+-      succeed = gdk_spawn_on_screen (gtk_widget_get_screen (GTK_WIDGET (window)), working_directory,
+-                                     argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH,
+-                                     NULL, NULL, &pid, &error);
++      succeed = xfce_spawn_on_screen_with_child_watch (gtk_widget_get_screen (GTK_WIDGET (window)),
++                                                       working_directory, argv, NULL,
++                                                       G_SPAWN_SEARCH_PATH,
++                                                       startup_notify,
++                                                       gtk_get_current_event_time (),
++                                                       icon_name,
++                                                       child_watch,
++                                                       &error);
+ 
+       /* check if we succeed */
+       if (G_LIKELY (succeed))
+         {
+-          /* check if we already have a child watch */
+-          if (G_UNLIKELY (uca_provider->child_watch_id >= 0))
+-            {
+-              /* reset the callback function to g_spawn_close_pid() so the plugin can be
+-               * safely unloaded and the child will still not become a zombie afterwards.
+-               */
+-              source = g_main_context_find_source_by_id (NULL, uca_provider->child_watch_id);
+-              g_source_set_callback (source, (GSourceFunc) g_spawn_close_pid, NULL, NULL);
+-            }
++          /* release existing child watch */
++          thunar_uca_provider_child_watch_destroy (uca_provider, NULL);
+ 
+-          /* schedule the new child watch */
+-          uca_provider->child_watch_id = g_child_watch_add_full (G_PRIORITY_LOW, pid, thunar_uca_provider_child_watch,
+-                                                                 uca_provider, thunar_uca_provider_child_watch_destroy);
++          /* set new closure */
++          uca_provider->child_watch = child_watch;
+ 
+           /* take over ownership of the working directory as child watch path */
+           uca_provider->child_watch_path = working_directory;
+           working_directory = NULL;
+         }
++      else
++        {
++          /* spawn failed, release watch */
++          g_closure_unref (child_watch);
++        }
+ 
+       /* cleanup */
+       g_free (working_directory);
+       g_strfreev (argv);
++      g_free (icon_name);
+     }
+ 
+   /* present error message to the user */
+@@ -416,14 +419,14 @@ thunar_uca_provider_activated (ThunarUcaProvider *uca_provider,
+ 
+ 
+ static void
+-thunar_uca_provider_child_watch (GPid     pid,
+-                                 gint     status,
+-                                 gpointer user_data)
++thunar_uca_provider_child_watch (ThunarUcaProvider *uca_provider,
++                                 gint               exit_status)
++
+ {
+-  ThunarUcaProvider *uca_provider = THUNAR_UCA_PROVIDER (user_data);
+-  GFileMonitor      *monitor;
+-  GError            *error = NULL;
+-  GFile             *file;
++  GFileMonitor *monitor;
++  GFile        *file;
++
++  g_return_if_fail (THUNAR_UCA_IS_PROVIDER (uca_provider));
+ 
+   GDK_THREADS_ENTER ();
+ 
+@@ -434,7 +437,7 @@ thunar_uca_provider_child_watch (GPid     pid,
+       file = g_file_new_for_path (uca_provider->child_watch_path);
+ 
+       /* schedule a changed notification on the path */
+-      monitor = g_file_monitor (file, G_FILE_MONITOR_NONE, NULL, &error);
++      monitor = g_file_monitor (file, G_FILE_MONITOR_NONE, NULL, NULL);
+ 
+       if (monitor != NULL)
+         {
+@@ -446,8 +449,7 @@ thunar_uca_provider_child_watch (GPid     pid,
+       g_object_unref (file);
+     }
+ 
+-  /* need to cleanup */
+-  g_spawn_close_pid (pid);
++  thunar_uca_provider_child_watch_destroy (uca_provider, NULL);
+ 
+   GDK_THREADS_LEAVE ();
+ }
+@@ -455,15 +457,27 @@ thunar_uca_provider_child_watch (GPid     pid,
+ 
+ 
+ static void
+-thunar_uca_provider_child_watch_destroy (gpointer user_data)
++thunar_uca_provider_child_watch_destroy (gpointer  user_data,
++                                         GClosure *closure)
+ {
+   ThunarUcaProvider *uca_provider = THUNAR_UCA_PROVIDER (user_data);
++  GClosure          *child_watch;
+ 
+-  /* reset child watch id and path */
+-  g_free (uca_provider->child_watch_path);
+-  uca_provider->child_watch_path = NULL;
+-  uca_provider->child_watch_id = -1;
+-}
+-
++  /* leave if the closure is not the one we're watching */
++  if (uca_provider->child_watch == closure
++      || closure == NULL)
++    {
++      /* reset child watch and path */
++      if (G_UNLIKELY (uca_provider->child_watch != NULL))
++        {
++          child_watch = uca_provider->child_watch;
++          uca_provider->child_watch = NULL;
+ 
++          g_closure_invalidate (child_watch);
++          g_closure_unref (child_watch);
++        }
+ 
++      g_free (uca_provider->child_watch_path);
++      uca_provider->child_watch_path = NULL;
++    }
++}
+-- 
+1.6.5.6
+



More information about the Xfce4-commits mailing list