diff --git a/config.h b/config.h index 1f3bd8b..e620afa 100644 --- a/config.h +++ b/config.h @@ -47,7 +47,7 @@ static const Rule rules[] = { { "Alacritty", NULL, NULL, 0, 0, 1, 0, -1, 0 }, { "floating", NULL, NULL, 0, 1, 0, 0, -1, 0 }, { "Spotify", "spotify", NULL, 128, 0, 0, 0, 0, 1 }, - { "AyuGramDesktop", "ayugram-desktop", NULL, 256, 0, 0, 0, 0, 1 }, + { "TelegramDesktop", "telegram-desktop", NULL, 256, 0, 0, 0, 0, 1 }, }; @@ -61,7 +61,6 @@ static const int spawnmaster = 0; #define FORCE_VSPLIT 1 #include "vanitygaps.c" -static const int draw_ltsymbol = 0; static const Layout layouts[] = { /* symbol reverse function */ { "", "", tile }, @@ -118,7 +117,7 @@ static const Key keys[] = { // apps { MODKEY, XK_w, spawn, SHCMD("firefox") }, - { MODKEY, XK_t, spawn, SHCMD("ayugram-desktop") }, + { MODKEY, XK_t, spawn, SHCMD("telegram-desktop") }, { MODKEY|ShiftMask, XK_s, spawn, SHCMD("flameshot", "gui") }, { MODKEY|ShiftMask, XK_r, spawn, SHCMD("xr") }, @@ -140,6 +139,8 @@ static const Key keys[] = { { MODKEY|ShiftMask, XK_Down, spawn, SHCMD("volume", "-1") }, { MODKEY, XK_Up, spawn, SHCMD("volume", "+5") }, { MODKEY, XK_Down, spawn, SHCMD("volume", "-5") }, + { MODKEY, XK_y, setlayout, {.v = &layouts[0]} }, + { MODKEY|ShiftMask, XK_y, setlayout, {.v = &layouts[2]} }, // tags TAGKEYS( XK_1, 0) diff --git a/dwm.c b/dwm.c index 4031bab..7850da6 100644 --- a/dwm.c +++ b/dwm.c @@ -137,7 +137,6 @@ struct Monitor { int gappoh; /* horizontal outer gaps */ int gappov; /* vertical outer gaps */ unsigned int seltags[MAX_METAWS]; - unsigned int sellt; unsigned int tagset[MAX_METAWS][2]; int showbar; int topbar; @@ -147,7 +146,7 @@ struct Monitor { Client *stack; Monitor *next; Window barwin; - const Layout *lt[2]; + const Layout *lts[MAX_METAWS][32]; }; typedef struct { @@ -194,6 +193,8 @@ static void focusmon(const Arg *arg); static void focusstack(const Arg *arg); static void focustagmon(const Arg *arg); static Atom getatomprop(Client *c, Atom prop); +static int getcurrenttag(const Monitor *m); +static const Layout *getlayout(const Monitor *m); static int getrootptr(int *x, int *y); static long getstate(Window w); static int gettextprop(Window w, Atom atom, char *text, unsigned int size); @@ -226,6 +227,7 @@ static void sendmon(Client *c, Monitor *m); static void setclientstate(Client *c, long state); static void setfocus(Client *c); static void setfullscreen(Client *c, int fullscreen); +static void setgloballayout(const Layout *lt, Monitor *m); static void setlayout(const Arg *arg); static void setcfact(const Arg *arg); static void setmfact(const Arg *arg); @@ -400,7 +402,7 @@ applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact) *h = bh; if (*w < bh) *w = bh; - if (resizehints || c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) { + if (resizehints || c->isfloating || !getlayout(c->mon)->arrange) { if (!c->hintsvalid) updatesizehints(c); /* see last two sentences in ICCCM 4.1.2.3 */ @@ -455,10 +457,11 @@ arrange(Monitor *m) void arrangemon(Monitor *m) { - const char *symbol = m->spawnmaster ? selmon->lt[selmon->sellt]->symbol : selmon->lt[selmon->sellt]->symbolrev; - strncpy(selmon->ltsymbol, symbol, sizeof selmon->ltsymbol); - if (m->lt[m->sellt]->arrange) - m->lt[m->sellt]->arrange(m); + const Layout *lt = getlayout(m); + const char *symbol = m->spawnmaster ? lt->symbol : lt->symbolrev; + strncpy(m->ltsymbol, symbol, sizeof m->ltsymbol); + if (lt->arrange) + lt->arrange(m); } void @@ -565,7 +568,7 @@ buttonpress(XEvent *e) else if (i < LENGTH(tags)) { click = ClkTagBar; arg.ui = 1 << i; - } else if (ev->x < x + TEXTW(selmon->ltsymbol) && draw_ltsymbol) + } else if (ev->x < x + TEXTW(selmon->ltsymbol) && *selmon->ltsymbol != '\0') click = ClkLtSymbol; else if (ev->x > selmon->ww - (int)TEXTW(stext)) click = ClkStatusText; @@ -603,7 +606,7 @@ cleanup(void) size_t i; view(&a); - selmon->lt[selmon->sellt] = &foo; + setgloballayout(&foo, selmon); for (m = mons; m; m = m->next) while (m->stack) unmanage(m->stack, 0); @@ -715,7 +718,7 @@ configurerequest(XEvent *e) if ((c = wintoclient(ev->window))) { if (ev->value_mask & CWBorderWidth) c->bw = ev->border_width; - else if (c->isfloating || !selmon->lt[selmon->sellt]->arrange) { + else if (c->isfloating || !getlayout(selmon)->arrange) { m = c->mon; if (ev->value_mask & CWX) { c->oldx = c->x; @@ -776,8 +779,7 @@ createmon(void) m->gappiv = gappiv; m->gappoh = gappoh; m->gappov = gappov; - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; + setgloballayout(&layouts[0], m); m->spawnmaster = spawnmaster; strncpy(m->ltsymbol, symbol, sizeof m->ltsymbol); return m; @@ -882,7 +884,7 @@ drawbar(Monitor *m) drw_setscheme(drw, scheme[SchemeNorm]); - if (draw_ltsymbol) { + if (*m->ltsymbol != '\0') { w = TEXTW(m->ltsymbol); x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); } @@ -1045,6 +1047,24 @@ getatomprop(Client *c, Atom prop) return atom; } +int +getcurrenttag(const Monitor *m) +{ + int counter = 0; + unsigned int seltags = m->tagset[metaws][m->seltags[metaws]]; + + while (((seltags & 0x1) == 0) && (seltags >>= 1)) + ++counter; + return seltags == 1 ? counter : -1; +} + +const Layout* +getlayout(const Monitor *m) +{ + int tag = getcurrenttag(m); + return tag != -1 ? m->lts[metaws][tag] : &layouts[0]; +} + int getrootptr(int *x, int *y) { @@ -1156,7 +1176,8 @@ static void invertdir(const Arg *arg) { selmon->spawnmaster = !selmon->spawnmaster; - const char *symbol = selmon->spawnmaster ? selmon->lt[selmon->sellt]->symbol : selmon->lt[selmon->sellt]->symbolrev; + const Layout *lt = getlayout(selmon); + const char *symbol = selmon->spawnmaster ? lt->symbol : lt->symbolrev; strncpy(selmon->ltsymbol, symbol, sizeof selmon->ltsymbol); if (selmon->sel) @@ -1384,10 +1405,10 @@ movemouse(const Arg *arg) ny = selmon->wy; else if (abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap) ny = selmon->wy + selmon->wh - HEIGHT(c); - if (!c->isfloating && selmon->lt[selmon->sellt]->arrange + if (!c->isfloating && getlayout(selmon)->arrange && (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) togglefloating(NULL); - if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) + if (!getlayout(selmon)->arrange || c->isfloating) resize(c, nx, ny, c->w, c->h, 1); break; } @@ -1552,11 +1573,11 @@ resizemouse(const Arg *arg) if (c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww && c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh) { - if (!c->isfloating && selmon->lt[selmon->sellt]->arrange + if (!c->isfloating && getlayout(selmon)->arrange && (abs(nw - c->w) > snap || abs(nh - c->h) > snap)) togglefloating(NULL); } - if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) + if (!getlayout(selmon)->arrange || c->isfloating) resize(c, c->x, c->y, nw, nh, 1); break; } @@ -1581,9 +1602,9 @@ restack(Monitor *m) drawbar(m); if (!m->sel) return; - if (m->sel->isfloating || !m->lt[m->sellt]->arrange) + if (m->sel->isfloating || !getlayout(m)->arrange) XRaiseWindow(dpy, m->sel->win); - if (m->lt[m->sellt]->arrange) { + if (getlayout(m)->arrange) { wc.stack_mode = Below; wc.sibling = m->barwin; for (c = m->stack; c; c = c->snext) @@ -1742,18 +1763,37 @@ setfullscreen(Client *c, int fullscreen) } void -setlayout(const Arg *arg) +setgloballayout(const Layout *lt, Monitor *m) { - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) - selmon->sellt ^= 1; - if (arg && arg->v) - selmon->lt[selmon->sellt] = (Layout *)arg->v; - const char *symbol = selmon->spawnmaster ? selmon->lt[selmon->sellt]->symbol : selmon->lt[selmon->sellt]->symbolrev; - strncpy(selmon->ltsymbol, symbol, sizeof selmon->ltsymbol); - if (selmon->sel) + int i, j; + for (i = 0; i < MAX_METAWS; ++i) + for (j = 0; j < 32; ++j) + m->lts[i][j] = lt; +} + +void +setlayout(const Arg *arg) // TODO: fix +{ + int tag; + + if (!arg || !arg->v) + return; + + tag = getcurrenttag(selmon); + if (tag == -1) + return; + + const Layout *lt = arg->v; + selmon->lts[metaws][tag] = arg->v; + if (selmon->sel) { arrange(selmon); - else + focus(selmon->sel); + } + else { + const char *symbol = selmon->spawnmaster ? lt->symbol : lt->symbolrev; + strncpy(selmon->ltsymbol, symbol, sizeof selmon->ltsymbol); drawbar(selmon); + } } void @@ -1763,7 +1803,7 @@ setcfact(const Arg *arg) { c = selmon->sel; - if(!arg || !c || !selmon->lt[selmon->sellt]->arrange) + if(!arg || !c || !getlayout(selmon)->arrange) return; f = arg->f + c->cfact; if(arg->f == 0.0) @@ -1780,7 +1820,7 @@ setmfact(const Arg *arg) { float f; - if (!arg || !selmon->lt[selmon->sellt]->arrange) + if (!arg || !getlayout(selmon)->arrange) return; f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; if (f < 0.05 || f > 0.95) @@ -1892,7 +1932,7 @@ showhide(Client *c) if (ISVISIBLE(c)) { /* show clients top down */ XMoveWindow(dpy, c->win, c->x, c->y); - if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) + if ((!getlayout(c->mon)->arrange || c->isfloating) && !c->isfullscreen) resize(c, c->x, c->y, c->w, c->h, 0); showhide(c->snext); } else { @@ -1906,9 +1946,9 @@ int solitary(Client *c) { return ((nexttiled(c->mon->clients) == c && !nexttiled(c->next)) - || &monocle == c->mon->lt[c->mon->sellt]->arrange) + || &monocle == getlayout(c->mon)->arrange) && !c->isfullscreen && !c->isfloating - && NULL != c->mon->lt[c->mon->sellt]->arrange; + && NULL != getlayout(c->mon)->arrange; } void @@ -2656,7 +2696,7 @@ zoom(const Arg *arg) { Client *c = selmon->sel; - if (!selmon->lt[selmon->sellt]->arrange || !c || c->isfloating) + if (!getlayout(selmon)->arrange || !c || c->isfloating) return; if (c == nexttiled(selmon->clients) && !(c = nexttiled(c->next))) return;