[gnome-shell] shell/screenshot: Throw error on failure
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] shell/screenshot: Throw error on failure
- Date: Tue, 24 Mar 2020 11:35:29 +0000 (UTC)
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]