screenshot-ui: Use ImageContent for notification icon
StImageContent specifically, when used as a notification icon, preserves the screenshot aspect ratio and avoids ugly scaling. Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1954>
This commit is contained in:
parent
4442ced760
commit
27bcf0da48
@ -1,7 +1,7 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
/* exported ScreenshotService, ScreenshotUI, showScreenshotUI */
|
/* exported ScreenshotService, ScreenshotUI, showScreenshotUI */
|
||||||
|
|
||||||
const { Clutter, Gio, GObject, GLib, Gtk, Meta, Shell, St } = imports.gi;
|
const { Clutter, Cogl, Gio, GObject, GLib, Gtk, Meta, Shell, St } = imports.gi;
|
||||||
|
|
||||||
const GrabHelper = imports.ui.grabHelper;
|
const GrabHelper = imports.ui.grabHelper;
|
||||||
const Layout = imports.ui.layout;
|
const Layout = imports.ui.layout;
|
||||||
@ -1531,7 +1531,7 @@ class ScreenshotUI extends St.Widget {
|
|||||||
this.close();
|
this.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
_storeScreenshot(bytes) {
|
_storeScreenshot(bytes, pixbuf) {
|
||||||
// Store to the clipboard first in case storing to file fails.
|
// Store to the clipboard first in case storing to file fails.
|
||||||
const clipboard = St.Clipboard.get_default();
|
const clipboard = St.Clipboard.get_default();
|
||||||
clipboard.set_content(St.ClipboardType.CLIPBOARD, 'image/png', bytes);
|
clipboard.set_content(St.ClipboardType.CLIPBOARD, 'image/png', bytes);
|
||||||
@ -1589,6 +1589,20 @@ class ScreenshotUI extends St.Widget {
|
|||||||
// Add it to recent files.
|
// Add it to recent files.
|
||||||
Gtk.RecentManager.get_default().add_item(file.get_uri());
|
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
|
||||||
|
// shown in a notification.
|
||||||
|
const pixels = pixbuf.read_pixel_bytes();
|
||||||
|
const content =
|
||||||
|
St.ImageContent.new_with_preferred_size(pixbuf.width, pixbuf.height);
|
||||||
|
content.set_bytes(
|
||||||
|
pixels,
|
||||||
|
Cogl.PixelFormat.RGBA_8888,
|
||||||
|
pixbuf.width,
|
||||||
|
pixbuf.height,
|
||||||
|
pixbuf.rowstride
|
||||||
|
);
|
||||||
|
|
||||||
// Show a notification.
|
// Show a notification.
|
||||||
const source = new MessageTray.Source(
|
const source = new MessageTray.Source(
|
||||||
// Translators: notification source name.
|
// Translators: notification source name.
|
||||||
@ -1601,10 +1615,7 @@ class ScreenshotUI extends St.Widget {
|
|||||||
_('Screenshot captured'),
|
_('Screenshot captured'),
|
||||||
// Translators: notification body when a screenshot was captured.
|
// Translators: notification body when a screenshot was captured.
|
||||||
_('You can paste the image from the clipboard.'),
|
_('You can paste the image from the clipboard.'),
|
||||||
{
|
{ datetime: time, gicon: content }
|
||||||
datetime: time,
|
|
||||||
gicon: Gio.BytesIcon.new(bytes),
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
// Translators: button on the screenshot notification.
|
// Translators: button on the screenshot notification.
|
||||||
notification.addAction(_('Show in Files'), () => {
|
notification.addAction(_('Show in Files'), () => {
|
||||||
@ -1660,9 +1671,9 @@ class ScreenshotUI extends St.Widget {
|
|||||||
this._cursor.y * this._scale,
|
this._cursor.y * this._scale,
|
||||||
this._cursorScale,
|
this._cursorScale,
|
||||||
stream
|
stream
|
||||||
).then(() => {
|
).then(pixbuf => {
|
||||||
stream.close(null);
|
stream.close(null);
|
||||||
this._storeScreenshot(stream.steal_as_bytes());
|
this._storeScreenshot(stream.steal_as_bytes(), pixbuf);
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
logError(err, 'Error capturing screenshot');
|
logError(err, 'Error capturing screenshot');
|
||||||
});
|
});
|
||||||
@ -1693,9 +1704,9 @@ class ScreenshotUI extends St.Widget {
|
|||||||
window.cursorPoint.y * window.bufferScale,
|
window.cursorPoint.y * window.bufferScale,
|
||||||
this._cursorScale,
|
this._cursorScale,
|
||||||
stream
|
stream
|
||||||
).then(() => {
|
).then(pixbuf => {
|
||||||
stream.close(null);
|
stream.close(null);
|
||||||
this._storeScreenshot(stream.steal_as_bytes());
|
this._storeScreenshot(stream.steal_as_bytes(), pixbuf);
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
logError(err, 'Error capturing screenshot');
|
logError(err, 'Error capturing screenshot');
|
||||||
});
|
});
|
||||||
|
@ -1049,7 +1049,7 @@ shell_screenshot_pick_color_finish (ShellScreenshot *screenshot,
|
|||||||
#undef INDEX_B
|
#undef INDEX_B
|
||||||
|
|
||||||
static void
|
static void
|
||||||
composite_to_stream_on_png_saved (GObject *source,
|
composite_to_stream_on_png_saved (GObject *pixbuf,
|
||||||
GAsyncResult *result,
|
GAsyncResult *result,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
@ -1059,7 +1059,7 @@ composite_to_stream_on_png_saved (GObject *source,
|
|||||||
if (!gdk_pixbuf_save_to_stream_finish (result, &error))
|
if (!gdk_pixbuf_save_to_stream_finish (result, &error))
|
||||||
g_task_return_error (task, error);
|
g_task_return_error (task, error);
|
||||||
else
|
else
|
||||||
g_task_return_boolean (task, TRUE);
|
g_task_return_pointer (task, g_object_ref (pixbuf), g_object_unref);
|
||||||
|
|
||||||
g_object_unref (task);
|
g_object_unref (task);
|
||||||
}
|
}
|
||||||
@ -1193,10 +1193,11 @@ shell_screenshot_composite_to_stream (CoglTexture *texture,
|
|||||||
* Finish the asynchronous operation started by
|
* Finish the asynchronous operation started by
|
||||||
* shell_screenshot_composite_to_stream () and obtain its result.
|
* shell_screenshot_composite_to_stream () and obtain its result.
|
||||||
*
|
*
|
||||||
* Returns: whether the operation was successful
|
* Returns: (transfer full) (nullable): a GdkPixbuf with the final image if the
|
||||||
|
* operation was successful, or NULL on error.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
gboolean
|
GdkPixbuf *
|
||||||
shell_screenshot_composite_to_stream_finish (GAsyncResult *result,
|
shell_screenshot_composite_to_stream_finish (GAsyncResult *result,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
@ -1205,7 +1206,7 @@ shell_screenshot_composite_to_stream_finish (GAsyncResult *result,
|
|||||||
shell_screenshot_composite_to_stream),
|
shell_screenshot_composite_to_stream),
|
||||||
FALSE);
|
FALSE);
|
||||||
|
|
||||||
return g_task_propagate_boolean (G_TASK (result), error);
|
return g_task_propagate_pointer (G_TASK (result), error);
|
||||||
}
|
}
|
||||||
|
|
||||||
ShellScreenshot *
|
ShellScreenshot *
|
||||||
|
@ -84,7 +84,7 @@ void shell_screenshot_composite_to_stream (CoglTexture *texture,
|
|||||||
GOutputStream *stream,
|
GOutputStream *stream,
|
||||||
GAsyncReadyCallback callback,
|
GAsyncReadyCallback callback,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
gboolean shell_screenshot_composite_to_stream_finish (GAsyncResult *result,
|
GdkPixbuf *shell_screenshot_composite_to_stream_finish (GAsyncResult *result,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
#endif /* ___SHELL_SCREENSHOT_H__ */
|
#endif /* ___SHELL_SCREENSHOT_H__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user