diff --git a/include/atoms_rest.xmacro b/include/atoms_rest.xmacro index d461dc08..b65a81d8 100644 --- a/include/atoms_rest.xmacro +++ b/include/atoms_rest.xmacro @@ -17,3 +17,4 @@ xmacro(I3_FLOATING_WINDOW) xmacro(_NET_REQUEST_FRAME_EXTENTS) xmacro(_NET_FRAME_EXTENTS) xmacro(_MOTIF_WM_HINTS) +xmacro(WM_CHANGE_STATE) diff --git a/src/handlers.c b/src/handlers.c index d2232965..2cd45b79 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -806,6 +806,18 @@ static void handle_client_message(xcb_client_message_event_t *event) { XCB_ATOM_CARDINAL, 32, 4, &r); xcb_flush(conn); + } else if (event->type == A_WM_CHANGE_STATE) { + /* http://tronche.com/gui/x/icccm/sec-4.html#s-4.1.4 */ + if (event->data.data32[0] == XCB_ICCCM_WM_STATE_ICONIC) { + /* For compatiblity reasons, Wine will request iconic state and cannot ensure that the WM has agreed on it; + * immediately revert to normal to avoid being stuck in a paused state. */ + DLOG("Client has requested iconic state, rejecting. (window = %d)\n", event->window); + long data[] = {XCB_ICCCM_WM_STATE_NORMAL, XCB_NONE}; + xcb_change_property(conn, XCB_PROP_MODE_REPLACE, event->window, + A_WM_STATE, A_WM_STATE, 32, 2, data); + } else { + DLOG("Not handling WM_CHANGE_STATE request. (window = %d, state = %d)\n", event->window, event->data.data32[0]); + } } else if (event->type == A__NET_CURRENT_DESKTOP) { /* This request is used by pagers and bars to change the current * desktop likely as a result of some user action. We interpret this as