From 640f3b9f2156a007c5d1a36afdee570e123c95e4 Mon Sep 17 00:00:00 2001
From: John Lindgren <john@jlindgren.net>
Date: Sat, 16 Apr 2022 13:24:11 -0400
Subject: 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 aa9569fe..d4a48393 100644
--- a/include/wlr/xwayland.h
+++ b/include/wlr/xwayland.h
@@ -15,6 +15,7 @@
 #include <wlr/types/wlr_compositor.h>
 #include <wlr/types/wlr_seat.h>
 #include <xcb/xcb.h>
+#include <xcb/xcb_icccm.h>
 
 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 0c199269..a80e4764 100644
--- a/xwayland/xwm.c
+++ b/xwayland/xwm.c
@@ -15,7 +15,6 @@
 #include <xcb/composite.h>
 #include <xcb/render.h>
 #include <xcb/res.h>
-#include <xcb/xcb_icccm.h>
 #include <xcb/xfixes.h>
 #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;
 	}
-- 
cgit v1.2.3