aboutsummaryrefslogtreecommitdiff
path: root/xwayland
diff options
context:
space:
mode:
authorTony Crisci <tony@dubstepdish.com>2017-10-27 15:20:50 -0400
committerTony Crisci <tony@dubstepdish.com>2017-10-27 15:20:50 -0400
commit325def38418f5caefd6dc23749dd2ca6bae0a36c (patch)
tree2ff0d1d0431f1be11fcae076f8cdfd8c5e7b695b /xwayland
parentbe297d9d144739e39e9264bc91fa95990873ced0 (diff)
xwm: create colormap and visual depth detection
Diffstat (limited to 'xwayland')
-rw-r--r--xwayland/xwm.c47
-rw-r--r--xwayland/xwm.h2
2 files changed, 45 insertions, 4 deletions
diff --git a/xwayland/xwm.c b/xwayland/xwm.c
index 5ba91370..9ddf59df 100644
--- a/xwayland/xwm.c
+++ b/xwayland/xwm.c
@@ -64,6 +64,9 @@ static struct wlr_xwayland_surface *wlr_xwayland_surface_create(
return NULL;
}
+ xcb_get_geometry_cookie_t geometry_cookie =
+ xcb_get_geometry(xwm->xcb_conn, window_id);
+
uint32_t values[1];
values[0] =
XCB_EVENT_MASK_FOCUS_CHANGE |
@@ -92,6 +95,16 @@ static struct wlr_xwayland_surface *wlr_xwayland_surface_create(
wl_signal_init(&surface->events.set_parent);
wl_signal_init(&surface->events.set_pid);
wl_signal_init(&surface->events.set_window_type);
+
+ xcb_get_geometry_reply_t *geometry_reply =
+ xcb_get_geometry_reply(xwm->xcb_conn, geometry_cookie, NULL);
+
+ if (geometry_reply != NULL) {
+ surface->has_alpha = geometry_reply->depth == 32;
+ }
+
+ free(geometry_reply);
+
return surface;
}
@@ -193,10 +206,6 @@ static void wlr_xwayland_surface_destroy(struct wlr_xwayland_surface *surface) {
wl_list_remove(&surface->unpaired_link);
}
- for (size_t i = 0; i < surface->state->length; i++) {
- free(surface->state->items[i]);
- }
-
if (surface->surface) {
wl_list_remove(&surface->surface_destroy.link);
wl_list_remove(&surface->surface_commit.link);
@@ -1140,6 +1149,35 @@ static void xwm_create_wm_window(struct wlr_xwm *xwm) {
XCB_CURRENT_TIME);
}
+// TODO use me to support 32 bit color somehow
+static void xwm_get_visual_and_colormap(struct wlr_xwm *xwm) {
+ xcb_depth_iterator_t d_iter;
+ xcb_visualtype_iterator_t vt_iter;
+ xcb_visualtype_t *visualtype;
+
+ d_iter = xcb_screen_allowed_depths_iterator(xwm->screen);
+ visualtype = NULL;
+ while (d_iter.rem > 0) {
+ if (d_iter.data->depth == 32) {
+ vt_iter = xcb_depth_visuals_iterator(d_iter.data);
+ visualtype = vt_iter.data;
+ break;
+ }
+
+ xcb_depth_next(&d_iter);
+ }
+
+ if (visualtype == NULL) {
+ wlr_log(L_DEBUG, "no 32 bit visualtype\n");
+ return;
+ }
+
+ xwm->visual_id = visualtype->visual_id;
+ xwm->colormap = xcb_generate_id(xwm->xcb_conn);
+ xcb_create_colormap_checked(xwm->xcb_conn, XCB_COLORMAP_ALLOC_NONE,
+ xwm->colormap, xwm->screen->root, xwm->visual_id);
+}
+
struct wlr_xwm *xwm_create(struct wlr_xwayland *wlr_xwayland) {
struct wlr_xwm *xwm = calloc(1, sizeof(struct wlr_xwm));
if (xwm == NULL) {
@@ -1175,6 +1213,7 @@ struct wlr_xwm *xwm_create(struct wlr_xwayland *wlr_xwayland) {
wl_event_source_check(xwm->event_source);
xwm_get_resources(xwm);
+ xwm_get_visual_and_colormap(xwm);
uint32_t values[1];
values[0] =
diff --git a/xwayland/xwm.h b/xwayland/xwm.h
index 4f8c20a2..7d30d278 100644
--- a/xwayland/xwm.h
+++ b/xwayland/xwm.h
@@ -47,6 +47,8 @@ struct wlr_xwm {
xcb_connection_t *xcb_conn;
xcb_screen_t *screen;
xcb_window_t window;
+ xcb_visualid_t visual_id;
+ xcb_colormap_t colormap;
struct wlr_xwayland_surface *focus_surface;