problems with some Qt apps (upstream git commit 2d14ced024416e2074b57290bf7dade7d08899e5) Bugfix: either use SetInputFocus *or* send WM_TAKE_FOCUS, not both. This fixes problems with Oracle/OpenJDK JRE 7.0 (upstream git commit 21a2971b2442ab0881cf79553cc6b65bbb44afa7)
63 lines
3.0 KiB
Plaintext
63 lines
3.0 KiB
Plaintext
$OpenBSD: patch-src_x_c,v 1.3 2012/01/20 15:53:18 dcoppa Exp $
|
|
|
|
Bugfix: either use SetInputFocus *or* send WM_TAKE_FOCUS, not both.
|
|
This fixes problems with Oracle/OpenJDK JRE 7.0
|
|
(upstream git commit 21a2971b2442ab0881cf79553cc6b65bbb44afa7)
|
|
|
|
Bugfix: respect WM_HINTS.input for WM_TAKE_FOCUS clients. This fixes
|
|
problems with some Qt apps
|
|
(upstream git commit 2d14ced024416e2074b57290bf7dade7d08899e5)
|
|
|
|
--- src/x.c.orig Sat Dec 24 16:25:08 2011
|
|
+++ src/x.c Fri Jan 20 14:29:56 2012
|
|
@@ -849,26 +849,34 @@ void x_push_changes(Con *con) {
|
|
/* Invalidate focused_id to correctly focus new windows with the same ID */
|
|
focused_id = XCB_NONE;
|
|
} else {
|
|
- DLOG("Updating focus (focused: %p / %s)\n", focused, focused->name);
|
|
- /* We remove XCB_EVENT_MASK_FOCUS_CHANGE from the event mask to get
|
|
- * no focus change events for our own focus changes. We only want
|
|
- * these generated by the clients. */
|
|
- if (focused->window != NULL) {
|
|
- values[0] = CHILD_EVENT_MASK & ~(XCB_EVENT_MASK_FOCUS_CHANGE);
|
|
- xcb_change_window_attributes(conn, focused->window->id, XCB_CW_EVENT_MASK, values);
|
|
- }
|
|
- xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, to_focus, XCB_CURRENT_TIME);
|
|
- if (focused->window != NULL) {
|
|
- values[0] = CHILD_EVENT_MASK;
|
|
- xcb_change_window_attributes(conn, focused->window->id, XCB_CW_EVENT_MASK, values);
|
|
- }
|
|
-
|
|
+ bool set_focus = true;
|
|
if (focused->window != NULL &&
|
|
focused->window->needs_take_focus) {
|
|
+ DLOG("Updating focus by sending WM_TAKE_FOCUS to window 0x%08x (focused: %p / %s)\n",
|
|
+ to_focus, focused, focused->name);
|
|
send_take_focus(to_focus);
|
|
+ set_focus = !focused->window->doesnt_accept_focus;
|
|
+ DLOG("set_focus = %d\n", set_focus);
|
|
}
|
|
|
|
- ewmh_update_active_window(to_focus);
|
|
+ if (set_focus) {
|
|
+ DLOG("Updating focus (focused: %p / %s)\n", focused, focused->name);
|
|
+ /* We remove XCB_EVENT_MASK_FOCUS_CHANGE from the event mask to get
|
|
+ * no focus change events for our own focus changes. We only want
|
|
+ * these generated by the clients. */
|
|
+ if (focused->window != NULL) {
|
|
+ values[0] = CHILD_EVENT_MASK & ~(XCB_EVENT_MASK_FOCUS_CHANGE);
|
|
+ xcb_change_window_attributes(conn, focused->window->id, XCB_CW_EVENT_MASK, values);
|
|
+ }
|
|
+ xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, to_focus, XCB_CURRENT_TIME);
|
|
+ if (focused->window != NULL) {
|
|
+ values[0] = CHILD_EVENT_MASK;
|
|
+ xcb_change_window_attributes(conn, focused->window->id, XCB_CW_EVENT_MASK, values);
|
|
+ }
|
|
+
|
|
+ ewmh_update_active_window(to_focus);
|
|
+ }
|
|
+
|
|
focused_id = to_focus;
|
|
}
|
|
}
|