Send WM_TAKE_FOCUS when setting focus (fixes java problems)

This commit is contained in:
Michael Stapelberg 2011-03-17 22:44:29 +01:00
parent 7cb1ca5a92
commit f5afe2f67e
6 changed files with 32 additions and 2 deletions

View File

@ -21,7 +21,7 @@
#ifndef _I3_H #ifndef _I3_H
#define _I3_H #define _I3_H
#define NUM_ATOMS 21 #define NUM_ATOMS 22
extern xcb_connection_t *global_conn; extern xcb_connection_t *global_conn;
extern xcb_key_symbols_t *keysyms; extern xcb_key_symbols_t *keysyms;

View File

@ -126,6 +126,12 @@ char *convert_utf8_to_ucs2(char *input, int *real_strlen);
Client *get_last_focused_client(xcb_connection_t *conn, Container *container, Client *get_last_focused_client(xcb_connection_t *conn, Container *container,
Client *exclude); Client *exclude);
/**
* Sends WM_TAKE_FOCUS to the client
*
*/
void take_focus(xcb_connection_t *conn, Client *client);
/** /**
* Sets the given client as focused by updating the data structures correctly, * Sets the given client as focused by updating the data structures correctly,
* updating the X input focus and finally re-decorating both windows (to * updating the X input focus and finally re-decorating both windows (to

View File

@ -64,7 +64,8 @@ enum { _NET_SUPPORTED = 0,
WM_CLIENT_LEADER, WM_CLIENT_LEADER,
_NET_CURRENT_DESKTOP, _NET_CURRENT_DESKTOP,
_NET_ACTIVE_WINDOW, _NET_ACTIVE_WINDOW,
_NET_WORKAREA _NET_WORKAREA,
WM_TAKE_FOCUS
}; };
extern unsigned int xcb_numlock_mask; extern unsigned int xcb_numlock_mask;

View File

@ -326,6 +326,7 @@ int main(int argc, char *argv[], char *env[]) {
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);
/* TODO: this has to be more beautiful somewhen */ /* TODO: this has to be more beautiful somewhen */
int major, minor, error; int major, minor, error;
@ -491,6 +492,7 @@ int main(int argc, char *argv[], char *env[]) {
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);
xcb_property_set_handler(&prophs, atoms[_NET_WM_WINDOW_TYPE], UINT_MAX, handle_window_type, NULL); xcb_property_set_handler(&prophs, atoms[_NET_WM_WINDOW_TYPE], UINT_MAX, handle_window_type, NULL);
/* TODO: In order to comply with EWMH, we have to watch _NET_WM_STRUT_PARTIAL */ /* TODO: In order to comply with EWMH, we have to watch _NET_WM_STRUT_PARTIAL */

View File

@ -512,6 +512,7 @@ map:
} }
if (new->container == CUR_CELL || client_is_floating(new)) { if (new->container == CUR_CELL || client_is_floating(new)) {
xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, new->child, XCB_CURRENT_TIME); xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, new->child, XCB_CURRENT_TIME);
take_focus(conn, new);
ewmh_update_active_window(new->child); ewmh_update_active_window(new->child);
} }
} }

View File

@ -222,6 +222,25 @@ Client *get_last_focused_client(xcb_connection_t *conn, Container *container, Cl
return NULL; return NULL;
} }
/*
* Sends WM_TAKE_FOCUS to the client
*
*/
void take_focus(xcb_connection_t *conn, Client *client) {
xcb_client_message_event_t ev;
memset(&ev, 0, sizeof(xcb_client_message_event_t));
ev.response_type = XCB_CLIENT_MESSAGE;
ev.window = client->child;
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, client->child, XCB_EVENT_MASK_NO_EVENT, (char*)&ev);
}
/* /*
* Sets the given client as focused by updating the data structures correctly, * Sets the given client as focused by updating the data structures correctly,
@ -261,6 +280,7 @@ void set_focus(xcb_connection_t *conn, Client *client, bool set_anyways) {
CLIENT_LOG(client); CLIENT_LOG(client);
/* Set focus to the entered window, and flush xcb buffer immediately */ /* Set focus to the entered window, and flush xcb buffer immediately */
xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, client->child, XCB_CURRENT_TIME); xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, client->child, XCB_CURRENT_TIME);
take_focus(conn, client);
ewmh_update_active_window(client->child); ewmh_update_active_window(client->child);
//xcb_warp_pointer(conn, XCB_NONE, client->child, 0, 0, 0, 0, 10, 10); //xcb_warp_pointer(conn, XCB_NONE, client->child, 0, 0, 0, 0, 10, 10);