aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/wlr/xwayland.h35
-rw-r--r--xwayland/xwm.c17
2 files changed, 40 insertions, 12 deletions
diff --git a/include/wlr/xwayland.h b/include/wlr/xwayland.h
index 1f2d7acb..09f9fbac 100644
--- a/include/wlr/xwayland.h
+++ b/include/wlr/xwayland.h
@@ -39,6 +39,30 @@ 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;
+};
+
struct wlr_xwayland_surface {
xcb_window_t window_id;
uint32_t surface_id;
@@ -64,14 +88,9 @@ struct wlr_xwayland_surface {
size_t protocols_len;
uint32_t decorations;
-
- #ifdef HAS_XCB_ICCCM
- xcb_icccm_wm_hints_t *hints;
- xcb_size_hints_t *size_hints;
- #else
- void *hints;
- void *size_hints;
- #endif
+ struct wlr_xwayland_surface_hints *hints;
+ uint32_t hints_urgency;
+ struct wlr_xwayland_surface_size_hints *size_hints;
struct {
struct wl_signal destroy;
diff --git a/xwayland/xwm.c b/xwayland/xwm.c
index 120c1ae8..a4091d1f 100644
--- a/xwayland/xwm.c
+++ b/xwayland/xwm.c
@@ -288,12 +288,16 @@ 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(surface->hints);
- surface->hints = calloc(1, sizeof(xcb_icccm_wm_hints_t));
+ surface->hints = calloc(1, sizeof(struct wlr_xwayland_surface_hints));
if (surface->hints == NULL) {
return;
}
- xcb_icccm_get_wm_hints_from_reply(surface->hints, reply);
+ memcpy(surface->hints, &hints, sizeof(struct wlr_xwayland_surface_hints));
+ surface->hints_urgency = xcb_icccm_wm_hints_get_urgency(&hints);
wlr_log(L_DEBUG, "WM_HINTS (%d)", reply->value_len);
}
@@ -311,12 +315,17 @@ 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(surface->size_hints);
- surface->size_hints = calloc(1, sizeof(xcb_size_hints_t));
+ surface->size_hints =
+ calloc(1, sizeof(struct wlr_xwayland_surface_size_hints));
if (surface->size_hints == NULL) {
return;
}
- xcb_icccm_get_wm_size_hints_from_reply(surface->size_hints, reply);
+ memcpy(surface->size_hints, &size_hints,
+ sizeof(struct wlr_xwayland_surface_size_hints));
wlr_log(L_DEBUG, "WM_NORMAL_HINTS (%d)", reply->value_len);
}