diff --git a/src/barwin.c b/src/barwin.c index 4ad6710..2b0fad9 100644 --- a/src/barwin.c +++ b/src/barwin.c @@ -218,7 +218,8 @@ barwin_unmap_subwin(BarWindow *bw) void barwin_move(BarWindow *bw, int x, int y) { - CHECK(bw); + if(!bw || (bw->geo.x == x && bw->geo.y == y)) + return; XMoveWindow(dpy, bw->win, (bw->geo.x = x), (bw->geo.y = y)); @@ -233,7 +234,8 @@ barwin_move(BarWindow *bw, int x, int y) void barwin_resize(BarWindow *bw, uint w, uint h) { - CHECK(bw); + if(!bw || (bw->geo.width == w && bw->geo.height == h)) + return; bw->geo.width = w; bw->geo.height = h; diff --git a/src/config.c b/src/config.c index 7de9a78..43a45d8 100644 --- a/src/config.c +++ b/src/config.c @@ -56,6 +56,9 @@ func_name_list_t tmp_func_list[] = {"tag_transfert_prev", uicb_tagtransfert_prev }, {"tag_urgent", uicb_tag_urgent }, {"tag_toggle_additional", uicb_tag_toggle_additional }, + {"tag_swap", uicb_tag_swap }, + {"tag_swap_next", uicb_tag_swap_next }, + {"tag_swap_prev", uicb_tag_swap_previous }, {"set_mwfact", uicb_set_mwfact }, {"set_nmaster", uicb_set_nmaster }, {"quit", uicb_quit }, diff --git a/src/infobar.c b/src/infobar.c index c3bf260..b3ade81 100644 --- a/src/infobar.c +++ b/src/infobar.c @@ -219,7 +219,7 @@ infobar_draw_selbar(int sc) void infobar_draw_taglist(int sc) { - int i, x; + int i, x, j; Client *c; Bool is_occupied[MAXTAG]; @@ -233,9 +233,8 @@ infobar_draw_taglist(int sc) if(c->screen == sc) is_occupied[c->tag] = True; - for(i = 1, x = 0; i < conf.ntag[sc] + 1; ++i) + for(i = 1, x = j = 0; i < conf.ntag[sc] + 1; ++i) { - /* Autohide tag feature */ if(conf.tagautohide) { diff --git a/src/tag.c b/src/tag.c index 0c0328d..3d8fcd0 100644 --- a/src/tag.c +++ b/src/tag.c @@ -296,5 +296,74 @@ uicb_tag_toggle_additional(uicb_t cmd) return; } +/** Swap 2 tags + *\param s Screen + *\param t1 Tag 1 + *\param t2 Tag 2 +*/ +void +tag_swap(int s, int t1, int t2) +{ + Tag t; + int i, j; + if(t1 > conf.ntag[s] || t1 < 0 + || t2 > conf.ntag[s] || t2 < 0 || t1 == t2) + return; + t = tags[s][t1]; + tags[s][t1] = tags[s][t2]; + tags[s][t2] = t; + + /* Adapt tags buttons */ + for(i = 1, j = 0; i < conf.ntag[s] + 1; ++i) + { + barwin_move(infobar[s].tags[i], j, 0); + j += textw(tags[s][i].name) + PAD; + barwin_resize(infobar[s].tags[i], textw(tags[s][i].name) + PAD, infobar[s].geo.height); + barwin_resize(infobar[s].tags_board, j, infobar[s].geo.height); + } + + tag_set(t2); + + 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; +} + +/** Swap current tag with next tag + *\param cmd uicb_t type +*/ +void +uicb_tag_swap_next(uicb_t cmd) +{ + screen_get_sel(); + + tag_swap(selscreen, seltag[selscreen], seltag[selscreen] + 1); + + return; +} + +/** Swap current tag with previous tag + *\param cmd uicb_t type +*/ +void +uicb_tag_swap_previous(uicb_t cmd) +{ + screen_get_sel(); + + tag_swap(selscreen, seltag[selscreen], seltag[selscreen] - 1); + + return; +} diff --git a/src/wmfs.h b/src/wmfs.h index 088b662..dc13315 100644 --- a/src/wmfs.h +++ b/src/wmfs.h @@ -284,7 +284,6 @@ char *clean_value(char *str); int parse_image_block(ImageAttr *im, char *str); #endif /* HAVE_IMLIB */ - /* tag.c */ void tag_set(int tag); void tag_transfert(Client *c, int tag); @@ -297,8 +296,11 @@ void uicb_tagtransfert_next(uicb_t); void uicb_tagtransfert_prev(uicb_t); void uicb_tag_urgent(uicb_t cmd); void tag_additional(int sc, int tag, int adtag); -void uicb_tag_toggle_additional(uicb_t cmd); - +void uicb_tag_toggle_additional(uicb_t); +void tag_swap(int s, int t1, int t2); +void uicb_tag_swap(uicb_t); +void uicb_tag_swap_next(uicb_t); +void uicb_tag_swap_previous(uicb_t); /* screen.c */ int screen_count(void);