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
#define _I3_H
#define NUM_ATOMS 21
#define NUM_ATOMS 22
extern xcb_connection_t *global_conn;
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 *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,
* 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,
_NET_CURRENT_DESKTOP,
_NET_ACTIVE_WINDOW,
_NET_WORKAREA
_NET_WORKAREA,
WM_TAKE_FOCUS
};
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_ACTIVE_WINDOW);
REQUEST_ATOM(_NET_WORKAREA);
REQUEST_ATOM(WM_TAKE_FOCUS);
/* TODO: this has to be more beautiful somewhen */
int major, minor, error;
@ -491,6 +492,7 @@ int main(int argc, char *argv[], char *env[]) {
GET_ATOM(_NET_CURRENT_DESKTOP);
GET_ATOM(_NET_ACTIVE_WINDOW);
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);
/* 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)) {
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);
}
}

View File

@ -222,6 +222,25 @@ Client *get_last_focused_client(xcb_connection_t *conn, Container *container, Cl
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,
@ -261,6 +280,7 @@ void set_focus(xcb_connection_t *conn, Client *client, bool set_anyways) {
CLIENT_LOG(client);
/* 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);
take_focus(conn, client);
ewmh_update_active_window(client->child);
//xcb_warp_pointer(conn, XCB_NONE, client->child, 0, 0, 0, 0, 10, 10);