diff options
Diffstat (limited to '0002-xwayland-add-support-for-changing-global-scale-facto.patch')
-rw-r--r-- | 0002-xwayland-add-support-for-changing-global-scale-facto.patch | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/0002-xwayland-add-support-for-changing-global-scale-facto.patch b/0002-xwayland-add-support-for-changing-global-scale-facto.patch new file mode 100644 index 000000000000..dcad54666126 --- /dev/null +++ b/0002-xwayland-add-support-for-changing-global-scale-facto.patch @@ -0,0 +1,134 @@ +From eae4b468fc2d04e9db5688abaf4e34ea472d8aaf Mon Sep 17 00:00:00 2001 +From: Dario Nieuwenhuis <dirbaio@dirbaio.net> +Date: Tue, 10 Mar 2020 23:21:11 +0100 +Subject: [PATCH 2/2] xwayland: add support for changing global scale factor on + the fly via x extension. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +[Antonin Décimo: rebase after e0f239f] +[Antonin Décimo: rebase after 1eb38e0] +[Antonin Décimo: rebase after 79be26f] +--- + include/xwayland/xwm.h | 3 +++ + xwayland/xwayland.c | 3 +++ + xwayland/xwm.c | 44 ++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 50 insertions(+) + +diff --git a/include/xwayland/xwm.h b/include/xwayland/xwm.h +index 0cdf6ea1..367605d9 100644 +--- a/include/xwayland/xwm.h ++++ b/include/xwayland/xwm.h +@@ -122,6 +122,7 @@ struct wlr_xwm { + + const xcb_query_extension_reply_t *xfixes; + const xcb_query_extension_reply_t *xres; ++ const xcb_query_extension_reply_t *xwayland_ext; + #if HAS_XCB_ERRORS + xcb_errors_context_t *errors_context; + #endif +@@ -156,4 +157,6 @@ char *xwm_get_atom_name(struct wlr_xwm *xwm, xcb_atom_t atom); + bool xwm_atoms_contains(struct wlr_xwm *xwm, xcb_atom_t *atoms, + size_t num_atoms, enum atom_name needle); + ++void xwm_scale_changed(struct wlr_xwm *xwm); ++ + #endif +diff --git a/xwayland/xwayland.c b/xwayland/xwayland.c +index a6397a1a..8868b10f 100644 +--- a/xwayland/xwayland.c ++++ b/xwayland/xwayland.c +@@ -106,6 +106,9 @@ struct wlr_xwayland *wlr_xwayland_create(struct wl_display *wl_display, + + void wlr_xwayland_set_scale(struct wlr_xwayland *xwayland, int32_t scale) { + xwayland->server->scale = scale; ++ if (xwayland->xwm != NULL) { ++ xwm_scale_changed(xwayland->xwm); ++ } + } + + void wlr_xwayland_set_cursor(struct wlr_xwayland *xwayland, +diff --git a/xwayland/xwm.c b/xwayland/xwm.c +index d0423126..a20a89d9 100644 +--- a/xwayland/xwm.c ++++ b/xwayland/xwm.c +@@ -17,6 +17,7 @@ + #include <xcb/res.h> + #include <xcb/xcb_icccm.h> + #include <xcb/xfixes.h> ++#include <xcb/xcbext.h> + #include "util/signal.h" + #include "xwayland/xwm.h" + +@@ -28,6 +29,10 @@ static int32_t unscale(struct wlr_xwm *xwm, int32_t val) { + return (val + xwm->xwayland->server->scale/2) / xwm->xwayland->server->scale; + } + ++static xcb_extension_t xwayland_ext_id = { ++ .name = "XWAYLAND", ++}; ++ + const char *const atom_map[ATOM_LAST] = { + [WL_SURFACE_ID] = "WL_SURFACE_ID", + [WM_DELETE_WINDOW] = "WM_DELETE_WINDOW", +@@ -1832,6 +1837,7 @@ static void xwm_get_resources(struct wlr_xwm *xwm) { + xcb_prefetch_extension_data(xwm->xcb_conn, &xcb_xfixes_id); + xcb_prefetch_extension_data(xwm->xcb_conn, &xcb_composite_id); + xcb_prefetch_extension_data(xwm->xcb_conn, &xcb_res_id); ++ xcb_prefetch_extension_data(xwm->xcb_conn, &xwayland_ext_id); // TODO what if extension is not present?? + + size_t i; + xcb_intern_atom_cookie_t cookies[ATOM_LAST]; +@@ -1863,6 +1869,8 @@ static void xwm_get_resources(struct wlr_xwm *xwm) { + wlr_log(WLR_DEBUG, "xfixes not available"); + } + ++ xwm->xwayland_ext = xcb_get_extension_data(xwm->xcb_conn, &xwayland_ext_id); ++ + xcb_xfixes_query_version_cookie_t xfixes_cookie; + xcb_xfixes_query_version_reply_t *xfixes_reply; + xfixes_cookie = +@@ -2253,3 +2261,39 @@ enum wlr_xwayland_icccm_input_model wlr_xwayland_icccm_input_model( + } + return WLR_ICCCM_INPUT_MODEL_NONE; + } ++ ++ ++typedef struct { ++ uint8_t major_opcode; ++ uint8_t minor_opcode; ++ uint16_t length; ++ uint16_t screen; ++ uint16_t scale; ++} xwayland_ext_set_scale_request_t; ++ ++void xwm_scale_changed(struct wlr_xwm *xwm) { ++ xcb_protocol_request_t req = { ++ .count = 1, ++ .ext = &xwayland_ext_id, ++ .opcode = 1, ++ .isvoid = false, ++ }; ++ ++ xwayland_ext_set_scale_request_t xcb_out = { ++ .screen = 0, ++ .scale = xwm->xwayland->server->scale, ++ }; ++ ++ struct iovec xcb_parts[3]; ++ xcb_parts[2].iov_base = (char *) &xcb_out; ++ xcb_parts[2].iov_len = sizeof(xcb_out); ++ xcb_send_request(xwm->xcb_conn, 0, xcb_parts+2, &req); ++ ++ // Reconfigure all surfaces with the new scale. ++ struct wlr_xwayland_surface *surface; ++ wl_list_for_each(surface, &xwm->surfaces, link) { ++ wlr_xwayland_surface_configure(surface, surface->x, surface->y, surface->width, surface->height); ++ } ++ ++ xcb_flush(xwm->xcb_conn); ++} +-- +2.33.1 + |