summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Mikhaylenko <alexm@gnome.org>2021-04-06 01:36:55 +0500
committerAlexander Mikhaylenko <alexm@gnome.org>2021-04-05 20:38:47 +0000
commitbb3af59d8f2f614a674b89e26e3067770e7a09cb (patch)
tree7876960a9cef839c427291b5c5401016dc1702be
parent5e43dcbf0c50a28aac6e5c25a862fc557d076358 (diff)
downloadgnome-screenshot-bb3af59d8f2f614a674b89e26e3067770e7a09cb.tar.gz
Stop using gtk_dialog_run()
Make screenshot_show_dialog() async instead, and use the response signal.
-rw-r--r--src/screenshot-application.c69
-rw-r--r--src/screenshot-utils.c54
-rw-r--r--src/screenshot-utils.h15
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
@@ -128,6 +128,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)
@@ -452,6 +470,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)
{
GdkPixbuf *screenshot;
@@ -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