diff --git a/awesome.c b/awesome.c index 952b1939e..0a19a792c 100644 --- a/awesome.c +++ b/awesome.c @@ -47,6 +47,7 @@ #include #include +#include #include #include #include @@ -221,6 +222,42 @@ scan(xcb_query_tree_cookie_t tree_c) restore_client_order(prop_cookie); } +static void +acquire_WM_Sn(void) +{ + xcb_intern_atom_cookie_t atom_q; + xcb_intern_atom_reply_t *atom_r; + xcb_atom_t atom; + char *atom_name; + + /* Get the WM_Sn atom */ + globalconf.selection_owner_window = xcb_generate_id(globalconf.connection); + xcb_create_window(globalconf.connection, globalconf.screen->root_depth, + globalconf.selection_owner_window, globalconf.screen->root, + -1, -1, 1, 1, 0, + XCB_COPY_FROM_PARENT, globalconf.screen->root_visual, + 0, NULL); + + atom_name = xcb_atom_name_by_screen("WM_S", globalconf.default_screen); + if(!atom_name) + fatal("error getting WM_Sn atom name"); + + atom_q = xcb_intern_atom_unchecked(globalconf.connection, false, + a_strlen(atom_name), atom_name); + + p_delete(&atom_name); + + atom_r = xcb_intern_atom_reply(globalconf.connection, atom_q, NULL); + if(!atom_r) + fatal("error getting WM_Sn atom"); + + atom = atom_r->atom; + p_delete(&atom_r); + + /* Acquire the selection */ + xcb_set_selection_owner(globalconf.connection, globalconf.selection_owner_window, atom, XCB_CURRENT_TIME); +} + static void a_xcb_check(void) { @@ -506,6 +543,9 @@ main(int argc, char **argv) /* Did we get some usable data from the above X11 setup? */ draw_test_cairo_xcb(); + /* Acquire the WM_Sn selection */ + acquire_WM_Sn(); + /* initialize dbus */ a_dbus_init(); diff --git a/globalconf.h b/globalconf.h index 0f1b84848..2299a502e 100644 --- a/globalconf.h +++ b/globalconf.h @@ -84,6 +84,8 @@ typedef struct key_array_t keys; /** Root window mouse bindings */ button_array_t buttons; + /** Window owning the WM_Sn selection */ + xcb_window_t selection_owner_window; /** Modifiers masks */ uint16_t numlockmask, shiftlockmask, capslockmask, modeswitchmask; /** Check for XTest extension */