void Client::updateEwmhState(xcb_ewmh_connection_t* conn, xcb_get_property_cookie_t cookie) { warning() << "updating ewmh state"; mEwmhState.clear(); xcb_ewmh_get_atoms_reply_t prop; if (xcb_ewmh_get_wm_state_reply(conn, cookie, &prop, 0)) { for (uint32_t i = 0; i < prop.atoms_len; ++i) { warning() << "ewmh state has" << Atoms::name(prop.atoms[i]); mEwmhState.insert(prop.atoms[i]); } xcb_ewmh_get_atoms_reply_wipe(&prop); } }
bool ewmh_wm_state_fullscreen(const xcb_window_t win) { const xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_state_unchecked(cfg.ewmh, win); xcb_ewmh_get_atoms_reply_t data; if (!xcb_ewmh_get_wm_state_reply(cfg.ewmh, cookie, &data, (void *)0)) return false; bool state = false; for (unsigned short i = 0; i < data.atoms_len; i++) if ((state = data.atoms[i] == cfg.ewmh->_NET_WM_STATE_FULLSCREEN)) break; xcb_ewmh_get_atoms_reply_wipe(&data); return state; }
void handle_rules(xcb_window_t win, bool *floating, bool *transient, bool *fullscreen, bool *takes_focus) { xcb_ewmh_get_atoms_reply_t win_type; if (xcb_ewmh_get_wm_window_type_reply(ewmh, xcb_ewmh_get_wm_window_type(ewmh, win), &win_type, NULL) == 1) { for (unsigned int i = 0; i < win_type.atoms_len; i++) { xcb_atom_t a = win_type.atoms[i]; if (a == ewmh->_NET_WM_WINDOW_TYPE_TOOLBAR || a == ewmh->_NET_WM_WINDOW_TYPE_UTILITY) { *takes_focus = false; } else if (a == ewmh->_NET_WM_WINDOW_TYPE_DIALOG) { *floating = true; } } xcb_ewmh_get_atoms_reply_wipe(&win_type); } xcb_ewmh_get_atoms_reply_t win_state; if (xcb_ewmh_get_wm_state_reply(ewmh, xcb_ewmh_get_wm_state(ewmh, win), &win_state, NULL) == 1) { for (unsigned int i = 0; i < win_state.atoms_len; i++) { xcb_atom_t a = win_state.atoms[i]; if (a == ewmh->_NET_WM_STATE_FULLSCREEN) { *fullscreen = true; } } xcb_ewmh_get_atoms_reply_wipe(&win_state); } xcb_window_t transient_for = XCB_NONE; xcb_icccm_get_wm_transient_for_reply(dpy, xcb_icccm_get_wm_transient_for(dpy, win), &transient_for, NULL); *transient = (transient_for == XCB_NONE ? false : true); if (*transient) *floating = true; rule_t *rule = rule_head; while (rule != NULL) { if (is_match(rule, win)) { if (rule->effect.floating) *floating = true; } rule = rule->next; } }
// === WindowIsMaximized() === bool LXCB::WindowIsMaximized(WId win){ if(DEBUG){ qDebug() << "XCB: WindowIsMaximized()"; } if(win==0){ return ""; } //See if the _NET_WM_STATE_MAXIMIZED_[VERT/HORZ] flags are set on the window xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_state_unchecked(&EWMH, win); if(cookie.sequence == 0){ return false; } xcb_ewmh_get_atoms_reply_t states; if( 1 == xcb_ewmh_get_wm_state_reply(&EWMH, cookie, &states, NULL) ){ //Loop over the states for(unsigned int i=0; i<states.atoms_len; i++){ if(states.atoms[i] == EWMH._NET_WM_STATE_MAXIMIZED_HORZ \ || states.atoms[i] == EWMH._NET_WM_STATE_MAXIMIZED_VERT ){ return true; } } } return false; }
// === WindowState() === LXCB::WINDOWSTATE LXCB::WindowState(WId win){ if(DEBUG){ qDebug() << "XCB: WindowState()"; } if(win==0){ return IGNORE; } xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_state_unchecked(&EWMH, win); if(cookie.sequence == 0){ return IGNORE; } xcb_ewmh_get_atoms_reply_t states; WINDOWSTATE cstate = IGNORE; //First Check for special states (ATTENTION in particular); if( 1 == xcb_ewmh_get_wm_state_reply(&EWMH, cookie, &states, NULL) ){ for(unsigned int i=0; i<states.atoms_len; i++){ if(states.atoms[i] == EWMH._NET_WM_STATE_DEMANDS_ATTENTION){ cstate = ATTENTION; break; } //nothing more urgent - stop here else if(states.atoms[i] == EWMH._NET_WM_STATE_HIDDEN){ cstate = INVISIBLE; } } } //Now check to see if the window is the active one if(cstate == IGNORE){ xcb_get_property_cookie_t cookie = xcb_ewmh_get_active_window_unchecked(&EWMH, 0); xcb_window_t actwin; if(1 == xcb_ewmh_get_active_window_reply(&EWMH, cookie, &actwin, NULL) ){ if(actwin == win){ cstate = ACTIVE; } } } //Now check for ICCCM Urgency hint (not sure if this is still valid with EWMH instead) /*if(cstate == IGNORE){ xcb_get_property_cookie_t cookie = xcb_icccm_get_wm_hints_unchecked(QX11Info::connection(), win); xcb_icccm_wm_hints_t hints; if( 1== xcb_icccm_get_wm_hints_reply(QX11Info::connection(), cookie, &hints, NULL) ){ if(xcb_icccm_wm_hints_get_urgency(hints) ){ cstate = ATTENTION; }; } }*/ //Now check for standard visible/invisible attribute (current mapping state) if(cstate == IGNORE){ xcb_get_window_attributes_cookie_t cookie = xcb_get_window_attributes(QX11Info::connection(), win); xcb_get_window_attributes_reply_t *attr = xcb_get_window_attributes_reply(QX11Info::connection(), cookie, NULL); if(attr!=0){ if(attr->map_state==XCB_MAP_STATE_VIEWABLE){ cstate = VISIBLE; } else{ cstate = INVISIBLE; } free(attr); } } return cstate; }