diff options
-rw-r--r-- | .SRCINFO | 40 | ||||
-rw-r--r-- | 6c5ffcd1fee9e44780a6a8792f74ecfbe24a1ca7.patch | 159 | ||||
-rw-r--r-- | PKGBUILD | 72 |
3 files changed, 271 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO new file mode 100644 index 000000000000..6588898fc439 --- /dev/null +++ b/.SRCINFO @@ -0,0 +1,40 @@ +pkgbase = wlroots-hidpi-xprop-git + pkgdesc = Modular Wayland compositor library (git version, with patches) + pkgver = 0.16.0.20220907.140046 + pkgrel = 1 + url = https://gitlab.freedesktop.org/wlroots/wlroots + arch = x86_64 + license = MIT + makedepends = git + makedepends = meson + makedepends = vulkan-headers + makedepends = wayland-protocols + makedepends = xorgproto + depends = glslang + depends = libinput + depends = libxcb + depends = opengl-driver + depends = xcb-util-errors + depends = xcb-util-renderutil + depends = xcb-util-wm + depends = libpixman-1.so + depends = libseat.so + depends = libudev.so + depends = libvulkan.so + depends = libwayland-client.so + depends = libwayland-server.so + depends = libxkbcommon.so + depends = xorg-xwayland + optdepends = xorg-xwayland-hidpi-xprop: HiDPI support, see https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/733 + provides = libwlroots.so + provides = wlroots=0.16.0 + provides = wlroots-git + conflicts = wlroots + conflicts = wlroots-git + options = debug + source = wlroots-hidpi-xprop-git::git+https://gitlab.freedesktop.org/wlroots/wlroots.git + source = https://gitlab.freedesktop.org/lilydjwg/wlroots/-/commit/6c5ffcd1fee9e44780a6a8792f74ecfbe24a1ca7.patch + sha512sums = SKIP + sha512sums = c2193fb6d3063919ecb427a72d09fd11563a9de68e848e9721d7a7d9dc67e700654067ce154b1ddc5fb4587b9cea71d29a73a55a18f54d6ecd60897989677bb2 + +pkgname = wlroots-hidpi-xprop-git diff --git a/6c5ffcd1fee9e44780a6a8792f74ecfbe24a1ca7.patch b/6c5ffcd1fee9e44780a6a8792f74ecfbe24a1ca7.patch new file mode 100644 index 000000000000..7642b55270f4 --- /dev/null +++ b/6c5ffcd1fee9e44780a6a8792f74ecfbe24a1ca7.patch @@ -0,0 +1,159 @@ +From 6c5ffcd1fee9e44780a6a8792f74ecfbe24a1ca7 Mon Sep 17 00:00:00 2001 +From: lilydjwg <lilydjwg@gmail.com> +Date: Wed, 17 Nov 2021 19:34:58 +0800 +Subject: [PATCH] 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 | 54 +++++++++++++++++++++++++++++++----------- + 2 files changed, 42 insertions(+), 14 deletions(-) + +diff --git a/include/xwayland/xwm.h b/include/xwayland/xwm.h +index 0cdf6ea1..e272a326 100644 +--- a/include/xwayland/xwm.h ++++ b/include/xwayland/xwm.h +@@ -84,6 +84,7 @@ enum atom_name { + DND_ACTION_PRIVATE, + NET_CLIENT_LIST, + NET_CLIENT_LIST_STACKING, ++ XWAYLAND_GLOBAL_OUTPUT_SCALE, + ATOM_LAST // keep last + }; + +@@ -94,6 +95,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 313bfc0a..1abe2147 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, 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; ++} ++ + const char *const atom_map[ATOM_LAST] = { + [WL_SURFACE_ID] = "WL_SURFACE_ID", + [WM_DELETE_WINDOW] = "WM_DELETE_WINDOW", +@@ -89,6 +97,7 @@ 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=" +@@ -948,8 +957,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, +@@ -980,10 +989,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, + }; + +@@ -998,14 +1007,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) { +@@ -1114,7 +1123,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; + } + +@@ -1708,16 +1732,17 @@ void wlr_xwayland_surface_activate(struct wlr_xwayland_surface *xsurface, + + void wlr_xwayland_surface_configure(struct wlr_xwayland_surface *xsurface, + int16_t x, int16_t y, uint16_t width, uint16_t height) { ++ struct wlr_xwm *xwm = xsurface->xwm; ++ + xsurface->x = x; + xsurface->y = y; + xsurface->width = width; + xsurface->height = height; + +- struct wlr_xwm *xwm = xsurface->xwm; + 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); + xcb_flush(xwm->xcb_conn); + } +@@ -2046,6 +2071,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); +-- +GitLab + diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 000000000000..d2e358b995c6 --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,72 @@ +# Maintainer: q234 rty <q23456yuiop at gmail dot com> +# Contributor: lilydjwg <lilydjwg@gmail.com> +# Contributor: Adrian Perez de Castro <aperez@igalia.com> +# Contributor: Antonin Décimo <antonin dot decimo at gmail dot com> +pkgname=wlroots-hidpi-xprop-git +pkgver=0.16.0.20220907.140046 +pkgrel=1 +license=(MIT) +pkgdesc='Modular Wayland compositor library (git version, with patches)' +url=https://gitlab.freedesktop.org/wlroots/wlroots +arch=(x86_64) +provides=("libwlroots.so" "wlroots=${pkgver%%.202*}" "wlroots-git") +conflicts=(wlroots wlroots-git) +options=(debug) +depends=( + glslang + libinput + libxcb + opengl-driver + xcb-util-errors + xcb-util-renderutil + xcb-util-wm + + 'libpixman-1.so' + 'libseat.so' + 'libudev.so' + 'libvulkan.so' + 'libwayland-client.so' + 'libwayland-server.so' + 'libxkbcommon.so' + + xorg-xwayland) +optdepends=('xorg-xwayland-hidpi-xprop: HiDPI support, see https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/733') +makedepends=( + git + meson + vulkan-headers + wayland-protocols + xorgproto) +source=("${pkgname}::git+${url}.git" + https://gitlab.freedesktop.org/lilydjwg/wlroots/-/commit/6c5ffcd1fee9e44780a6a8792f74ecfbe24a1ca7.patch) +sha512sums=('SKIP' + 'c2193fb6d3063919ecb427a72d09fd11563a9de68e848e9721d7a7d9dc67e700654067ce154b1ddc5fb4587b9cea71d29a73a55a18f54d6ecd60897989677bb2') + +pkgver () { + cd "${pkgname}" + ( + set -o pipefail + version=$(grep -zoP "project\([^)]*\)" meson.build | xargs --null echo | grep -oP "^\sversion:\s'\K[^-']*") + printf "${version}.%s" "$(TZ=UTC git log -1 --pretty='%cd' --date=format-local:%Y%m%d.%H%M%S)" + ) +} + +prepare () { + cd "${pkgname}" + git revert -n 18595000f3a21502fd60bf213122859cc348f9af + patch -Np1 < ../6c5ffcd1fee9e44780a6a8792f74ecfbe24a1ca7.patch +} + +build () { + arch-meson \ + --buildtype=debug \ + -Dwerror=false \ + -Dexamples=false \ + "${pkgname}" build + meson compile -C build +} + +package () { + DESTDIR="${pkgdir}" meson install -C build + install -Dm644 "${pkgname}/"LICENSE "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE" +} |