Send WM_TAKE_FOCUS to clients when setting focus (fixes java swing problems)
This commit is contained in:
parent
c1a9e1593d
commit
36664c6289
|
@ -67,6 +67,7 @@ enum {
|
||||||
_NET_CURRENT_DESKTOP,
|
_NET_CURRENT_DESKTOP,
|
||||||
_NET_ACTIVE_WINDOW,
|
_NET_ACTIVE_WINDOW,
|
||||||
_NET_WORKAREA,
|
_NET_WORKAREA,
|
||||||
|
WM_TAKE_FOCUS,
|
||||||
NUM_ATOMS
|
NUM_ATOMS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -295,6 +295,7 @@ int main(int argc, char *argv[]) {
|
||||||
REQUEST_ATOM(_NET_CURRENT_DESKTOP);
|
REQUEST_ATOM(_NET_CURRENT_DESKTOP);
|
||||||
REQUEST_ATOM(_NET_ACTIVE_WINDOW);
|
REQUEST_ATOM(_NET_ACTIVE_WINDOW);
|
||||||
REQUEST_ATOM(_NET_WORKAREA);
|
REQUEST_ATOM(_NET_WORKAREA);
|
||||||
|
REQUEST_ATOM(WM_TAKE_FOCUS);
|
||||||
|
|
||||||
/* Initialize the Xlib connection */
|
/* Initialize the Xlib connection */
|
||||||
xlibdpy = xkbdpy = XOpenDisplay(NULL);
|
xlibdpy = xkbdpy = XOpenDisplay(NULL);
|
||||||
|
@ -398,6 +399,7 @@ int main(int argc, char *argv[]) {
|
||||||
GET_ATOM(_NET_CURRENT_DESKTOP);
|
GET_ATOM(_NET_CURRENT_DESKTOP);
|
||||||
GET_ATOM(_NET_ACTIVE_WINDOW);
|
GET_ATOM(_NET_ACTIVE_WINDOW);
|
||||||
GET_ATOM(_NET_WORKAREA);
|
GET_ATOM(_NET_WORKAREA);
|
||||||
|
GET_ATOM(WM_TAKE_FOCUS);
|
||||||
|
|
||||||
/* Watch _NET_WM_NAME (title of the window encoded in UTF-8) */
|
/* Watch _NET_WM_NAME (title of the window encoded in UTF-8) */
|
||||||
xcb_property_set_handler(&prophs, atoms[_NET_WM_NAME], 128, handle_windowname_change, NULL);
|
xcb_property_set_handler(&prophs, atoms[_NET_WM_NAME], 128, handle_windowname_change, NULL);
|
||||||
|
|
16
src/x.c
16
src/x.c
|
@ -616,6 +616,22 @@ void x_push_changes(Con *con) {
|
||||||
} else {
|
} else {
|
||||||
DLOG("Updating focus (focused: %p / %s)\n", focused, focused->name);
|
DLOG("Updating focus (focused: %p / %s)\n", focused, focused->name);
|
||||||
xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, to_focus, XCB_CURRENT_TIME);
|
xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, to_focus, XCB_CURRENT_TIME);
|
||||||
|
|
||||||
|
/* TODO: check if that client acccepts WM_TAKE_FOCUS at all */
|
||||||
|
xcb_client_message_event_t ev;
|
||||||
|
|
||||||
|
memset(&ev, 0, sizeof(xcb_client_message_event_t));
|
||||||
|
|
||||||
|
ev.response_type = XCB_CLIENT_MESSAGE;
|
||||||
|
ev.window = to_focus;
|
||||||
|
ev.type = atoms[WM_PROTOCOLS];
|
||||||
|
ev.format = 32;
|
||||||
|
ev.data.data32[0] = atoms[WM_TAKE_FOCUS];
|
||||||
|
ev.data.data32[1] = XCB_CURRENT_TIME;
|
||||||
|
|
||||||
|
DLOG("Sending WM_TAKE_FOCUS to the client\n");
|
||||||
|
xcb_send_event(conn, false, to_focus, XCB_EVENT_MASK_NO_EVENT, (char*)&ev);
|
||||||
|
|
||||||
ewmh_update_active_window(to_focus);
|
ewmh_update_active_window(to_focus);
|
||||||
focused_id = to_focus;
|
focused_id = to_focus;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue