/** Whether the application used _NET_WM_NAME */
bool uses_net_wm_name;
+ /** Whether the application needs to receive WM_TAKE_FOCUS */
+ bool needs_take_focus;
+
/** Whether the window says it is a dock window */
enum { W_NODOCK = 0, W_DOCK_TOP = 1, W_DOCK_BOTTOM = 2 } dock;
*/
void x_con_kill(Con *con);
+/**
+ * Returns true if the client supports the given protocol atom (like WM_DELETE_WINDOW)
+ *
+ */
+bool window_supports_protocol(xcb_window_t window, xcb_atom_t atom);
+
/**
* Kills the given X11 window using WM_DELETE_WINDOW (if supported).
*
*/
void fake_absolute_configure_notify(Con *con);
+/**
+ * Sends the WM_TAKE_FOCUS ClientMessage to the given window
+ *
+ */
+void send_take_focus(xcb_window_t window);
+
/**
* Finds out which modifier mask is the one for numlock, as the user may
* change this.
window_update_transient_for(cwindow, xcb_get_property_reply(conn, transient_cookie, NULL));
window_update_strut_partial(cwindow, xcb_get_property_reply(conn, strut_cookie, NULL));
+ /* check if the window needs WM_TAKE_FOCUS */
+ cwindow->needs_take_focus = window_supports_protocol(cwindow->id, A_WM_TAKE_FOCUS);
+
/* Where to start searching for a container that swallows the new one? */
Con *search_at = croot;
* Returns true if the client supports the given protocol atom (like WM_DELETE_WINDOW)
*
*/
-static bool window_supports_protocol(xcb_window_t window, xcb_atom_t atom) {
+bool window_supports_protocol(xcb_window_t window, xcb_atom_t atom) {
xcb_get_property_cookie_t cookie;
xcb_icccm_get_wm_protocols_reply_t protocols;
bool result = false;
xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, to_focus, XCB_CURRENT_TIME);
/* TODO: check if that client acccepts WM_TAKE_FOCUS at all */
- xcb_client_message_event_t ev;
-
- memset(&ev, 0, sizeof(xcb_client_message_event_t));
-
- ev.response_type = XCB_CLIENT_MESSAGE;
- ev.window = to_focus;
- ev.type = A_WM_PROTOCOLS;
- ev.format = 32;
- ev.data.data32[0] = A_WM_TAKE_FOCUS;
- ev.data.data32[1] = XCB_CURRENT_TIME;
-
- DLOG("Sending WM_TAKE_FOCUS to the client\n");
- xcb_send_event(conn, false, to_focus, XCB_EVENT_MASK_NO_EVENT, (char*)&ev);
+ if (focused->window != NULL &&
+ focused->window->needs_take_focus) {
+ send_take_focus(to_focus);
+ }
ewmh_update_active_window(to_focus);
focused_id = to_focus;
fake_configure_notify(conn, absolute, con->window->id);
}
+/*
+ * Sends the WM_TAKE_FOCUS ClientMessage to the given window
+ *
+ */
+void send_take_focus(xcb_window_t window) {
+ xcb_client_message_event_t ev;
+
+ memset(&ev, 0, sizeof(xcb_client_message_event_t));
+
+ ev.response_type = XCB_CLIENT_MESSAGE;
+ ev.window = window;
+ ev.type = A_WM_PROTOCOLS;
+ ev.format = 32;
+ ev.data.data32[0] = A_WM_TAKE_FOCUS;
+ ev.data.data32[1] = XCB_CURRENT_TIME;
+
+ DLOG("Sending WM_TAKE_FOCUS to the client\n");
+ xcb_send_event(conn, false, window, XCB_EVENT_MASK_NO_EVENT, (char*)&ev);
+}
+
/*
* Finds out which modifier mask is the one for numlock, as the user may change this.
*