From e717611af8b12c33fe5a1ac33b5887b799ba3e8f Mon Sep 17 00:00:00 2001
From: Alexander Schwinn <alexxcons@xfce.org>
Date: Sun, 7 Mar 2021 11:01:15 +0100
Subject: [PATCH] thunar-launcher: Send signal when device operation is
 started/finished

Preparation for the usage of thunar-launcher in shortcuts view (Issue
#198)
---
 thunar/thunar-launcher.c | 49 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

diff --git a/thunar/thunar-launcher.c b/thunar/thunar-launcher.c
index 44d887107..59eeb7905 100644
--- a/thunar/thunar-launcher.c
+++ b/thunar/thunar-launcher.c
@@ -88,6 +88,14 @@ typedef struct _ThunarLauncherPokeData ThunarLauncherPokeData;
 
 
 
+/* Signal identifiers */
+enum
+{
+  DEVICE_OPERATION_STARTED,
+  DEVICE_OPERATION_FINISHED,
+  LAST_SIGNAL,
+};
+
 /* Property identifiers */
 enum
 {
@@ -235,6 +243,8 @@ static GQuark thunar_launcher_appinfo_quark;
 static GQuark thunar_launcher_device_quark;
 static GQuark thunar_launcher_file_quark;
 
+static guint launcher_signals[LAST_SIGNAL];
+
 struct _ThunarLauncherPokeData
 {
   GList                          *files_to_poke; /* List of thunar-files */
@@ -314,6 +324,36 @@ thunar_launcher_class_init (ThunarLauncherClass *klass)
   gobject_class->get_property = thunar_launcher_get_property;
   gobject_class->set_property = thunar_launcher_set_property;
 
+  /**
+   * ThunarLauncher::device-operation-started:
+   * @launcher : a #ThunarLauncher
+   * @device   : the #ThunarDevice on which the operation was finished
+   *
+   * This signal is emitted by the @launcher right after the device operation (mount/unmount/eject) is started
+   **/
+  launcher_signals[DEVICE_OPERATION_STARTED] =
+    g_signal_new (I_("device-operation-started"),
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_NO_HOOKS, 0,
+                  NULL, NULL,
+                  g_cclosure_marshal_generic,
+                  G_TYPE_NONE, 1, THUNAR_TYPE_DEVICE);
+
+  /**
+   * ThunarLauncher::device-operation-finished:
+   * @launcher : a #ThunarLauncher
+   * @device   : the #ThunarDevice on which the operation was finished
+   *
+   * This signal is emitted by the @launcher right after the device operation (mount/unmount/eject) is finished
+   **/
+  launcher_signals[DEVICE_OPERATION_FINISHED] =
+    g_signal_new (I_("device-operation-finished"),
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_NO_HOOKS, 0,
+                  NULL, NULL,
+                  g_cclosure_marshal_generic,
+                  G_TYPE_NONE, 1, THUNAR_TYPE_DEVICE);
+
   /**
    * ThunarLauncher:widget:
    *
@@ -959,6 +999,7 @@ thunar_launcher_poke (ThunarLauncher                 *launcher,
 
    if (launcher->device_to_process != NULL)
      {
+       g_signal_emit (launcher, launcher_signals[DEVICE_OPERATION_STARTED], 0, launcher->device_to_process);
        thunar_browser_poke_device (THUNAR_BROWSER (launcher), launcher->device_to_process,
                                    launcher->widget, thunar_launcher_poke_device_finish,
                                   poke_data);
@@ -1000,6 +1041,7 @@ static void thunar_launcher_poke_device_finish (ThunarBrowser *browser,
 
   if (cancelled == TRUE || error != NULL || mount_point == NULL)
     {
+      g_signal_emit (browser, launcher_signals[DEVICE_OPERATION_FINISHED], 0, volume);
       thunar_launcher_poke_data_free (poke_data);
       return;
     }
@@ -1020,6 +1062,7 @@ static void thunar_launcher_poke_device_finish (ThunarBrowser *browser,
       thunar_navigator_change_directory (THUNAR_NAVIGATOR (browser), mount_point);
     }
 
+  g_signal_emit (browser, launcher_signals[DEVICE_OPERATION_FINISHED], 0, volume);
   thunar_launcher_poke_data_free (poke_data);
 }
 
@@ -2732,6 +2775,7 @@ thunar_launcher_action_eject_finish (ThunarDevice  *device,
     }
 
   g_object_unref (launcher);
+  g_signal_emit (launcher, launcher_signals[DEVICE_OPERATION_FINISHED], 0, device);
 }
 
 
@@ -2754,6 +2798,8 @@ thunar_launcher_action_eject (ThunarLauncher *launcher)
       /* prepare a mount operation */
       mount_operation = thunar_gtk_mount_operation_new (GTK_WIDGET (launcher->widget));
 
+      g_signal_emit (launcher, launcher_signals[DEVICE_OPERATION_STARTED], 0, launcher->device_to_process);
+
       /* eject */
       thunar_device_eject (launcher->device_to_process,
                            mount_operation,
@@ -2788,6 +2834,7 @@ thunar_launcher_action_unmount_finish (ThunarDevice *device,
     }
 
   g_object_unref (launcher);
+  g_signal_emit (launcher, launcher_signals[DEVICE_OPERATION_FINISHED], 0, device);
 }
 
 
@@ -2810,6 +2857,8 @@ thunar_launcher_action_unmount (ThunarLauncher *launcher)
       /* prepare a mount operation */
       mount_operation = thunar_gtk_mount_operation_new (GTK_WIDGET (launcher->widget));
 
+      g_signal_emit (launcher, launcher_signals[DEVICE_OPERATION_STARTED], 0, launcher->device_to_process);
+
       /* eject */
       thunar_device_unmount (launcher->device_to_process,
                              mount_operation,
-- 
GitLab