// === MaximizeWindow() === void LXCB::MaximizeWindow(WId win, bool flagsonly){ //request that the window become maximized if(DEBUG){ qDebug() << "XCB: MaximizeWindow()"; } if(win==0){ return; } if(flagsonly){ //Directly set the flags on the window (bypassing the WM) xcb_atom_t list[2]; list[0] = EWMH._NET_WM_STATE_MAXIMIZED_VERT; list[1] = EWMH._NET_WM_STATE_MAXIMIZED_HORZ; xcb_ewmh_set_wm_state(&EWMH, win, 2, list); }else{ //Need to send a client message event for the window so the WM picks it up xcb_client_message_event_t event; event.response_type = XCB_CLIENT_MESSAGE; event.format = 32; event.window = win; event.type = EWMH._NET_WM_STATE; event.data.data32[0] = 2; //set to toggle (switch back and forth) event.data.data32[1] = EWMH._NET_WM_STATE_MAXIMIZED_VERT; event.data.data32[2] = EWMH._NET_WM_STATE_MAXIMIZED_HORZ; event.data.data32[3] = 0; event.data.data32[4] = 0; xcb_send_event(QX11Info::connection(), 0, QX11Info::appRootWindow(), XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *) &event); } }
void _xcwm_atoms_set_wm_state(xcwm_window_t *window, xcwm_window_state_t state) { /* xcb_icccm_wm_state_t icccm_state; */ uint32_t icccm_state[2]; xcb_atom_t *ewmh_state = NULL; int ewmh_atom_cnt = 0; switch (state) { case XCWM_WINDOW_STATE_NORMAL: { icccm_state[0] = XCB_ICCCM_WM_STATE_NORMAL; icccm_state[1] = XCB_NONE; break; } case XCWM_WINDOW_STATE_ICONIC: { ewmh_atom_cnt = 1; icccm_state[0] = XCB_ICCCM_WM_STATE_ICONIC; icccm_state[1] = XCB_NONE; ewmh_state = calloc(ewmh_atom_cnt, sizeof(xcb_atom_t)); ewmh_state[0] = window->context->atoms.ewmh_conn._NET_WM_STATE_HIDDEN; break; } default: { /* No need to attempt to update the state */ return; } } /* Only set for top-level windows */ if (!window->transient_for && !window->override_redirect) { xcb_change_property(window->context->conn, XCB_PROP_MODE_REPLACE, window->window_id, window->context->atoms.wm_state_atom, window->context->atoms.wm_state_atom, 32, 2, icccm_state); } xcb_ewmh_set_wm_state(&window->context->atoms.ewmh_conn, window->window_id, ewmh_atom_cnt, ewmh_state); xcb_flush(window->context->conn); if (ewmh_state) { free(ewmh_state); } }
void ewmh_wm_state_update(node_t *n) { client_t *c = n->client; size_t count = 0; uint32_t values[12]; #define HANDLE_WM_STATE(s) \ if (WM_FLAG_##s & c->wm_flags) { \ values[count++] = ewmh->_NET_WM_STATE_##s; \ } HANDLE_WM_STATE(MODAL) HANDLE_WM_STATE(STICKY) HANDLE_WM_STATE(MAXIMIZED_VERT) HANDLE_WM_STATE(MAXIMIZED_HORZ) HANDLE_WM_STATE(SHADED) HANDLE_WM_STATE(SKIP_TASKBAR) HANDLE_WM_STATE(SKIP_PAGER) HANDLE_WM_STATE(HIDDEN) HANDLE_WM_STATE(FULLSCREEN) HANDLE_WM_STATE(ABOVE) HANDLE_WM_STATE(BELOW) HANDLE_WM_STATE(DEMANDS_ATTENTION) #undef HANDLE_WM_STATE xcb_ewmh_set_wm_state(ewmh, n->id, count, values); }