xwayland: Account for the scale factor

Apply the scale factor to the root window and adjust the coordinates and
hotspot location for cursors.

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Reviewed-By: Kenny Levinsen <kl@kl.wtf>
Acked-by: Peter Hutterer <peter.hutterer@who-t.net>
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1197>
This commit is contained in:
Olivier Fourdan 2023-11-02 10:25:46 +01:00
parent b678297c53
commit 54f8fc4090
3 changed files with 117 additions and 19 deletions

View File

@ -156,6 +156,7 @@ xwl_cursor_attach_pixmap(struct xwl_seat *xwl_seat,
struct xwl_cursor *xwl_cursor, PixmapPtr pixmap) struct xwl_cursor *xwl_cursor, PixmapPtr pixmap)
{ {
struct wl_buffer *buffer; struct wl_buffer *buffer;
struct xwl_screen *xwl_screen = xwl_seat->xwl_screen;
buffer = xwl_shm_pixmap_get_wl_buffer(pixmap); buffer = xwl_shm_pixmap_get_wl_buffer(pixmap);
if (!buffer) { if (!buffer) {
@ -164,7 +165,8 @@ xwl_cursor_attach_pixmap(struct xwl_seat *xwl_seat,
} }
wl_surface_attach(xwl_cursor->surface, buffer, 0, 0); wl_surface_attach(xwl_cursor->surface, buffer, 0, 0);
xwl_surface_damage(xwl_seat->xwl_screen, xwl_cursor->surface, 0, 0, wl_surface_set_buffer_scale(xwl_cursor->surface, xwl_screen->global_surface_scale);
xwl_surface_damage(xwl_screen, xwl_cursor->surface, 0, 0,
xwl_seat->x_cursor->bits->width, xwl_seat->x_cursor->bits->width,
xwl_seat->x_cursor->bits->height); xwl_seat->x_cursor->bits->height);
@ -196,8 +198,10 @@ void
xwl_seat_set_cursor(struct xwl_seat *xwl_seat) xwl_seat_set_cursor(struct xwl_seat *xwl_seat)
{ {
struct xwl_cursor *xwl_cursor = &xwl_seat->cursor; struct xwl_cursor *xwl_cursor = &xwl_seat->cursor;
struct xwl_screen *xwl_screen = xwl_seat->xwl_screen;
PixmapPtr pixmap; PixmapPtr pixmap;
CursorPtr cursor; CursorPtr cursor;
int xhot, yhot;
if (!xwl_seat->wl_pointer) if (!xwl_seat->wl_pointer)
return; return;
@ -222,11 +226,14 @@ xwl_seat_set_cursor(struct xwl_seat *xwl_seat)
xwl_cursor_copy_bits_to_pixmap(cursor, pixmap); xwl_cursor_copy_bits_to_pixmap(cursor, pixmap);
xhot = xwl_seat->x_cursor->bits->xhot / xwl_screen->global_surface_scale;
yhot = xwl_seat->x_cursor->bits->yhot / xwl_screen->global_surface_scale;
wl_pointer_set_cursor(xwl_seat->wl_pointer, wl_pointer_set_cursor(xwl_seat->wl_pointer,
xwl_seat->pointer_enter_serial, xwl_seat->pointer_enter_serial,
xwl_cursor->surface, xwl_cursor->surface,
xwl_seat->x_cursor->bits->xhot, xhot,
xwl_seat->x_cursor->bits->yhot); yhot);
xwl_cursor_attach_pixmap(xwl_seat, xwl_cursor, pixmap); xwl_cursor_attach_pixmap(xwl_seat, xwl_cursor, pixmap);
} }
@ -235,9 +242,11 @@ void
xwl_tablet_tool_set_cursor(struct xwl_tablet_tool *xwl_tablet_tool) xwl_tablet_tool_set_cursor(struct xwl_tablet_tool *xwl_tablet_tool)
{ {
struct xwl_seat *xwl_seat = xwl_tablet_tool->seat; struct xwl_seat *xwl_seat = xwl_tablet_tool->seat;
struct xwl_screen *xwl_screen = xwl_seat->xwl_screen;
struct xwl_cursor *xwl_cursor = &xwl_tablet_tool->cursor; struct xwl_cursor *xwl_cursor = &xwl_tablet_tool->cursor;
PixmapPtr pixmap; PixmapPtr pixmap;
CursorPtr cursor; CursorPtr cursor;
int xhot, yhot;
if (!xwl_seat->x_cursor) { if (!xwl_seat->x_cursor) {
zwp_tablet_tool_v2_set_cursor(xwl_tablet_tool->tool, zwp_tablet_tool_v2_set_cursor(xwl_tablet_tool->tool,
@ -260,11 +269,14 @@ xwl_tablet_tool_set_cursor(struct xwl_tablet_tool *xwl_tablet_tool)
xwl_cursor_copy_bits_to_pixmap(cursor, pixmap); xwl_cursor_copy_bits_to_pixmap(cursor, pixmap);
xhot = xwl_seat->x_cursor->bits->xhot / xwl_screen->global_surface_scale;
yhot = xwl_seat->x_cursor->bits->yhot / xwl_screen->global_surface_scale;
zwp_tablet_tool_v2_set_cursor(xwl_tablet_tool->tool, zwp_tablet_tool_v2_set_cursor(xwl_tablet_tool->tool,
xwl_tablet_tool->proximity_in_serial, xwl_tablet_tool->proximity_in_serial,
xwl_cursor->surface, xwl_cursor->surface,
xwl_seat->x_cursor->bits->xhot, xhot,
xwl_seat->x_cursor->bits->yhot); yhot);
xwl_cursor_attach_pixmap(xwl_seat, xwl_cursor, pixmap); xwl_cursor_attach_pixmap(xwl_seat, xwl_cursor, pixmap);
} }

View File

@ -515,13 +515,13 @@ pointer_handle_enter(void *data, struct wl_pointer *pointer,
wl_fixed_t sx_w, wl_fixed_t sy_w) wl_fixed_t sx_w, wl_fixed_t sy_w)
{ {
struct xwl_seat *xwl_seat = data; struct xwl_seat *xwl_seat = data;
struct xwl_screen *xwl_screen = xwl_seat->xwl_screen;
DeviceIntPtr dev = get_pointer_device(xwl_seat); DeviceIntPtr dev = get_pointer_device(xwl_seat);
DeviceIntPtr master; DeviceIntPtr master;
int i; int i;
int sx = wl_fixed_to_int(sx_w); int sx, sy;
int sy = wl_fixed_to_int(sy_w);
int dx, dy; int dx, dy;
ScreenPtr pScreen = xwl_seat->xwl_screen->screen; ScreenPtr pScreen = xwl_screen->screen;
ValuatorMask mask; ValuatorMask mask;
/* There's a race here where if we create and then immediately /* There's a race here where if we create and then immediately
@ -536,6 +536,9 @@ pointer_handle_enter(void *data, struct wl_pointer *pointer,
if (!is_surface_from_xwl_window(surface)) if (!is_surface_from_xwl_window(surface))
return; return;
sx = wl_fixed_to_int(sx_w) * xwl_screen->global_surface_scale;
sy = wl_fixed_to_int(sy_w) * xwl_screen->global_surface_scale;
xwl_seat->xwl_screen->serial = serial; xwl_seat->xwl_screen->serial = serial;
xwl_seat->pointer_enter_serial = serial; xwl_seat->pointer_enter_serial = serial;
@ -624,6 +627,7 @@ pointer_handle_leave(void *data, struct wl_pointer *pointer,
static void static void
dispatch_relative_motion_with_warp(struct xwl_seat *xwl_seat) dispatch_relative_motion_with_warp(struct xwl_seat *xwl_seat)
{ {
struct xwl_screen *xwl_screen = xwl_seat->xwl_screen;
double dx, dx_unaccel; double dx, dx_unaccel;
double dy, dy_unaccel; double dy, dy_unaccel;
@ -632,6 +636,11 @@ dispatch_relative_motion_with_warp(struct xwl_seat *xwl_seat)
dx_unaccel = xwl_seat->pending_pointer_event.dx_unaccel; dx_unaccel = xwl_seat->pending_pointer_event.dx_unaccel;
dy_unaccel = xwl_seat->pending_pointer_event.dy_unaccel; dy_unaccel = xwl_seat->pending_pointer_event.dy_unaccel;
dx *= xwl_screen->global_surface_scale;
dy *= xwl_screen->global_surface_scale;
dx_unaccel *= xwl_screen->global_surface_scale;
dy_unaccel *= xwl_screen->global_surface_scale;
xwl_pointer_warp_emulator_handle_motion(xwl_seat->pointer_warp_emulator, xwl_pointer_warp_emulator_handle_motion(xwl_seat->pointer_warp_emulator,
dx, dy, dx, dy,
dx_unaccel, dy_unaccel); dx_unaccel, dy_unaccel);
@ -640,6 +649,7 @@ dispatch_relative_motion_with_warp(struct xwl_seat *xwl_seat)
static void static void
dispatch_absolute_motion(struct xwl_seat *xwl_seat) dispatch_absolute_motion(struct xwl_seat *xwl_seat)
{ {
struct xwl_screen *xwl_screen = xwl_seat->xwl_screen;
ValuatorMask mask; ValuatorMask mask;
DeviceIntPtr device; DeviceIntPtr device;
int flags; int flags;
@ -650,6 +660,9 @@ dispatch_absolute_motion(struct xwl_seat *xwl_seat)
int x; int x;
int y; int y;
event_x *= xwl_screen->global_surface_scale;
event_y *= xwl_screen->global_surface_scale;
if (xwl_window_has_viewport_enabled(xwl_seat->focus_window)) { if (xwl_window_has_viewport_enabled(xwl_seat->focus_window)) {
event_x *= xwl_seat->focus_window->scale_x; event_x *= xwl_seat->focus_window->scale_x;
event_y *= xwl_seat->focus_window->scale_y; event_y *= xwl_seat->focus_window->scale_y;
@ -676,12 +689,18 @@ dispatch_absolute_motion(struct xwl_seat *xwl_seat)
static void static void
dispatch_relative_motion(struct xwl_seat *xwl_seat) dispatch_relative_motion(struct xwl_seat *xwl_seat)
{ {
struct xwl_screen *xwl_screen = xwl_seat->xwl_screen;
ValuatorMask mask; ValuatorMask mask;
double event_dx = xwl_seat->pending_pointer_event.dx; double event_dx = xwl_seat->pending_pointer_event.dx;
double event_dy = xwl_seat->pending_pointer_event.dy; double event_dy = xwl_seat->pending_pointer_event.dy;
double event_dx_unaccel = xwl_seat->pending_pointer_event.dx_unaccel; double event_dx_unaccel = xwl_seat->pending_pointer_event.dx_unaccel;
double event_dy_unaccel = xwl_seat->pending_pointer_event.dy_unaccel; double event_dy_unaccel = xwl_seat->pending_pointer_event.dy_unaccel;
event_dx *= xwl_screen->global_surface_scale;
event_dy *= xwl_screen->global_surface_scale;
event_dx_unaccel *= xwl_screen->global_surface_scale;
event_dy_unaccel *= xwl_screen->global_surface_scale;
valuator_mask_zero(&mask); valuator_mask_zero(&mask);
valuator_mask_set_unaccelerated(&mask, 0, event_dx, event_dx_unaccel); valuator_mask_set_unaccelerated(&mask, 0, event_dx, event_dx_unaccel);
valuator_mask_set_unaccelerated(&mask, 1, event_dy, event_dy_unaccel); valuator_mask_set_unaccelerated(&mask, 1, event_dy, event_dy_unaccel);
@ -955,9 +974,13 @@ pointer_gesture_swipe_handle_update(void *data,
wl_fixed_t dyf) wl_fixed_t dyf)
{ {
struct xwl_seat *xwl_seat = data; struct xwl_seat *xwl_seat = data;
struct xwl_screen *xwl_screen = xwl_seat->xwl_screen;
double dx = wl_fixed_to_double(dxf); double dx = wl_fixed_to_double(dxf);
double dy = wl_fixed_to_double(dyf); double dy = wl_fixed_to_double(dyf);
dx *= xwl_screen->global_surface_scale;
dy *= xwl_screen->global_surface_scale;
QueueGestureSwipeEvents(xwl_seat->pointer_gestures, QueueGestureSwipeEvents(xwl_seat->pointer_gestures,
XI_GestureSwipeUpdate, XI_GestureSwipeUpdate,
xwl_seat->pointer_gesture_swipe_fingers, xwl_seat->pointer_gesture_swipe_fingers,
@ -1021,10 +1044,14 @@ pointer_gesture_pinch_handle_update(void *data,
wl_fixed_t rotation) wl_fixed_t rotation)
{ {
struct xwl_seat *xwl_seat = data; struct xwl_seat *xwl_seat = data;
struct xwl_screen *xwl_screen = xwl_seat->xwl_screen;
double dx = wl_fixed_to_double(dxf); double dx = wl_fixed_to_double(dxf);
double dy = wl_fixed_to_double(dyf); double dy = wl_fixed_to_double(dyf);
double scale = wl_fixed_to_double(scalef); double scale = wl_fixed_to_double(scalef);
dx *= xwl_screen->global_surface_scale;
dy *= xwl_screen->global_surface_scale;
xwl_seat->pointer_gesture_pinch_last_scale = scale; xwl_seat->pointer_gesture_pinch_last_scale = scale;
QueueGesturePinchEvents(xwl_seat->pointer_gestures, QueueGesturePinchEvents(xwl_seat->pointer_gestures,
XI_GesturePinchUpdate, XI_GesturePinchUpdate,
@ -1403,6 +1430,7 @@ touch_handle_down(void *data, struct wl_touch *wl_touch,
int32_t id, wl_fixed_t sx_w, wl_fixed_t sy_w) int32_t id, wl_fixed_t sx_w, wl_fixed_t sy_w)
{ {
struct xwl_seat *xwl_seat = data; struct xwl_seat *xwl_seat = data;
struct xwl_screen *xwl_screen = xwl_seat->xwl_screen;
struct xwl_touch *xwl_touch; struct xwl_touch *xwl_touch;
if (surface == NULL) if (surface == NULL)
@ -1423,6 +1451,9 @@ touch_handle_down(void *data, struct wl_touch *wl_touch,
xwl_touch->y = wl_fixed_to_int(sy_w); xwl_touch->y = wl_fixed_to_int(sy_w);
xorg_list_add(&xwl_touch->link_touch, &xwl_seat->touches); xorg_list_add(&xwl_touch->link_touch, &xwl_seat->touches);
xwl_touch->x *= xwl_screen->global_surface_scale;
xwl_touch->y *= xwl_screen->global_surface_scale;
xwl_touch_send_event(xwl_touch, xwl_seat, XI_TouchBegin); xwl_touch_send_event(xwl_touch, xwl_seat, XI_TouchBegin);
} }
@ -1449,6 +1480,7 @@ touch_handle_motion(void *data, struct wl_touch *wl_touch,
wl_fixed_t sx_w, wl_fixed_t sy_w) wl_fixed_t sx_w, wl_fixed_t sy_w)
{ {
struct xwl_seat *xwl_seat = data; struct xwl_seat *xwl_seat = data;
struct xwl_screen *xwl_screen = xwl_seat->xwl_screen;
struct xwl_touch *xwl_touch; struct xwl_touch *xwl_touch;
xwl_touch = xwl_seat_lookup_touch(xwl_seat, id); xwl_touch = xwl_seat_lookup_touch(xwl_seat, id);
@ -1458,6 +1490,10 @@ touch_handle_motion(void *data, struct wl_touch *wl_touch,
xwl_touch->x = wl_fixed_to_int(sx_w); xwl_touch->x = wl_fixed_to_int(sx_w);
xwl_touch->y = wl_fixed_to_int(sy_w); xwl_touch->y = wl_fixed_to_int(sy_w);
xwl_touch->x *= xwl_screen->global_surface_scale;
xwl_touch->y *= xwl_screen->global_surface_scale;
xwl_touch_send_event(xwl_touch, xwl_seat, XI_TouchUpdate); xwl_touch_send_event(xwl_touch, xwl_seat, XI_TouchUpdate);
} }
@ -2146,6 +2182,7 @@ tablet_tool_motion(void *data, struct zwp_tablet_tool_v2 *tool,
{ {
struct xwl_tablet_tool *xwl_tablet_tool = data; struct xwl_tablet_tool *xwl_tablet_tool = data;
struct xwl_seat *xwl_seat = xwl_tablet_tool->seat; struct xwl_seat *xwl_seat = xwl_tablet_tool->seat;
struct xwl_screen *xwl_screen = xwl_seat->xwl_screen;
int32_t dx, dy; int32_t dx, dy;
double sx = wl_fixed_to_double(x); double sx = wl_fixed_to_double(x);
double sy = wl_fixed_to_double(y); double sy = wl_fixed_to_double(y);
@ -2153,6 +2190,9 @@ tablet_tool_motion(void *data, struct zwp_tablet_tool_v2 *tool,
if (!xwl_seat->tablet_focus_window) if (!xwl_seat->tablet_focus_window)
return; return;
sx *= xwl_screen->global_surface_scale;
sy *= xwl_screen->global_surface_scale;
dx = xwl_seat->tablet_focus_window->window->drawable.x; dx = xwl_seat->tablet_focus_window->window->drawable.x;
dy = xwl_seat->tablet_focus_window->window->drawable.y; dy = xwl_seat->tablet_focus_window->window->drawable.y;
@ -2186,12 +2226,16 @@ tablet_tool_tilt(void *data, struct zwp_tablet_tool_v2 *tool,
{ {
struct xwl_tablet_tool *xwl_tablet_tool = data; struct xwl_tablet_tool *xwl_tablet_tool = data;
struct xwl_seat *xwl_seat = xwl_tablet_tool->seat; struct xwl_seat *xwl_seat = xwl_tablet_tool->seat;
struct xwl_screen *xwl_screen = xwl_seat->xwl_screen;
if (!xwl_seat->tablet_focus_window) if (!xwl_seat->tablet_focus_window)
return; return;
xwl_tablet_tool->tilt_x = wl_fixed_to_double(tilt_x); xwl_tablet_tool->tilt_x = wl_fixed_to_double(tilt_x);
xwl_tablet_tool->tilt_y = wl_fixed_to_double(tilt_y); xwl_tablet_tool->tilt_y = wl_fixed_to_double(tilt_y);
xwl_tablet_tool->tilt_x *= xwl_screen->global_surface_scale;
xwl_tablet_tool->tilt_y *= xwl_screen->global_surface_scale;
} }
static void static void

View File

@ -27,6 +27,7 @@
#include <dix-config.h> #include <dix-config.h>
#endif #endif
#include <math.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <X11/X.h> #include <X11/X.h>
@ -266,6 +267,9 @@ xwl_window_enable_viewport(struct xwl_window *xwl_window,
struct xwl_output *xwl_output, struct xwl_output *xwl_output,
struct xwl_emulated_mode *emulated_mode) struct xwl_emulated_mode *emulated_mode)
{ {
struct xwl_screen *xwl_screen = xwl_window->xwl_screen;
int width, height;
if (!xwl_window_has_viewport_enabled(xwl_window)) { if (!xwl_window_has_viewport_enabled(xwl_window)) {
DebugF("XWAYLAND: enabling viewport %dx%d -> %dx%d\n", DebugF("XWAYLAND: enabling viewport %dx%d -> %dx%d\n",
emulated_mode->width, emulated_mode->height, emulated_mode->width, emulated_mode->height,
@ -274,17 +278,20 @@ xwl_window_enable_viewport(struct xwl_window *xwl_window,
xwl_window->surface); xwl_window->surface);
} }
width = emulated_mode->width / xwl_screen->global_surface_scale;
height = emulated_mode->height / xwl_screen->global_surface_scale;
wp_viewport_set_source(xwl_window->viewport, wp_viewport_set_source(xwl_window->viewport,
wl_fixed_from_int(0), wl_fixed_from_int(0),
wl_fixed_from_int(0), wl_fixed_from_int(0),
wl_fixed_from_int(emulated_mode->width), wl_fixed_from_int(width),
wl_fixed_from_int(emulated_mode->height)); wl_fixed_from_int(height));
wp_viewport_set_destination(xwl_window->viewport, wp_viewport_set_destination(xwl_window->viewport,
xwl_output->width, xwl_output->width,
xwl_output->height); xwl_output->height);
xwl_window->scale_x = (float)emulated_mode->width / xwl_output->width; xwl_window->scale_x = (float) width / xwl_output->width;
xwl_window->scale_y = (float)emulated_mode->height / xwl_output->height; xwl_window->scale_y = (float) height / xwl_output->height;
} }
static Bool static Bool
@ -641,12 +648,20 @@ xwl_window_maybe_resize(struct xwl_window *xwl_window, double width, double heig
{ {
struct xwl_screen *xwl_screen = xwl_window->xwl_screen; struct xwl_screen *xwl_screen = xwl_window->xwl_screen;
struct xwl_output *xwl_output; struct xwl_output *xwl_output;
double scale;
RRModePtr mode; RRModePtr mode;
/* Clamp the size */ /* Clamp the size */
width = min(max(width, MIN_ROOTFUL_WIDTH), MAX_ROOTFUL_WIDTH); width = min(max(width, MIN_ROOTFUL_WIDTH), MAX_ROOTFUL_WIDTH);
height = min(max(height, MIN_ROOTFUL_HEIGHT), MAX_ROOTFUL_HEIGHT); height = min(max(height, MIN_ROOTFUL_HEIGHT), MAX_ROOTFUL_HEIGHT);
/* Make sure the size is a multiple of the scale, it's a protocol error otherwise. */
scale = xwl_screen->global_surface_scale;
if (scale > 1.0) {
width = round(width / scale) * scale;
height = round(height / scale) * scale;
}
if (width == xwl_screen->width && height == xwl_screen->height) if (width == xwl_screen->width && height == xwl_screen->height)
return; return;
@ -667,10 +682,18 @@ xwl_window_maybe_resize(struct xwl_window *xwl_window, double width, double heig
static void static void
xwl_window_libdecor_set_size_limits(struct xwl_window *xwl_window) xwl_window_libdecor_set_size_limits(struct xwl_window *xwl_window)
{ {
struct xwl_screen *xwl_screen = xwl_window->xwl_screen;
libdecor_frame_set_min_content_size(xwl_window->libdecor_frame, libdecor_frame_set_min_content_size(xwl_window->libdecor_frame,
MIN_ROOTFUL_WIDTH, MIN_ROOTFUL_HEIGHT); MIN_ROOTFUL_WIDTH /
xwl_screen->global_surface_scale,
MIN_ROOTFUL_HEIGHT /
xwl_screen->global_surface_scale);
libdecor_frame_set_max_content_size(xwl_window->libdecor_frame, libdecor_frame_set_max_content_size(xwl_window->libdecor_frame,
MAX_ROOTFUL_WIDTH, MAX_ROOTFUL_HEIGHT); MAX_ROOTFUL_WIDTH /
xwl_screen->global_surface_scale,
MAX_ROOTFUL_HEIGHT /
xwl_screen->global_surface_scale);
} }
static void static void
@ -701,11 +724,21 @@ handle_libdecor_configure(struct libdecor_frame *frame,
new_width = (double) width; new_width = (double) width;
new_height = (double) height; new_height = (double) height;
} }
else {
new_width = xwl_screen->width / xwl_screen->global_surface_scale;
new_height = xwl_screen->height / xwl_screen->global_surface_scale;
}
new_width *= xwl_screen->global_surface_scale;
new_height *= xwl_screen->global_surface_scale;
xwl_window_maybe_resize(xwl_window, new_width, new_height); xwl_window_maybe_resize(xwl_window, new_width, new_height);
new_width = xwl_screen->width / xwl_screen->global_surface_scale;
new_height = xwl_screen->height / xwl_screen->global_surface_scale;
xwl_window_update_libdecor_size(xwl_window, configuration, xwl_window_update_libdecor_size(xwl_window, configuration,
xwl_screen_get_width(xwl_screen), round(new_width), round(new_height));
xwl_screen_get_height(xwl_screen));
wl_surface_commit(xwl_window->surface); wl_surface_commit(xwl_window->surface);
} }
@ -802,14 +835,17 @@ xdg_toplevel_handle_configure(void *data,
struct xwl_screen *xwl_screen = xwl_window->xwl_screen; struct xwl_screen *xwl_screen = xwl_window->xwl_screen;
uint32_t *p; uint32_t *p;
Bool old_active = xwl_screen->active; Bool old_active = xwl_screen->active;
int new_width, new_height;
/* Maintain our current size if no dimensions are requested */ /* Maintain our current size if no dimensions are requested */
if (width == 0 && height == 0) if (width == 0 && height == 0)
return; return;
if (!xwl_screen->fullscreen) { if (!xwl_screen->fullscreen) {
new_width = width * xwl_screen->global_surface_scale;
new_height = height * xwl_screen->global_surface_scale;
/* This will be committed by the xdg_surface.configure handler */ /* This will be committed by the xdg_surface.configure handler */
xwl_window_maybe_resize(xwl_window, width, height); xwl_window_maybe_resize(xwl_window, new_width, new_height);
} }
xwl_screen->active = FALSE; xwl_screen->active = FALSE;
@ -1273,8 +1309,14 @@ xwl_resize_window(WindowPtr window,
if (xwl_window_get(window) || xwl_window_is_toplevel(window)) if (xwl_window_get(window) || xwl_window_is_toplevel(window))
xwl_window_check_resolution_change_emulation(xwl_window); xwl_window_check_resolution_change_emulation(xwl_window);
#ifdef XWL_HAS_LIBDECOR #ifdef XWL_HAS_LIBDECOR
if (window == screen->root) if (window == screen->root) {
xwl_window_update_libdecor_size(xwl_window, NULL, width, height); unsigned int decor_width, decor_height;
decor_width = width / xwl_screen->global_surface_scale;
decor_height = height / xwl_screen->global_surface_scale;
xwl_window_update_libdecor_size(xwl_window, NULL,
decor_width, decor_height);
}
#endif #endif
} }
} }