aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2023-11-17 16:01:16 +0100
committerFederico Angelilli <code@fedang.net>2023-11-17 16:01:16 +0100
commit032af5aeb9bd80b933672ca4b5360c33baa8d42e (patch)
tree9ae1d9291f9d2fe6fb4ce35c133d6ab6cfded0b8
parentab92cac18652f72be12f68b5a96095ba8eb5afdf (diff)
Remove window_set_opacity and use xcb aux in window_create
-rw-r--r--src/window.c75
-rw-r--r--src/window.h4
2 files changed, 28 insertions, 51 deletions
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);