summarylogtreecommitdiffstats
path: root/0001-xwayland-add-support-for-global-scale-factor.patch
diff options
context:
space:
mode:
Diffstat (limited to '0001-xwayland-add-support-for-global-scale-factor.patch')
-rw-r--r--0001-xwayland-add-support-for-global-scale-factor.patch164
1 files changed, 164 insertions, 0 deletions
diff --git a/0001-xwayland-add-support-for-global-scale-factor.patch b/0001-xwayland-add-support-for-global-scale-factor.patch
new file mode 100644
index 000000000000..0050a8a27ed7
--- /dev/null
+++ b/0001-xwayland-add-support-for-global-scale-factor.patch
@@ -0,0 +1,164 @@
+From c84ece04da099f7d6bae6d3341918f4f80bf9e29 Mon Sep 17 00:00:00 2001
+From: Dario Nieuwenhuis <dirbaio@dirbaio.net>
+Date: Fri, 31 Jan 2020 22:57:48 +0100
+Subject: [PATCH 1/2] xwayland: add support for global scale factor
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This does the necessary changes to support HiDPI in xwayland
+applications, with the following xwayland patch:
+https://gitlab.freedesktop.org/xorg/xserver/merge_requests/111
+
+[Antonin Décimo: rebase after 27609ba]
+[Antonin Décimo: rebase after 99f3c64]
+[Antonin Décimo: rebase after 79be26f]
+Co-authored-by: Antonin Décimo <antonin.decimo@gmail.com>
+---
+ include/wlr/xwayland.h | 4 ++++
+ xwayland/server.c | 2 ++
+ xwayland/xwayland.c | 4 ++++
+ xwayland/xwm.c | 47 ++++++++++++++++++++++++++++++------------
+ 4 files changed, 44 insertions(+), 13 deletions(-)
+
+diff --git a/include/wlr/xwayland.h b/include/wlr/xwayland.h
+index 3689b8b3..00cee542 100644
+--- a/include/wlr/xwayland.h
++++ b/include/wlr/xwayland.h
+@@ -32,6 +32,8 @@ struct wlr_xwayland_server {
+
+ time_t server_start;
+
++ int32_t scale;
++
+ /* Anything above display is reset on Xwayland restart, rest is conserved */
+
+ int display;
+@@ -262,6 +264,8 @@ struct wlr_xwayland *wlr_xwayland_create(struct wl_display *wl_display,
+
+ void wlr_xwayland_destroy(struct wlr_xwayland *wlr_xwayland);
+
++void wlr_xwayland_set_scale(struct wlr_xwayland *wlr_xwayland, int32_t scale);
++
+ void wlr_xwayland_set_cursor(struct wlr_xwayland *wlr_xwayland,
+ uint8_t *pixels, uint32_t stride, uint32_t width, uint32_t height,
+ int32_t hotspot_x, int32_t hotspot_y);
+diff --git a/xwayland/server.c b/xwayland/server.c
+index 7af01b6f..fa4dfb34 100644
+--- a/xwayland/server.c
++++ b/xwayland/server.c
+@@ -449,6 +449,8 @@ struct wlr_xwayland_server *wlr_xwayland_server_create(
+ server->wl_fd[0] = server->wl_fd[1] = -1;
+ server->wm_fd[0] = server->wm_fd[1] = -1;
+
++ server->scale = 1;
++
+ wl_signal_init(&server->events.ready);
+ wl_signal_init(&server->events.destroy);
+
+diff --git a/xwayland/xwayland.c b/xwayland/xwayland.c
+index 86e8c6eb..a6397a1a 100644
+--- a/xwayland/xwayland.c
++++ b/xwayland/xwayland.c
+@@ -104,6 +104,10 @@ struct wlr_xwayland *wlr_xwayland_create(struct wl_display *wl_display,
+ return xwayland;
+ }
+
++void wlr_xwayland_set_scale(struct wlr_xwayland *xwayland, int32_t scale) {
++ xwayland->server->scale = scale;
++}
++
+ void wlr_xwayland_set_cursor(struct wlr_xwayland *xwayland,
+ uint8_t *pixels, uint32_t stride, uint32_t width, uint32_t height,
+ int32_t hotspot_x, int32_t hotspot_y) {
+diff --git a/xwayland/xwm.c b/xwayland/xwm.c
+index 313bfc0a..d0423126 100644
+--- a/xwayland/xwm.c
++++ b/xwayland/xwm.c
+@@ -20,6 +20,14 @@
+ #include "util/signal.h"
+ #include "xwayland/xwm.h"
+
++static int32_t scale(struct wlr_xwm *xwm, int32_t val) {
++ return val * xwm->xwayland->server->scale;
++}
++
++static int32_t unscale(struct wlr_xwm *xwm, int32_t val) {
++ return (val + xwm->xwayland->server->scale/2) / xwm->xwayland->server->scale;
++}
++
+ const char *const atom_map[ATOM_LAST] = {
+ [WL_SURFACE_ID] = "WL_SURFACE_ID",
+ [WM_DELETE_WINDOW] = "WM_DELETE_WINDOW",
+@@ -948,8 +956,13 @@ 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,
+@@ -980,10 +993,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 = unscale(xwm, mask & XCB_CONFIG_WINDOW_X ? ev->x : surface->x),
++ .y = unscale(xwm, mask & XCB_CONFIG_WINDOW_Y ? ev->y : surface->y),
++ .width = unscale(xwm, mask & XCB_CONFIG_WINDOW_WIDTH ? ev->width : surface->width),
++ .height = unscale(xwm, mask & XCB_CONFIG_WINDOW_HEIGHT ? ev->height : surface->height),
+ .mask = mask,
+ };
+
+@@ -998,14 +1011,16 @@ 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) {
+@@ -1717,7 +1732,13 @@ 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(xsurface->xwm, x),
++ scale(xsurface->xwm, y),
++ scale(xsurface->xwm, width),
++ scale(xsurface->xwm, height),
++ 0,
++ };
+ xcb_configure_window(xwm->xcb_conn, xsurface->window_id, mask, values);
+ xcb_flush(xwm->xcb_conn);
+ }
+--
+2.33.1
+