diff options
| author | Federico Angelilli <code@fedang.net> | 2023-11-13 17:04:45 +0100 |
|---|---|---|
| committer | Federico Angelilli <code@fedang.net> | 2023-11-13 17:04:45 +0100 |
| commit | dc98ed4f21ddba80199b37c1d7617b92d4f6b056 (patch) | |
| tree | 16cbb6a5c9a8f7b54b55dbcfa89326ea6a3b718e | |
| parent | a6fad8924ef8f351d6c77a092afd3e0918e002b1 (diff) | |
Extract window opacity logic
| -rw-r--r-- | x11.c | 52 | ||||
| -rw-r--r-- | x11.h | 2 |
2 files changed, 30 insertions, 24 deletions
@@ -93,6 +93,8 @@ static gboolean xcb_source_dispatch(GSource *source, GSourceFunc callback, gpoin case XCB_PROPERTY_NOTIFY: { xcb_property_notify_event_t *property = (xcb_property_notify_event_t *)xsource->event; + log_debug("Processing event 'PropertyNotify' [type %d]", XCB_PROPERTY_NOTIFY); + if (property->atom == XCB_ATOM_RESOURCE_MANAGER) { window_update_scale(data); @@ -257,26 +259,6 @@ found_visual: xcb_icccm_set_wm_name(win->connection, win->window, XCB_ATOM_STRING, 8, strlen("comet"), "comet"); xcb_map_window(win->connection, win->window); - //xcb_atom_t NET_WM_WINDOW_OPACITY = intern_atom(win, "_NET_WM_WINDOW_OPACITY"); - //xcb_atom_t CARDINAL = intern_atom(win, "CARDINAL"); - - // Value between 0 and 1 - //double transparency = 0.8; - //unsigned long opacity = 0xffffffff * transparency; - - //error = - //xcb_request_check(win->connection, - //xcb_change_property_checked(win->connection, - // XCB_PROP_MODE_REPLACE, - // win->window, - // NET_WM_WINDOW_OPACITY, - // CARDINAL, - // 32, - // 1, - // (char *)&opacity)); - //assert(error == NULL); - //log_debug("Window '%s' set to '%d%%'", "opacity", (int)round(100 - 100 * transparency)); - xcb_flush(win->connection); log_debug("Xcb initialized"); @@ -306,16 +288,18 @@ cairo_t *window_get_context(Window *win) void window_update_scale(Window *win) { + const char *dpi_res = "Xft.dpi"; char *dpi_value; - if (xcb_xrm_resource_get_string(win->database, "Xft.dpi", "Xft.dpi", &dpi_value) >= 0) { - log_debug("Xrm query '%s' found '%s'", "Xft.dpi", dpi_value); + + if (xcb_xrm_resource_get_string(win->database, dpi_res, dpi_res, &dpi_value) >= 0) { + log_debug("Xrm query '%s' found '%s'", dpi_res, dpi_value); win->dpi = strtod(dpi_value, NULL); g_free(dpi_value); } else { - log_debug("Xrm query '%s' not found", "Xft.dpi"); + log_debug("Xrm query '%s' not found", dpi_res); win->dpi = 96.0; //win->dpi = (double)screen_size->height * 25.4 / (double)screen_size->mheight; - log_debug("Fallback dpi value '%lf'", win->dpi); + log_debug("Fallback dpi value '%.2lf'", win->dpi); } } @@ -330,6 +314,26 @@ void window_get_screen_size(Window *win, int *width, int *height) *height = win->screen_height; } +void window_set_transparency(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->connection, + XCB_PROP_MODE_REPLACE, + win->window, + NET_WM_WINDOW_OPACITY, + XCB_ATOM_CARDINAL, + 32, + 1, + (char *)&opacity); + + log_debug("Window transparency set to '%.2lf%%'", alpha * 100.0); + +} + void window_move(Window *win, int x, int y) { if (win->x == x && win->y == y) return; @@ -15,6 +15,8 @@ double window_get_scale(Window *win); void window_get_screen_size(Window *win, int *width, int *height); +void window_set_transparency(Window *win, double alpha); + void window_move(Window *win, int x, int y); void window_resize(Window *win, int width, int height); |
