[gnome-shell] screenshot-ui: Add support for disable-save-to-disk
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] screenshot-ui: Add support for disable-save-to-disk
- Date: Thu, 27 Jan 2022 22:30:54 +0000 (UTC)
commit 7d43038312db2d289cf47ed23623ea062b7a5615
Author: Ivan Molodetskikh <yalterz gmail com>
Date: Thu Jan 27 20:29:02 2022 +0300
screenshot-ui: Add support for disable-save-to-disk
When disable-save-to-disk is set, we only save the screenshot to the
clipboard, and therefore don't add the "open file" and "open folder"
actions to the notification.
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1954>
js/ui/screenshot.js | 118 +++++++++++++++++++++++++++++-----------------------
1 file changed, 67 insertions(+), 51 deletions(-)
---
diff --git a/js/ui/screenshot.js b/js/ui/screenshot.js
index 11f97831c2..c1f2a16353 100644
--- a/js/ui/screenshot.js
+++ b/js/ui/screenshot.js
@@ -1012,6 +1012,8 @@ class ScreenshotUI extends St.Widget {
visible: false,
});
+ this._lockdownSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.lockdown' });
+
// The full-screen screenshot has a separate container so that we can
// show it without the screenshot UI fade-in for a nicer animation.
this._stageScreenshotContainer = new St.Widget({ visible: false });
@@ -1536,58 +1538,69 @@ class ScreenshotUI extends St.Widget {
const clipboard = St.Clipboard.get_default();
clipboard.set_content(St.ClipboardType.CLIPBOARD, 'image/png', bytes);
- const dir = Gio.File.new_for_path(GLib.build_filenamev([
- GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_PICTURES),
- // Translators: name of the folder under ~/Pictures for screenshots.
- _('Screenshots'),
- ]));
-
- try {
- dir.make_directory_with_parents(null);
- } catch (e) {
- if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.EXISTS))
- throw e;
- }
-
const time = GLib.DateTime.new_now_local();
- const timestamp = time.format('%Y-%m-%d %H-%M-%S');
- // Translators: this is the name of the file that the screenshot is
- // saved to. The placeholder is a timestamp, e.g. "2017-05-21 12-24-03".
- const name = _('Screenshot from %s').format(timestamp);
- // If the target file already exists, try appending a suffix with an
- // increasing number to it.
+ // This will be set in the first save to disk branch and then accessed
+ // in the second save to disk branch, so we need to declare it outside.
+ let file;
+
+ // The function is declared here rather than inside the condition to
+ // satisfy eslint.
/**
* Returns a filename suffix with an increasingly large index.
*
* @returns {Generator<string|*, void, *>} suffix string
*/
- function *suffixes() {
+ function* suffixes() {
yield '';
for (let i = 1; ; i++)
yield '-%s'.format(i);
}
- let file;
- for (const suffix of suffixes()) {
- file = Gio.File.new_for_path(GLib.build_filenamev([
- dir.get_path(), '%s%s.png'.format(name, suffix),
+ const disableSaveToDisk =
+ this._lockdownSettings.get_boolean('disable-save-to-disk');
+
+ if (!disableSaveToDisk) {
+ const dir = Gio.File.new_for_path(GLib.build_filenamev([
+ GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_PICTURES),
+ // Translators: name of the folder under ~/Pictures for screenshots.
+ _('Screenshots'),
]));
try {
- const stream = file.create(Gio.FileCreateFlags.NONE, null);
- stream.write_bytes(bytes, null);
- break;
+ dir.make_directory_with_parents(null);
} catch (e) {
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.EXISTS))
throw e;
}
- }
- // Add it to recent files.
- Gtk.RecentManager.get_default().add_item(file.get_uri());
+ const timestamp = time.format('%Y-%m-%d %H-%M-%S');
+ // Translators: this is the name of the file that the screenshot is
+ // saved to. The placeholder is a timestamp, e.g. "2017-05-21 12-24-03".
+ const name = _('Screenshot from %s').format(timestamp);
+
+ // If the target file already exists, try appending a suffix with an
+ // increasing number to it.
+ for (const suffix of suffixes()) {
+ file = Gio.File.new_for_path(GLib.build_filenamev([
+ dir.get_path(), '%s%s.png'.format(name, suffix),
+ ]));
+
+ try {
+ const stream = file.create(Gio.FileCreateFlags.NONE, null);
+ stream.write_bytes(bytes, null);
+ break;
+ } catch (e) {
+ if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.EXISTS))
+ throw e;
+ }
+ }
+
+ // Add it to recent files.
+ Gtk.RecentManager.get_default().add_item(file.get_uri());
+ }
// Create a St.ImageContent icon for the notification. We want
// St.ImageContent specifically because it preserves the aspect ratio when
@@ -1617,29 +1630,32 @@ class ScreenshotUI extends St.Widget {
_('You can paste the image from the clipboard.'),
{ datetime: time, gicon: content }
);
- // Translators: button on the screenshot notification.
- notification.addAction(_('Show in Files'), () => {
- const app =
- Gio.app_info_get_default_for_type('inode/directory', false);
-
- if (app === null) {
- // It may be null e.g. in a toolbox without nautilus.
- log('Error showing in files: no default app set for inode/directory');
- return;
- }
- app.launch([file], global.create_app_launch_context(0, -1));
- });
- notification.connect('activated', () => {
- try {
- Gio.app_info_launch_default_for_uri(
- file.get_uri(), global.create_app_launch_context(0, -1));
- } catch (err) {
- logError(err, 'Error opening screenshot');
- }
- });
- notification.setTransient(true);
+ if (!disableSaveToDisk) {
+ // Translators: button on the screenshot notification.
+ notification.addAction(_('Show in Files'), () => {
+ const app =
+ Gio.app_info_get_default_for_type('inode/directory', false);
+ if (app === null) {
+ // It may be null e.g. in a toolbox without nautilus.
+ log('Error showing in files: no default app set for inode/directory');
+ return;
+ }
+
+ app.launch([file], global.create_app_launch_context(0, -1));
+ });
+ notification.connect('activated', () => {
+ try {
+ Gio.app_info_launch_default_for_uri(
+ file.get_uri(), global.create_app_launch_context(0, -1));
+ } catch (err) {
+ logError(err, 'Error opening screenshot');
+ }
+ });
+ }
+
+ notification.setTransient(true);
Main.messageTray.add(source);
source.showNotification(notification);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]