shell-screenshot: Use mutter paint signals to optionally draw cursor
Under wayland, if the cursor should be included when doing a fullscreen screenshot, we can rely on mutter "paint" signal to have it composited for free. Otherwise if it's not requested, we can use the "actors-painted" signal to get a stage texture before the mouse overlay has been added. Instead, under X11 or when only a window screenshot is requested, we still need to draw it manually. https://bugzilla.gnome.org/show_bug.cgi?id=765011 https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/5
This commit is contained in:
parent
559ec8750a
commit
b3e178af9d
@ -40,6 +40,13 @@ struct _ShellScreenshotPrivate
|
|||||||
gboolean include_frame;
|
gboolean include_frame;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
SHELL_SCREENSHOT_SCREEN,
|
||||||
|
SHELL_SCREENSHOT_WINDOW,
|
||||||
|
SHELL_SCREENSHOT_AREA,
|
||||||
|
} ShellScreenshotMode;
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_PRIVATE (ShellScreenshot, shell_screenshot, G_TYPE_OBJECT);
|
G_DEFINE_TYPE_WITH_PRIVATE (ShellScreenshot, shell_screenshot, G_TYPE_OBJECT);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -257,12 +264,15 @@ do_grab_screenshot (ShellScreenshot *screenshot,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
should_draw_cursor_image (void)
|
should_draw_cursor_image (ShellScreenshotMode mode)
|
||||||
{
|
{
|
||||||
g_autoptr (GSettings) settings = g_settings_new (A11Y_APPS_SCHEMA);
|
if (mode == SHELL_SCREENSHOT_WINDOW || !meta_is_wayland_compositor ())
|
||||||
|
{
|
||||||
|
g_autoptr (GSettings) settings = g_settings_new (A11Y_APPS_SCHEMA);
|
||||||
|
|
||||||
if (!g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY))
|
if (!g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -524,6 +534,7 @@ shell_screenshot_screenshot (ShellScreenshot *screenshot,
|
|||||||
{
|
{
|
||||||
ClutterActor *stage;
|
ClutterActor *stage;
|
||||||
ShellScreenshotPrivate *priv = screenshot->priv;
|
ShellScreenshotPrivate *priv = screenshot->priv;
|
||||||
|
const char *paint_signal;
|
||||||
GTask *result;
|
GTask *result;
|
||||||
|
|
||||||
if (priv->filename != NULL) {
|
if (priv->filename != NULL) {
|
||||||
@ -543,13 +554,22 @@ shell_screenshot_screenshot (ShellScreenshot *screenshot,
|
|||||||
g_task_set_source_tag (result, shell_screenshot_screenshot);
|
g_task_set_source_tag (result, shell_screenshot_screenshot);
|
||||||
|
|
||||||
priv->filename = g_strdup (filename);
|
priv->filename = g_strdup (filename);
|
||||||
priv->include_cursor = include_cursor && should_draw_cursor_image ();
|
priv->include_cursor = FALSE;
|
||||||
|
|
||||||
stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global));
|
stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global));
|
||||||
|
paint_signal = "actors-painted";
|
||||||
|
|
||||||
meta_disable_unredirect_for_display (shell_global_get_display (priv->global));
|
meta_disable_unredirect_for_display (shell_global_get_display (priv->global));
|
||||||
|
|
||||||
g_signal_connect_after (stage, "paint", G_CALLBACK (grab_screenshot), result);
|
if (include_cursor)
|
||||||
|
{
|
||||||
|
if (should_draw_cursor_image (SHELL_SCREENSHOT_SCREEN))
|
||||||
|
priv->include_cursor = TRUE;
|
||||||
|
else
|
||||||
|
paint_signal = "paint";
|
||||||
|
}
|
||||||
|
|
||||||
|
g_signal_connect_after (stage, paint_signal, G_CALLBACK (grab_screenshot), result);
|
||||||
|
|
||||||
clutter_actor_queue_redraw (stage);
|
clutter_actor_queue_redraw (stage);
|
||||||
}
|
}
|
||||||
@ -717,7 +737,8 @@ shell_screenshot_screenshot_window (ShellScreenshot *screenshot,
|
|||||||
|
|
||||||
priv->filename = g_strdup (filename);
|
priv->filename = g_strdup (filename);
|
||||||
priv->include_frame = include_frame;
|
priv->include_frame = include_frame;
|
||||||
priv->include_cursor = include_cursor && should_draw_cursor_image ();
|
priv->include_cursor = include_cursor &&
|
||||||
|
should_draw_cursor_image (SHELL_SCREENSHOT_WINDOW);
|
||||||
|
|
||||||
stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global));
|
stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user