From dc98ed4f21ddba80199b37c1d7617b92d4f6b056 Mon Sep 17 00:00:00 2001 From: Federico Angelilli Date: Mon, 13 Nov 2023 17:04:45 +0100 Subject: Extract window opacity logic --- x11.c | 52 ++++++++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 24 deletions(-) (limited to 'x11.c') diff --git a/x11.c b/x11.c index df072b9..b8e105b 100644 --- a/x11.c +++ b/x11.c @@ -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; -- cgit v1.2.3