feat: initial metaworkspace implementation
This commit is contained in:
parent
9724383228
commit
4607399dc8
2 changed files with 165 additions and 83 deletions
144
config.h
144
config.h
|
@ -1,5 +1,6 @@
|
||||||
/* appearance */
|
/* appearance */
|
||||||
#include <X11/X.h>
|
#include <X11/X.h>
|
||||||
|
#include <X11/Xutil.h>
|
||||||
static const unsigned int borderpx = 2;
|
static const unsigned int borderpx = 2;
|
||||||
static const unsigned int snap = 0;
|
static const unsigned int snap = 0;
|
||||||
static const unsigned int swallowfloating = 0;
|
static const unsigned int swallowfloating = 0;
|
||||||
|
@ -34,6 +35,8 @@ static const unsigned int alphas[][3] = {
|
||||||
|
|
||||||
/* tagging */
|
/* tagging */
|
||||||
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
|
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
|
||||||
|
static const char *metaworkspaces[] = { "1", "2", "3", "4" };
|
||||||
|
|
||||||
static const Rule rules[] = {
|
static const Rule rules[] = {
|
||||||
/* xprop(1):
|
/* xprop(1):
|
||||||
* WM_CLASS(STRING) = instance, class
|
* WM_CLASS(STRING) = instance, class
|
||||||
|
@ -86,79 +89,96 @@ static const char *termcmd[] = { "alacritty", NULL };
|
||||||
static const Key keys[] = {
|
static const Key keys[] = {
|
||||||
/* modifier key function argument */
|
/* modifier key function argument */
|
||||||
// movement
|
// movement
|
||||||
{ MODKEY, XK_d, spawn, {.v = dmenucmd } },
|
|
||||||
{ MODKEY, XK_Return, spawn, {.v = termcmd } },
|
|
||||||
{ MODKEY, XK_b, togglebar, {0} },
|
|
||||||
{ MODKEY, XK_j, focusstack, {.i = +1 } },
|
|
||||||
{ MODKEY, XK_k, focusstack, {.i = -1 } },
|
|
||||||
// { MODKEY|ShiftMask, XK_l, incnmaster, {.i = +1 } },
|
// { MODKEY|ShiftMask, XK_l, incnmaster, {.i = +1 } },
|
||||||
// { MODKEY|ShiftMask, XK_h, incnmaster, {.i = -1 } },
|
// { MODKEY|ShiftMask, XK_h, incnmaster, {.i = -1 } },
|
||||||
{ MODKEY, XK_n, setmfact, {.f = -0.05} },
|
{ MODKEY, XK_d, spawn, {.v = dmenucmd } },
|
||||||
{ MODKEY, XK_m, setmfact, {.f = +0.05} },
|
{ MODKEY, XK_Return, spawn, {.v = termcmd } },
|
||||||
{ MODKEY, XK_c, zoom, {0} },
|
{ MODKEY, XK_b, togglebar, {0} },
|
||||||
{ MODKEY, XK_Tab, view, {0} },
|
{ MODKEY, XK_j, focusstack, {.i = +1 } },
|
||||||
{ MODKEY, XK_q, killclient, {0} },
|
{ MODKEY, XK_k, focusstack, {.i = -1 } },
|
||||||
|
{ MODKEY, XK_n, setmfact, {.f = -0.05} },
|
||||||
|
{ MODKEY, XK_m, setmfact, {.f = +0.05} },
|
||||||
|
{ MODKEY, XK_c, zoom, {0} },
|
||||||
|
{ MODKEY, XK_Tab, view, {0} },
|
||||||
|
{ MODKEY, XK_q, killclient, {0} },
|
||||||
|
|
||||||
// layout
|
// layout
|
||||||
{ MODKEY, XK_u, setlayout, {.v = &layouts[0]} },
|
{ MODKEY, XK_u, setlayout, {.v = &layouts[0]} },
|
||||||
{ MODKEY, XK_y, setlayout, {.v = &layouts[1]} },
|
{ MODKEY, XK_y, setlayout, {.v = &layouts[1]} },
|
||||||
{ MODKEY|ControlMask, XK_m, setlayout, {.v = &layouts[2]} },
|
{ MODKEY|ControlMask, XK_m, setlayout, {.v = &layouts[2]} },
|
||||||
{ MODKEY|ControlMask|ShiftMask, XK_m, setlayout, {.v = &layouts[3]} },
|
{ MODKEY|ControlMask|ShiftMask, XK_m, setlayout, {.v = &layouts[3]} },
|
||||||
{ MODKEY, XK_f, togglefullscr, {0} },
|
{ MODKEY, XK_f, togglefullscr, {0} },
|
||||||
{ MODKEY|ShiftMask, XK_f, togglefloating, {0} },
|
{ MODKEY|ShiftMask, XK_f, togglefloating, {0} },
|
||||||
{ MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } },
|
{ MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } },
|
||||||
{ MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } },
|
{ MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } },
|
||||||
{ MODKEY, XK_0, view, {.ui = ~0 } },
|
{ MODKEY, XK_0, view, {.ui = ~0 } },
|
||||||
{ MODKEY|ControlMask, XK_0, tag, {.ui = ~0 } },
|
{ MODKEY|ControlMask, XK_0, tag, {.ui = ~0 } },
|
||||||
{ MODKEY, XK_p, invertdir, {0} },
|
{ MODKEY, XK_p, invertdir, {0} },
|
||||||
|
|
||||||
|
// metaws
|
||||||
|
{ MODKEY, XK_Page_Up, traversemetaws, {.i = +1} },
|
||||||
|
{ MODKEY, XK_Page_Down, traversemetaws, {.i = -1} },
|
||||||
|
{ MODKEY|Mod1Mask, XK_h, viewmetaws, {.ui = 0} },
|
||||||
|
{ MODKEY|Mod1Mask, XK_j, viewmetaws, {.ui = 1} },
|
||||||
|
{ MODKEY|Mod1Mask, XK_k, viewmetaws, {.ui = 2} },
|
||||||
|
{ MODKEY|Mod1Mask, XK_l, viewmetaws, {.ui = 3} },
|
||||||
|
|
||||||
|
{ MODKEY|Mod1Mask|ControlMask, XK_h, tagmetaws, {.i = 0} },
|
||||||
|
{ MODKEY|Mod1Mask|ControlMask, XK_j, tagmetaws, {.i = 1} },
|
||||||
|
{ MODKEY|Mod1Mask|ControlMask, XK_k, tagmetaws, {.i = 2} },
|
||||||
|
{ MODKEY|Mod1Mask|ControlMask, XK_l, tagmetaws, {.i = 3} },
|
||||||
|
{ MODKEY|Mod1Mask|ControlMask, XK_m, tagmetaws, {.i = -1} },
|
||||||
|
|
||||||
// apps
|
// apps
|
||||||
{ MODKEY, XK_w, spawn, SHCMD("firefox") },
|
{ MODKEY, XK_w, spawn, SHCMD("firefox") },
|
||||||
{ MODKEY|ShiftMask, XK_p, spawn, SHCMD("cast") },
|
{ MODKEY|ShiftMask, XK_p, spawn, SHCMD("cast") },
|
||||||
{ MODKEY, XK_t, spawn, SHCMD("ayugram-desktop") },
|
{ MODKEY, XK_t, spawn, SHCMD("ayugram-desktop") },
|
||||||
{ MODKEY|ShiftMask, XK_s, spawn, SHCMD("flameshot", "gui") },
|
{ MODKEY|ShiftMask, XK_s, spawn, SHCMD("flameshot", "gui") },
|
||||||
{ MODKEY, XK_i, spawn, SHCMD("dunstctl", "history-pop") },
|
{ MODKEY, XK_i, spawn, SHCMD("dunstctl", "history-pop") },
|
||||||
{ MODKEY, XK_o, spawn, SHCMD("dunstctl", "close") },
|
{ MODKEY, XK_o, spawn, SHCMD("dunstctl", "close") },
|
||||||
{ MODKEY|ShiftMask, XK_i, spawn, SHCMD("dunstctl", "set-paused", "false") },
|
{ MODKEY|ShiftMask, XK_i, spawn, SHCMD("dunstctl", "set-paused", "false") },
|
||||||
{ MODKEY|ShiftMask, XK_o, spawn, SHCMD("dunstctl", "set-paused", "true") },
|
{ MODKEY|ShiftMask, XK_o, spawn, SHCMD("dunstctl", "set-paused", "true") },
|
||||||
{ MODKEY|ShiftMask, XK_r, spawn, SHCMD("xr") },
|
{ MODKEY|ShiftMask, XK_r, spawn, SHCMD("xr") },
|
||||||
{ MODKEY, XK_x, spawn, SHCMD("vesktop") },
|
{ MODKEY, XK_x, spawn, SHCMD("vesktop") },
|
||||||
{ MODKEY, XK_v, spawn, SHCMD("vpn", "-d", "--visual") },
|
{ MODKEY, XK_v, spawn, SHCMD("vpn", "-d", "--visual") },
|
||||||
{ MODKEY|ShiftMask, XK_v, spawn, SHCMD("vpn", "--visual") },
|
{ MODKEY|ShiftMask, XK_v, spawn, SHCMD("vpn", "--visual") },
|
||||||
|
|
||||||
// tags
|
// tags
|
||||||
TAGKEYS( XK_1, 0)
|
TAGKEYS( XK_1, 0)
|
||||||
TAGKEYS( XK_2, 1)
|
TAGKEYS( XK_2, 1)
|
||||||
TAGKEYS( XK_3, 2)
|
TAGKEYS( XK_3, 2)
|
||||||
TAGKEYS( XK_4, 3)
|
TAGKEYS( XK_4, 3)
|
||||||
TAGKEYS( XK_5, 4)
|
TAGKEYS( XK_5, 4)
|
||||||
TAGKEYS( XK_6, 5)
|
TAGKEYS( XK_6, 5)
|
||||||
TAGKEYS( XK_7, 6)
|
TAGKEYS( XK_7, 6)
|
||||||
TAGKEYS( XK_8, 7)
|
TAGKEYS( XK_8, 7)
|
||||||
TAGKEYS( XK_9, 8)
|
TAGKEYS( XK_9, 8)
|
||||||
{ MODKEY|ShiftMask, XK_q, quit, {0} },
|
{ MODKEY|ShiftMask, XK_q, quit, {0} },
|
||||||
{ MODKEY, XK_h, focusmon, {.i = -1 } },
|
{ MODKEY, XK_h, focusmon, {.i = -1 } },
|
||||||
{ MODKEY, XK_l, focusmon, {.i = +1 } },
|
{ MODKEY, XK_l, focusmon, {.i = +1 } },
|
||||||
{ MODKEY|ControlMask, XK_h, tagmon, {.i = -1 } },
|
{ MODKEY|ControlMask, XK_h, tagmon, {.i = -1 } },
|
||||||
{ MODKEY|ControlMask, XK_l, tagmon, {.i = +1 } },
|
{ MODKEY|ControlMask, XK_l, tagmon, {.i = +1 } },
|
||||||
{ MODKEY|ShiftMask, XK_h, focustagmon, {.i = -1 } },
|
{ MODKEY|ShiftMask, XK_h, focustagmon, {.i = -1 } },
|
||||||
{ MODKEY|ShiftMask, XK_l, focustagmon, {.i = +1 } },
|
{ MODKEY|ShiftMask, XK_l, focustagmon, {.i = +1 } },
|
||||||
};
|
};
|
||||||
|
|
||||||
/* button definitions */
|
/* button definitions */
|
||||||
/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
|
/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, ClkRootWin, or ClkMetaWorkspace */
|
||||||
static const Button buttons[] = {
|
static const Button buttons[] = {
|
||||||
/* click event mask button function argument */
|
/* click event mask button function argument */
|
||||||
{ ClkClientWin, MODKEY, Button1, movemouse, {0} },
|
{ ClkClientWin, MODKEY, Button1, movemouse, {0} },
|
||||||
{ ClkClientWin, MODKEY, Button2, togglefloating, {0} },
|
{ ClkClientWin, MODKEY, Button2, togglefloating, {0} },
|
||||||
{ ClkClientWin, MODKEY, Button3, resizemouse, {0} },
|
{ ClkClientWin, MODKEY, Button3, resizemouse, {0} },
|
||||||
{ ClkClientWin, MODKEY|ControlMask, Button1, resizemouse, {0} },
|
{ ClkClientWin, MODKEY|ControlMask, Button1, resizemouse, {0} },
|
||||||
{ ClkTagBar, 0, Button3, toggleview, {0} },
|
{ ClkTagBar, 0, Button3, toggleview, {0} },
|
||||||
{ ClkTagBar, MODKEY, Button3, toggletag, {0} },
|
{ ClkTagBar, MODKEY, Button3, toggletag, {0} },
|
||||||
|
|
||||||
{ ClkTagBar, 0, Button1, view, {0} },
|
{ ClkTagBar, 0, Button1, view, {0} },
|
||||||
{ ClkTagBar, ShiftMask, Button1, tagview, {0} },
|
{ ClkTagBar, ShiftMask, Button1, tagview, {0} },
|
||||||
{ ClkTagBar, ControlMask, Button1, tag, {0} },
|
{ ClkTagBar, ControlMask, Button1, tag, {0} },
|
||||||
{ ClkTagBar, Mod1Mask, Button1, toggletag, {0} },
|
{ ClkTagBar, Mod1Mask, Button1, toggletag, {0} },
|
||||||
{ ClkTagBar, ControlMask|ShiftMask, Button1, toggleview, {0} },
|
{ ClkTagBar, ControlMask|ShiftMask, Button1, toggleview, {0} },
|
||||||
|
|
||||||
|
{ ClkMwSymbol, 0, Button1, traversemetaws, {.i = +1} },
|
||||||
|
{ ClkMwSymbol, 0, Button3, traversemetaws, {.i = -1} },
|
||||||
};
|
};
|
||||||
|
|
104
dwm.c
104
dwm.c
|
@ -55,7 +55,7 @@
|
||||||
#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
|
#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
|
||||||
#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \
|
#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \
|
||||||
* MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy)))
|
* MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy)))
|
||||||
#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]))
|
#define ISVISIBLE(C) ((C->tags[metaws] & C->mon->tagset[C->mon->seltags]))
|
||||||
#define LENGTH(X) (sizeof X / sizeof X[0])
|
#define LENGTH(X) (sizeof X / sizeof X[0])
|
||||||
#define MOUSEMASK (BUTTONMASK|PointerMotionMask)
|
#define MOUSEMASK (BUTTONMASK|PointerMotionMask)
|
||||||
#define WIDTH(X) ((X)->w + 2 * (X)->bw)
|
#define WIDTH(X) ((X)->w + 2 * (X)->bw)
|
||||||
|
@ -72,7 +72,7 @@ enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
|
||||||
NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
|
NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
|
||||||
enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
|
enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
|
||||||
enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
|
enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
|
||||||
ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
|
ClkClientWin, ClkRootWin, ClkLast, ClkMwSymbol }; /* clicks */
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
int i;
|
int i;
|
||||||
|
@ -99,7 +99,7 @@ struct Client {
|
||||||
int oldx, oldy, oldw, oldh;
|
int oldx, oldy, oldw, oldh;
|
||||||
int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid;
|
int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid;
|
||||||
int bw, oldbw;
|
int bw, oldbw;
|
||||||
unsigned int tags;
|
unsigned int tags[32];
|
||||||
int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, isterminal, noswallow;
|
int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, isterminal, noswallow;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
Client *next;
|
Client *next;
|
||||||
|
@ -232,6 +232,7 @@ static void sigterm(int unused);
|
||||||
static int solitary(Client *c);
|
static int solitary(Client *c);
|
||||||
static void spawn(const Arg *arg);
|
static void spawn(const Arg *arg);
|
||||||
static void tag(const Arg *arg);
|
static void tag(const Arg *arg);
|
||||||
|
static void tagmetaws(const Arg *arg);
|
||||||
static void tagview(const Arg *arg);
|
static void tagview(const Arg *arg);
|
||||||
static void tagmon(const Arg *arg);
|
static void tagmon(const Arg *arg);
|
||||||
static void togglebar(const Arg *arg);
|
static void togglebar(const Arg *arg);
|
||||||
|
@ -239,6 +240,7 @@ static void togglefloating(const Arg *arg);
|
||||||
static void togglefullscr(const Arg *arg);
|
static void togglefullscr(const Arg *arg);
|
||||||
static void toggletag(const Arg *arg);
|
static void toggletag(const Arg *arg);
|
||||||
static void toggleview(const Arg *arg);
|
static void toggleview(const Arg *arg);
|
||||||
|
static void traversemetaws(const Arg *arg);
|
||||||
static void unfocus(Client *c, int setfocus);
|
static void unfocus(Client *c, int setfocus);
|
||||||
static void unmanage(Client *c, int destroyed);
|
static void unmanage(Client *c, int destroyed);
|
||||||
static void unmapnotify(XEvent *e);
|
static void unmapnotify(XEvent *e);
|
||||||
|
@ -253,6 +255,7 @@ static void updatetitle(Client *c);
|
||||||
static void updatewindowtype(Client *c);
|
static void updatewindowtype(Client *c);
|
||||||
static void updatewmhints(Client *c);
|
static void updatewmhints(Client *c);
|
||||||
static void view(const Arg *arg);
|
static void view(const Arg *arg);
|
||||||
|
static void viewmetaws(const Arg *arg);
|
||||||
static Client *wintoclient(Window w);
|
static Client *wintoclient(Window w);
|
||||||
static Monitor *wintomon(Window w);
|
static Monitor *wintomon(Window w);
|
||||||
static int xerror(Display *dpy, XErrorEvent *ee);
|
static int xerror(Display *dpy, XErrorEvent *ee);
|
||||||
|
@ -306,6 +309,8 @@ static int useargb = 0;
|
||||||
static Visual *visual;
|
static Visual *visual;
|
||||||
static int depth;
|
static int depth;
|
||||||
static Colormap cmap;
|
static Colormap cmap;
|
||||||
|
static int metaws = 0;
|
||||||
|
static char mwsymbol[128] = {0};
|
||||||
|
|
||||||
static xcb_connection_t *xcon;
|
static xcb_connection_t *xcon;
|
||||||
|
|
||||||
|
@ -327,7 +332,7 @@ applyrules(Client *c)
|
||||||
|
|
||||||
/* rule matching */
|
/* rule matching */
|
||||||
c->isfloating = 0;
|
c->isfloating = 0;
|
||||||
c->tags = 0;
|
c->tags[metaws] = 0;
|
||||||
XGetClassHint(dpy, c->win, &ch);
|
XGetClassHint(dpy, c->win, &ch);
|
||||||
class = ch.res_class ? ch.res_class : broken;
|
class = ch.res_class ? ch.res_class : broken;
|
||||||
instance = ch.res_name ? ch.res_name : broken;
|
instance = ch.res_name ? ch.res_name : broken;
|
||||||
|
@ -341,7 +346,7 @@ applyrules(Client *c)
|
||||||
c->isterminal = r->isterminal;
|
c->isterminal = r->isterminal;
|
||||||
c->noswallow = r->noswallow;
|
c->noswallow = r->noswallow;
|
||||||
c->isfloating = r->isfloating;
|
c->isfloating = r->isfloating;
|
||||||
c->tags |= r->tags;
|
c->tags[metaws] |= r->tags;
|
||||||
for (m = mons; m && m->num != r->monitor; m = m->next);
|
for (m = mons; m && m->num != r->monitor; m = m->next);
|
||||||
if (m)
|
if (m)
|
||||||
c->mon = m;
|
c->mon = m;
|
||||||
|
@ -351,7 +356,7 @@ applyrules(Client *c)
|
||||||
XFree(ch.res_class);
|
XFree(ch.res_class);
|
||||||
if (ch.res_name)
|
if (ch.res_name)
|
||||||
XFree(ch.res_name);
|
XFree(ch.res_name);
|
||||||
c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags];
|
c->tags[metaws] = c->tags[metaws] & TAGMASK ? c->tags[metaws] & TAGMASK : c->mon->tagset[c->mon->seltags];
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -534,11 +539,16 @@ buttonpress(XEvent *e)
|
||||||
focus(NULL);
|
focus(NULL);
|
||||||
}
|
}
|
||||||
if (ev->window == selmon->barwin) {
|
if (ev->window == selmon->barwin) {
|
||||||
i = x = 0;
|
i = 0;
|
||||||
|
x = TEXTW(mwsymbol);
|
||||||
|
|
||||||
do
|
do
|
||||||
x += TEXTW(tags[i]);
|
x += TEXTW(tags[i]);
|
||||||
while (ev->x >= x && ++i < LENGTH(tags));
|
while (ev->x >= x && ++i < LENGTH(tags));
|
||||||
if (i < LENGTH(tags)) {
|
|
||||||
|
if (ev->x < TEXTW(mwsymbol))
|
||||||
|
click = ClkMwSymbol;
|
||||||
|
else if (i < LENGTH(tags)) {
|
||||||
click = ClkTagBar;
|
click = ClkTagBar;
|
||||||
arg.ui = 1 << i;
|
arg.ui = 1 << i;
|
||||||
} else if (ev->x < x + TEXTW(selmon->ltsymbol))
|
} else if (ev->x < x + TEXTW(selmon->ltsymbol))
|
||||||
|
@ -555,7 +565,7 @@ buttonpress(XEvent *e)
|
||||||
}
|
}
|
||||||
for (i = 0; i < LENGTH(buttons); i++)
|
for (i = 0; i < LENGTH(buttons); i++)
|
||||||
if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button
|
if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button
|
||||||
&& CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state))
|
&& CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state))
|
||||||
buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg);
|
buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -808,7 +818,7 @@ dirtomon(int dir)
|
||||||
void
|
void
|
||||||
drawbar(Monitor *m)
|
drawbar(Monitor *m)
|
||||||
{
|
{
|
||||||
int x, w, tw = 0;
|
int w, x = 0, tw = 0;
|
||||||
int boxs = drw->fonts->h / 9;
|
int boxs = drw->fonts->h / 9;
|
||||||
int boxw = drw->fonts->h / 6 + 2;
|
int boxw = drw->fonts->h / 6 + 2;
|
||||||
unsigned int i, occ = 0, urg = 0;
|
unsigned int i, occ = 0, urg = 0;
|
||||||
|
@ -818,32 +828,38 @@ drawbar(Monitor *m)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* draw status first so it can be overdrawn by tags later */
|
/* draw status first so it can be overdrawn by tags later */
|
||||||
|
drw_setscheme(drw, scheme[SchemeNorm]);
|
||||||
if (m == selmon) { /* status is only drawn on selected monitor */
|
if (m == selmon) { /* status is only drawn on selected monitor */
|
||||||
drw_setscheme(drw, scheme[SchemeNorm]);
|
|
||||||
tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
|
tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
|
||||||
drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0);
|
drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (c = m->clients; c; c = c->next) {
|
for (c = m->clients; c; c = c->next) {
|
||||||
occ |= c->tags;
|
occ |= c->tags[metaws];
|
||||||
if (c->isurgent)
|
if (c->isurgent)
|
||||||
urg |= c->tags;
|
urg |= c->tags[metaws];
|
||||||
}
|
}
|
||||||
x = 0;
|
|
||||||
|
w = TEXTW(mwsymbol);
|
||||||
|
x = drw_text(drw, x, 0, w, bh, lrpad / 2, mwsymbol, 0);
|
||||||
|
|
||||||
for (i = 0; i < LENGTH(tags); i++) {
|
for (i = 0; i < LENGTH(tags); i++) {
|
||||||
w = TEXTW(tags[i]);
|
w = TEXTW(tags[i]);
|
||||||
drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]);
|
drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]);
|
||||||
drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i);
|
drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i);
|
||||||
if (occ & 1 << i)
|
if (occ & 1 << i)
|
||||||
drw_rect(drw, x + boxs, boxs, boxw, boxw,
|
drw_rect(drw, x + boxs, boxs, boxw, boxw,
|
||||||
m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
|
m == selmon && selmon->sel && selmon->sel->tags[metaws] & 1 << i,
|
||||||
urg & 1 << i);
|
urg & 1 << i);
|
||||||
x += w;
|
x += w;
|
||||||
}
|
}
|
||||||
|
|
||||||
w = TEXTW(m->ltsymbol);
|
w = TEXTW(m->ltsymbol);
|
||||||
|
|
||||||
drw_setscheme(drw, scheme[SchemeNorm]);
|
drw_setscheme(drw, scheme[SchemeNorm]);
|
||||||
x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
|
x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
|
||||||
|
|
||||||
|
|
||||||
if ((w = m->ww - tw - x) > bh) {
|
if ((w = m->ww - tw - x) > bh) {
|
||||||
if (m->sel) {
|
if (m->sel) {
|
||||||
drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
|
drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
|
||||||
|
@ -1187,7 +1203,7 @@ manage(Window w, XWindowAttributes *wa)
|
||||||
updatetitle(c);
|
updatetitle(c);
|
||||||
if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) {
|
if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) {
|
||||||
c->mon = t->mon;
|
c->mon = t->mon;
|
||||||
c->tags = t->tags;
|
c->tags[metaws] = t->tags[metaws];
|
||||||
} else {
|
} else {
|
||||||
c->mon = selmon;
|
c->mon = selmon;
|
||||||
applyrules(c);
|
applyrules(c);
|
||||||
|
@ -1271,7 +1287,7 @@ monocle(Monitor *m)
|
||||||
|
|
||||||
for (c = m->clients; c; c = c->next)
|
for (c = m->clients; c; c = c->next)
|
||||||
if (ISVISIBLE(c))
|
if (ISVISIBLE(c))
|
||||||
n++;
|
++n;
|
||||||
if (n > 0) /* override layout symbol */
|
if (n > 0) /* override layout symbol */
|
||||||
snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n);
|
snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n);
|
||||||
for (c = nexttiled(m->clients); c; c = nexttiled(c->next))
|
for (c = nexttiled(m->clients); c; c = nexttiled(c->next))
|
||||||
|
@ -1591,7 +1607,7 @@ sendmon(Client *c, Monitor *m)
|
||||||
Client *pc = selmon->stack;
|
Client *pc = selmon->stack;
|
||||||
|
|
||||||
c->mon = m;
|
c->mon = m;
|
||||||
c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
|
c->tags[metaws] = m->tagset[m->seltags]; /* assign tags of target monitor */
|
||||||
|
|
||||||
if (m->spawnmaster)
|
if (m->spawnmaster)
|
||||||
attach(c);
|
attach(c);
|
||||||
|
@ -1783,6 +1799,7 @@ setup(void)
|
||||||
scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
|
scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
|
||||||
for (i = 0; i < LENGTH(colors); i++)
|
for (i = 0; i < LENGTH(colors); i++)
|
||||||
scheme[i] = drw_scm_create(drw, colors[i], alphas[i], 3);
|
scheme[i] = drw_scm_create(drw, colors[i], alphas[i], 3);
|
||||||
|
snprintf(mwsymbol, LENGTH(mwsymbol), "[%s]", metaworkspaces[metaws]);
|
||||||
/* init bars */
|
/* init bars */
|
||||||
updatebars();
|
updatebars();
|
||||||
updatestatus();
|
updatestatus();
|
||||||
|
@ -1890,12 +1907,34 @@ void
|
||||||
tag(const Arg *arg)
|
tag(const Arg *arg)
|
||||||
{
|
{
|
||||||
if (selmon->sel && arg->ui & TAGMASK) {
|
if (selmon->sel && arg->ui & TAGMASK) {
|
||||||
selmon->sel->tags = arg->ui & TAGMASK;
|
selmon->sel->tags[metaws] = arg->ui & TAGMASK;
|
||||||
focus(NULL);
|
focus(NULL);
|
||||||
arrange(selmon);
|
arrange(selmon);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
tagmetaws(const Arg *arg)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
unsigned int ot;
|
||||||
|
|
||||||
|
if (!selmon->sel || arg->i >= (int)LENGTH(metaworkspaces))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (arg->i == -1)
|
||||||
|
for (i = 0; i < LENGTH(metaworkspaces); ++i)
|
||||||
|
selmon->sel->tags[i] = selmon->sel->tags[metaws];
|
||||||
|
else {
|
||||||
|
ot = selmon->sel->tags[metaws];
|
||||||
|
for (i = 0; i < LENGTH(metaworkspaces); ++i)
|
||||||
|
selmon->sel->tags[i] = 0;
|
||||||
|
selmon->sel->tags[arg->i] = ot;
|
||||||
|
}
|
||||||
|
focus(NULL);
|
||||||
|
arrange(selmon);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
tagmon(const Arg *arg)
|
tagmon(const Arg *arg)
|
||||||
{
|
{
|
||||||
|
@ -1963,9 +2002,9 @@ toggletag(const Arg *arg)
|
||||||
|
|
||||||
if (!selmon->sel)
|
if (!selmon->sel)
|
||||||
return;
|
return;
|
||||||
newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
|
newtags = selmon->sel->tags[metaws] ^ (arg->ui & TAGMASK);
|
||||||
if (newtags) {
|
if (newtags) {
|
||||||
selmon->sel->tags = newtags;
|
selmon->sel->tags[metaws] = newtags;
|
||||||
focus(NULL);
|
focus(NULL);
|
||||||
arrange(selmon);
|
arrange(selmon);
|
||||||
}
|
}
|
||||||
|
@ -1983,6 +2022,17 @@ toggleview(const Arg *arg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
traversemetaws(const Arg *arg)
|
||||||
|
{
|
||||||
|
if (!arg->i) return;
|
||||||
|
metaws = (metaws + arg->i + (LENGTH(metaworkspaces))) % LENGTH(metaworkspaces);
|
||||||
|
snprintf(mwsymbol, LENGTH(mwsymbol), "[%s]", metaworkspaces[metaws]);
|
||||||
|
focus(NULL);
|
||||||
|
arrange(NULL);
|
||||||
|
drawbars();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
unfocus(Client *c, int setfocus)
|
unfocus(Client *c, int setfocus)
|
||||||
{
|
{
|
||||||
|
@ -2307,6 +2357,18 @@ view(const Arg *arg)
|
||||||
arrange(selmon);
|
arrange(selmon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
viewmetaws(const Arg *arg)
|
||||||
|
{
|
||||||
|
if (arg->ui < LENGTH(metaworkspaces)) {
|
||||||
|
metaws = arg->ui;
|
||||||
|
snprintf(mwsymbol, LENGTH(mwsymbol), "[%s]", metaworkspaces[metaws]);
|
||||||
|
focus(NULL);
|
||||||
|
arrange(NULL);
|
||||||
|
drawbars();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pid_t
|
pid_t
|
||||||
winpid(Window w)
|
winpid(Window w)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue