[gnome-screenshot] Allow taking area screenshots with delay



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]