void property_update_wm_transient_for(client_t *c, xcb_get_property_cookie_t cookie) { xcb_window_t trans; int counter; client_t *tc, *tmp; if(!xcb_icccm_get_wm_transient_for_reply(globalconf.connection, cookie, &trans, NULL)) return; tmp = tc = client_getbywin(trans); luaA_object_push(globalconf.L, c); client_set_type(globalconf.L, -1, WINDOW_TYPE_DIALOG); client_set_above(globalconf.L, -1, false); /* Verify that there are no loops in the transient_for relation after we are done */ for(counter = 0; tmp != NULL && counter <= globalconf.stack.len; counter++) { if (tmp == c) /* We arrived back at the client we started from, so there is a loop */ counter = globalconf.stack.len+1; tmp = tmp->transient_for; } if (counter <= globalconf.stack.len) client_set_transient_for(globalconf.L, -1, tc); lua_pop(globalconf.L, 1); }
void property_update_wm_transient_for(client_t *c, xcb_get_property_reply_t *reply) { xcb_window_t trans; if(reply) { if(!xcb_icccm_get_wm_transient_for_from_reply(&trans, reply)) return; } else { if(!xcb_icccm_get_wm_transient_for_reply(globalconf.connection, xcb_icccm_get_wm_transient_for_unchecked(globalconf.connection, c->window), &trans, NULL)) return; } luaA_object_push(globalconf.L, c); client_set_type(globalconf.L, -1, WINDOW_TYPE_DIALOG); client_set_above(globalconf.L, -1, false); client_set_transient_for(globalconf.L, -1, client_getbywin(trans)); lua_pop(globalconf.L, 1); }
void Client::updateTransient(xcb_connection_t* conn, xcb_get_property_cookie_t cookie) { if (!xcb_icccm_get_wm_transient_for_reply(conn, cookie, &mTransientFor, 0)) { mTransientFor = XCB_NONE; } else { if (mTransientFor == XCB_NONE || mTransientFor == root()) { // we're really transient for the group if (!mGroup) { // bad error() << "transient-for None or root but no leader set"; mTransientFor = XCB_NONE; return; } mTransientFor = mGroup->leader(); } else { // add us to the group of the window we're transient for Client *other = Client::client(mTransientFor); if (!other) { error() << "Couldn't find the client we're transient for" << mWindow << mTransientFor; mTransientFor = XCB_NONE; return; } ClientGroup *otherGroup = other->group(); if (mGroup != otherGroup) { mGroup = otherGroup; mGroup->add(this); } } } }
//! Process WM_TRANSIENT_FOR reply and update fields void Client::process_wm_transient_for(xcb_get_property_cookie_t gpc) { if (xcb_icccm_get_wm_transient_for_reply(g_xcb.connection, gpc, &m_wm_transient_for, NULL)) { INFO << "ICCCM: transient for " << m_wm_transient_for; } else { WARN << "ICCCM WM_TRANSIENT_FOR could not be retrieved."; } }
void property_update_wm_transient_for(client_t *c, xcb_get_property_cookie_t cookie) { xcb_window_t trans; if(!xcb_icccm_get_wm_transient_for_reply(globalconf.connection, cookie, &trans, NULL)) return; luaA_object_push(globalconf.L, c); client_set_type(globalconf.L, -1, WINDOW_TYPE_DIALOG); client_set_above(globalconf.L, -1, false); client_set_transient_for(globalconf.L, -1, client_getbywin(trans)); lua_pop(globalconf.L, 1); }
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; } }
static void setup_window_type(xcwm_window_t *window, xcwm_property_t *property) { xcb_get_property_cookie_t cookie; xcb_window_t transient; xcb_ewmh_get_atoms_reply_t type; xcb_ewmh_connection_t ewmh_conn = window->context->atoms.ewmh_conn; int i; /* if nothing below matches, set the default to unknown */ window->type = XCWM_WINDOW_TYPE_UNKNOWN; /* Get the window this one is transient for */ cookie = xcb_icccm_get_wm_transient_for(window->context->conn, window->window_id); if (xcb_icccm_get_wm_transient_for_reply(window->context->conn, cookie, &transient, NULL)) { window->transient_for = _xcwm_get_window_node_by_window_id(transient); window->type = XCWM_WINDOW_TYPE_DIALOG; // not if override-redirect } else { window->transient_for = NULL; window->type = XCWM_WINDOW_TYPE_NORMAL; } /* Check and see if the client has set the _NET_WM_WINDOW_TYPE * atom. Since the "type" is a list of window types, ordered by * preference, we need to loop through to make sure we get a * match. */ cookie = xcb_ewmh_get_wm_window_type(&ewmh_conn, window->window_id); if (xcb_ewmh_get_wm_window_type_reply(&ewmh_conn, cookie, &type, NULL)) { for (i = 0; i < type.atoms_len; i++) { if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_DESKTOP) { window->type = XCWM_WINDOW_TYPE_DESKTOP; break; } else if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_DOCK) { window->type = XCWM_WINDOW_TYPE_DOCK; break; } else if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_TOOLBAR) { window->type = XCWM_WINDOW_TYPE_TOOLBAR; break; } else if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_MENU) { window->type = XCWM_WINDOW_TYPE_MENU; break; } else if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_UTILITY) { window->type = XCWM_WINDOW_TYPE_UTILITY; break; } else if ((type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_SPLASH) || (type.atoms[i] == window->context->atoms.net_wm_window_type_splashscreen)) { window->type = XCWM_WINDOW_TYPE_SPLASH; break; } else if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_DIALOG) { window->type = XCWM_WINDOW_TYPE_DIALOG; break; } else if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_DROPDOWN_MENU) { window->type = XCWM_WINDOW_TYPE_DROPDOWN_MENU; break; } else if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_POPUP_MENU) { window->type = XCWM_WINDOW_TYPE_POPUP_MENU; break; } else if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_TOOLTIP) { window->type = XCWM_WINDOW_TYPE_TOOLTIP; break; } else if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_NOTIFICATION) { window->type = XCWM_WINDOW_TYPE_NOTIFICATION; break; } else if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_COMBO) { window->type = XCWM_WINDOW_TYPE_COMBO; break; } else if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_DND) { window->type = XCWM_WINDOW_TYPE_DND; break; } else if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_NORMAL) { window->type = XCWM_WINDOW_TYPE_NORMAL; break; } } } }