[gnome-screenshot] Allow taking area screenshots with delay
- From: Alexander Mikhaylenko <alexm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-screenshot] Allow taking area screenshots with delay
- Date: Sat, 14 Mar 2020 10:05:22 +0000 (UTC)
commit 164e779ac8a7b94f2bbbbe2c4d0d6b1215b9f341
Author: Philipp Wolfer <ph wolfer gmail com>
Date: Tue Mar 3 13:52:00 2020 +0100
Allow taking area screenshots with delay
Remove the workaround that disables the timeout option.
Fixes https://gitlab.gnome.org/GNOME/gnome-screenshot/issues/43
src/screenshot-application.c | 90 +++++++++++++++++++++----------------
src/screenshot-config.c | 7 ---
src/screenshot-interactive-dialog.c | 5 ---
3 files changed, 52 insertions(+), 50 deletions(-)
---
diff --git a/src/screenshot-application.c b/src/screenshot-application.c
index 2258862..1c6fe18 100644
--- a/src/screenshot-application.c
+++ b/src/screenshot-application.c
@@ -3,6 +3,7 @@
* Copyright (C) 2001 Jonathan Blandford <jrb alum mit edu>
* Copyright (C) 2006 Emmanuele Bassi <ebassi gnome org>
* Copyright (C) 2008-2012 Cosimo Cecchi <cosimoc gnome org>
+ * Copyright (C) 2020 Philipp Wolfer <ph wolfer gmail com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@@ -54,6 +55,8 @@ struct _ScreenshotApplicationPriv {
gchar *save_uri;
gboolean should_overwrite;
+ GdkRectangle *rectangle;
+
ScreenshotDialog *dialog;
};
@@ -452,12 +455,12 @@ build_filename_ready_cb (GObject *source,
}
static void
-finish_prepare_screenshot (ScreenshotApplication *self,
- GdkRectangle *rectangle)
+finish_take_screenshot (ScreenshotApplication *self)
{
GdkPixbuf *screenshot;
- screenshot = screenshot_get_pixbuf (rectangle);
+ screenshot = screenshot_get_pixbuf (self->priv->rectangle);
+ g_clear_pointer (&self->priv->rectangle, g_free);
if (screenshot == NULL)
{
@@ -530,6 +533,39 @@ finish_prepare_screenshot (ScreenshotApplication *self,
screenshot_build_filename_async (screenshot_config->save_dir, NULL, build_filename_ready_cb, self);
}
+static gboolean
+take_screenshot_timeout (gpointer user_data)
+{
+ ScreenshotApplication *self = user_data;
+ finish_take_screenshot (self);
+
+ return FALSE;
+}
+
+static void
+start_screenshot_timeout (ScreenshotApplication *self)
+{
+ guint delay = screenshot_config->delay * 1000;
+
+ if (!screenshot_config->take_area_shot)
+ /* hold the GApplication while doing the async screenshot op */
+ g_application_hold (G_APPLICATION (self));
+
+ /* HACK: give time to the dialog to actually disappear.
+ * We don't have any way to tell when the compositor has finished
+ * re-drawing.
+ */
+ if (delay == 0 && screenshot_config->interactive)
+ delay = 200;
+
+ if (delay > 0)
+ g_timeout_add (delay,
+ take_screenshot_timeout,
+ self);
+ else
+ g_idle_add (take_screenshot_timeout, self);
+}
+
static void
rectangle_found_cb (GdkRectangle *rectangle,
gpointer user_data)
@@ -538,7 +574,8 @@ rectangle_found_cb (GdkRectangle *rectangle,
if (rectangle != NULL)
{
- finish_prepare_screenshot (self, rectangle);
+ self->priv->rectangle = g_memdup (rectangle, sizeof *rectangle);
+ start_screenshot_timeout (self);
}
else
{
@@ -550,45 +587,21 @@ rectangle_found_cb (GdkRectangle *rectangle,
}
}
-static gboolean
-prepare_screenshot_timeout (gpointer user_data)
-{
- ScreenshotApplication *self = user_data;
-
- if (screenshot_config->take_area_shot)
- screenshot_select_area_async (rectangle_found_cb, self);
- else
- finish_prepare_screenshot (self, NULL);
-
- screenshot_save_config ();
-
- return FALSE;
-}
-
static void
screenshot_start (ScreenshotApplication *self)
{
- guint delay = screenshot_config->delay * 1000;
-
- /* hold the GApplication while doing the async screenshot op */
- g_application_hold (G_APPLICATION (self));
-
if (screenshot_config->take_area_shot)
- delay = 0;
-
- /* HACK: give time to the dialog to actually disappear.
- * We don't have any way to tell when the compositor has finished
- * re-drawing.
- */
- if (delay == 0 && screenshot_config->interactive)
- delay = 200;
-
- if (delay > 0)
- g_timeout_add (delay,
- prepare_screenshot_timeout,
- self);
+ {
+ /* hold the GApplication while selecting the screen area */
+ g_application_hold (G_APPLICATION (self));
+ screenshot_select_area_async (rectangle_found_cb, self);
+ }
else
- g_idle_add (prepare_screenshot_timeout, self);
+ {
+ start_screenshot_timeout (self);
+ }
+
+ screenshot_save_config ();
}
static gboolean version_arg = FALSE;
@@ -841,6 +854,7 @@ screenshot_application_finalize (GObject *object)
g_clear_object (&self->priv->screenshot);
g_free (self->priv->icc_profile_base64);
g_free (self->priv->save_uri);
+ g_clear_pointer (&self->priv->rectangle, g_free);
G_OBJECT_CLASS (screenshot_application_parent_class)->finalize (object);
}
diff --git a/src/screenshot-config.c b/src/screenshot-config.c
index c095f24..993c656 100644
--- a/src/screenshot-config.c
+++ b/src/screenshot-config.c
@@ -119,13 +119,6 @@ screenshot_config_parse_command_line (gboolean clipboard_arg,
return FALSE;
}
- if (delay_arg && area_arg)
- {
- g_printerr (_("Conflicting options: --area and --delay should not be "
- "used at the same time.\n"));
- return FALSE;
- }
-
screenshot_config->interactive = interactive_arg;
if (screenshot_config->interactive)
diff --git a/src/screenshot-interactive-dialog.c b/src/screenshot-interactive-dialog.c
index afd2221..30815aa 100644
--- a/src/screenshot-interactive-dialog.c
+++ b/src/screenshot-interactive-dialog.c
@@ -32,7 +32,6 @@
static GtkWidget *pointer_row = NULL;
static GtkWidget *shadow_row = NULL;
-static GtkWidget *delay_row = NULL;
enum
{
@@ -67,9 +66,7 @@ target_toggled_cb (GtkToggleButton *button,
take_area_shot = (target_toggle == TARGET_TOGGLE_AREA);
gtk_widget_set_sensitive (shadow_row, take_window_shot);
-
gtk_widget_set_sensitive (pointer_row, !take_area_shot);
- gtk_widget_set_sensitive (delay_row, !take_area_shot);
screenshot_config->take_window_shot = take_window_shot;
screenshot_config->take_area_shot = take_area_shot;
@@ -174,8 +171,6 @@ connect_screenshot_frame (GtkBuilder *ui)
/** Grab after delay **/
delay = GTK_WIDGET (gtk_builder_get_object (ui, "delay"));
- delay_row = GTK_WIDGET (gtk_builder_get_object (ui, "delayrow"));
- gtk_widget_set_sensitive (delay_row, !screenshot_config->take_area_shot);
adjust = GTK_ADJUSTMENT (gtk_adjustment_new ((gdouble) screenshot_config->delay,
0.0, 99.0,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]