From 640f3b9f2156a007c5d1a36afdee570e123c95e4 Mon Sep 17 00:00:00 2001 From: John Lindgren Date: Sat, 16 Apr 2022 13:24:11 -0400 Subject: [PATCH] Revert "Copy xcb_icccm structs into wlroots" The original commit introduced a bug by transposing the order of some of the fields in xcb_size_hints_t. Since XCB ICCCM support is required now, we can just eliminate the duplicate structs. With minor changes: - Remove #ifdef HAS_XCB_ICCCM guards - Fix #includes - Fix references to local size_hints struct This reverts commit 12b9b1a4bdf00742cc510c2329c7a66c649b3ab0. --- include/wlr/xwayland.h | 30 +++--------------------------- xwayland/xwm.c | 26 ++++++++------------------ 2 files changed, 11 insertions(+), 45 deletions(-) diff --git a/include/wlr/xwayland.h b/include/wlr/xwayland.h index aa9569fea..d4a483931 100644 --- a/include/wlr/xwayland.h +++ b/include/wlr/xwayland.h @@ -15,6 +15,7 @@ #include #include #include +#include struct wlr_xwm; struct wlr_xwayland_cursor; @@ -96,30 +97,6 @@ enum wlr_xwayland_surface_decorations { WLR_XWAYLAND_SURFACE_DECORATIONS_NO_TITLE = 2, }; -struct wlr_xwayland_surface_hints { - uint32_t flags; - uint32_t input; - int32_t initial_state; - xcb_pixmap_t icon_pixmap; - xcb_window_t icon_window; - int32_t icon_x, icon_y; - xcb_pixmap_t icon_mask; - xcb_window_t window_group; -}; - -struct wlr_xwayland_surface_size_hints { - uint32_t flags; - int32_t x, y; - int32_t width, height; - int32_t min_width, min_height; - int32_t max_width, max_height; - int32_t width_inc, height_inc; - int32_t base_width, base_height; - int32_t min_aspect_num, min_aspect_den; - int32_t max_aspect_num, max_aspect_den; - uint32_t win_gravity; -}; - /** * This represents the input focus described as follows: * @@ -176,9 +153,8 @@ struct wlr_xwayland_surface { size_t protocols_len; uint32_t decorations; - struct wlr_xwayland_surface_hints *hints; - uint32_t hints_urgency; - struct wlr_xwayland_surface_size_hints *size_hints; + xcb_icccm_wm_hints_t *hints; + xcb_size_hints_t *size_hints; bool pinging; struct wl_event_source *ping_timer; diff --git a/xwayland/xwm.c b/xwayland/xwm.c index 0c1992690..a80e47643 100644 --- a/xwayland/xwm.c +++ b/xwayland/xwm.c @@ -15,7 +15,6 @@ #include #include #include -#include #include #include "util/signal.h" #include "xwayland/xwm.h" @@ -662,17 +661,12 @@ static void read_surface_hints(struct wlr_xwm *xwm, return; } - xcb_icccm_wm_hints_t hints; - xcb_icccm_get_wm_hints_from_reply(&hints, reply); - free(xsurface->hints); - xsurface->hints = calloc(1, sizeof(struct wlr_xwayland_surface_hints)); + xsurface->hints = calloc(1, sizeof(xcb_icccm_wm_hints_t)); if (xsurface->hints == NULL) { return; } - - memcpy(xsurface->hints, &hints, sizeof(struct wlr_xwayland_surface_hints)); - xsurface->hints_urgency = xcb_icccm_wm_hints_get_urgency(&hints); + xcb_icccm_get_wm_hints_from_reply(xsurface->hints, reply); if (!(xsurface->hints->flags & XCB_ICCCM_WM_HINT_INPUT)) { // The client didn't specify whether it wants input. @@ -690,20 +684,16 @@ static void read_surface_normal_hints(struct wlr_xwm *xwm, return; } - xcb_size_hints_t size_hints; - xcb_icccm_get_wm_size_hints_from_reply(&size_hints, reply); - free(xsurface->size_hints); - xsurface->size_hints = - calloc(1, sizeof(struct wlr_xwayland_surface_size_hints)); + xsurface->size_hints = calloc(1, sizeof(xcb_size_hints_t)); if (xsurface->size_hints == NULL) { return; } - memcpy(xsurface->size_hints, &size_hints, - sizeof(struct wlr_xwayland_surface_size_hints)); + xcb_icccm_get_wm_size_hints_from_reply(xsurface->size_hints, reply); - bool has_min_size_hints = (size_hints.flags & XCB_ICCCM_SIZE_HINT_P_MIN_SIZE) != 0; - bool has_base_size_hints = (size_hints.flags & XCB_ICCCM_SIZE_HINT_BASE_SIZE) != 0; + int32_t flags = xsurface->size_hints->flags; + bool has_min_size_hints = (flags & XCB_ICCCM_SIZE_HINT_P_MIN_SIZE) != 0; + bool has_base_size_hints = (flags & XCB_ICCCM_SIZE_HINT_BASE_SIZE) != 0; /* ICCCM says that if absent, min size is equal to base size and vice versa */ if (!has_min_size_hints && !has_base_size_hints) { xsurface->size_hints->min_width = -1; @@ -718,7 +708,7 @@ static void read_surface_normal_hints(struct wlr_xwm *xwm, xsurface->size_hints->min_height = xsurface->size_hints->base_height; } - if ((size_hints.flags & XCB_ICCCM_SIZE_HINT_P_MAX_SIZE) == 0) { + if ((flags & XCB_ICCCM_SIZE_HINT_P_MAX_SIZE) == 0) { xsurface->size_hints->max_width = -1; xsurface->size_hints->max_height = -1; }