/** Add an additional tag to the current tag *\param sc Screen *\param tag Tag where apply additional tag *\param adtag Additional tag to apply in tag */ void tag_additional(int sc, int tag, int adtag) { if(tag < 0 || tag > conf.ntag[sc] || adtag < 1 || adtag > conf.ntag[sc] || adtag == seltag[sc]) return; tags[sc][tag].tagad ^= TagFlag(adtag); tags[sc][adtag].request_update = True; arrange(sc, True); return; }
void uicb_tag_toggle_expose(uicb_t cmd) { (void)cmd; int i, j; screen_get_sel(); for(i = 1; i <= conf.ntag[selscreen]; i++) { if(strcmp(tags[selscreen][i].name, conf.tag_expose_name) == 0) { if(clients && sel->tag) tag_set(sel->tag); tag_delete(selscreen, i); for(j = 0; j < conf.ntag[selscreen]; j++) tags[selscreen][j].request_update = True; arrange(selscreen, True); return; } } tag_new(selscreen, conf.tag_expose_name); for(i = 0; i < conf.nlayout; ++i) { if(strcmp(conf.expose_layout, conf.layout[i].type) == 0) { tags[selscreen][conf.ntag[selscreen]].layout = conf.layout[i]; } } for(i = 1; i < conf.ntag[selscreen]; ++i) { tags[selscreen][conf.ntag[selscreen]].tagad ^= TagFlag(i); } tags[selscreen][conf.ntag[selscreen]].request_update = True; arrange(selscreen, True); return; }
/* Set the tag * \param tag The tag number */ void tag_set(int tag) { Client *c; Bool al = False; int i; if(tag < 0 || tag > MAXTAG) return; screen_get_sel(); if(seltag[selscreen] != tag) prevseltag[selscreen] = seltag[selscreen]; else if(tag == seltag[selscreen] && tag != prevseltag[selscreen] && conf.tag_auto_prev) tag = seltag[selscreen] = prevseltag[selscreen]; else seltag[selscreen] = tag; if(conf.tag_round) { if(tag <= 0) seltag[selscreen] = conf.ntag[selscreen]; else if(tag > conf.ntag[selscreen]) seltag[selscreen] = 1; else seltag[selscreen] = tag; } else { if(!tag || tag > conf.ntag[selscreen]) return; seltag[selscreen] = tag; } ewmh_update_current_tag_prop(); /* Arrange infobar position */ if(tags[selscreen][prevseltag[selscreen]].barpos != tags[selscreen][seltag[selscreen]].barpos || prevseltag[selscreen] == seltag[selscreen]) infobar_set_position(tags[selscreen][seltag[selscreen]].barpos); /* Check if a layout update is needed with additional tags */ if(tags[selscreen][seltag[selscreen]].tagad) al = True; else if(tags[selscreen][seltag[selscreen]].request_update) { al = True; tags[selscreen][seltag[selscreen]].request_update = False; } for(i = 1; i < conf.ntag[selscreen] + 1; ++i) if(tags[selscreen][i].tagad & TagFlag(seltag[selscreen])) { al = True; break; } /* Check for ignore_tag clients */ for(c = clients; c; c = c->next) if(c->tag == MAXTAG + 1 && c->screen == selscreen) { al = True; break; } arrange(selscreen, al); if(tags[selscreen][tag].request_update) { tags[selscreen][seltag[selscreen]].layout.func(selscreen); tags[selscreen][tag].request_update = False; } /* To focus selected client of the via focusontag option */ for(c = clients; c; c = c->next) if(c->focusontag == tag && c->screen == selscreen) break; /* No focusontag option found on any client, try to find the first of the tag */ if(!c) for(c = clients; c; c = c->next) if(c->tag == (uint)seltag[selscreen] && c->screen == selscreen) break; client_focus((c) ? c : NULL); return; }
/** Draw the taglist in the InfoBar *\param sc Screen number */ void infobar_draw_taglist(int sc) { int i, x; Client *c = NULL; Bool is_occupied[MAXTAG + 1]; if(conf.layout_placement) barwin_move(infobar[sc].tags_board, ((conf.layout_button_width > 0) ? (uint)conf.layout_button_width : (textw(tags[sc][seltag[sc]].layout.symbol) + PAD)) + PAD / 2, 0); for(i = 0; i < MAXTAG; i++) is_occupied[i] = False; for(c = clients; c; c = c->next) if(c->screen == sc && c->tag != MAXTAG + 1) is_occupied[c->tag] = True; for(i = 1, x = 0; i < conf.ntag[sc] + 1; ++i) { /* Autohide tag feature */ if(conf.tagautohide) { if(!is_occupied[i] && i != seltag[sc]) { barwin_unmap(infobar[sc].tags[i]); continue; } if(!infobar[sc].tags[i]->mapped) barwin_map(infobar[sc].tags[i]); barwin_move(infobar[sc].tags[i], x, 0); x += infobar[sc].tags[i]->geo.width; barwin_resize(infobar[sc].tags_board, x, infobar[sc].geo.height); } infobar[sc].tags[i]->bg = tags[sc][i].urgent ? conf.colors.tagurbg : ((i == seltag[sc] || tags[sc][seltag[sc]].tagad & TagFlag(i)) ? conf.colors.tagselbg : (is_occupied[i] ? conf.colors.tag_occupied_bg : conf.colors.bar)); infobar[sc].tags[i]->fg = tags[sc][i].urgent ? conf.colors.tagurfg : ((i == seltag[sc] || tags[sc][seltag[sc]].tagad & TagFlag(i)) ? conf.colors.tagselfg : (is_occupied[i] ? conf.colors.tag_occupied_fg : conf.colors.text)); barwin_color_set(infobar[sc].tags[i], infobar[sc].tags[i]->bg, infobar[sc].tags[i]->fg); barwin_refresh_color(infobar[sc].tags[i]); if(tags[sc][i].name) barwin_draw_text(infobar[sc].tags[i], PAD / 2, FHINFOBAR, tags[sc][i].name); } return; }