Created
April 2, 2023 06:50
-
-
Save joshuataylor/5beb171c470be84784d3939e5089ec40 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 5d04dc68d7a952c2b98cab7af60bba93bee2dec7 Mon Sep 17 00:00:00 2001 | |
From: lilydjwg <[email protected]> | |
Date: Wed, 17 Nov 2021 19:34:58 +0800 | |
Subject: [PATCH 1/2] xwayland: support HiDPI scale | |
This supports the xorg-xwayland patch at https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/733 | |
--- | |
include/xwayland/xwm.h | 2 ++ | |
xwayland/xwm.c | 51 +++++++++++++++++++++++++++++++----------- | |
2 files changed, 40 insertions(+), 13 deletions(-) | |
diff --git a/include/xwayland/xwm.h b/include/xwayland/xwm.h | |
index 3d540522..33ff1478 100644 | |
--- a/include/xwayland/xwm.h | |
+++ b/include/xwayland/xwm.h | |
@@ -88,6 +88,7 @@ enum atom_name { | |
DND_ACTION_PRIVATE, | |
NET_CLIENT_LIST, | |
NET_CLIENT_LIST_STACKING, | |
+ XWAYLAND_GLOBAL_OUTPUT_SCALE, | |
ATOM_LAST // keep last | |
}; | |
@@ -96,6 +97,7 @@ struct wlr_xwm { | |
struct wl_event_source *event_source; | |
struct wlr_seat *seat; | |
uint32_t ping_timeout; | |
+ uint32_t scale; | |
xcb_atom_t atoms[ATOM_LAST]; | |
xcb_connection_t *xcb_conn; | |
diff --git a/xwayland/xwm.c b/xwayland/xwm.c | |
index 5f857f24..4f03b07c 100644 | |
--- a/xwayland/xwm.c | |
+++ b/xwayland/xwm.c | |
@@ -19,6 +19,14 @@ | |
#include <xcb/xfixes.h> | |
#include "xwayland/xwm.h" | |
+static int32_t scale(struct wlr_xwm *xwm, uint32_t val) { | |
+ return val * xwm->scale; | |
+} | |
+ | |
+static int32_t unscale(struct wlr_xwm *xwm, uint32_t val) { | |
+ return (val + xwm->scale/2) / xwm->scale; | |
+} | |
+ | |
static const char *const atom_map[ATOM_LAST] = { | |
[WL_SURFACE_ID] = "WL_SURFACE_ID", | |
[WL_SURFACE_SERIAL] = "WL_SURFACE_SERIAL", | |
@@ -90,6 +98,7 @@ static const char *const atom_map[ATOM_LAST] = { | |
[DND_ACTION_PRIVATE] = "XdndActionPrivate", | |
[NET_CLIENT_LIST] = "_NET_CLIENT_LIST", | |
[NET_CLIENT_LIST_STACKING] = "_NET_CLIENT_LIST_STACKING", | |
+ [XWAYLAND_GLOBAL_OUTPUT_SCALE] = "_XWAYLAND_GLOBAL_OUTPUT_SCALE", | |
}; | |
#define STARTUP_INFO_REMOVE_PREFIX "remove: ID=" | |
@@ -965,8 +974,8 @@ static void xwm_handle_create_notify(struct wlr_xwm *xwm, | |
return; | |
} | |
- xwayland_surface_create(xwm, ev->window, ev->x, ev->y, | |
- ev->width, ev->height, ev->override_redirect); | |
+ xwayland_surface_create(xwm, ev->window, unscale(xwm, ev->x), unscale(xwm, ev->y), | |
+ unscale(xwm, ev->width), unscale(xwm, ev->height), ev->override_redirect); | |
} | |
static void xwm_handle_destroy_notify(struct wlr_xwm *xwm, | |
@@ -997,10 +1006,10 @@ static void xwm_handle_configure_request(struct wlr_xwm *xwm, | |
struct wlr_xwayland_surface_configure_event wlr_event = { | |
.surface = surface, | |
- .x = mask & XCB_CONFIG_WINDOW_X ? ev->x : surface->x, | |
- .y = mask & XCB_CONFIG_WINDOW_Y ? ev->y : surface->y, | |
- .width = mask & XCB_CONFIG_WINDOW_WIDTH ? ev->width : surface->width, | |
- .height = mask & XCB_CONFIG_WINDOW_HEIGHT ? ev->height : surface->height, | |
+ .x = mask & XCB_CONFIG_WINDOW_X ? unscale(xwm, ev->x) : surface->x, | |
+ .y = mask & XCB_CONFIG_WINDOW_Y ? unscale(xwm, ev->y) : surface->y, | |
+ .width = mask & XCB_CONFIG_WINDOW_WIDTH ? unscale(xwm, ev->width) : surface->width, | |
+ .height = mask & XCB_CONFIG_WINDOW_HEIGHT ? unscale(xwm, ev->height) : surface->height, | |
.mask = mask, | |
}; | |
@@ -1015,14 +1024,14 @@ static void xwm_handle_configure_notify(struct wlr_xwm *xwm, | |
} | |
bool geometry_changed = | |
- (xsurface->x != ev->x || xsurface->y != ev->y || | |
- xsurface->width != ev->width || xsurface->height != ev->height); | |
+ (xsurface->x != unscale(xwm, ev->x) || xsurface->y != unscale(xwm, ev->y) || | |
+ xsurface->width != unscale(xwm, ev->width) || xsurface->height != unscale(xwm, ev->height)); | |
if (geometry_changed) { | |
- xsurface->x = ev->x; | |
- xsurface->y = ev->y; | |
- xsurface->width = ev->width; | |
- xsurface->height = ev->height; | |
+ xsurface->x = unscale(xwm, ev->x); | |
+ xsurface->y = unscale(xwm, ev->y); | |
+ xsurface->width = unscale(xwm, ev->width); | |
+ xsurface->height = unscale(xwm, ev->height); | |
} | |
if (xsurface->override_redirect != ev->override_redirect) { | |
@@ -1132,7 +1141,22 @@ static void xwm_handle_unmap_notify(struct wlr_xwm *xwm, | |
static void xwm_handle_property_notify(struct wlr_xwm *xwm, | |
xcb_property_notify_event_t *ev) { | |
struct wlr_xwayland_surface *xsurface = lookup_surface(xwm, ev->window); | |
+ | |
if (xsurface == NULL) { | |
+ if (ev->atom == xwm->atoms[XWAYLAND_GLOBAL_OUTPUT_SCALE]) { | |
+ xcb_get_property_cookie_t cookie = xcb_get_property(xwm->xcb_conn, 0, | |
+ ev->window, ev->atom, XCB_ATOM_ANY, 0, 2048); | |
+ xcb_get_property_reply_t *reply = xcb_get_property_reply(xwm->xcb_conn, | |
+ cookie, NULL); | |
+ if (reply == NULL) { | |
+ return; | |
+ } | |
+ if (reply->type == XCB_ATOM_CARDINAL) { | |
+ xwm->scale = *(uint32_t*)xcb_get_property_value(reply); | |
+ } | |
+ free(reply); | |
+ } | |
+ | |
return; | |
} | |
@@ -1769,7 +1793,7 @@ void wlr_xwayland_surface_configure(struct wlr_xwayland_surface *xsurface, | |
uint32_t mask = XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | | |
XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT | | |
XCB_CONFIG_WINDOW_BORDER_WIDTH; | |
- uint32_t values[] = {x, y, width, height, 0}; | |
+ uint32_t values[] = {scale(xwm, x), scale(xwm, y), scale(xwm, width), scale(xwm, height), 0}; | |
xcb_configure_window(xwm->xcb_conn, xsurface->window_id, mask, values); | |
// If the window size did not change, then we cannot rely on | |
@@ -2122,6 +2146,7 @@ struct wlr_xwm *xwm_create(struct wlr_xwayland *xwayland, int wm_fd) { | |
wl_list_init(&xwm->pending_startup_ids); | |
xwm->ping_timeout = 10000; | |
+ xwm->scale = 1; | |
xwm->xcb_conn = xcb_connect_to_fd(wm_fd, NULL); | |
int rc = xcb_connection_has_error(xwm->xcb_conn); | |
-- | |
2.39.2 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment