[gnome-shell] shell/screenshot: Throw error on failure



commit 35484151cece2dbb3d6c6b81c4ca285b1897e84c
Author: Florian Müllner <fmuellner gnome org>
Date:   Tue Mar 24 07:15:26 2020 +0100

    shell/screenshot: Throw error on failure
    
    Commit da537cda43 moved the Shell.Screenshot API to GIO's async pattern,
    but we never set the GError passed to the *_finish() functions and only
    indicate failure by returning FALSE.
    
    The expected behavior is to throw an error in that situation, so make sure
    we do that.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1123

 js/ui/screenshot.js    | 39 ++++++++++++++++++++-------------------
 src/shell-screenshot.c | 18 +++++++++---------
 2 files changed, 29 insertions(+), 28 deletions(-)
---
diff --git a/js/ui/screenshot.js b/js/ui/screenshot.js
index 78afc4ae47..7aed8d01b4 100644
--- a/js/ui/screenshot.js
+++ b/js/ui/screenshot.js
@@ -113,16 +113,14 @@ var ScreenshotService = class {
         return [null, null];
     }
 
-    _onScreenshotComplete(result, area, stream, file, flash, invocation) {
-        if (result) {
-            if (flash) {
-                let flashspot = new Flashspot(area);
-                flashspot.fire(() => {
-                    this._removeShooterForSender(invocation.get_sender());
-                });
-            } else {
+    _onScreenshotComplete(area, stream, file, flash, invocation) {
+        if (flash) {
+            let flashspot = new Flashspot(area);
+            flashspot.fire(() => {
                 this._removeShooterForSender(invocation.get_sender());
-            }
+            });
+        } else {
+            this._removeShooterForSender(invocation.get_sender());
         }
 
         stream.close(null);
@@ -136,7 +134,7 @@ var ScreenshotService = class {
             clipboard.set_content(St.ClipboardType.CLIPBOARD, 'image/png', bytes);
         }
 
-        let retval = GLib.Variant.new('(bs)', [result, filenameUsed]);
+        let retval = GLib.Variant.new('(bs)', [true, filenameUsed]);
         invocation.return_value(retval);
     }
 
@@ -178,12 +176,13 @@ var ScreenshotService = class {
         screenshot.screenshot_area(x, y, width, height, stream,
             (o, res) => {
                 try {
-                    let [result, area] =
+                    let [success_, area] =
                         screenshot.screenshot_area_finish(res);
                     this._onScreenshotComplete(
-                        result, area, stream, file, flash, invocation);
+                        area, stream, file, flash, invocation);
                 } catch (e) {
-                    invocation.return_gerror(e);
+                    this._removeShooterForSender(invocation.get_sender());
+                    invocation.return_value(new GLib.Variant('(bs)', [false, '']));
                 }
             });
     }
@@ -201,12 +200,13 @@ var ScreenshotService = class {
         screenshot.screenshot_window(includeFrame, includeCursor, stream,
             (o, res) => {
                 try {
-                    let [result, area] =
+                    let [success_, area] =
                         screenshot.screenshot_window_finish(res);
                     this._onScreenshotComplete(
-                        result, area, stream, file, flash, invocation);
+                        area, stream, file, flash, invocation);
                 } catch (e) {
-                    invocation.return_gerror(e);
+                    this._removeShooterForSender(invocation.get_sender());
+                    invocation.return_value(new GLib.Variant('(bs)', [false, '']));
                 }
             });
     }
@@ -224,12 +224,13 @@ var ScreenshotService = class {
         screenshot.screenshot(includeCursor, stream,
             (o, res) => {
                 try {
-                    let [result, area] =
+                    let [success_, area] =
                         screenshot.screenshot_finish(res);
                     this._onScreenshotComplete(
-                        result, area, stream, file, flash, invocation);
+                        area, stream, file, flash, invocation);
                 } catch (e) {
-                    invocation.return_gerror(e);
+                    this._removeShooterForSender(invocation.get_sender());
+                    invocation.return_value(new GLib.Variant('(bs)', [false, '']));
                 }
             });
     }
diff --git a/src/shell-screenshot.c b/src/shell-screenshot.c
index 4cc65bd771..e60d5891b1 100644
--- a/src/shell-screenshot.c
+++ b/src/shell-screenshot.c
@@ -87,12 +87,12 @@ write_screenshot_thread (GTask        *result,
                          gpointer      task_data,
                          GCancellable *cancellable)
 {
-  cairo_status_t status;
   ShellScreenshot *screenshot = SHELL_SCREENSHOT (object);
   ShellScreenshotPrivate *priv;
   g_autoptr (GOutputStream) stream = NULL;
   g_autoptr(GdkPixbuf) pixbuf = NULL;
   g_autofree char *creation_time = NULL;
+  GError *error = NULL;
 
   g_assert (screenshot != NULL);
 
@@ -109,15 +109,15 @@ write_screenshot_thread (GTask        *result,
   if (!creation_time)
     creation_time = g_date_time_format (priv->datetime, "%FT%T%z");
 
-  if (gdk_pixbuf_save_to_stream (pixbuf, stream, "png", NULL, NULL,
-                                 "tEXt::Software", "gnome-screenshot",
-                                 "tEXt::Creation Time", creation_time,
-                                 NULL))
-    status = CAIRO_STATUS_SUCCESS;
-  else
-    status = CAIRO_STATUS_WRITE_ERROR;
+  gdk_pixbuf_save_to_stream (pixbuf, stream, "png", NULL, &error,
+                             "tEXt::Software", "gnome-screenshot",
+                             "tEXt::Creation Time", creation_time,
+                             NULL);
 
-  g_task_return_boolean (result, status == CAIRO_STATUS_SUCCESS);
+  if (error)
+    g_task_return_error (result, error);
+  else
+    g_task_return_boolean (result, TRUE);
 }
 
 static void


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