/* Set t to NULL to untag c from c->tag */ void tag_client(struct tag *t, struct client *c) { /* Remove client from its previous tag */ if(c->tag && !(c->flags & CLIENT_RULED)) { if(c->tag == t) return; if(!(c->flags & (CLIENT_IGNORE_LAYOUT | CLIENT_FREE))) layout_split_arrange_closed(c); if(!(c->flags & CLIENT_REMOVEALL)) { SLIST_REMOVE(&c->tag->clients, c, client, tnext); if(c->tag->sel == c || W->client == c) client_focus( client_tab_next( client_next(c))); } } c->flags &= ~CLIENT_RULED; /* Client remove */ if(!t) { infobar_elem_screen_update(c->screen, ElemTag); return; } c->prevtag = c->tag; c->tag = t; c->screen = t->screen; client_update_props(c, CPROP_LOC); SLIST_INSERT_HEAD(&t->clients, c, tnext); infobar_elem_screen_update(c->screen, ElemTag); if(c->flags & CLIENT_TABMASTER && c->prevtag) { struct client *cc; SLIST_FOREACH(cc, &c->prevtag->clients, tnext) if(cc->tabmaster == c) { cc->flags |= CLIENT_IGNORE_LAYOUT; tag_client(t, cc); } } layout_client(c); if(t != c->screen->seltag || c->flags & CLIENT_TABBED) client_unmap(c); }
void remove_client(struct client *c, bool destroyed) { struct monitor *mon = c->mon; monitor_remove_client(mon, c); if (!destroyed) client_unmap(c); client_free(c); monitor_focus(mon, NULL); monitor_arrange(mon); update_net_client_list(); }
/** Manage the client hints *\param c Client pointer */ void ewmh_manage_window_type(Client *c) { Atom *atom, rf; int f; ulong n, il, i; uchar *data = NULL; long ldata[5] = { 0 }; if(XGetWindowProperty(dpy, c->win, net_atom[net_wm_window_type], 0L, 0x7FFFFFFFL, False, XA_ATOM, &rf, &f, &n, &il, &data) == Success && n) { atom = (Atom*)data; for(i = 0; i < n; ++i) { /* Manage _NET_WM_WINDOW_TYPE_DOCK & _NET_WM_WINDOW_TYPE_SPLASH */ if(atom[i] == net_atom[net_wm_window_type_dock] || atom[i] == net_atom[net_wm_window_type_splash]) { /* Unmap frame, decoration.. */ client_unmap(c); /* Map only window */ XMapWindow(dpy, c->win); /* Reparent it to ROOT win */ XReparentWindow(dpy, c->win, ROOT, c->geo.x, c->geo.y); XRaiseWindow(dpy, c->win); c->flags |= DockFlag; } /* MANAGE _NET_WM_WINDOW_TYPE_DIALOG */ else if(atom[i] == net_atom[net_wm_window_type_dialog]) { c->flags |= FreeFlag; c->flags &= ~(TileFlag | MaxFlag | LMaxFlag); client_moveresize(c, c->ogeo, True); client_focus(c); tags[selscreen][seltag[selscreen]].layout.func(selscreen); } } XFree(data); } /* Get NET_WM_STATE set without sending client message event */ if(XGetWindowProperty(dpy, c->win, net_atom[net_wm_state], 0L, 0x7FFFFFFFL, False, XA_ATOM, &rf, &f, &n, &il, &data) == Success && n) { atom = (Atom*)data; for(i = 0; i < n; ++i) { ldata[0] = _NET_WM_STATE_ADD; ldata[1] = atom[i]; ewmh_manage_net_wm_state(ldata, c); } XFree(data); } return; }