/** Layout switching function * \param b Bool True : next False : previous */ void layoutswitch(Bool b) { int i; Client *c; screen_get_sel(); if(tags[selscreen][seltag[selscreen]].layout.func == freelayout) for(c = clients; c && (c->tag != (uint)seltag[selscreen] && c->screen != selscreen); c = c->next) { c->ogeo = c->geo; c->free_geo = c->geo; } for(i = 0; i < conf.nlayout; ++i) { if(tags[selscreen][seltag[selscreen]].layout.func == conf.layout[i].func && tags[selscreen][seltag[selscreen]].layout.symbol == conf.layout[i].symbol) { if(b) tags[selscreen][seltag[selscreen]].layout = conf.layout[(i + 1) % conf.nlayout]; else tags[selscreen][seltag[selscreen]].layout = conf.layout[(i + conf.nlayout - 1) % conf.nlayout]; break; } } ewmh_update_current_tag_prop(); tags[selscreen][seltag[selscreen]].layout.func(selscreen); infobar_draw(selscreen); return; }
/** Rename the selected tag *\param cmd uicb_t type */ void uicb_tag_rename(uicb_t cmd) { screen_get_sel(); char *str; size_t len; if(!cmd || !strlen(cmd)) return; str = tags[selscreen][seltag[selscreen]].name; len = strlen(str); /* TODO: if strlen(cmd) > len, the tag name * will be truncated... * We can't do a realloc because if the pointer change * free() on paser will segfault.on free_conf()... */ strncpy(str, cmd, len); infobar_update_taglist(selscreen); infobar_draw(selscreen); return; }
/** Toggle abovefc option *\param cmd uicb_t type */ void uicb_toggle_abovefc(uicb_t cmd) { Client *c; (void)cmd; screen_get_sel(); if(!(tags[selscreen][seltag[selscreen]].abovefc = !tags[selscreen][seltag[selscreen]].abovefc)) { for(c = clients; c; c = c->next) if(c->flags & AboveFlag && c->screen == selscreen && c->tag == (uint)seltag[selscreen]) { c->flags &= ~AboveFlag; break; } tags[selscreen][seltag[selscreen]].layout.func(selscreen); } client_focus(sel); return; }
/** Toggle the selected client to free * \param cmd uicb_t type unused */ void uicb_togglefree(uicb_t cmd) { (void)cmd; if(!sel || sel->screen != screen_get_sel() || (sel->flags & FSSFlag)) return; sel->flags ^= FreeFlag; if((sel->flags & FreeFlag)) { sel->flags &= ~(TileFlag | MaxFlag | LMaxFlag); client_moveresize(sel, sel->free_geo, True); client_raise(sel); } else { sel->free_geo = sel->geo; sel->ogeo = sel->geo; } client_update_attributes(sel); tags[selscreen][seltag[selscreen]].layout.func(selscreen); return; }
/* Transfert a client to a tag * \param c Client pointer * \param tag Tag */ void tag_transfert(Client *c, int tag) { screen_get_sel(); CHECK(c); if(tag <= 0) tag = 1; if(tag > conf.ntag[selscreen]) return; c->tag = tag; c->screen = selscreen; arrange(c->screen, True); client_focus_next(c); client_update_attributes(c); tags[c->screen][tag].request_update = True; return; }
void uicb_menu(uicb_t cmd) { int i, d, u, x, y; Window w; if(!strcmp(cmd, "menulayout")) menu_draw(menulayout, menulayout.x, menulayout.y); for(i = 0; i < conf.nmenu; ++i) if(!strcmp(cmd, conf.menu[i].name)) { if(conf.menu[i].place_at_mouse) { XQueryPointer(dpy, ROOT, &w, &w, &x, &y, &d, &d, (uint *)&u); conf.menu[i].x = x; conf.menu[i].y = y; } else { screen_get_sel(); x = conf.menu[i].x + spgeo[selscreen].x; y = conf.menu[i].y + spgeo[selscreen].y; } menu_draw(conf.menu[i], x, y); } return; }
/** Keep that tag the last one *\param cmd uicb_t type unused */ void uicb_tag_stay_last(uicb_t cmd) { (void)cmd; screen_get_sel(); if(tags[selscreen][seltag[selscreen]].stay_last) tags[selscreen][seltag[selscreen]].stay_last = False; else { int i; remove_old_last_tag(selscreen); for(i = seltag[selscreen]; i <= conf.ntag[selscreen]; i++) { tag_swap(selscreen, seltag[selscreen], seltag[selscreen] + 1); } tag_set(conf.ntag[selscreen]); tags[selscreen][seltag[selscreen]].stay_last = True; arrange(selscreen, True); } return; }
/** Get the current desktop */ void ewmh_update_current_tag_prop(void) { int t; char s[8] = { 0 }; screen_get_sel(); t = seltag[selscreen] - 1; /* Get current desktop (tag) */ XChangeProperty(dpy, ROOT, net_atom[net_current_desktop], XA_CARDINAL, 32, PropModeReplace, (uchar*)&t, 1); /* Current tag name */ XChangeProperty(dpy, ROOT, net_atom[wmfs_current_tag], net_atom[utf8_string], 8, PropModeReplace, (uchar*)tags[selscreen][seltag[selscreen]].name, strlen(tags[selscreen][seltag[selscreen]].name)); sprintf(s, "%.3f", tags[selscreen][t + 1].mwfact); /* Current tag mwfact */ XChangeProperty(dpy, ROOT, net_atom[wmfs_mwfact], XA_STRING, 8, PropModeReplace, (uchar*)s, strlen(s)); /* Current nmaster */ XChangeProperty(dpy, ROOT, net_atom[wmfs_nmaster], XA_CARDINAL, 32, PropModeReplace, (uchar*)&tags[selscreen][t + 1].nmaster, 1); /* Current layout */ XChangeProperty(dpy, ROOT, net_atom[wmfs_current_layout], net_atom[utf8_string], 8, PropModeReplace, (uchar*)tags[selscreen][seltag[selscreen]].layout.symbol, strlen(tags[selscreen][seltag[selscreen]].layout.symbol)); return; }
/** Toggle the tag_autohide mode * \param cmd uicb_t type unused */ void uicb_toggle_tagautohide(uicb_t cmd) { int i, x; (void)cmd; screen_get_sel(); conf.tagautohide = !conf.tagautohide; if(!conf.tagautohide) { for(i = 1, x = 0; i < conf.ntag[selscreen] + 1; ++i) { if(!infobar[selscreen].tags[i]->mapped) barwin_map(infobar[selscreen].tags[i]); barwin_move(infobar[selscreen].tags[i], x, 0); x += infobar[selscreen].tags[i]->geo.width; } barwin_resize(infobar[selscreen].tags_board, x, infobar[selscreen].geo.height); } infobar_draw(selscreen); return; }
/* Set the infobar position * \param pos Position of the bar */ void infobar_set_position(int pos) { screen_get_sel(); switch(pos) { case IB_Hide: sgeo[selscreen].y = spgeo[selscreen].y + TBARH; sgeo[selscreen].height = spgeo[selscreen].height - TBARH; infobar[selscreen].geo.y = -(infobar[selscreen].geo.height) * 2; break; case IB_Bottom: sgeo[selscreen].y = spgeo[selscreen].y + TBARH; sgeo[selscreen].height = spgeo[selscreen].height - INFOBARH - TBARH; infobar[selscreen].geo.y = spgeo[selscreen].y + sgeo[selscreen].height + TBARH; break; default: case IB_Top: sgeo[selscreen].y = spgeo[selscreen].y + INFOBARH + TBARH; sgeo[selscreen].height = spgeo[selscreen].height - INFOBARH - TBARH; infobar[selscreen].geo.y = spgeo[selscreen].y; break; } tags[selscreen][seltag[selscreen]].barpos = pos; barwin_move(infobar[selscreen].bar, sgeo[selscreen].x - BORDH, infobar[selscreen].geo.y); infobar_draw(selscreen); arrange(selscreen, True); return; }
/** Add an additional tag to the current tag *\param cmd uicb_t */ void uicb_tag_toggle_additional(uicb_t cmd) { screen_get_sel(); tag_additional(selscreen, seltag[selscreen], atoi(cmd)); return; }
/** Swap current tag with a specified tag *\param cmd uicb_t type */ void uicb_tag_swap(uicb_t cmd) { screen_get_sel(); tag_swap(selscreen, seltag[selscreen], atoi(cmd)); return; }
/** Adding a tag *\param cmd uicb_t type */ void uicb_tag_new(uicb_t cmd) { screen_get_sel(); tag_new(selscreen, (char*)cmd); return; }
/** Uicb: screen prev sel * \param cmd uicb_t type unused */ void uicb_screen_prev_sel(uicb_t cmd) { (void)cmd; screen_get_sel(); screen_set_sel(prevselscreen); return; }
/** Check layout type * \param cmd uicb_t type layout type */ Bool uicb_checklayout(uicb_t cmd) { screen_get_sel(); if(!strcmp(cmd, tags[selscreen][seltag[selscreen]].layout.type)) return True; return False; }
/** Swap current tag with previous tag *\param cmd uicb_t type */ void uicb_tag_swap_previous(uicb_t cmd) { (void)cmd; screen_get_sel(); tag_swap(selscreen, seltag[selscreen], seltag[selscreen] - 1); return; }
/** Set the previous selected tag * \param cmd uicb_t type unused */ void uicb_tag_prev_sel(uicb_t cmd) { (void)cmd; screen_get_sel(); tag_set(prevseltag[selscreen]); return; }
/** Go to the last tag *\param cmd uicb_t type unused */ void uicb_tag_last(uicb_t cmd) { (void)cmd; screen_get_sel(); tag_set(conf.ntag[selscreen]); return; }
/** Set the previous tag * \param cmd uicb_t type unused */ void uicb_tag_prev(uicb_t cmd) { (void)cmd; screen_get_sel(); tag_set(seltag[selscreen] - 1); return; }
/** Set the next tag * \param cmd uicb_t type unused */ void uicb_tag_next(uicb_t cmd) { (void)cmd; screen_get_sel(); tag_set(seltag[selscreen] + 1); return; }
/** Uicb: screen prev * \param cmd Screen uicb_t type */ void uicb_screen_prev(uicb_t cmd) { (void)cmd; screen_get_sel(); selscreen = (selscreen - 1 < 0) ? screen_count() - 1 : selscreen - 1; screen_set_sel(selscreen); return; }
/** Toggle the resizehint * \param cmd uicb_t type */ void uicb_toggle_resizehint(uicb_t cmd) { screen_get_sel(); (void)cmd; tags[selscreen][seltag[selscreen]].resizehint = !tags[selscreen][seltag[selscreen]].resizehint; tags[selscreen][seltag[selscreen]].layout.func(selscreen); return; }
/** Toggle the infobar position * \param cmd uicb_t type unused */ void uicb_infobar_togglepos(uicb_t cmd) { (void)cmd; screen_get_sel(); infobar_set_position((tags[selscreen][seltag[selscreen]].barpos = (tags[selscreen][seltag[selscreen]].barpos < 2) ? tags[selscreen][seltag[selscreen]].barpos + 1 : 0)); return; }
/** Delete a tag *\param cmd uicb_t type */ void uicb_tag_del(uicb_t cmd) { int n; screen_get_sel(); if(cmd == NULL || !(n = atoi(cmd))) n = seltag[selscreen]; tag_delete(selscreen, n); return; }
/** Uicb: screen next * \param cmd Screen uicb_t type */ void uicb_screen_next(uicb_t cmd) { (void)cmd; screen_get_sel(); if(screen_count() > 1) { selscreen = (selscreen + 1 > screen_count() - 1) ? 0 : selscreen + 1; screen_set_sel(selscreen); } 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; }
/** Swap current tag with next tag *\param cmd uicb_t type */ void uicb_tag_swap_next(uicb_t cmd) { (void)cmd; screen_get_sel(); /* Check if the next one does have the stay_last bool */ if(!tags[selscreen][conf.ntag[selscreen]].stay_last) { tag_swap(selscreen, seltag[selscreen], seltag[selscreen] + 1); } else { warnx("The next tag is set to always stay the last one"); } return; }
/** Toggle hide/display infobar * \param cmd uicb_t type unused */ void uicb_infobar_toggledisplay(uicb_t cmd) { (void)cmd; screen_get_sel(); int new_pos; new_pos = (tags[selscreen][seltag[selscreen]].barpos ? 0 : (tags[selscreen][seltag[selscreen]].prev_barpos ? tags[selscreen][seltag[selscreen]].prev_barpos : 2 )); tags[selscreen][seltag[selscreen]].prev_barpos = tags[selscreen][seltag[selscreen]].barpos; tags[selscreen][seltag[selscreen]].barpos = new_pos; infobar_set_position(new_pos); return; }
/** The free layout function */ void freelayout(int screen) { Client *c; (void)screen; for(c = clients; c; c = c->next) if(!ishide(c, selscreen) && c->screen == screen_get_sel() && !(c->flags & MaxFlag)) { client_moveresize(c, c->free_geo, True); c->flags &= ~(TileFlag | LMaxFlag); } ewmh_update_current_tag_prop(); return; }
/** Set the client as master * \param c Client */ void layout_set_client_master(Client *c) { screen_get_sel(); if(!c || (c->flags & HintFlag) || !(c->flags & TileFlag) || (c->flags & FSSFlag)) return; if(c == tiled_client(selscreen, clients)) CHECK((c = tiled_client(selscreen, c->next))); client_detach(c); client_attach(c); tags[selscreen][seltag[selscreen]].layout.func(selscreen); return; }