From bb3af59d8f2f614a674b89e26e3067770e7a09cb Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Tue, 6 Apr 2021 01:36:55 +0500 Subject: 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 -- cgit v1.2.1