[gnome-screenshot/wip/exalm/cleanups: 14/15] dialog: Replace callback with signals



commit 45f3a638cd233d94bdfae8bed472b8e1b17d5db8
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Fri Apr 3 09:46:00 2020 +0500

    dialog: Replace callback with signals

 src/screenshot-application.c | 47 +++++++++++++++++++-------------------
 src/screenshot-dialog.c      | 54 ++++++++++++++++++++++++++++++++++----------
 src/screenshot-dialog.h      | 15 ++----------
 3 files changed, 68 insertions(+), 48 deletions(-)
---
diff --git a/src/screenshot-application.c b/src/screenshot-application.c
index fd3811b..820bc55 100644
--- a/src/screenshot-application.c
+++ b/src/screenshot-application.c
@@ -371,27 +371,27 @@ screenshot_save_to_clipboard (ScreenshotApplication *self)
 }
 
 static void
-screenshot_dialog_response_cb (ScreenshotResponse response,
-                               ScreenshotApplication *self)
+save_clicked_cb (ScreenshotDialog      *dialog,
+                 ScreenshotApplication *self)
 {
-  switch (response)
-    {
-    case SCREENSHOT_RESPONSE_SAVE:
-      /* update to the new URI */
-      g_free (self->priv->save_uri);
-      self->priv->save_uri = screenshot_dialog_get_uri (self->priv->dialog);
-      screenshot_save_to_file (self);
-      break;
-    case SCREENSHOT_RESPONSE_COPY:
-      screenshot_save_to_clipboard (self);
-      break;
-    case SCREENSHOT_RESPONSE_BACK:
-      screenshot_back (self);
-      break;
-    default:
-      g_assert_not_reached ();
-      break;
-    }
+  /* update to the new URI */
+  g_free (self->priv->save_uri);
+  self->priv->save_uri = screenshot_dialog_get_uri (self->priv->dialog);
+  screenshot_save_to_file (self);
+}
+
+static void
+copy_clicked_cb (ScreenshotDialog      *dialog,
+                 ScreenshotApplication *self)
+{
+  screenshot_save_to_clipboard (self);
+}
+
+static void
+back_clicked_cb (ScreenshotDialog      *dialog,
+                 ScreenshotApplication *self)
+{
+  screenshot_back (self);
 }
 
 static void
@@ -440,9 +440,10 @@ build_filename_ready_cb (GObject *source,
   if (screenshot_config->interactive)
     {
       self->priv->dialog = screenshot_dialog_new (self->priv->screenshot,
-                                                  self->priv->save_uri,
-                                                  (SaveScreenshotCallback)screenshot_dialog_response_cb,
-                                                  self);
+                                                  self->priv->save_uri);
+      g_signal_connect_object (self->priv->dialog, "save", G_CALLBACK (save_clicked_cb), self, 0);
+      g_signal_connect_object (self->priv->dialog, "copy", G_CALLBACK (copy_clicked_cb), self, 0);
+      g_signal_connect_object (self->priv->dialog, "back", G_CALLBACK (back_clicked_cb), self, 0);
     }
   else
     {
diff --git a/src/screenshot-dialog.c b/src/screenshot-dialog.c
index f72fdf6..684152e 100644
--- a/src/screenshot-dialog.c
+++ b/src/screenshot-dialog.c
@@ -40,13 +40,19 @@ struct _ScreenshotDialog
 
   gint drag_x;
   gint drag_y;
-
-  SaveScreenshotCallback callback;
-  gpointer user_data;
 };
 
 G_DEFINE_TYPE (ScreenshotDialog, screenshot_dialog, GTK_TYPE_APPLICATION_WINDOW)
 
+enum {
+  SIGNAL_SAVE,
+  SIGNAL_COPY,
+  SIGNAL_BACK,
+  N_SIGNALS,
+};
+
+static guint signals[N_SIGNALS];
+
 enum {
   TYPE_IMAGE_PNG,
   LAST_TYPE
@@ -170,21 +176,21 @@ static void
 back_clicked_cb (GtkButton        *button,
                  ScreenshotDialog *self)
 {
-  self->callback (SCREENSHOT_RESPONSE_BACK, self->user_data);
+  g_signal_emit (self, signals[SIGNAL_BACK], 0);
 }
 
 static void
 save_clicked_cb (GtkButton        *button,
                  ScreenshotDialog *self)
 {
-  self->callback (SCREENSHOT_RESPONSE_SAVE, self->user_data);
+  g_signal_emit (self, signals[SIGNAL_SAVE], 0);
 }
 
 static void
 copy_clicked_cb (GtkButton        *button,
                  ScreenshotDialog *self)
 {
-  self->callback (SCREENSHOT_RESPONSE_COPY, self->user_data);
+  g_signal_emit (self, signals[SIGNAL_COPY], 0);
 }
 
 static void
@@ -192,6 +198,33 @@ screenshot_dialog_class_init (ScreenshotDialogClass *klass)
 {
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
+  signals[SIGNAL_SAVE] =
+    g_signal_new ("save",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST,
+                  0,
+                  NULL, NULL, NULL,
+                  G_TYPE_NONE,
+                  0);
+
+  signals[SIGNAL_COPY] =
+    g_signal_new ("copy",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST,
+                  0,
+                  NULL, NULL, NULL,
+                  G_TYPE_NONE,
+                  0);
+
+  signals[SIGNAL_BACK] =
+    g_signal_new ("back",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST,
+                  0,
+                  NULL, NULL, NULL,
+                  G_TYPE_NONE,
+                  0);
+
   gtk_widget_class_set_template_from_resource (widget_class,
                                                "/org/gnome/Screenshot/ui/screenshot-dialog.ui");
   gtk_widget_class_bind_template_child (widget_class, ScreenshotDialog, filename_entry);
@@ -215,10 +248,8 @@ screenshot_dialog_init (ScreenshotDialog *self)
 }
 
 ScreenshotDialog *
-screenshot_dialog_new (GdkPixbuf              *screenshot,
-                       char                   *initial_uri,
-                       SaveScreenshotCallback f,
-                       gpointer               user_data)
+screenshot_dialog_new (GdkPixbuf *screenshot,
+                       char      *initial_uri)
 {
   g_autoptr(GFile) tmp_file = NULL, parent_file = NULL;
   g_autofree gchar *current_folder = NULL, *current_name = NULL;
@@ -233,9 +264,8 @@ screenshot_dialog_new (GdkPixbuf              *screenshot,
   current_folder = g_file_get_uri (parent_file);
 
   self = g_object_new (SCREENSHOT_TYPE_DIALOG, NULL);
+
   self->screenshot = screenshot;
-  self->callback = f;
-  self->user_data = user_data;
 
   gtk_window_set_application (GTK_WINDOW (self), GTK_APPLICATION (g_application_get_default ()));
   gtk_widget_realize (GTK_WIDGET (self));
diff --git a/src/screenshot-dialog.h b/src/screenshot-dialog.h
index a929ac4..51b425f 100644
--- a/src/screenshot-dialog.h
+++ b/src/screenshot-dialog.h
@@ -27,19 +27,8 @@ G_BEGIN_DECLS
 
 G_DECLARE_FINAL_TYPE (ScreenshotDialog, screenshot_dialog, SCREENSHOT, DIALOG, GtkApplicationWindow)
 
-typedef enum {
-  SCREENSHOT_RESPONSE_SAVE,
-  SCREENSHOT_RESPONSE_COPY,
-  SCREENSHOT_RESPONSE_BACK
-
-} ScreenshotResponse;
-
-typedef void (*SaveScreenshotCallback) (ScreenshotResponse response, gpointer *user_data);
-
-ScreenshotDialog *screenshot_dialog_new          (GdkPixbuf              *screenshot,
-                                                  char                   *initial_uri,
-                                                  SaveScreenshotCallback f,
-                                                  gpointer               user_data);
+ScreenshotDialog *screenshot_dialog_new          (GdkPixbuf *screenshot,
+                                                  char      *initial_uri);
 
 char             *screenshot_dialog_get_uri      (ScreenshotDialog *dialog);
 char             *screenshot_dialog_get_folder   (ScreenshotDialog *dialog);


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