cursor: Move sprite preparation into sprite classes
Make the prepare function a vfunc of MetaCursorSprite, moving the root cursor prepare function into MetaCursorSpriteXcursor. This should solve two issues: - The root cursor prepare function was changed in f77d8e2a12a07ef6abe9 to solve an issue with fractional scales. The tool cursor prepare function was missing this fix. - The cursors created via the shape protocol had no prepare function at all, so were not getting scaled. Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3975 Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4345>
This commit is contained in:
parent
bac6e440ae
commit
b08cf5c135
@ -24,6 +24,7 @@
|
|||||||
#include "backends/meta-cursor.h"
|
#include "backends/meta-cursor.h"
|
||||||
#include "backends/meta-cursor-renderer.h"
|
#include "backends/meta-cursor-renderer.h"
|
||||||
#include "backends/meta-cursor-tracker-private.h"
|
#include "backends/meta-cursor-tracker-private.h"
|
||||||
|
#include "backends/meta-logical-monitor.h"
|
||||||
#include "clutter/clutter.h"
|
#include "clutter/clutter.h"
|
||||||
#include "cogl/cogl.h"
|
#include "cogl/cogl.h"
|
||||||
#include "meta/prefs.h"
|
#include "meta/prefs.h"
|
||||||
@ -461,6 +462,60 @@ meta_cursor_sprite_xcursor_invalidate (MetaCursorSprite *sprite)
|
|||||||
sprite_xcursor->invalidated = TRUE;
|
sprite_xcursor->invalidated = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cursor_sprite_xcursor_prepare_at (MetaCursorSprite *sprite,
|
||||||
|
float best_scale,
|
||||||
|
int x,
|
||||||
|
int y)
|
||||||
|
{
|
||||||
|
MetaCursorSpriteXcursor *sprite_xcursor = META_CURSOR_SPRITE_XCURSOR (sprite);
|
||||||
|
MetaCursorTracker *cursor_tracker =
|
||||||
|
meta_cursor_sprite_get_cursor_tracker (sprite);
|
||||||
|
MetaBackend *backend =
|
||||||
|
meta_cursor_tracker_get_backend (cursor_tracker);
|
||||||
|
|
||||||
|
if (!meta_is_wayland_compositor ())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (meta_backend_is_stage_views_scaled (backend))
|
||||||
|
{
|
||||||
|
if (best_scale != 0.0f)
|
||||||
|
{
|
||||||
|
float ceiled_scale;
|
||||||
|
int cursor_width, cursor_height;
|
||||||
|
|
||||||
|
ceiled_scale = ceilf (best_scale);
|
||||||
|
meta_cursor_sprite_xcursor_set_theme_scale (sprite_xcursor,
|
||||||
|
(int) ceiled_scale);
|
||||||
|
|
||||||
|
meta_cursor_sprite_realize_texture (sprite);
|
||||||
|
meta_cursor_sprite_xcursor_get_scaled_image_size (sprite_xcursor,
|
||||||
|
&cursor_width,
|
||||||
|
&cursor_height);
|
||||||
|
meta_cursor_sprite_set_viewport_dst_size (sprite,
|
||||||
|
cursor_width,
|
||||||
|
cursor_height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MetaMonitorManager *monitor_manager =
|
||||||
|
meta_backend_get_monitor_manager (backend);
|
||||||
|
MetaLogicalMonitor *logical_monitor;
|
||||||
|
|
||||||
|
logical_monitor =
|
||||||
|
meta_monitor_manager_get_logical_monitor_at (monitor_manager, x, y);
|
||||||
|
|
||||||
|
/* Reload the cursor texture if the scale has changed. */
|
||||||
|
if (logical_monitor)
|
||||||
|
{
|
||||||
|
meta_cursor_sprite_xcursor_set_theme_scale (sprite_xcursor,
|
||||||
|
(int) logical_monitor->scale);
|
||||||
|
meta_cursor_sprite_set_texture_scale (sprite, 1.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static ClutterColorState *
|
static ClutterColorState *
|
||||||
ensure_xcursor_color_state (MetaCursorTracker *cursor_tracker)
|
ensure_xcursor_color_state (MetaCursorTracker *cursor_tracker)
|
||||||
{
|
{
|
||||||
@ -544,4 +599,5 @@ meta_cursor_sprite_xcursor_class_init (MetaCursorSpriteXcursorClass *klass)
|
|||||||
cursor_sprite_class->tick_frame = meta_cursor_sprite_xcursor_tick_frame;
|
cursor_sprite_class->tick_frame = meta_cursor_sprite_xcursor_tick_frame;
|
||||||
cursor_sprite_class->get_current_frame_time =
|
cursor_sprite_class->get_current_frame_time =
|
||||||
meta_cursor_sprite_xcursor_get_current_frame_time;
|
meta_cursor_sprite_xcursor_get_current_frame_time;
|
||||||
|
cursor_sprite_class->prepare_at = meta_cursor_sprite_xcursor_prepare_at;
|
||||||
}
|
}
|
||||||
|
@ -65,9 +65,6 @@ typedef struct _MetaCursorSpritePrivate
|
|||||||
|
|
||||||
ClutterColorState *color_state;
|
ClutterColorState *color_state;
|
||||||
|
|
||||||
MetaCursorPrepareFunc prepare_func;
|
|
||||||
gpointer prepare_func_data;
|
|
||||||
|
|
||||||
MetaCursorTracker *cursor_tracker;
|
MetaCursorTracker *cursor_tracker;
|
||||||
} MetaCursorSpritePrivate;
|
} MetaCursorSpritePrivate;
|
||||||
|
|
||||||
@ -309,29 +306,16 @@ meta_cursor_sprite_get_viewport_dst_size (MetaCursorSprite *sprite,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
meta_cursor_sprite_set_prepare_func (MetaCursorSprite *sprite,
|
|
||||||
MetaCursorPrepareFunc func,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
MetaCursorSpritePrivate *priv =
|
|
||||||
meta_cursor_sprite_get_instance_private (sprite);
|
|
||||||
|
|
||||||
priv->prepare_func = func;
|
|
||||||
priv->prepare_func_data = user_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_cursor_sprite_prepare_at (MetaCursorSprite *sprite,
|
meta_cursor_sprite_prepare_at (MetaCursorSprite *sprite,
|
||||||
float best_scale,
|
float best_scale,
|
||||||
int x,
|
int x,
|
||||||
int y)
|
int y)
|
||||||
{
|
{
|
||||||
MetaCursorSpritePrivate *priv =
|
MetaCursorSpriteClass *sprite_class = META_CURSOR_SPRITE_GET_CLASS (sprite);
|
||||||
meta_cursor_sprite_get_instance_private (sprite);
|
|
||||||
|
|
||||||
if (priv->prepare_func)
|
if (sprite_class->prepare_at)
|
||||||
priv->prepare_func (sprite, best_scale, x, y, priv->prepare_func_data);
|
sprite_class->prepare_at (sprite, best_scale, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
|
@ -42,17 +42,11 @@ struct _MetaCursorSpriteClass
|
|||||||
gboolean (* is_animated) (MetaCursorSprite *sprite);
|
gboolean (* is_animated) (MetaCursorSprite *sprite);
|
||||||
void (* tick_frame) (MetaCursorSprite *sprite);
|
void (* tick_frame) (MetaCursorSprite *sprite);
|
||||||
unsigned int (* get_current_frame_time) (MetaCursorSprite *sprite);
|
unsigned int (* get_current_frame_time) (MetaCursorSprite *sprite);
|
||||||
};
|
void (* prepare_at) (MetaCursorSprite *sprite,
|
||||||
|
float best_scale,
|
||||||
typedef void (* MetaCursorPrepareFunc) (MetaCursorSprite *sprite,
|
|
||||||
float scale,
|
|
||||||
int x,
|
int x,
|
||||||
int y,
|
int y);
|
||||||
gpointer user_data);
|
};
|
||||||
|
|
||||||
void meta_cursor_sprite_set_prepare_func (MetaCursorSprite *sprite,
|
|
||||||
MetaCursorPrepareFunc func,
|
|
||||||
gpointer user_data);
|
|
||||||
|
|
||||||
void meta_cursor_sprite_prepare_at (MetaCursorSprite *sprite,
|
void meta_cursor_sprite_prepare_at (MetaCursorSprite *sprite,
|
||||||
float best_scale,
|
float best_scale,
|
||||||
|
@ -1681,64 +1681,6 @@ meta_display_notify_window_created (MetaDisplay *display,
|
|||||||
g_signal_emit (display, display_signals[WINDOW_CREATED], 0, window);
|
g_signal_emit (display, display_signals[WINDOW_CREATED], 0, window);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
root_cursor_prepare_at (MetaCursorSpriteXcursor *sprite_xcursor,
|
|
||||||
float best_scale,
|
|
||||||
int x,
|
|
||||||
int y,
|
|
||||||
MetaDisplay *display)
|
|
||||||
{
|
|
||||||
MetaCursorSprite *cursor_sprite = META_CURSOR_SPRITE (sprite_xcursor);
|
|
||||||
MetaBackend *backend = backend_from_display (display);
|
|
||||||
|
|
||||||
if (meta_backend_is_stage_views_scaled (backend))
|
|
||||||
{
|
|
||||||
if (best_scale != 0.0f)
|
|
||||||
{
|
|
||||||
float ceiled_scale;
|
|
||||||
int cursor_width, cursor_height;
|
|
||||||
|
|
||||||
ceiled_scale = ceilf (best_scale);
|
|
||||||
meta_cursor_sprite_xcursor_set_theme_scale (sprite_xcursor,
|
|
||||||
(int) ceiled_scale);
|
|
||||||
|
|
||||||
meta_cursor_sprite_realize_texture (cursor_sprite);
|
|
||||||
meta_cursor_sprite_xcursor_get_scaled_image_size (sprite_xcursor,
|
|
||||||
&cursor_width,
|
|
||||||
&cursor_height);
|
|
||||||
meta_cursor_sprite_set_viewport_dst_size (cursor_sprite,
|
|
||||||
cursor_width,
|
|
||||||
cursor_height);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MetaMonitorManager *monitor_manager =
|
|
||||||
meta_backend_get_monitor_manager (backend);
|
|
||||||
MetaLogicalMonitor *logical_monitor;
|
|
||||||
|
|
||||||
logical_monitor =
|
|
||||||
meta_monitor_manager_get_logical_monitor_at (monitor_manager, x, y);
|
|
||||||
|
|
||||||
/* Reload the cursor texture if the scale has changed. */
|
|
||||||
if (logical_monitor)
|
|
||||||
{
|
|
||||||
meta_cursor_sprite_xcursor_set_theme_scale (sprite_xcursor,
|
|
||||||
(int) logical_monitor->scale);
|
|
||||||
meta_cursor_sprite_set_texture_scale (cursor_sprite, 1.0f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
manage_root_cursor_sprite_scale (MetaDisplay *display,
|
|
||||||
MetaCursorSpriteXcursor *sprite_xcursor)
|
|
||||||
{
|
|
||||||
meta_cursor_sprite_set_prepare_func (META_CURSOR_SPRITE (sprite_xcursor),
|
|
||||||
(MetaCursorPrepareFunc) root_cursor_prepare_at,
|
|
||||||
display);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_display_reload_cursor (MetaDisplay *display)
|
meta_display_reload_cursor (MetaDisplay *display)
|
||||||
{
|
{
|
||||||
@ -1748,10 +1690,6 @@ meta_display_reload_cursor (MetaDisplay *display)
|
|||||||
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
|
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
|
||||||
|
|
||||||
sprite_xcursor = meta_cursor_sprite_xcursor_new (cursor, cursor_tracker);
|
sprite_xcursor = meta_cursor_sprite_xcursor_new (cursor, cursor_tracker);
|
||||||
|
|
||||||
if (meta_is_wayland_compositor ())
|
|
||||||
manage_root_cursor_sprite_scale (display, sprite_xcursor);
|
|
||||||
|
|
||||||
meta_cursor_tracker_set_root_cursor (cursor_tracker,
|
meta_cursor_tracker_set_root_cursor (cursor_tracker,
|
||||||
META_CURSOR_SPRITE (sprite_xcursor));
|
META_CURSOR_SPRITE (sprite_xcursor));
|
||||||
g_object_unref (sprite_xcursor);
|
g_object_unref (sprite_xcursor);
|
||||||
|
@ -21,6 +21,12 @@
|
|||||||
#include "wayland/meta-cursor-sprite-wayland.h"
|
#include "wayland/meta-cursor-sprite-wayland.h"
|
||||||
|
|
||||||
#include "backends/meta-cursor-tracker-private.h"
|
#include "backends/meta-cursor-tracker-private.h"
|
||||||
|
#include "backends/meta-logical-monitor.h"
|
||||||
|
#include "wayland/meta-wayland-private.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_XWAYLAND
|
||||||
|
#include "wayland/meta-xwayland.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
struct _MetaCursorSpriteWayland
|
struct _MetaCursorSpriteWayland
|
||||||
{
|
{
|
||||||
@ -65,6 +71,94 @@ meta_cursor_sprite_wayland_invalidate (MetaCursorSprite *sprite)
|
|||||||
sprite_wayland->invalidated = TRUE;
|
sprite_wayland->invalidated = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cursor_sprite_wayland_prepare_at (MetaCursorSprite *sprite,
|
||||||
|
float best_scale,
|
||||||
|
int x,
|
||||||
|
int y)
|
||||||
|
{
|
||||||
|
MetaCursorSpriteWayland *sprite_wayland = META_CURSOR_SPRITE_WAYLAND (sprite);
|
||||||
|
MetaCursorTracker *cursor_tracker =
|
||||||
|
meta_cursor_sprite_get_cursor_tracker (sprite);
|
||||||
|
MetaBackend *backend =
|
||||||
|
meta_cursor_tracker_get_backend (cursor_tracker);
|
||||||
|
MetaWaylandSurface *surface = sprite_wayland->surface;
|
||||||
|
MetaMonitorManager *monitor_manager =
|
||||||
|
meta_backend_get_monitor_manager (backend);
|
||||||
|
MetaLogicalMonitor *logical_monitor;
|
||||||
|
|
||||||
|
logical_monitor =
|
||||||
|
meta_monitor_manager_get_logical_monitor_at (monitor_manager, x, y);
|
||||||
|
if (logical_monitor)
|
||||||
|
{
|
||||||
|
int surface_scale;
|
||||||
|
float texture_scale;
|
||||||
|
#ifdef HAVE_XWAYLAND
|
||||||
|
MetaXWaylandManager *xwayland_manager =
|
||||||
|
&surface->compositor->xwayland_manager;
|
||||||
|
|
||||||
|
if (meta_wayland_surface_is_xwayland (surface))
|
||||||
|
surface_scale = meta_xwayland_get_x11_ui_scaling_factor (xwayland_manager);
|
||||||
|
else
|
||||||
|
#endif /* HAVE_XWAYLAND */
|
||||||
|
surface_scale = surface->applied_state.scale;
|
||||||
|
|
||||||
|
if (surface->viewport.has_dst_size)
|
||||||
|
texture_scale = 1.0f;
|
||||||
|
else if (meta_backend_is_stage_views_scaled (backend))
|
||||||
|
texture_scale = 1.0f / surface_scale;
|
||||||
|
else
|
||||||
|
texture_scale = (meta_logical_monitor_get_scale (logical_monitor) /
|
||||||
|
surface_scale);
|
||||||
|
|
||||||
|
meta_cursor_sprite_set_texture_scale (sprite, texture_scale);
|
||||||
|
meta_cursor_sprite_set_texture_transform (sprite,
|
||||||
|
surface->buffer_transform);
|
||||||
|
|
||||||
|
if (surface->viewport.has_src_rect)
|
||||||
|
{
|
||||||
|
meta_cursor_sprite_set_viewport_src_rect (sprite,
|
||||||
|
&surface->viewport.src_rect);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
meta_cursor_sprite_reset_viewport_src_rect (sprite);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (surface->viewport.has_dst_size)
|
||||||
|
{
|
||||||
|
int dst_width;
|
||||||
|
int dst_height;
|
||||||
|
|
||||||
|
if (meta_backend_is_stage_views_scaled (backend))
|
||||||
|
{
|
||||||
|
dst_width = surface->viewport.dst_width;
|
||||||
|
dst_height = surface->viewport.dst_height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
float monitor_scale =
|
||||||
|
meta_logical_monitor_get_scale (logical_monitor);
|
||||||
|
|
||||||
|
dst_width = (int) (surface->viewport.dst_width * monitor_scale);
|
||||||
|
dst_height = (int) (surface->viewport.dst_height * monitor_scale);
|
||||||
|
}
|
||||||
|
|
||||||
|
meta_cursor_sprite_set_viewport_dst_size (sprite,
|
||||||
|
dst_width,
|
||||||
|
dst_height);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
meta_cursor_sprite_reset_viewport_dst_size (sprite);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
meta_wayland_surface_set_main_monitor (surface, logical_monitor);
|
||||||
|
meta_wayland_surface_update_outputs (surface);
|
||||||
|
meta_wayland_surface_notify_preferred_scale_monitor (surface);
|
||||||
|
}
|
||||||
|
|
||||||
static ClutterColorState *
|
static ClutterColorState *
|
||||||
ensure_default_color_state (MetaCursorTracker *cursor_tracker)
|
ensure_default_color_state (MetaCursorTracker *cursor_tracker)
|
||||||
{
|
{
|
||||||
@ -135,4 +229,5 @@ meta_cursor_sprite_wayland_class_init (MetaCursorSpriteWaylandClass *klass)
|
|||||||
cursor_sprite_class->invalidate =
|
cursor_sprite_class->invalidate =
|
||||||
meta_cursor_sprite_wayland_invalidate;
|
meta_cursor_sprite_wayland_invalidate;
|
||||||
cursor_sprite_class->is_animated = meta_cursor_sprite_wayland_is_animated;
|
cursor_sprite_class->is_animated = meta_cursor_sprite_wayland_is_animated;
|
||||||
|
cursor_sprite_class->prepare_at = meta_cursor_sprite_wayland_prepare_at;
|
||||||
}
|
}
|
||||||
|
@ -30,10 +30,6 @@
|
|||||||
#include "wayland/meta-wayland-presentation-time-private.h"
|
#include "wayland/meta-wayland-presentation-time-private.h"
|
||||||
#include "wayland/meta-wayland-private.h"
|
#include "wayland/meta-wayland-private.h"
|
||||||
|
|
||||||
#ifdef HAVE_XWAYLAND
|
|
||||||
#include "wayland/meta-xwayland.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct _MetaWaylandCursorSurfacePrivate MetaWaylandCursorSurfacePrivate;
|
typedef struct _MetaWaylandCursorSurfacePrivate MetaWaylandCursorSurfacePrivate;
|
||||||
|
|
||||||
struct _MetaWaylandCursorSurfacePrivate
|
struct _MetaWaylandCursorSurfacePrivate
|
||||||
@ -104,96 +100,6 @@ update_cursor_sprite_texture (MetaWaylandCursorSurface *cursor_surface)
|
|||||||
meta_cursor_renderer_force_update (priv->cursor_renderer);
|
meta_cursor_renderer_force_update (priv->cursor_renderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
cursor_sprite_prepare_at (MetaCursorSprite *cursor_sprite,
|
|
||||||
float best_scale,
|
|
||||||
int x,
|
|
||||||
int y,
|
|
||||||
MetaWaylandCursorSurface *cursor_surface)
|
|
||||||
{
|
|
||||||
MetaWaylandSurfaceRole *role = META_WAYLAND_SURFACE_ROLE (cursor_surface);
|
|
||||||
MetaWaylandSurface *surface = meta_wayland_surface_role_get_surface (role);
|
|
||||||
MetaContext *context =
|
|
||||||
meta_wayland_compositor_get_context (surface->compositor);
|
|
||||||
MetaBackend *backend = meta_context_get_backend (context);
|
|
||||||
MetaMonitorManager *monitor_manager =
|
|
||||||
meta_backend_get_monitor_manager (backend);
|
|
||||||
MetaLogicalMonitor *logical_monitor;
|
|
||||||
|
|
||||||
logical_monitor =
|
|
||||||
meta_monitor_manager_get_logical_monitor_at (monitor_manager, x, y);
|
|
||||||
if (logical_monitor)
|
|
||||||
{
|
|
||||||
int surface_scale;
|
|
||||||
float texture_scale;
|
|
||||||
#ifdef HAVE_XWAYLAND
|
|
||||||
MetaWaylandCompositor *wayland_compositor =
|
|
||||||
meta_context_get_wayland_compositor (context);
|
|
||||||
MetaXWaylandManager *xwayland_manager =
|
|
||||||
&wayland_compositor->xwayland_manager;
|
|
||||||
|
|
||||||
if (meta_wayland_surface_is_xwayland (surface))
|
|
||||||
surface_scale = meta_xwayland_get_x11_ui_scaling_factor (xwayland_manager);
|
|
||||||
else
|
|
||||||
#endif /* HAVE_XWAYLAND */
|
|
||||||
surface_scale = surface->applied_state.scale;
|
|
||||||
|
|
||||||
if (surface->viewport.has_dst_size)
|
|
||||||
texture_scale = 1.0f;
|
|
||||||
else if (meta_backend_is_stage_views_scaled (backend))
|
|
||||||
texture_scale = 1.0f / surface_scale;
|
|
||||||
else
|
|
||||||
texture_scale = (meta_logical_monitor_get_scale (logical_monitor) /
|
|
||||||
surface_scale);
|
|
||||||
|
|
||||||
meta_cursor_sprite_set_texture_scale (cursor_sprite, texture_scale);
|
|
||||||
meta_cursor_sprite_set_texture_transform (cursor_sprite,
|
|
||||||
surface->buffer_transform);
|
|
||||||
|
|
||||||
if (surface->viewport.has_src_rect)
|
|
||||||
{
|
|
||||||
meta_cursor_sprite_set_viewport_src_rect (cursor_sprite,
|
|
||||||
&surface->viewport.src_rect);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
meta_cursor_sprite_reset_viewport_src_rect (cursor_sprite);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (surface->viewport.has_dst_size)
|
|
||||||
{
|
|
||||||
int dst_width;
|
|
||||||
int dst_height;
|
|
||||||
|
|
||||||
if (meta_backend_is_stage_views_scaled (backend))
|
|
||||||
{
|
|
||||||
dst_width = surface->viewport.dst_width;
|
|
||||||
dst_height = surface->viewport.dst_height;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
float monitor_scale =
|
|
||||||
meta_logical_monitor_get_scale (logical_monitor);
|
|
||||||
|
|
||||||
dst_width = (int) (surface->viewport.dst_width * monitor_scale);
|
|
||||||
dst_height = (int) (surface->viewport.dst_height * monitor_scale);
|
|
||||||
}
|
|
||||||
|
|
||||||
meta_cursor_sprite_set_viewport_dst_size (cursor_sprite,
|
|
||||||
dst_width,
|
|
||||||
dst_height);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
meta_cursor_sprite_reset_viewport_dst_size (cursor_sprite);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
meta_wayland_surface_set_main_monitor (surface, logical_monitor);
|
|
||||||
meta_wayland_surface_update_outputs (surface);
|
|
||||||
meta_wayland_surface_notify_preferred_scale_monitor (surface);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_wayland_cursor_surface_assigned (MetaWaylandSurfaceRole *surface_role)
|
meta_wayland_cursor_surface_assigned (MetaWaylandSurfaceRole *surface_role)
|
||||||
{
|
{
|
||||||
@ -362,17 +268,8 @@ meta_wayland_cursor_surface_dispose (GObject *object)
|
|||||||
wl_list_for_each_safe (cb, next, &priv->frame_callbacks, link)
|
wl_list_for_each_safe (cb, next, &priv->frame_callbacks, link)
|
||||||
wl_resource_destroy (cb->resource);
|
wl_resource_destroy (cb->resource);
|
||||||
|
|
||||||
g_signal_handlers_disconnect_by_func (priv->cursor_sprite,
|
|
||||||
cursor_sprite_prepare_at, cursor_surface);
|
|
||||||
|
|
||||||
g_clear_object (&priv->cursor_renderer);
|
g_clear_object (&priv->cursor_renderer);
|
||||||
|
|
||||||
if (priv->cursor_sprite)
|
|
||||||
{
|
|
||||||
meta_cursor_sprite_set_prepare_func (META_CURSOR_SPRITE (priv->cursor_sprite),
|
|
||||||
NULL, NULL);
|
|
||||||
g_clear_object (&priv->cursor_sprite);
|
g_clear_object (&priv->cursor_sprite);
|
||||||
}
|
|
||||||
|
|
||||||
if (priv->buffer)
|
if (priv->buffer)
|
||||||
{
|
{
|
||||||
@ -413,9 +310,6 @@ meta_wayland_cursor_surface_constructed (GObject *object)
|
|||||||
|
|
||||||
priv->cursor_sprite = meta_cursor_sprite_wayland_new (surface,
|
priv->cursor_sprite = meta_cursor_sprite_wayland_new (surface,
|
||||||
cursor_tracker);
|
cursor_tracker);
|
||||||
meta_cursor_sprite_set_prepare_func (META_CURSOR_SPRITE (priv->cursor_sprite),
|
|
||||||
(MetaCursorPrepareFunc) cursor_sprite_prepare_at,
|
|
||||||
cursor_surface);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -32,7 +32,6 @@
|
|||||||
#include "wayland/meta-wayland-tablet.h"
|
#include "wayland/meta-wayland-tablet.h"
|
||||||
#include "wayland/meta-wayland-tablet-seat.h"
|
#include "wayland/meta-wayland-tablet-seat.h"
|
||||||
#include "backends/meta-input-settings-private.h"
|
#include "backends/meta-input-settings-private.h"
|
||||||
#include "backends/meta-logical-monitor.h"
|
|
||||||
|
|
||||||
#include "tablet-unstable-v2-server-protocol.h"
|
#include "tablet-unstable-v2-server-protocol.h"
|
||||||
|
|
||||||
@ -425,39 +424,6 @@ tablet_tool_handle_cursor_surface_destroy (struct wl_listener *listener,
|
|||||||
meta_wayland_tablet_tool_set_cursor_surface (tool, NULL);
|
meta_wayland_tablet_tool_set_cursor_surface (tool, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
tool_cursor_prepare_at (MetaCursorSpriteXcursor *sprite_xcursor,
|
|
||||||
float best_scale,
|
|
||||||
int x,
|
|
||||||
int y,
|
|
||||||
MetaWaylandTabletTool *tool)
|
|
||||||
{
|
|
||||||
MetaBackend *backend = backend_from_tool (tool);
|
|
||||||
MetaMonitorManager *monitor_manager =
|
|
||||||
meta_backend_get_monitor_manager (backend);
|
|
||||||
MetaLogicalMonitor *logical_monitor;
|
|
||||||
|
|
||||||
logical_monitor =
|
|
||||||
meta_monitor_manager_get_logical_monitor_at (monitor_manager, x, y);
|
|
||||||
|
|
||||||
/* Reload the cursor texture if the scale has changed. */
|
|
||||||
if (logical_monitor)
|
|
||||||
{
|
|
||||||
MetaCursorSprite *cursor_sprite = META_CURSOR_SPRITE (sprite_xcursor);
|
|
||||||
float ceiled_scale;
|
|
||||||
|
|
||||||
ceiled_scale = ceilf (logical_monitor->scale);
|
|
||||||
meta_cursor_sprite_xcursor_set_theme_scale (sprite_xcursor,
|
|
||||||
(int) ceiled_scale);
|
|
||||||
|
|
||||||
if (meta_backend_is_stage_views_scaled (backend))
|
|
||||||
meta_cursor_sprite_set_texture_scale (cursor_sprite,
|
|
||||||
1.0f / ceiled_scale);
|
|
||||||
else
|
|
||||||
meta_cursor_sprite_set_texture_scale (cursor_sprite, 1.0f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MetaWaylandTabletTool *
|
MetaWaylandTabletTool *
|
||||||
meta_wayland_tablet_tool_new (MetaWaylandTabletSeat *seat,
|
meta_wayland_tablet_tool_new (MetaWaylandTabletSeat *seat,
|
||||||
ClutterInputDeviceTool *device_tool)
|
ClutterInputDeviceTool *device_tool)
|
||||||
@ -480,9 +446,6 @@ meta_wayland_tablet_tool_new (MetaWaylandTabletSeat *seat,
|
|||||||
|
|
||||||
tool->default_sprite = meta_cursor_sprite_xcursor_new (META_CURSOR_DEFAULT,
|
tool->default_sprite = meta_cursor_sprite_xcursor_new (META_CURSOR_DEFAULT,
|
||||||
cursor_tracker);
|
cursor_tracker);
|
||||||
meta_cursor_sprite_set_prepare_func (META_CURSOR_SPRITE (tool->default_sprite),
|
|
||||||
(MetaCursorPrepareFunc) tool_cursor_prepare_at,
|
|
||||||
tool);
|
|
||||||
|
|
||||||
return tool;
|
return tool;
|
||||||
}
|
}
|
||||||
@ -504,8 +467,6 @@ meta_wayland_tablet_tool_free (MetaWaylandTabletTool *tool)
|
|||||||
wl_list_init (wl_resource_get_link (resource));
|
wl_list_init (wl_resource_get_link (resource));
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_cursor_sprite_set_prepare_func (META_CURSOR_SPRITE (tool->default_sprite),
|
|
||||||
NULL, NULL);
|
|
||||||
g_object_unref (tool->default_sprite);
|
g_object_unref (tool->default_sprite);
|
||||||
|
|
||||||
g_free (tool);
|
g_free (tool);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user