utf8_title_cookie, title_cookie,
class_cookie, leader_cookie, transient_cookie,
role_cookie, startup_id_cookie, wm_hints_cookie,
- wm_normal_hints_cookie, motif_wm_hints_cookie;
+ wm_normal_hints_cookie, motif_wm_hints_cookie, wm_user_time_cookie;
geomc = xcb_get_geometry(conn, d);
wm_hints_cookie = xcb_icccm_get_wm_hints(conn, window);
wm_normal_hints_cookie = xcb_icccm_get_wm_normal_hints(conn, window);
motif_wm_hints_cookie = GET_PROPERTY(A__MOTIF_WM_HINTS, 5 * sizeof(uint64_t));
+ wm_user_time_cookie = GET_PROPERTY(A__NET_WM_USER_TIME, UINT32_MAX);
DLOG("Managing window 0x%08x\n", window);
cwindow->id = window;
cwindow->depth = get_visual_depth(attr->visual);
- /* We need to grab buttons 1-3 for click-to-focus and buttons 1-5
- * to allow for mouse bindings using --whole-window to work correctly. */
- xcb_grab_button(conn, false, window, XCB_EVENT_MASK_BUTTON_PRESS,
- XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC, root, XCB_NONE,
- XCB_BUTTON_INDEX_ANY,
- XCB_BUTTON_MASK_ANY /* don’t filter for any modifiers */);
+ xcb_grab_buttons(conn, window, bindings_should_grab_scrollwheel_buttons());
/* update as much information as possible so far (some replies may be NULL) */
window_update_class(cwindow, xcb_get_property_reply(conn, class_cookie, NULL), true);
values[0] = XCB_NONE;
xcb_change_window_attributes(conn, window, XCB_CW_EVENT_MASK, values);
- xcb_void_cookie_t rcookie = xcb_reparent_window_checked(conn, window, nc->frame, 0, 0);
+ xcb_void_cookie_t rcookie = xcb_reparent_window_checked(conn, window, nc->frame.id, 0, 0);
if (xcb_request_check(conn, rcookie) != NULL) {
LOG("Could not reparent the window, aborting\n");
goto geom_out;
}
}
+ if (set_focus) {
+ DLOG("Checking con = %p for _NET_WM_USER_TIME.\n", nc);
+
+ uint32_t *wm_user_time;
+ xcb_get_property_reply_t *wm_user_time_reply = xcb_get_property_reply(conn, wm_user_time_cookie, NULL);
+ if (wm_user_time_reply != NULL && xcb_get_property_value_length(wm_user_time_reply) != 0 &&
+ (wm_user_time = xcb_get_property_value(wm_user_time_reply)) &&
+ wm_user_time[0] == 0) {
+ DLOG("_NET_WM_USER_TIME set to 0, not focusing con = %p.\n", nc);
+ set_focus = false;
+ }
+
+ FREE(wm_user_time_reply);
+ } else {
+ xcb_discard_reply(conn, wm_user_time_cookie.sequence);
+ }
+
/* Defer setting focus after the 'new' event has been sent to ensure the
* proper window event sequence. */
if (set_focus && !nc->window->doesnt_accept_focus && nc->mapped) {