Send last event timestamp with WM_TAKE_FOCUS msg
Patch status: merged
Patch by Tony Crisci
Long description:
According to 4.1.7 of the iccm spec http://tronche.com/gui/x/icccm/sec-4.html#s-4.1.7 > Windows with the atom WM_TAKE_FOCUS in their WM_PROTOCOLS property may > receive a ClientMessage event from the window manager (as described in > section 4.2.8) with WM_TAKE_FOCUS in its data[0] field and a valid > timestamp (i.e. not CurrentTime ) in its data[1] field. Adds the timestamp parameter to send_take_focus to avoid the dangerous use of a global variable.
To apply this patch, use:
curl http://cr.i3wm.org/patch/498/raw.patch | git am
b/include/xcb.h
26 |
@@ -94,7 +94,7 @@ void fake_absolute_configure_notify(Con *con); |
27 |
* Sends the WM_TAKE_FOCUS ClientMessage to the given window |
28 |
* |
29 |
*/ |
30 |
-void send_take_focus(xcb_window_t window); |
31 |
+void send_take_focus(xcb_window_t window, xcb_timestamp_t timestamp); |
32 |
|
33 |
/** |
34 |
* Raises the given window (typically client->frame) above all other windows |
b/src/x.c
39 |
@@ -992,7 +992,7 @@ void x_push_changes(Con *con) { |
40 |
focused->window->needs_take_focus) { |
41 |
DLOG("Updating focus by sending WM_TAKE_FOCUS to window 0x%08x (focused: %p / %s)\n", |
42 |
to_focus, focused, focused->name); |
43 |
- send_take_focus(to_focus); |
44 |
+ send_take_focus(to_focus, last_timestamp); |
45 |
set_focus = !focused->window->doesnt_accept_focus; |
46 |
DLOG("set_focus = %d\n", set_focus); |
47 |
|
b/src/xcb.c
52 |
@@ -110,7 +110,7 @@ void fake_absolute_configure_notify(Con *con) { |
53 |
* Sends the WM_TAKE_FOCUS ClientMessage to the given window |
54 |
* |
55 |
*/ |
56 |
-void send_take_focus(xcb_window_t window) { |
57 |
+void send_take_focus(xcb_window_t window, xcb_timestamp_t timestamp) { |
58 |
/* Every X11 event is 32 bytes long. Therefore, XCB will copy 32 bytes. |
59 |
* In order to properly initialize these bytes, we allocate 32 bytes even |
60 |
* though we only need less for an xcb_configure_notify_event_t */ |
61 |
@@ -122,7 +122,7 @@ void send_take_focus(xcb_window_t window) { |
62 |
ev->type = A_WM_PROTOCOLS; |
63 |
ev->format = 32; |
64 |
ev->data.data32[0] = A_WM_TAKE_FOCUS; |
65 |
- ev->data.data32[1] = XCB_CURRENT_TIME; |
66 |
+ ev->data.data32[1] = timestamp; |
67 |
|
68 |
DLOG("Sending WM_TAKE_FOCUS to the client\n"); |
69 |
xcb_send_event(conn, false, window, XCB_EVENT_MASK_NO_EVENT, (char*)ev); |