From 032af5aeb9bd80b933672ca4b5360c33baa8d42e Mon Sep 17 00:00:00 2001 From: Federico Angelilli Date: Fri, 17 Nov 2023 16:01:16 +0100 Subject: Remove window_set_opacity and use xcb aux in window_create --- src/window.c | 75 +++++++++++++++++++++--------------------------------------- src/window.h | 4 ++-- 2 files changed, 28 insertions(+), 51 deletions(-) (limited to 'src') diff --git a/src/window.c b/src/window.c index 734761a..d6cf692 100644 --- a/src/window.c +++ b/src/window.c @@ -90,6 +90,8 @@ static void wm_setup(Window *win) log_debug("Xcb ewmh connected"); xcb_ewmh_set_wm_window_type(&win->con->ewmh, win->window, 1, &win->con->ewmh._NET_WM_WINDOW_TYPE_DOCK); + xcb_ewmh_set_wm_desktop(&win->con->ewmh, win->window, 0xFFFFFFFF); + xcb_ewmh_set_wm_pid(&win->con->ewmh, win->window, getpid()); xcb_atom_t state[] = { win->con->ewmh._NET_WM_STATE_STICKY, @@ -97,12 +99,8 @@ static void wm_setup(Window *win) }; xcb_ewmh_set_wm_state(&win->con->ewmh, win->window, G_N_ELEMENTS(state), state); - xcb_ewmh_set_wm_desktop(&win->con->ewmh, win->window, 0xFFFFFFFF); - - xcb_ewmh_set_wm_pid(&win->con->ewmh, win->window, getpid()); - + // TODO: These should be updated depdending on the situation! wm_set_size(win); - wm_set_struts(win); } @@ -112,25 +110,24 @@ Window *window_create(Connection *con) g_assert_nonnull(win); win->con = con; - const uint32_t value_mask = XCB_CW_BACK_PIXMAP | XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL - | XCB_CW_OVERRIDE_REDIRECT | XCB_CW_EVENT_MASK | XCB_CW_COLORMAP; + // Set mask and params for CreateWindow + win->cw_mask = XCB_CW_BACK_PIXMAP | XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL + | XCB_CW_OVERRIDE_REDIRECT | XCB_CW_EVENT_MASK | XCB_CW_COLORMAP; - const uint32_t event_mask = XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY - | XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_FOCUS_CHANGE - | XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_BUTTON_PRESS; + uint32_t event_mask = XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY + | XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_FOCUS_CHANGE + | XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_BUTTON_PRESS; xcb_colormap_t colormap = xcb_generate_id(con->connection); xcb_create_colormap(con->connection, XCB_COLORMAP_ALLOC_NONE, colormap, con->screen->root, con->visual_type->visual_id); log_debug("Xcb colormap created [id=%u]", colormap); - const uint32_t value_list[] = { - XCB_NONE, // back pixmap - 0x00000000, // back pixel - 0x00000000, // border pixel - true, // override redirect - event_mask, // event mask - colormap // colormap - }; + XCB_AUX_ADD_PARAM(&win->cw_mask, &win->cw_params, back_pixmap, XCB_NONE); + XCB_AUX_ADD_PARAM(&win->cw_mask, &win->cw_params, back_pixel, 0x00000000); + XCB_AUX_ADD_PARAM(&win->cw_mask, &win->cw_params, border_pixel, 0x00000000); + XCB_AUX_ADD_PARAM(&win->cw_mask, &win->cw_params, override_redirect, true); + XCB_AUX_ADD_PARAM(&win->cw_mask, &win->cw_params, event_mask, event_mask); + XCB_AUX_ADD_PARAM(&win->cw_mask, &win->cw_params, colormap, colormap); win->width = win->height = 1; log_debug("Window temporary size [width=%d, height=%d]", win->width, win->height); @@ -139,17 +136,17 @@ Window *window_create(Connection *con) log_debug("Window temporary position [x=%d, y=%d]", win->x, win->y); win->window = xcb_generate_id(con->connection); - xcb_create_window(con->connection, - con->screen_depth, - win->window, - con->screen->root, - win->x, win->y, - win->width, win->height, - 0, // border - XCB_WINDOW_CLASS_COPY_FROM_PARENT, - con->visual_type->visual_id, - value_mask, - value_list); + xcb_aux_create_window(con->connection, + con->screen_depth, + win->window, + con->screen->root, + win->x, win->y, + win->width, win->height, + 0, // border + XCB_WINDOW_CLASS_COPY_FROM_PARENT, + con->visual_type->visual_id, + win->cw_mask, + &win->cw_params); log_debug("Xcb window created [id=%u]", win->window); @@ -192,26 +189,6 @@ void window_get_screen_size(Window *win, int *width, int *height) *height = win->con->screen_size->height; } -void window_set_opacity(Window *win, double alpha) -{ - // Value between 0 and 1 - g_assert_true(alpha >= 0 && alpha <= 1); - unsigned long opacity = 0xffffffff * alpha; - - xcb_atom_t _NET_WM_WINDOW_OPACITY = intern_atom(win, "_NET_WM_WINDOW_OPACITY"); - xcb_change_property(win->con->connection, - XCB_PROP_MODE_REPLACE, - win->window, - _NET_WM_WINDOW_OPACITY, - XCB_ATOM_CARDINAL, - 32, - 1, - (char *)&opacity); - - log_debug("Window updated opacity [%.2lf%%]", alpha * 100.0); - -} - void window_move(Window *win, int x, int y) { if (win->x == x && win->y == y) return; diff --git a/src/window.h b/src/window.h index e6172ac..77f2d91 100644 --- a/src/window.h +++ b/src/window.h @@ -10,6 +10,8 @@ typedef struct Window Window; struct Window { Connection *con; xcb_drawable_t window; + uint32_t cw_mask; + xcb_params_cw_t cw_params; cairo_surface_t *surface; cairo_t *cr; int x, y; @@ -22,8 +24,6 @@ cairo_t *window_get_context(Window *win); double window_get_scale(Window *win); -void window_set_opacity(Window *win, double alpha); - void window_get_screen_size(Window *win, int *width, int *height); void window_move(Window *win, int x, int y); -- cgit v1.2.3