diff --git a/src/atoms-list.txt b/src/atoms-list.txt index 0001a17..3b14c5c 100644 --- a/src/atoms-list.txt +++ b/src/atoms-list.txt @@ -12,3 +12,4 @@ COMPOUND_TEXT _NET_ACTIVE_WINDOW _NET_WM_NAME _NET_WM_ICON_NAME +_NET_SUPPORTING_WM_CHECK diff --git a/src/wm.c b/src/wm.c index dfb174e..f256f5a 100644 --- a/src/wm.c +++ b/src/wm.c @@ -5,18 +5,20 @@ #include #include #include -#include #include #include #include #include #include #include +#include #include #include #include #include +#include "app.h" +#include "atoms-extern.h" #include "atoms.h" #include "backtrace.h" #include "buffer.h" @@ -263,6 +265,9 @@ void wm_clean(void) { if (source_id) g_source_remove(source_id); } + xcb_destroy_window(wm.xcb_conn, wm.wm_check_window); + wm.wm_check_window = XCB_WINDOW_NONE; + xcursor_clean(); xkb_free(); xcb_ungrab_key(wm.xcb_conn, XCB_GRAB_ANY, wm.screen->root, modifier_any); @@ -300,6 +305,27 @@ static void wm_setup(void) { wm_setup_keybindings(); atoms_init(wm.xcb_conn); + + { + wm.wm_check_window = xcb_generate_id(wm.xcb_conn); + xcb_create_window(wm.xcb_conn, wm.screen->root_depth, wm.wm_check_window, + wm.screen->root, -1, -1, 1, 1, 0, XCB_COPY_FROM_PARENT, + wm.screen->root_visual, XCB_NONE, nullptr); + xwindow_set_class_instance(wm.wm_check_window); +#define NAME APP_NAME "_wm_check" + xwindow_set_name_static(wm.wm_check_window, NAME); + const void *data = &wm.wm_check_window; + xcb_atom_t type = XCB_ATOM_WINDOW; + uint8_t mode = XCB_PROP_MODE_REPLACE; + xcb_change_property(wm.xcb_conn, mode, wm.wm_check_window, _NET_WM_NAME, + UTF8_STRING, 8, sizeof(NAME) - 1, NAME); + xcb_change_property(wm.xcb_conn, mode, wm.wm_check_window, + _NET_SUPPORTING_WM_CHECK, type, 32, 1, data); + xcb_change_property(wm.xcb_conn, mode, wm.screen->root, + _NET_SUPPORTING_WM_CHECK, type, 32, 1, data); +#undef NAME + } + xkb_init(); xcb_flush(wm.xcb_conn); } @@ -362,8 +388,8 @@ int main(int argc, char *argv[]) { wm_check_xcb_extensions(); wm_detect_monitor(); - setup_event_loop(); wm_setup(); + setup_event_loop(); debug_show_monitor_list(); diff --git a/src/wm.h b/src/wm.h index 6ec5c37..dcc530f 100644 --- a/src/wm.h +++ b/src/wm.h @@ -24,6 +24,7 @@ typedef struct wm_t { xcb_connection_t *xcb_conn; xcb_screen_t *screen; xcb_key_symbols_t *key_symbols; + xcb_window_t wm_check_window; int default_screen; bool have_xfixes; bool have_xinerama;