[gnome-screenshot/wip/exalm/dialog] Stop using gtk_dialog_run()




commit 5bf10b033905aa80eb4482da75a53de2466a0935
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Tue Apr 6 01:36:55 2021 +0500

    Stop using gtk_dialog_run()
    
    Make screenshot_show_dialog() async instead, and use the response signal.

 src/screenshot-application.c | 69 ++++++++++++++++++++++++++++++--------------
 src/screenshot-utils.c       | 54 ++++++++++++++++++++++++----------
 src/screenshot-utils.h       | 15 ++++++----
 3 files changed, 96 insertions(+), 42 deletions(-)
---
diff --git a/src/screenshot-application.c b/src/screenshot-application.c
index df50d86..cc663d4 100644
--- a/src/screenshot-application.c
+++ b/src/screenshot-application.c
@@ -127,6 +127,28 @@ save_pixbuf_handle_success (ScreenshotApplication *self)
     }
 }
 
+static void
+screenshot_dialog_focus_cb (gint                   response,
+                            ScreenshotApplication *self)
+{
+  gtk_widget_grab_focus (screenshot_dialog_get_filename_entry (self->dialog));
+}
+
+static void
+screenshot_dialog_override_cb (gint                   response,
+                               ScreenshotApplication *self)
+{
+  if (response == GTK_RESPONSE_YES)
+    {
+      self->should_overwrite = TRUE;
+      screenshot_save_to_file (self);
+
+      return;
+    }
+
+  screenshot_dialog_focus_cb (response, self);
+}
+
 static void
 save_pixbuf_handle_error (ScreenshotApplication *self,
                           GError *error)
@@ -147,19 +169,13 @@ save_pixbuf_handle_error (ScreenshotApplication *self,
           g_autofree gchar *detail = g_strdup_printf (_("A file named ā€œ%sā€ already exists in ā€œ%sā€"),
                                                       file_name, folder_name);
 
-          gint response = screenshot_show_dialog (GTK_WINDOW (dialog),
-                                                  GTK_MESSAGE_WARNING,
-                                                  GTK_BUTTONS_YES_NO,
-                                                  _("Overwrite existing file?"),
-                                                  detail);
-
-          if (response == GTK_RESPONSE_YES)
-            {
-              self->should_overwrite = TRUE;
-              screenshot_save_to_file (self);
-
-              return;
-            }
+          screenshot_show_dialog (GTK_WINDOW (dialog),
+                                  GTK_MESSAGE_WARNING,
+                                  GTK_BUTTONS_YES_NO,
+                                  _("Overwrite existing file?"),
+                                  detail,
+                                  (ScreenshotResponseFunc) screenshot_dialog_override_cb,
+                                  self);
         }
       else
         {
@@ -167,10 +183,10 @@ save_pixbuf_handle_error (ScreenshotApplication *self,
                                   GTK_MESSAGE_ERROR,
                                   GTK_BUTTONS_OK,
                                   _("Unable to capture a screenshot"),
-                                  _("Error creating file. Please choose another location and retry."));
+                                  _("Error creating file. Please choose another location and retry."),
+                                  (ScreenshotResponseFunc) screenshot_dialog_focus_cb,
+                                  dialog);
         }
-
-      gtk_widget_grab_focus (screenshot_dialog_get_filename_entry (dialog));
     }
   else
     {
@@ -425,7 +441,9 @@ build_filename_ready_cb (GObject *source,
                                 GTK_MESSAGE_ERROR,
                                 GTK_BUTTONS_OK,
                                 _("Unable to capture a screenshot"),
-                                _("Error creating file"));
+                                _("Error creating file"),
+                                NULL,
+                                NULL);
       else
         {
           if (screenshot_config->file != NULL)
@@ -451,6 +469,15 @@ build_filename_ready_cb (GObject *source,
     }
 }
 
+static void
+screenshot_release_cb (gint                   response,
+                       ScreenshotApplication *self)
+{
+  g_application_release (G_APPLICATION (self));
+  if (screenshot_config->file != NULL)
+    exit (EXIT_FAILURE);
+}
+
 static void
 finish_take_screenshot (ScreenshotApplication *self)
 {
@@ -468,11 +495,9 @@ finish_take_screenshot (ScreenshotApplication *self)
                                 GTK_MESSAGE_ERROR,
                                 GTK_BUTTONS_OK,
                                 _("Unable to capture a screenshot"),
-                                _("All possible methods failed"));
-
-      g_application_release (G_APPLICATION (self));
-      if (screenshot_config->file != NULL)
-        exit (EXIT_FAILURE);
+                                _("All possible methods failed"),
+                                (ScreenshotResponseFunc) screenshot_release_cb,
+                                self);
 
       return;
     }
diff --git a/src/screenshot-utils.c b/src/screenshot-utils.c
index 906aace..df0b6e9 100644
--- a/src/screenshot-utils.c
+++ b/src/screenshot-utils.c
@@ -70,27 +70,47 @@ screenshot_get_pixbuf (GdkRectangle *rectangle)
   return screenshot;
 }
 
-gint
-screenshot_show_dialog (GtkWindow   *parent,
-                        GtkMessageType message_type,
-                        GtkButtonsType buttons_type,
-                        const gchar *message,
-                        const gchar *detail)
+typedef struct
 {
+  ScreenshotResponseFunc callback;
+  gpointer user_data;
+} DialogData;
+
+static void
+response_cb (GtkDialog  *dialog,
+             gint        response_id,
+             DialogData *data)
+{
+  gtk_widget_destroy (GTK_WIDGET (dialog));
+
+  if (data->callback)
+    data->callback (response_id, data->user_data);
+
+  g_free (data);
+}
+
+void
+screenshot_show_dialog (GtkWindow              *parent,
+                        GtkMessageType          message_type,
+                        GtkButtonsType          buttons_type,
+                        const gchar            *message,
+                        const gchar            *detail,
+                        ScreenshotResponseFunc  callback,
+                        gpointer                user_data)
+{
+  DialogData *data;
   GtkWidget *dialog;
   GtkWindowGroup *group;
-  gint response;
 
-  g_return_val_if_fail ((parent == NULL) || (GTK_IS_WINDOW (parent)),
-                        GTK_RESPONSE_NONE);
-  g_return_val_if_fail (message != NULL, GTK_RESPONSE_NONE);
+  g_return_if_fail ((parent == NULL) || (GTK_IS_WINDOW (parent)));
+  g_return_if_fail (message != NULL);
 
+  data = g_new0 (DialogData, 1);
   dialog = gtk_message_dialog_new (parent,
                                    GTK_DIALOG_DESTROY_WITH_PARENT,
                                    message_type,
                                    buttons_type,
                                    "%s", message);
-  gtk_window_set_title (GTK_WINDOW (dialog), "");
 
   if (detail)
     gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
@@ -103,11 +123,13 @@ screenshot_show_dialog (GtkWindow   *parent,
         gtk_window_group_add_window (group, GTK_WINDOW (dialog));
     }
 
-  response = gtk_dialog_run (GTK_DIALOG (dialog));
+  data->callback = callback;
+  data->user_data = user_data;
 
-  gtk_widget_destroy (dialog);
+  if (callback)
+    g_signal_connect (dialog, "response", G_CALLBACK (response_cb), data);
 
-  return response;
+  gtk_window_present (GTK_WINDOW (dialog));
 }
 
 void
@@ -125,5 +147,7 @@ screenshot_display_help (GtkWindow *parent)
                             GTK_MESSAGE_ERROR,
                             GTK_BUTTONS_OK,
                             _("Error loading the help page"),
-                            error->message);
+                            error->message,
+                            NULL,
+                            NULL);
 }
diff --git a/src/screenshot-utils.h b/src/screenshot-utils.h
index 015ca96..a47290e 100644
--- a/src/screenshot-utils.h
+++ b/src/screenshot-utils.h
@@ -25,13 +25,18 @@ G_BEGIN_DECLS
 
 #define SCREENSHOT_ICON_NAME "org.gnome.Screenshot"
 
+typedef void (*ScreenshotResponseFunc) (gint     response,
+                                        gpointer user_data);
+
 GdkPixbuf *screenshot_get_pixbuf          (GdkRectangle *rectangle);
 
-gint       screenshot_show_dialog   (GtkWindow   *parent,
-                                     GtkMessageType message_type,
-                                     GtkButtonsType buttons_type,
-                                     const gchar *message,
-                                     const gchar *detail);
+void       screenshot_show_dialog         (GtkWindow              *parent,
+                                           GtkMessageType          message_type,
+                                           GtkButtonsType          buttons_type,
+                                           const gchar            *message,
+                                           const gchar            *detail,
+                                           ScreenshotResponseFunc  callback,
+                                           gpointer                user_data);
 void       screenshot_display_help        (GtkWindow *parent);
 
 G_END_DECLS


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