diff --git a/dvtm.c b/dvtm.c index 464a223..684cd3c 100644 --- a/dvtm.c +++ b/dvtm.c @@ -222,9 +222,19 @@ static char *title; #include "config.h" +typedef struct { + unsigned int curtag, prevtag; + int nmasters[LENGTH(tags) + 1]; + float mfacts[LENGTH(tags) + 1]; + Layout *layouts[LENGTH(tags) + 1]; + int barpos[LENGTH(tags) + 1]; + int barlastpos[LENGTH(tags) + 1]; +} Pertag; + /* global variables */ static const char *dvtm_name = "dvtm"; Screen screen = { .mfact = MFACT, .nmaster = NMASTER, .history = SCROLL_HISTORY }; +static Pertag pertag; static Client *stack = NULL; static Client *sel = NULL; static Client *lastsel = NULL; @@ -301,15 +311,15 @@ updatebarpos(void) { static void hidebar(void) { if (bar.pos != BAR_OFF) { - bar.lastpos = bar.pos; - bar.pos = BAR_OFF; + bar.lastpos = pertag.barlastpos[pertag.curtag] = bar.pos; + bar.pos = pertag.barpos[pertag.curtag] = BAR_OFF; } } static void showbar(void) { if (bar.pos == BAR_OFF) - bar.pos = bar.lastpos; + bar.pos = pertag.barpos[pertag.curtag] = bar.lastpos; } static void @@ -805,9 +815,32 @@ toggletag(const char *args[]) { } static void +setpertag(void) { + screen.nmaster = pertag.nmasters[pertag.curtag]; + screen.mfact = pertag.mfacts[pertag.curtag]; + layout = pertag.layouts[pertag.curtag]; + if (bar.pos != pertag.barpos[pertag.curtag]) { + bar.pos = pertag.barpos[pertag.curtag]; + updatebarpos(); + } + bar.lastpos = pertag.barlastpos[pertag.curtag]; +} + +static void toggleview(const char *args[]) { + int i; + unsigned int newtagset = tagset[seltags] ^ (bitoftag(args[0]) & TAGMASK); if (newtagset) { + if(newtagset == TAGMASK) { + pertag.prevtag = pertag.curtag; + pertag.curtag = 0; + } else if(!(newtagset & 1 << (pertag.curtag - 1))) { + pertag.prevtag = pertag.curtag; + for (i=0; !(newtagset &1 << i); i++) ; + pertag.curtag = i + 1; + } + setpertag(); tagset[seltags] = newtagset; tagschanged(); } @@ -815,9 +848,19 @@ toggleview(const char *args[]) { static void view(const char *args[]) { + int i; + unsigned int newtagset = bitoftag(args[0]) & TAGMASK; if (tagset[seltags] != newtagset && newtagset) { seltags ^= 1; /* toggle sel tagset */ + pertag.prevtag = pertag.curtag; + if(args[0] == NULL) + pertag.curtag = 0; + else { + for (i = 0; (i < LENGTH(tags)) && (tags[i] != args[0]); i++) ; + pertag.curtag = i + 1; + } + setpertag(); tagset[seltags] = newtagset; tagschanged(); } @@ -825,7 +868,13 @@ view(const char *args[]) { static void viewprevtag(const char *args[]) { + unsigned int tmptag; + seltags ^= 1; + tmptag = pertag.prevtag; + pertag.prevtag = pertag.curtag; + pertag.curtag = tmptag; + setpertag(); tagschanged(); } @@ -869,6 +918,20 @@ mouse_setup(void) { #endif /* CONFIG_MOUSE */ } +static void +initpertag(void) { + int i; + + pertag.curtag = pertag.prevtag = 1; + for(i=0; i <= LENGTH(tags); i++) { + pertag.nmasters[i] = screen.nmaster; + pertag.mfacts[i] = screen.mfact; + pertag.layouts[i] = layout; + pertag.barpos[i] = bar.pos; + pertag.barlastpos[i] = bar.lastpos; + } +} + static bool checkshell(const char *shell) { if (shell == NULL || *shell == '\0' || *shell != '/') @@ -914,6 +977,7 @@ setup(void) { } colors[i].pair = vt_color_reserve(colors[i].fg, colors[i].bg); } + initpertag(); resize_screen(); struct sigaction sa; sa.sa_flags = 0; @@ -1242,6 +1306,7 @@ setlayout(const char *args[]) { return; layout = &layouts[i]; } + pertag.layouts[pertag.curtag] = layout; arrange(); } @@ -1262,6 +1327,7 @@ incnmaster(const char *args[]) { if (screen.nmaster < 1) screen.nmaster = 1; } + pertag.nmasters[pertag.curtag] = screen.nmaster; arrange(); } @@ -1284,6 +1350,7 @@ setmfact(const char *args[]) { else if (screen.mfact > 0.9) screen.mfact = 0.9; } + pertag.mfacts[pertag.curtag] = screen.mfact; arrange(); } @@ -1308,10 +1375,10 @@ static void togglebarpos(const char *args[]) { switch (bar.pos == BAR_OFF ? bar.lastpos : bar.pos) { case BAR_TOP: - bar.pos = BAR_BOTTOM; + bar.pos = pertag.barpos[pertag.curtag] = BAR_BOTTOM; break; case BAR_BOTTOM: - bar.pos = BAR_TOP; + bar.pos = pertag.barpos[pertag.curtag] = BAR_TOP; break; } updatebarpos();