initial patches
This commit is contained in:
parent
348f6559ab
commit
ebd33761bb
16
config.def.h
16
config.def.h
@ -12,11 +12,15 @@ static const char col_gray2[] = "#444444";
|
|||||||
static const char col_gray3[] = "#bbbbbb";
|
static const char col_gray3[] = "#bbbbbb";
|
||||||
static const char col_gray4[] = "#eeeeee";
|
static const char col_gray4[] = "#eeeeee";
|
||||||
static const char col_cyan[] = "#005577";
|
static const char col_cyan[] = "#005577";
|
||||||
|
static const char col_urgborder[] = "#ff0000";
|
||||||
static const char *colors[][3] = {
|
static const char *colors[][3] = {
|
||||||
/* fg bg border */
|
/* fg bg border */
|
||||||
[SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
|
[SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
|
||||||
[SchemeSel] = { col_gray4, col_cyan, col_cyan },
|
[SchemeSel] = { col_gray4, col_cyan, col_cyan },
|
||||||
|
[SchemeUrg] = { col_gray4, col_cyan, col_urgborder },
|
||||||
};
|
};
|
||||||
|
static const XPoint stickyicon[] = { {0,0}, {4,0}, {4,8}, {2,6}, {0,8}, {0,0} }; /* represents the icon as an array of vertices */
|
||||||
|
static const XPoint stickyiconbb = {4,8}; /* defines the bottom right corner of the polygon's bounding box (speeds up scaling) */
|
||||||
|
|
||||||
/* 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" };
|
||||||
@ -60,6 +64,9 @@ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn()
|
|||||||
static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
|
static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
|
||||||
static const char *termcmd[] = { "st", NULL };
|
static const char *termcmd[] = { "st", NULL };
|
||||||
|
|
||||||
|
/* moving programs up and down the stack */
|
||||||
|
#include "movestack.c"
|
||||||
|
|
||||||
static const Key keys[] = {
|
static const Key keys[] = {
|
||||||
/* modifier key function argument */
|
/* modifier key function argument */
|
||||||
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
|
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
|
||||||
@ -71,6 +78,8 @@ static const Key keys[] = {
|
|||||||
{ MODKEY, XK_d, incnmaster, {.i = -1 } },
|
{ MODKEY, XK_d, incnmaster, {.i = -1 } },
|
||||||
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
|
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
|
||||||
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
|
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
|
||||||
|
{ MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } },
|
||||||
|
{ MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } },
|
||||||
{ MODKEY, XK_Return, zoom, {0} },
|
{ MODKEY, XK_Return, zoom, {0} },
|
||||||
{ MODKEY, XK_Tab, view, {0} },
|
{ MODKEY, XK_Tab, view, {0} },
|
||||||
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
|
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
|
||||||
@ -95,6 +104,7 @@ static const Key keys[] = {
|
|||||||
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|ControlMask|ShiftMask, XK_q, quit, {1} },
|
||||||
};
|
};
|
||||||
|
|
||||||
/* button definitions */
|
/* button definitions */
|
||||||
|
14
config.def.h.rej
Normal file
14
config.def.h.rej
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
diff a/config.def.h b/config.def.h (rejected hunks)
|
||||||
|
@@ -12,10 +12,12 @@ static const char col_gray2[] = "#444444";
|
||||||
|
static const char col_gray3[] = "#bbbbbb";
|
||||||
|
static const char col_gray4[] = "#eeeeee";
|
||||||
|
static const char col_cyan[] = "#005577";
|
||||||
|
+static const char col_urgborder[] = "#ff0000";
|
||||||
|
static const char *colors[][3] = {
|
||||||
|
/* fg bg border */
|
||||||
|
[SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
|
||||||
|
[SchemeSel] = { col_gray4, col_cyan, col_cyan },
|
||||||
|
+ [SchemeUrg] = { col_gray4, col_cyan, col_urgborder },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* tagging */
|
20
drw.c
20
drw.c
@ -235,6 +235,26 @@ drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int
|
|||||||
XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1);
|
XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drw_polygon(Drw *drw, int x, int y, int ow, int oh, int sw, int sh, const XPoint *points, int npoints, int shape, int filled) /* wrapper function to scale and draw a polygon with X11 */
|
||||||
|
{
|
||||||
|
if (!drw || !drw->scheme)
|
||||||
|
return;
|
||||||
|
XSetForeground(drw->dpy, drw->gc, drw->scheme[ColFg].pixel);
|
||||||
|
if (!filled) { /* reduces the scaled width and height by 1 when drawing the outline to compensate for X11 drawing the line 1 pixel over */
|
||||||
|
sw -= 1;
|
||||||
|
sh -= 1;
|
||||||
|
}
|
||||||
|
XPoint scaledpoints[npoints];
|
||||||
|
memcpy(scaledpoints, points, npoints);
|
||||||
|
for (int v = 0; v < npoints; v++)
|
||||||
|
scaledpoints[v] = (XPoint){ .x = points[v].x * sw / ow + x, .y = points[v].y * sh / oh + y };
|
||||||
|
if (filled)
|
||||||
|
XFillPolygon(drw->dpy, drw->drawable, drw->gc, scaledpoints, npoints, shape, CoordModeOrigin); /* Change shape to 'Convex' or 'Complex' in dwm.c if the shape is not 'Nonconvex' */
|
||||||
|
else
|
||||||
|
XDrawLines(drw->dpy, drw->drawable, drw->gc, scaledpoints, npoints, CoordModeOrigin);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert)
|
drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert)
|
||||||
{
|
{
|
||||||
|
1
drw.h
1
drw.h
@ -52,6 +52,7 @@ void drw_setscheme(Drw *drw, Clr *scm);
|
|||||||
|
|
||||||
/* Drawing functions */
|
/* Drawing functions */
|
||||||
void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert);
|
void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert);
|
||||||
|
void drw_polygon(Drw *drw, int x, int y, int ow, int oh, int sw, int sh, const XPoint *points, int npoints, int shape, int filled);
|
||||||
int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert);
|
int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert);
|
||||||
|
|
||||||
/* Map functions */
|
/* Map functions */
|
||||||
|
10
dwm.1
10
dwm.1
@ -142,6 +142,9 @@ Add/remove all windows with nth tag to/from the view.
|
|||||||
.TP
|
.TP
|
||||||
.B Mod1\-Shift\-q
|
.B Mod1\-Shift\-q
|
||||||
Quit dwm.
|
Quit dwm.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-Control\-Shift\-q
|
||||||
|
Restart dwm.
|
||||||
.SS Mouse commands
|
.SS Mouse commands
|
||||||
.TP
|
.TP
|
||||||
.B Mod1\-Button1
|
.B Mod1\-Button1
|
||||||
@ -155,6 +158,13 @@ Resize focused window while dragging. Tiled windows will be toggled to the float
|
|||||||
.SH CUSTOMIZATION
|
.SH CUSTOMIZATION
|
||||||
dwm is customized by creating a custom config.h and (re)compiling the source
|
dwm is customized by creating a custom config.h and (re)compiling the source
|
||||||
code. This keeps it fast, secure and simple.
|
code. This keeps it fast, secure and simple.
|
||||||
|
.SH SIGNALS
|
||||||
|
.TP
|
||||||
|
.B SIGHUP - 1
|
||||||
|
Restart the dwm process.
|
||||||
|
.TP
|
||||||
|
.B SIGTERM - 15
|
||||||
|
Cleanly terminate the dwm process.
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
.BR dmenu (1),
|
.BR dmenu (1),
|
||||||
.BR st (1)
|
.BR st (1)
|
||||||
|
255
dwm.c
255
dwm.c
@ -49,7 +49,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 & C->mon->tagset[C->mon->seltags]) || C->issticky)
|
||||||
#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)
|
||||||
@ -61,7 +61,7 @@
|
|||||||
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
|
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
|
||||||
enum { SchemeNorm, SchemeSel }; /* color schemes */
|
enum { SchemeNorm, SchemeSel }; /* color schemes */
|
||||||
enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
|
enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
|
||||||
NetWMFullscreen, NetActiveWindow, NetWMWindowType,
|
NetWMFullscreen, NetWMSticky, NetActiveWindow, NetWMWindowType,
|
||||||
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,
|
||||||
@ -92,7 +92,7 @@ struct Client {
|
|||||||
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;
|
||||||
int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
|
int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, issticky;
|
||||||
Client *next;
|
Client *next;
|
||||||
Client *snext;
|
Client *snext;
|
||||||
Monitor *mon;
|
Monitor *mon;
|
||||||
@ -111,6 +111,7 @@ typedef struct {
|
|||||||
void (*arrange)(Monitor *);
|
void (*arrange)(Monitor *);
|
||||||
} Layout;
|
} Layout;
|
||||||
|
|
||||||
|
typedef struct Pertag Pertag;
|
||||||
struct Monitor {
|
struct Monitor {
|
||||||
char ltsymbol[16];
|
char ltsymbol[16];
|
||||||
float mfact;
|
float mfact;
|
||||||
@ -130,6 +131,7 @@ struct Monitor {
|
|||||||
Monitor *next;
|
Monitor *next;
|
||||||
Window barwin;
|
Window barwin;
|
||||||
const Layout *lt[2];
|
const Layout *lt[2];
|
||||||
|
Pertag *pertag;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -147,6 +149,7 @@ static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interac
|
|||||||
static void arrange(Monitor *m);
|
static void arrange(Monitor *m);
|
||||||
static void arrangemon(Monitor *m);
|
static void arrangemon(Monitor *m);
|
||||||
static void attach(Client *c);
|
static void attach(Client *c);
|
||||||
|
static void attachbottom(Client *c);
|
||||||
static void attachstack(Client *c);
|
static void attachstack(Client *c);
|
||||||
static void buttonpress(XEvent *e);
|
static void buttonpress(XEvent *e);
|
||||||
static void checkotherwm(void);
|
static void checkotherwm(void);
|
||||||
@ -200,17 +203,21 @@ static void sendmon(Client *c, Monitor *m);
|
|||||||
static void setclientstate(Client *c, long state);
|
static void setclientstate(Client *c, long state);
|
||||||
static void setfocus(Client *c);
|
static void setfocus(Client *c);
|
||||||
static void setfullscreen(Client *c, int fullscreen);
|
static void setfullscreen(Client *c, int fullscreen);
|
||||||
|
static void setsticky(Client *c, int sticky);
|
||||||
static void setlayout(const Arg *arg);
|
static void setlayout(const Arg *arg);
|
||||||
static void setmfact(const Arg *arg);
|
static void setmfact(const Arg *arg);
|
||||||
static void setup(void);
|
static void setup(void);
|
||||||
static void seturgent(Client *c, int urg);
|
static void seturgent(Client *c, int urg);
|
||||||
static void showhide(Client *c);
|
static void showhide(Client *c);
|
||||||
|
static void sighup(int unused);
|
||||||
|
static void sigterm(int unused);
|
||||||
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 tagmon(const Arg *arg);
|
static void tagmon(const Arg *arg);
|
||||||
static void tile(Monitor *m);
|
static void tile(Monitor *m);
|
||||||
static void togglebar(const Arg *arg);
|
static void togglebar(const Arg *arg);
|
||||||
static void togglefloating(const Arg *arg);
|
static void togglefloating(const Arg *arg);
|
||||||
|
static void togglesticky(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 unfocus(Client *c, int setfocus);
|
static void unfocus(Client *c, int setfocus);
|
||||||
@ -227,6 +234,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 warp(const Client *c);
|
||||||
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);
|
||||||
@ -260,6 +268,7 @@ static void (*handler[LASTEvent]) (XEvent *) = {
|
|||||||
[UnmapNotify] = unmapnotify
|
[UnmapNotify] = unmapnotify
|
||||||
};
|
};
|
||||||
static Atom wmatom[WMLast], netatom[NetLast];
|
static Atom wmatom[WMLast], netatom[NetLast];
|
||||||
|
static int restart = 0;
|
||||||
static int running = 1;
|
static int running = 1;
|
||||||
static Cur *cursor[CurLast];
|
static Cur *cursor[CurLast];
|
||||||
static Clr **scheme;
|
static Clr **scheme;
|
||||||
@ -271,6 +280,15 @@ static Window root, wmcheckwin;
|
|||||||
/* configuration, allows nested code to access above variables */
|
/* configuration, allows nested code to access above variables */
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
struct Pertag {
|
||||||
|
unsigned int curtag, prevtag; /* current and previous tag */
|
||||||
|
int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */
|
||||||
|
float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */
|
||||||
|
unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */
|
||||||
|
const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */
|
||||||
|
int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */
|
||||||
|
};
|
||||||
|
|
||||||
/* compile-time check if all tags fit into an unsigned int bit array. */
|
/* compile-time check if all tags fit into an unsigned int bit array. */
|
||||||
struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
|
struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
|
||||||
|
|
||||||
@ -408,6 +426,15 @@ attach(Client *c)
|
|||||||
c->mon->clients = c;
|
c->mon->clients = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
attachbottom(Client *c)
|
||||||
|
{
|
||||||
|
Client **tc;
|
||||||
|
c->next = NULL;
|
||||||
|
for (tc = &c->mon->clients; *tc; tc = &(*tc)->next);
|
||||||
|
*tc = c;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
attachstack(Client *c)
|
attachstack(Client *c)
|
||||||
{
|
{
|
||||||
@ -525,6 +552,10 @@ clientmessage(XEvent *e)
|
|||||||
|| cme->data.l[2] == netatom[NetWMFullscreen])
|
|| cme->data.l[2] == netatom[NetWMFullscreen])
|
||||||
setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */
|
setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */
|
||||||
|| (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen)));
|
|| (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen)));
|
||||||
|
|
||||||
|
if (cme->data.l[1] == netatom[NetWMSticky]
|
||||||
|
|| cme->data.l[2] == netatom[NetWMSticky])
|
||||||
|
setsticky(c, (cme->data.l[0] == 1 || (cme->data.l[0] == 2 && !c->issticky)));
|
||||||
} else if (cme->message_type == netatom[NetActiveWindow]) {
|
} else if (cme->message_type == netatom[NetActiveWindow]) {
|
||||||
if (c != selmon->sel && !c->isurgent)
|
if (c != selmon->sel && !c->isurgent)
|
||||||
seturgent(c, 1);
|
seturgent(c, 1);
|
||||||
@ -634,6 +665,7 @@ Monitor *
|
|||||||
createmon(void)
|
createmon(void)
|
||||||
{
|
{
|
||||||
Monitor *m;
|
Monitor *m;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
m = ecalloc(1, sizeof(Monitor));
|
m = ecalloc(1, sizeof(Monitor));
|
||||||
m->tagset[0] = m->tagset[1] = 1;
|
m->tagset[0] = m->tagset[1] = 1;
|
||||||
@ -644,6 +676,20 @@ createmon(void)
|
|||||||
m->lt[0] = &layouts[0];
|
m->lt[0] = &layouts[0];
|
||||||
m->lt[1] = &layouts[1 % LENGTH(layouts)];
|
m->lt[1] = &layouts[1 % LENGTH(layouts)];
|
||||||
strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
|
strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
|
||||||
|
m->pertag = ecalloc(1, sizeof(Pertag));
|
||||||
|
m->pertag->curtag = m->pertag->prevtag = 1;
|
||||||
|
|
||||||
|
for (i = 0; i <= LENGTH(tags); i++) {
|
||||||
|
m->pertag->nmasters[i] = m->nmaster;
|
||||||
|
m->pertag->mfacts[i] = m->mfact;
|
||||||
|
|
||||||
|
m->pertag->ltidxs[i][0] = m->lt[0];
|
||||||
|
m->pertag->ltidxs[i][1] = m->lt[1];
|
||||||
|
m->pertag->sellts[i] = m->sellt;
|
||||||
|
|
||||||
|
m->pertag->showbars[i] = m->showbar;
|
||||||
|
}
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -698,10 +744,10 @@ dirtomon(int dir)
|
|||||||
void
|
void
|
||||||
drawbar(Monitor *m)
|
drawbar(Monitor *m)
|
||||||
{
|
{
|
||||||
int x, w, tw = 0;
|
int x, w, tw = 0, mw, ew = 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, n = 0;
|
||||||
Client *c;
|
Client *c;
|
||||||
|
|
||||||
if (!m->showbar)
|
if (!m->showbar)
|
||||||
@ -715,6 +761,8 @@ drawbar(Monitor *m)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (c = m->clients; c; c = c->next) {
|
for (c = m->clients; c; c = c->next) {
|
||||||
|
if (ISVISIBLE(c))
|
||||||
|
n++;
|
||||||
occ |= c->tags;
|
occ |= c->tags;
|
||||||
if (c->isurgent)
|
if (c->isurgent)
|
||||||
urg |= c->tags;
|
urg |= c->tags;
|
||||||
@ -735,15 +783,41 @@ drawbar(Monitor *m)
|
|||||||
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 (n > 0) {
|
||||||
drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
|
tw = TEXTW(m->sel->name) + lrpad;
|
||||||
drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
|
mw = (tw >= w || n == 1) ? 0 : (w - tw) / (n - 1);
|
||||||
if (m->sel->isfloating)
|
|
||||||
drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
|
i = 0;
|
||||||
} else {
|
for (c = m->clients; c; c = c->next) {
|
||||||
drw_setscheme(drw, scheme[SchemeNorm]);
|
if (!ISVISIBLE(c) || c == m->sel)
|
||||||
drw_rect(drw, x, 0, w, bh, 1, 1);
|
continue;
|
||||||
|
tw = TEXTW(c->name);
|
||||||
|
if(tw < mw)
|
||||||
|
ew += (mw - tw);
|
||||||
|
else
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (i > 0)
|
||||||
|
mw += ew / i;
|
||||||
|
|
||||||
|
for (c = m->clients; c; c = c->next) {
|
||||||
|
if (!ISVISIBLE(c))
|
||||||
|
continue;
|
||||||
|
tw = MIN(m->sel == c ? w : mw, TEXTW(c->name));
|
||||||
|
|
||||||
|
drw_setscheme(drw, scheme[m == selmon && m->sel == c ? SchemeSel : SchemeNorm]);
|
||||||
|
if (tw > lrpad / 2)
|
||||||
|
drw_text(drw, x, 0, tw, bh, lrpad / 2, c->name, 0);
|
||||||
|
if (c->isfloating)
|
||||||
|
drw_rect(drw, x + boxs, boxs, boxw, boxw, c->isfixed, 0);
|
||||||
|
if (c->issticky)
|
||||||
|
drw_polygon(drw, x + boxs, c->isfloating ? boxs * 2 + boxw : boxs, stickyiconbb.x, stickyiconbb.y, boxw, boxw * stickyiconbb.y / stickyiconbb.x, stickyicon, LENGTH(stickyicon), Nonconvex, c->tags & c->mon->tagset[c->mon->seltags]);
|
||||||
|
x += tw;
|
||||||
|
w -= tw;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
drw_setscheme(drw, scheme[SchemeNorm]);
|
||||||
|
drw_rect(drw, x, 0, w, bh, 1, 1);
|
||||||
}
|
}
|
||||||
drw_map(drw, m->barwin, 0, 0, m->ww, bh);
|
drw_map(drw, m->barwin, 0, 0, m->ww, bh);
|
||||||
}
|
}
|
||||||
@ -833,6 +907,7 @@ focusmon(const Arg *arg)
|
|||||||
unfocus(selmon->sel, 0);
|
unfocus(selmon->sel, 0);
|
||||||
selmon = m;
|
selmon = m;
|
||||||
focus(NULL);
|
focus(NULL);
|
||||||
|
warp(selmon->sel);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -980,7 +1055,7 @@ grabkeys(void)
|
|||||||
void
|
void
|
||||||
incnmaster(const Arg *arg)
|
incnmaster(const Arg *arg)
|
||||||
{
|
{
|
||||||
selmon->nmaster = MAX(selmon->nmaster + arg->i, 0);
|
selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0);
|
||||||
arrange(selmon);
|
arrange(selmon);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1074,7 +1149,7 @@ manage(Window w, XWindowAttributes *wa)
|
|||||||
c->isfloating = c->oldstate = trans != None || c->isfixed;
|
c->isfloating = c->oldstate = trans != None || c->isfixed;
|
||||||
if (c->isfloating)
|
if (c->isfloating)
|
||||||
XRaiseWindow(dpy, c->win);
|
XRaiseWindow(dpy, c->win);
|
||||||
attach(c);
|
attachbottom(c);
|
||||||
attachstack(c);
|
attachstack(c);
|
||||||
XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend,
|
XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend,
|
||||||
(unsigned char *) &(c->win), 1);
|
(unsigned char *) &(c->win), 1);
|
||||||
@ -1258,6 +1333,7 @@ propertynotify(XEvent *e)
|
|||||||
void
|
void
|
||||||
quit(const Arg *arg)
|
quit(const Arg *arg)
|
||||||
{
|
{
|
||||||
|
if(arg->i) restart = 1;
|
||||||
running = 0;
|
running = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1377,6 +1453,8 @@ restack(Monitor *m)
|
|||||||
}
|
}
|
||||||
XSync(dpy, False);
|
XSync(dpy, False);
|
||||||
while (XCheckMaskEvent(dpy, EnterWindowMask, &ev));
|
while (XCheckMaskEvent(dpy, EnterWindowMask, &ev));
|
||||||
|
if (m == selmon && (m->tagset[m->seltags] & m->sel->tags) && selmon->lt[selmon->sellt] != &layouts[2])
|
||||||
|
warp(m->sel);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -1427,7 +1505,7 @@ sendmon(Client *c, Monitor *m)
|
|||||||
detachstack(c);
|
detachstack(c);
|
||||||
c->mon = m;
|
c->mon = m;
|
||||||
c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
|
c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
|
||||||
attach(c);
|
attachbottom(c);
|
||||||
attachstack(c);
|
attachstack(c);
|
||||||
focus(NULL);
|
focus(NULL);
|
||||||
arrange(NULL);
|
arrange(NULL);
|
||||||
@ -1507,13 +1585,30 @@ setfullscreen(Client *c, int fullscreen)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setsticky(Client *c, int sticky)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(sticky && !c->issticky) {
|
||||||
|
XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32,
|
||||||
|
PropModeReplace, (unsigned char *) &netatom[NetWMSticky], 1);
|
||||||
|
c->issticky = 1;
|
||||||
|
} else if(!sticky && c->issticky){
|
||||||
|
XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32,
|
||||||
|
PropModeReplace, (unsigned char *)0, 0);
|
||||||
|
c->issticky = 0;
|
||||||
|
arrange(c->mon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
setlayout(const Arg *arg)
|
setlayout(const Arg *arg)
|
||||||
{
|
{
|
||||||
if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
|
if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
|
||||||
selmon->sellt ^= 1;
|
selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag] ^= 1;
|
||||||
if (arg && arg->v)
|
if (arg && arg->v)
|
||||||
selmon->lt[selmon->sellt] = (Layout *)arg->v;
|
selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v;
|
||||||
strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
|
strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
|
||||||
if (selmon->sel)
|
if (selmon->sel)
|
||||||
arrange(selmon);
|
arrange(selmon);
|
||||||
@ -1532,7 +1627,7 @@ setmfact(const Arg *arg)
|
|||||||
f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
|
f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
|
||||||
if (f < 0.05 || f > 0.95)
|
if (f < 0.05 || f > 0.95)
|
||||||
return;
|
return;
|
||||||
selmon->mfact = f;
|
selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f;
|
||||||
arrange(selmon);
|
arrange(selmon);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1553,6 +1648,9 @@ setup(void)
|
|||||||
/* clean up any zombies (inherited from .xinitrc etc) immediately */
|
/* clean up any zombies (inherited from .xinitrc etc) immediately */
|
||||||
while (waitpid(-1, NULL, WNOHANG) > 0);
|
while (waitpid(-1, NULL, WNOHANG) > 0);
|
||||||
|
|
||||||
|
signal(SIGHUP, sighup);
|
||||||
|
signal(SIGTERM, sigterm);
|
||||||
|
|
||||||
/* init screen */
|
/* init screen */
|
||||||
screen = DefaultScreen(dpy);
|
screen = DefaultScreen(dpy);
|
||||||
sw = DisplayWidth(dpy, screen);
|
sw = DisplayWidth(dpy, screen);
|
||||||
@ -1576,6 +1674,7 @@ setup(void)
|
|||||||
netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False);
|
netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False);
|
||||||
netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False);
|
netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False);
|
||||||
netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
|
netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
|
||||||
|
netatom[NetWMSticky] = XInternAtom(dpy, "_NET_WM_STATE_STICKY", False);
|
||||||
netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False);
|
netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False);
|
||||||
netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False);
|
netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False);
|
||||||
netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False);
|
netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False);
|
||||||
@ -1644,6 +1743,20 @@ showhide(Client *c)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sighup(int unused)
|
||||||
|
{
|
||||||
|
Arg a = {.i = 1};
|
||||||
|
quit(&a);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sigterm(int unused)
|
||||||
|
{
|
||||||
|
Arg a = {.i = 0};
|
||||||
|
quit(&a);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
spawn(const Arg *arg)
|
spawn(const Arg *arg)
|
||||||
{
|
{
|
||||||
@ -1707,7 +1820,7 @@ tile(Monitor *m)
|
|||||||
void
|
void
|
||||||
togglebar(const Arg *arg)
|
togglebar(const Arg *arg)
|
||||||
{
|
{
|
||||||
selmon->showbar = !selmon->showbar;
|
selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar;
|
||||||
updatebarpos(selmon);
|
updatebarpos(selmon);
|
||||||
XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
|
XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
|
||||||
arrange(selmon);
|
arrange(selmon);
|
||||||
@ -1727,6 +1840,15 @@ togglefloating(const Arg *arg)
|
|||||||
arrange(selmon);
|
arrange(selmon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
togglesticky(const Arg *arg)
|
||||||
|
{
|
||||||
|
if (!selmon->sel)
|
||||||
|
return;
|
||||||
|
setsticky(selmon->sel, !selmon->sel->issticky);
|
||||||
|
arrange(selmon);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
toggletag(const Arg *arg)
|
toggletag(const Arg *arg)
|
||||||
{
|
{
|
||||||
@ -1746,9 +1868,33 @@ void
|
|||||||
toggleview(const Arg *arg)
|
toggleview(const Arg *arg)
|
||||||
{
|
{
|
||||||
unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK);
|
unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK);
|
||||||
|
int i;
|
||||||
|
|
||||||
if (newtagset) {
|
if (newtagset) {
|
||||||
selmon->tagset[selmon->seltags] = newtagset;
|
selmon->tagset[selmon->seltags] = newtagset;
|
||||||
|
|
||||||
|
if (newtagset == ~0) {
|
||||||
|
selmon->pertag->prevtag = selmon->pertag->curtag;
|
||||||
|
selmon->pertag->curtag = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* test if the user did not select the same tag */
|
||||||
|
if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) {
|
||||||
|
selmon->pertag->prevtag = selmon->pertag->curtag;
|
||||||
|
for (i = 0; !(newtagset & 1 << i); i++) ;
|
||||||
|
selmon->pertag->curtag = i + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* apply settings for this view */
|
||||||
|
selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
|
||||||
|
selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
|
||||||
|
selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
|
||||||
|
selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
|
||||||
|
selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
|
||||||
|
|
||||||
|
if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
|
||||||
|
togglebar(NULL);
|
||||||
|
|
||||||
focus(NULL);
|
focus(NULL);
|
||||||
arrange(selmon);
|
arrange(selmon);
|
||||||
}
|
}
|
||||||
@ -1907,7 +2053,7 @@ updategeom(void)
|
|||||||
m->clients = c->next;
|
m->clients = c->next;
|
||||||
detachstack(c);
|
detachstack(c);
|
||||||
c->mon = mons;
|
c->mon = mons;
|
||||||
attach(c);
|
attachbottom(c);
|
||||||
attachstack(c);
|
attachstack(c);
|
||||||
}
|
}
|
||||||
if (m == selmon)
|
if (m == selmon)
|
||||||
@ -2017,10 +2163,13 @@ updatewindowtype(Client *c)
|
|||||||
Atom state = getatomprop(c, netatom[NetWMState]);
|
Atom state = getatomprop(c, netatom[NetWMState]);
|
||||||
Atom wtype = getatomprop(c, netatom[NetWMWindowType]);
|
Atom wtype = getatomprop(c, netatom[NetWMWindowType]);
|
||||||
|
|
||||||
if (state == netatom[NetWMFullscreen])
|
if (state == netatom[NetWMFullscreen])
|
||||||
setfullscreen(c, 1);
|
setfullscreen(c, 1);
|
||||||
if (wtype == netatom[NetWMWindowTypeDialog])
|
if (state == netatom[NetWMSticky]) {
|
||||||
c->isfloating = 1;
|
setsticky(c, 1);
|
||||||
|
}
|
||||||
|
if (wtype == netatom[NetWMWindowTypeDialog])
|
||||||
|
c->isfloating = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -2032,8 +2181,11 @@ updatewmhints(Client *c)
|
|||||||
if (c == selmon->sel && wmh->flags & XUrgencyHint) {
|
if (c == selmon->sel && wmh->flags & XUrgencyHint) {
|
||||||
wmh->flags &= ~XUrgencyHint;
|
wmh->flags &= ~XUrgencyHint;
|
||||||
XSetWMHints(dpy, c->win, wmh);
|
XSetWMHints(dpy, c->win, wmh);
|
||||||
} else
|
} else {
|
||||||
c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0;
|
c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0;
|
||||||
|
if (c->isurgent)
|
||||||
|
XSetWindowBorder(dpy, c->win, scheme[SchemeUrg][ColBorder].pixel);
|
||||||
|
}
|
||||||
if (wmh->flags & InputHint)
|
if (wmh->flags & InputHint)
|
||||||
c->neverfocus = !wmh->input;
|
c->neverfocus = !wmh->input;
|
||||||
else
|
else
|
||||||
@ -2045,15 +2197,63 @@ updatewmhints(Client *c)
|
|||||||
void
|
void
|
||||||
view(const Arg *arg)
|
view(const Arg *arg)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
unsigned int tmptag;
|
||||||
|
|
||||||
if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
|
if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
|
||||||
return;
|
return;
|
||||||
selmon->seltags ^= 1; /* toggle sel tagset */
|
selmon->seltags ^= 1; /* toggle sel tagset */
|
||||||
if (arg->ui & TAGMASK)
|
if (arg->ui & TAGMASK) {
|
||||||
selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
|
selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
|
||||||
|
selmon->pertag->prevtag = selmon->pertag->curtag;
|
||||||
|
|
||||||
|
if (arg->ui == ~0)
|
||||||
|
selmon->pertag->curtag = 0;
|
||||||
|
else {
|
||||||
|
for (i = 0; !(arg->ui & 1 << i); i++) ;
|
||||||
|
selmon->pertag->curtag = i + 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
tmptag = selmon->pertag->prevtag;
|
||||||
|
selmon->pertag->prevtag = selmon->pertag->curtag;
|
||||||
|
selmon->pertag->curtag = tmptag;
|
||||||
|
}
|
||||||
|
|
||||||
|
selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
|
||||||
|
selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
|
||||||
|
selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
|
||||||
|
selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
|
||||||
|
selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
|
||||||
|
|
||||||
|
if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
|
||||||
|
togglebar(NULL);
|
||||||
|
|
||||||
focus(NULL);
|
focus(NULL);
|
||||||
arrange(selmon);
|
arrange(selmon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
warp(const Client *c)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
if (!c) {
|
||||||
|
XWarpPointer(dpy, None, root, 0, 0, 0, 0, selmon->wx + selmon->ww/2, selmon->wy + selmon->wh/2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!getrootptr(&x, &y) ||
|
||||||
|
(x > c->x - c->bw &&
|
||||||
|
y > c->y - c->bw &&
|
||||||
|
x < c->x + c->w + c->bw*2 &&
|
||||||
|
y < c->y + c->h + c->bw*2) ||
|
||||||
|
(y > c->mon->by && y < c->mon->by + bh) ||
|
||||||
|
(c->mon->topbar && !y))
|
||||||
|
return;
|
||||||
|
|
||||||
|
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w / 2, c->h / 2);
|
||||||
|
}
|
||||||
|
|
||||||
Client *
|
Client *
|
||||||
wintoclient(Window w)
|
wintoclient(Window w)
|
||||||
{
|
{
|
||||||
@ -2151,6 +2351,7 @@ main(int argc, char *argv[])
|
|||||||
#endif /* __OpenBSD__ */
|
#endif /* __OpenBSD__ */
|
||||||
scan();
|
scan();
|
||||||
run();
|
run();
|
||||||
|
if(restart) execvp(argv[0], argv);
|
||||||
cleanup();
|
cleanup();
|
||||||
XCloseDisplay(dpy);
|
XCloseDisplay(dpy);
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
|
28
dwm.c.rej
Normal file
28
dwm.c.rej
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
diff a/dwm.c b/dwm.c (rejected hunks)
|
||||||
|
@@ -205,6 +205,8 @@ static void setup(void);
|
||||||
|
static void seturgent(Client *c, int urg);
|
||||||
|
static void showhide(Client *c);
|
||||||
|
static void sigchld(int unused);
|
||||||
|
+static void sighup(int unused);
|
||||||
|
+static void sigterm(int unused);
|
||||||
|
static void spawn(const Arg *arg);
|
||||||
|
static void tag(const Arg *arg);
|
||||||
|
static void tagmon(const Arg *arg);
|
||||||
|
@@ -1536,6 +1540,9 @@ setup(void)
|
||||||
|
/* clean up any zombies immediately */
|
||||||
|
sigchld(0);
|
||||||
|
|
||||||
|
+ signal(SIGHUP, sighup);
|
||||||
|
+ signal(SIGTERM, sigterm);
|
||||||
|
+
|
||||||
|
/* init screen */
|
||||||
|
screen = DefaultScreen(dpy);
|
||||||
|
sw = DisplayWidth(dpy, screen);
|
||||||
|
@@ -2139,6 +2160,7 @@ main(int argc, char *argv[])
|
||||||
|
setup();
|
||||||
|
scan();
|
||||||
|
run();
|
||||||
|
+ if(restart) execvp(argv[0], argv);
|
||||||
|
cleanup();
|
||||||
|
XCloseDisplay(dpy);
|
||||||
|
return EXIT_SUCCESS;
|
48
movestack.c
Normal file
48
movestack.c
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
void
|
||||||
|
movestack(const Arg *arg) {
|
||||||
|
Client *c = NULL, *p = NULL, *pc = NULL, *i;
|
||||||
|
|
||||||
|
if(arg->i > 0) {
|
||||||
|
/* find the client after selmon->sel */
|
||||||
|
for(c = selmon->sel->next; c && (!ISVISIBLE(c) || c->isfloating); c = c->next);
|
||||||
|
if(!c)
|
||||||
|
for(c = selmon->clients; c && (!ISVISIBLE(c) || c->isfloating); c = c->next);
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* find the client before selmon->sel */
|
||||||
|
for(i = selmon->clients; i != selmon->sel; i = i->next)
|
||||||
|
if(ISVISIBLE(i) && !i->isfloating)
|
||||||
|
c = i;
|
||||||
|
if(!c)
|
||||||
|
for(; i; i = i->next)
|
||||||
|
if(ISVISIBLE(i) && !i->isfloating)
|
||||||
|
c = i;
|
||||||
|
}
|
||||||
|
/* find the client before selmon->sel and c */
|
||||||
|
for(i = selmon->clients; i && (!p || !pc); i = i->next) {
|
||||||
|
if(i->next == selmon->sel)
|
||||||
|
p = i;
|
||||||
|
if(i->next == c)
|
||||||
|
pc = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* swap c and selmon->sel selmon->clients in the selmon->clients list */
|
||||||
|
if(c && c != selmon->sel) {
|
||||||
|
Client *temp = selmon->sel->next==c?selmon->sel:selmon->sel->next;
|
||||||
|
selmon->sel->next = c->next==selmon->sel?c:c->next;
|
||||||
|
c->next = temp;
|
||||||
|
|
||||||
|
if(p && p != c)
|
||||||
|
p->next = c;
|
||||||
|
if(pc && pc != selmon->sel)
|
||||||
|
pc->next = selmon->sel;
|
||||||
|
|
||||||
|
if(selmon->sel == selmon->clients)
|
||||||
|
selmon->clients = c;
|
||||||
|
else if(c == selmon->clients)
|
||||||
|
selmon->clients = selmon->sel;
|
||||||
|
|
||||||
|
arrange(selmon);
|
||||||
|
}
|
||||||
|
}
|
54
patches/dwm-attachbottom-6.3.diff
Normal file
54
patches/dwm-attachbottom-6.3.diff
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
diff -up dwm-6.3/dwm.c dwm-6.3-attachbottom/dwm.c
|
||||||
|
--- dwm-6.3/dwm.c 2022-01-07 12:42:18.000000000 +0100
|
||||||
|
+++ dwm-6.3-attachbottom/dwm.c 2022-08-17 22:14:41.813809073 +0200
|
||||||
|
@@ -147,6 +147,7 @@ static int applysizehints(Client *c, int
|
||||||
|
static void arrange(Monitor *m);
|
||||||
|
static void arrangemon(Monitor *m);
|
||||||
|
static void attach(Client *c);
|
||||||
|
+static void attachbottom(Client *c);
|
||||||
|
static void attachstack(Client *c);
|
||||||
|
static void buttonpress(XEvent *e);
|
||||||
|
static void checkotherwm(void);
|
||||||
|
@@ -408,6 +409,15 @@ attach(Client *c)
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
+attachbottom(Client *c)
|
||||||
|
+{
|
||||||
|
+ Client **tc;
|
||||||
|
+ c->next = NULL;
|
||||||
|
+ for (tc = &c->mon->clients; *tc; tc = &(*tc)->next);
|
||||||
|
+ *tc = c;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
attachstack(Client *c)
|
||||||
|
{
|
||||||
|
c->snext = c->mon->stack;
|
||||||
|
@@ -1066,7 +1076,7 @@ manage(Window w, XWindowAttributes *wa)
|
||||||
|
c->isfloating = c->oldstate = trans != None || c->isfixed;
|
||||||
|
if (c->isfloating)
|
||||||
|
XRaiseWindow(dpy, c->win);
|
||||||
|
- attach(c);
|
||||||
|
+ attachbottom(c);
|
||||||
|
attachstack(c);
|
||||||
|
XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend,
|
||||||
|
(unsigned char *) &(c->win), 1);
|
||||||
|
@@ -1421,7 +1431,7 @@ sendmon(Client *c, Monitor *m)
|
||||||
|
detachstack(c);
|
||||||
|
c->mon = m;
|
||||||
|
c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
|
||||||
|
- attach(c);
|
||||||
|
+ attachbottom(c);
|
||||||
|
attachstack(c);
|
||||||
|
focus(NULL);
|
||||||
|
arrange(NULL);
|
||||||
|
@@ -1903,7 +1913,7 @@ updategeom(void)
|
||||||
|
m->clients = c->next;
|
||||||
|
detachstack(c);
|
||||||
|
c->mon = mons;
|
||||||
|
- attach(c);
|
||||||
|
+ attachbottom(c);
|
||||||
|
attachstack(c);
|
||||||
|
}
|
||||||
|
if (m == selmon)
|
73
patches/dwm-fancybar-20220527-d3f93c7.diff
Normal file
73
patches/dwm-fancybar-20220527-d3f93c7.diff
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
diff --git a/dwm.c b/dwm.c
|
||||||
|
--- a/dwm.c
|
||||||
|
+++ b/dwm.c
|
||||||
|
@@ -699,10 +699,10 @@ dirtomon(int dir)
|
||||||
|
void
|
||||||
|
drawbar(Monitor *m)
|
||||||
|
{
|
||||||
|
- int x, w, tw = 0;
|
||||||
|
+ int x, w, tw = 0, mw, ew = 0;
|
||||||
|
int boxs = drw->fonts->h / 9;
|
||||||
|
int boxw = drw->fonts->h / 6 + 2;
|
||||||
|
- unsigned int i, occ = 0, urg = 0;
|
||||||
|
+ unsigned int i, occ = 0, urg = 0, n = 0;
|
||||||
|
Client *c;
|
||||||
|
|
||||||
|
if (!m->showbar)
|
||||||
|
@@ -716,6 +716,8 @@ drawbar(Monitor *m)
|
||||||
|
}
|
||||||
|
|
||||||
|
for (c = m->clients; c; c = c->next) {
|
||||||
|
+ if (ISVISIBLE(c))
|
||||||
|
+ n++;
|
||||||
|
occ |= c->tags;
|
||||||
|
if (c->isurgent)
|
||||||
|
urg |= c->tags;
|
||||||
|
@@ -736,15 +738,39 @@ drawbar(Monitor *m)
|
||||||
|
x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
|
||||||
|
|
||||||
|
if ((w = m->ww - tw - x) > bh) {
|
||||||
|
- if (m->sel) {
|
||||||
|
- drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
|
||||||
|
- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
|
||||||
|
- if (m->sel->isfloating)
|
||||||
|
- drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
|
||||||
|
- } else {
|
||||||
|
- drw_setscheme(drw, scheme[SchemeNorm]);
|
||||||
|
- drw_rect(drw, x, 0, w, bh, 1, 1);
|
||||||
|
+ if (n > 0) {
|
||||||
|
+ tw = TEXTW(m->sel->name) + lrpad;
|
||||||
|
+ mw = (tw >= w || n == 1) ? 0 : (w - tw) / (n - 1);
|
||||||
|
+
|
||||||
|
+ i = 0;
|
||||||
|
+ for (c = m->clients; c; c = c->next) {
|
||||||
|
+ if (!ISVISIBLE(c) || c == m->sel)
|
||||||
|
+ continue;
|
||||||
|
+ tw = TEXTW(c->name);
|
||||||
|
+ if(tw < mw)
|
||||||
|
+ ew += (mw - tw);
|
||||||
|
+ else
|
||||||
|
+ i++;
|
||||||
|
+ }
|
||||||
|
+ if (i > 0)
|
||||||
|
+ mw += ew / i;
|
||||||
|
+
|
||||||
|
+ for (c = m->clients; c; c = c->next) {
|
||||||
|
+ if (!ISVISIBLE(c))
|
||||||
|
+ continue;
|
||||||
|
+ tw = MIN(m->sel == c ? w : mw, TEXTW(c->name));
|
||||||
|
+
|
||||||
|
+ drw_setscheme(drw, scheme[m == selmon && m->sel == c ? SchemeSel : SchemeNorm]);
|
||||||
|
+ if (tw > lrpad / 2)
|
||||||
|
+ drw_text(drw, x, 0, tw, bh, lrpad / 2, c->name, 0);
|
||||||
|
+ if (c->isfloating)
|
||||||
|
+ drw_rect(drw, x + boxs, boxs, boxw, boxw, c->isfixed, 0);
|
||||||
|
+ x += tw;
|
||||||
|
+ w -= tw;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
+ drw_setscheme(drw, scheme[SchemeNorm]);
|
||||||
|
+ drw_rect(drw, x, 0, w, bh, 1, 1);
|
||||||
|
}
|
||||||
|
drw_map(drw, m->barwin, 0, 0, m->ww, bh);
|
||||||
|
}
|
95
patches/dwm-movestack-20211115-a786211.diff
Normal file
95
patches/dwm-movestack-20211115-a786211.diff
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
From 9a4037dc0ef56f91c009317e78e9e3790dafbb58 Mon Sep 17 00:00:00 2001
|
||||||
|
From: BrunoCooper17 <BrunoCooper17@outlook.com>
|
||||||
|
Date: Mon, 15 Nov 2021 14:04:53 -0600
|
||||||
|
Subject: [PATCH] MoveStack patch
|
||||||
|
|
||||||
|
This plugin allows you to move clients around in the stack and swap them
|
||||||
|
with the master. It emulates the behavior off mod+shift+j and mod+shift+k
|
||||||
|
in Xmonad. movestack(+1) will swap the client with the current focus with
|
||||||
|
the next client. movestack(-1) will swap the client with the current focus
|
||||||
|
with the previous client.
|
||||||
|
---
|
||||||
|
config.def.h | 3 +++
|
||||||
|
movestack.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 51 insertions(+)
|
||||||
|
create mode 100644 movestack.c
|
||||||
|
|
||||||
|
diff --git a/config.def.h b/config.def.h
|
||||||
|
index a2ac963..33efa5b 100644
|
||||||
|
--- a/config.def.h
|
||||||
|
+++ b/config.def.h
|
||||||
|
@@ -60,6 +60,7 @@ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn()
|
||||||
|
static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
|
||||||
|
static const char *termcmd[] = { "st", NULL };
|
||||||
|
|
||||||
|
+#include "movestack.c"
|
||||||
|
static Key keys[] = {
|
||||||
|
/* modifier key function argument */
|
||||||
|
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
|
||||||
|
@@ -71,6 +72,8 @@ static Key keys[] = {
|
||||||
|
{ MODKEY, XK_d, incnmaster, {.i = -1 } },
|
||||||
|
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
|
||||||
|
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
|
||||||
|
+ { MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } },
|
||||||
|
+ { MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } },
|
||||||
|
{ MODKEY, XK_Return, zoom, {0} },
|
||||||
|
{ MODKEY, XK_Tab, view, {0} },
|
||||||
|
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
|
||||||
|
diff --git a/movestack.c b/movestack.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..520f4ae
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/movestack.c
|
||||||
|
@@ -0,0 +1,48 @@
|
||||||
|
+void
|
||||||
|
+movestack(const Arg *arg) {
|
||||||
|
+ Client *c = NULL, *p = NULL, *pc = NULL, *i;
|
||||||
|
+
|
||||||
|
+ if(arg->i > 0) {
|
||||||
|
+ /* find the client after selmon->sel */
|
||||||
|
+ for(c = selmon->sel->next; c && (!ISVISIBLE(c) || c->isfloating); c = c->next);
|
||||||
|
+ if(!c)
|
||||||
|
+ for(c = selmon->clients; c && (!ISVISIBLE(c) || c->isfloating); c = c->next);
|
||||||
|
+
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ /* find the client before selmon->sel */
|
||||||
|
+ for(i = selmon->clients; i != selmon->sel; i = i->next)
|
||||||
|
+ if(ISVISIBLE(i) && !i->isfloating)
|
||||||
|
+ c = i;
|
||||||
|
+ if(!c)
|
||||||
|
+ for(; i; i = i->next)
|
||||||
|
+ if(ISVISIBLE(i) && !i->isfloating)
|
||||||
|
+ c = i;
|
||||||
|
+ }
|
||||||
|
+ /* find the client before selmon->sel and c */
|
||||||
|
+ for(i = selmon->clients; i && (!p || !pc); i = i->next) {
|
||||||
|
+ if(i->next == selmon->sel)
|
||||||
|
+ p = i;
|
||||||
|
+ if(i->next == c)
|
||||||
|
+ pc = i;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* swap c and selmon->sel selmon->clients in the selmon->clients list */
|
||||||
|
+ if(c && c != selmon->sel) {
|
||||||
|
+ Client *temp = selmon->sel->next==c?selmon->sel:selmon->sel->next;
|
||||||
|
+ selmon->sel->next = c->next==selmon->sel?c:c->next;
|
||||||
|
+ c->next = temp;
|
||||||
|
+
|
||||||
|
+ if(p && p != c)
|
||||||
|
+ p->next = c;
|
||||||
|
+ if(pc && pc != selmon->sel)
|
||||||
|
+ pc->next = selmon->sel;
|
||||||
|
+
|
||||||
|
+ if(selmon->sel == selmon->clients)
|
||||||
|
+ selmon->clients = c;
|
||||||
|
+ else if(c == selmon->clients)
|
||||||
|
+ selmon->clients = selmon->sel;
|
||||||
|
+
|
||||||
|
+ arrange(selmon);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
\ No newline at end of file
|
||||||
|
--
|
||||||
|
2.33.1
|
||||||
|
|
177
patches/dwm-pertag-20200914-61bb8b2.diff
Normal file
177
patches/dwm-pertag-20200914-61bb8b2.diff
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
diff --git a/dwm.c b/dwm.c
|
||||||
|
index 664c527..ac8e4ec 100644
|
||||||
|
--- a/dwm.c
|
||||||
|
+++ b/dwm.c
|
||||||
|
@@ -111,6 +111,7 @@ typedef struct {
|
||||||
|
void (*arrange)(Monitor *);
|
||||||
|
} Layout;
|
||||||
|
|
||||||
|
+typedef struct Pertag Pertag;
|
||||||
|
struct Monitor {
|
||||||
|
char ltsymbol[16];
|
||||||
|
float mfact;
|
||||||
|
@@ -130,6 +131,7 @@ struct Monitor {
|
||||||
|
Monitor *next;
|
||||||
|
Window barwin;
|
||||||
|
const Layout *lt[2];
|
||||||
|
+ Pertag *pertag;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
@@ -272,6 +274,15 @@ static Window root, wmcheckwin;
|
||||||
|
/* configuration, allows nested code to access above variables */
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
+struct Pertag {
|
||||||
|
+ unsigned int curtag, prevtag; /* current and previous tag */
|
||||||
|
+ int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */
|
||||||
|
+ float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */
|
||||||
|
+ unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */
|
||||||
|
+ const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */
|
||||||
|
+ int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
/* compile-time check if all tags fit into an unsigned int bit array. */
|
||||||
|
struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
|
||||||
|
|
||||||
|
@@ -632,6 +643,7 @@ Monitor *
|
||||||
|
createmon(void)
|
||||||
|
{
|
||||||
|
Monitor *m;
|
||||||
|
+ unsigned int i;
|
||||||
|
|
||||||
|
m = ecalloc(1, sizeof(Monitor));
|
||||||
|
m->tagset[0] = m->tagset[1] = 1;
|
||||||
|
@@ -642,6 +654,20 @@ createmon(void)
|
||||||
|
m->lt[0] = &layouts[0];
|
||||||
|
m->lt[1] = &layouts[1 % LENGTH(layouts)];
|
||||||
|
strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
|
||||||
|
+ m->pertag = ecalloc(1, sizeof(Pertag));
|
||||||
|
+ m->pertag->curtag = m->pertag->prevtag = 1;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i <= LENGTH(tags); i++) {
|
||||||
|
+ m->pertag->nmasters[i] = m->nmaster;
|
||||||
|
+ m->pertag->mfacts[i] = m->mfact;
|
||||||
|
+
|
||||||
|
+ m->pertag->ltidxs[i][0] = m->lt[0];
|
||||||
|
+ m->pertag->ltidxs[i][1] = m->lt[1];
|
||||||
|
+ m->pertag->sellts[i] = m->sellt;
|
||||||
|
+
|
||||||
|
+ m->pertag->showbars[i] = m->showbar;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -967,7 +993,7 @@ grabkeys(void)
|
||||||
|
void
|
||||||
|
incnmaster(const Arg *arg)
|
||||||
|
{
|
||||||
|
- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0);
|
||||||
|
+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0);
|
||||||
|
arrange(selmon);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1502,9 +1528,9 @@ void
|
||||||
|
setlayout(const Arg *arg)
|
||||||
|
{
|
||||||
|
if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
|
||||||
|
- selmon->sellt ^= 1;
|
||||||
|
+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag] ^= 1;
|
||||||
|
if (arg && arg->v)
|
||||||
|
- selmon->lt[selmon->sellt] = (Layout *)arg->v;
|
||||||
|
+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v;
|
||||||
|
strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
|
||||||
|
if (selmon->sel)
|
||||||
|
arrange(selmon);
|
||||||
|
@@ -1523,7 +1549,7 @@ setmfact(const Arg *arg)
|
||||||
|
f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
|
||||||
|
if (f < 0.05 || f > 0.95)
|
||||||
|
return;
|
||||||
|
- selmon->mfact = f;
|
||||||
|
+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f;
|
||||||
|
arrange(selmon);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1702,7 +1728,7 @@ tile(Monitor *m)
|
||||||
|
void
|
||||||
|
togglebar(const Arg *arg)
|
||||||
|
{
|
||||||
|
- selmon->showbar = !selmon->showbar;
|
||||||
|
+ selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar;
|
||||||
|
updatebarpos(selmon);
|
||||||
|
XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
|
||||||
|
arrange(selmon);
|
||||||
|
@@ -1741,9 +1767,33 @@ void
|
||||||
|
toggleview(const Arg *arg)
|
||||||
|
{
|
||||||
|
unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK);
|
||||||
|
+ int i;
|
||||||
|
|
||||||
|
if (newtagset) {
|
||||||
|
selmon->tagset[selmon->seltags] = newtagset;
|
||||||
|
+
|
||||||
|
+ if (newtagset == ~0) {
|
||||||
|
+ selmon->pertag->prevtag = selmon->pertag->curtag;
|
||||||
|
+ selmon->pertag->curtag = 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* test if the user did not select the same tag */
|
||||||
|
+ if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) {
|
||||||
|
+ selmon->pertag->prevtag = selmon->pertag->curtag;
|
||||||
|
+ for (i = 0; !(newtagset & 1 << i); i++) ;
|
||||||
|
+ selmon->pertag->curtag = i + 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* apply settings for this view */
|
||||||
|
+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
|
||||||
|
+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
|
||||||
|
+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
|
||||||
|
+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
|
||||||
|
+ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
|
||||||
|
+
|
||||||
|
+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
|
||||||
|
+ togglebar(NULL);
|
||||||
|
+
|
||||||
|
focus(NULL);
|
||||||
|
arrange(selmon);
|
||||||
|
}
|
||||||
|
@@ -2038,11 +2088,37 @@ updatewmhints(Client *c)
|
||||||
|
void
|
||||||
|
view(const Arg *arg)
|
||||||
|
{
|
||||||
|
+ int i;
|
||||||
|
+ unsigned int tmptag;
|
||||||
|
+
|
||||||
|
if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
|
||||||
|
return;
|
||||||
|
selmon->seltags ^= 1; /* toggle sel tagset */
|
||||||
|
- if (arg->ui & TAGMASK)
|
||||||
|
+ if (arg->ui & TAGMASK) {
|
||||||
|
selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
|
||||||
|
+ selmon->pertag->prevtag = selmon->pertag->curtag;
|
||||||
|
+
|
||||||
|
+ if (arg->ui == ~0)
|
||||||
|
+ selmon->pertag->curtag = 0;
|
||||||
|
+ else {
|
||||||
|
+ for (i = 0; !(arg->ui & 1 << i); i++) ;
|
||||||
|
+ selmon->pertag->curtag = i + 1;
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ tmptag = selmon->pertag->prevtag;
|
||||||
|
+ selmon->pertag->prevtag = selmon->pertag->curtag;
|
||||||
|
+ selmon->pertag->curtag = tmptag;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
|
||||||
|
+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
|
||||||
|
+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
|
||||||
|
+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
|
||||||
|
+ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
|
||||||
|
+
|
||||||
|
+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
|
||||||
|
+ togglebar(NULL);
|
||||||
|
+
|
||||||
|
focus(NULL);
|
||||||
|
arrange(selmon);
|
||||||
|
}
|
139
patches/dwm-restartsig-20180523-6.2.diff
Normal file
139
patches/dwm-restartsig-20180523-6.2.diff
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
From 2991f37f0aaf44b9f9b11e7893ff0af8eb88f649 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christopher Drelich <cd@cdrakka.com>
|
||||||
|
Date: Wed, 23 May 2018 22:50:38 -0400
|
||||||
|
Subject: [PATCH] Modifies quit to handle restarts and adds SIGHUP and SIGTERM
|
||||||
|
handlers.
|
||||||
|
|
||||||
|
Modified quit() to restart if it receives arg .i = 1
|
||||||
|
MOD+CTRL+SHIFT+Q was added to confid.def.h to do just that.
|
||||||
|
|
||||||
|
Signal handlers were handled for SIGHUP and SIGTERM.
|
||||||
|
If dwm receives these signals it calls quit() with
|
||||||
|
arg .i = to 1 or 0, respectively.
|
||||||
|
|
||||||
|
To restart dwm:
|
||||||
|
MOD+CTRL+SHIFT+Q
|
||||||
|
or
|
||||||
|
kill -HUP dwmpid
|
||||||
|
|
||||||
|
To quit dwm cleanly:
|
||||||
|
MOD+SHIFT+Q
|
||||||
|
or
|
||||||
|
kill -TERM dwmpid
|
||||||
|
---
|
||||||
|
config.def.h | 1 +
|
||||||
|
dwm.1 | 10 ++++++++++
|
||||||
|
dwm.c | 22 ++++++++++++++++++++++
|
||||||
|
3 files changed, 33 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/config.def.h b/config.def.h
|
||||||
|
index a9ac303..e559429 100644
|
||||||
|
--- a/config.def.h
|
||||||
|
+++ b/config.def.h
|
||||||
|
@@ -94,6 +94,7 @@ static Key keys[] = {
|
||||||
|
TAGKEYS( XK_8, 7)
|
||||||
|
TAGKEYS( XK_9, 8)
|
||||||
|
{ MODKEY|ShiftMask, XK_q, quit, {0} },
|
||||||
|
+ { MODKEY|ControlMask|ShiftMask, XK_q, quit, {1} },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* button definitions */
|
||||||
|
diff --git a/dwm.1 b/dwm.1
|
||||||
|
index 13b3729..36a331c 100644
|
||||||
|
--- a/dwm.1
|
||||||
|
+++ b/dwm.1
|
||||||
|
@@ -142,6 +142,9 @@ Add/remove all windows with nth tag to/from the view.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-Shift\-q
|
||||||
|
Quit dwm.
|
||||||
|
+.TP
|
||||||
|
+.B Mod1\-Control\-Shift\-q
|
||||||
|
+Restart dwm.
|
||||||
|
.SS Mouse commands
|
||||||
|
.TP
|
||||||
|
.B Mod1\-Button1
|
||||||
|
@@ -155,6 +158,13 @@ Resize focused window while dragging. Tiled windows will be toggled to the float
|
||||||
|
.SH CUSTOMIZATION
|
||||||
|
dwm is customized by creating a custom config.h and (re)compiling the source
|
||||||
|
code. This keeps it fast, secure and simple.
|
||||||
|
+.SH SIGNALS
|
||||||
|
+.TP
|
||||||
|
+.B SIGHUP - 1
|
||||||
|
+Restart the dwm process.
|
||||||
|
+.TP
|
||||||
|
+.B SIGTERM - 15
|
||||||
|
+Cleanly terminate the dwm process.
|
||||||
|
.SH SEE ALSO
|
||||||
|
.BR dmenu (1),
|
||||||
|
.BR st (1)
|
||||||
|
diff --git a/dwm.c b/dwm.c
|
||||||
|
index bb95e26..286eecd 100644
|
||||||
|
--- a/dwm.c
|
||||||
|
+++ b/dwm.c
|
||||||
|
@@ -205,6 +205,8 @@ static void setup(void);
|
||||||
|
static void seturgent(Client *c, int urg);
|
||||||
|
static void showhide(Client *c);
|
||||||
|
static void sigchld(int unused);
|
||||||
|
+static void sighup(int unused);
|
||||||
|
+static void sigterm(int unused);
|
||||||
|
static void spawn(const Arg *arg);
|
||||||
|
static void tag(const Arg *arg);
|
||||||
|
static void tagmon(const Arg *arg);
|
||||||
|
@@ -260,6 +262,7 @@ static void (*handler[LASTEvent]) (XEvent *) = {
|
||||||
|
[UnmapNotify] = unmapnotify
|
||||||
|
};
|
||||||
|
static Atom wmatom[WMLast], netatom[NetLast];
|
||||||
|
+static int restart = 0;
|
||||||
|
static int running = 1;
|
||||||
|
static Cur *cursor[CurLast];
|
||||||
|
static Clr **scheme;
|
||||||
|
@@ -1248,6 +1251,7 @@ propertynotify(XEvent *e)
|
||||||
|
void
|
||||||
|
quit(const Arg *arg)
|
||||||
|
{
|
||||||
|
+ if(arg->i) restart = 1;
|
||||||
|
running = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1536,6 +1540,9 @@ setup(void)
|
||||||
|
/* clean up any zombies immediately */
|
||||||
|
sigchld(0);
|
||||||
|
|
||||||
|
+ signal(SIGHUP, sighup);
|
||||||
|
+ signal(SIGTERM, sigterm);
|
||||||
|
+
|
||||||
|
/* init screen */
|
||||||
|
screen = DefaultScreen(dpy);
|
||||||
|
sw = DisplayWidth(dpy, screen);
|
||||||
|
@@ -1637,6 +1644,20 @@ sigchld(int unused)
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
+sighup(int unused)
|
||||||
|
+{
|
||||||
|
+ Arg a = {.i = 1};
|
||||||
|
+ quit(&a);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+sigterm(int unused)
|
||||||
|
+{
|
||||||
|
+ Arg a = {.i = 0};
|
||||||
|
+ quit(&a);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
spawn(const Arg *arg)
|
||||||
|
{
|
||||||
|
if (arg->v == dmenucmd)
|
||||||
|
@@ -2139,6 +2160,7 @@ main(int argc, char *argv[])
|
||||||
|
setup();
|
||||||
|
scan();
|
||||||
|
run();
|
||||||
|
+ if(restart) execvp(argv[0], argv);
|
||||||
|
cleanup();
|
||||||
|
XCloseDisplay(dpy);
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
--
|
||||||
|
2.7.4
|
||||||
|
|
141
patches/dwm-sticky-6.4.diff
Normal file
141
patches/dwm-sticky-6.4.diff
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
From d47ba0b8aab26ffb2569c0d05df24fdd61b3f4b0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: aymey <fabianpaci@gmail.com>
|
||||||
|
Date: Mon, 5 Dec 2022 22:57:41 +1100
|
||||||
|
Subject: [PATCH] Sticky windows respect EWMH
|
||||||
|
|
||||||
|
---
|
||||||
|
dwm.c | 51 ++++++++++++++++++++++++++++++++++++++++++++-------
|
||||||
|
1 file changed, 44 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dwm.c b/dwm.c
|
||||||
|
index 253aba7..a9157bf 100644
|
||||||
|
--- a/dwm.c
|
||||||
|
+++ b/dwm.c
|
||||||
|
@@ -49,7 +49,7 @@
|
||||||
|
#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)) \
|
||||||
|
* 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 & C->mon->tagset[C->mon->seltags]) || C->issticky)
|
||||||
|
#define LENGTH(X) (sizeof X / sizeof X[0])
|
||||||
|
#define MOUSEMASK (BUTTONMASK|PointerMotionMask)
|
||||||
|
#define WIDTH(X) ((X)->w + 2 * (X)->bw)
|
||||||
|
@@ -61,7 +61,7 @@
|
||||||
|
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
|
||||||
|
enum { SchemeNorm, SchemeSel }; /* color schemes */
|
||||||
|
enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
|
||||||
|
- NetWMFullscreen, NetActiveWindow, NetWMWindowType,
|
||||||
|
+ NetWMFullscreen, NetWMSticky, NetActiveWindow, NetWMWindowType,
|
||||||
|
NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
|
||||||
|
enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
|
||||||
|
enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
|
||||||
|
@@ -92,7 +92,7 @@ struct Client {
|
||||||
|
int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid;
|
||||||
|
int bw, oldbw;
|
||||||
|
unsigned int tags;
|
||||||
|
- int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
|
||||||
|
+ int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, issticky;
|
||||||
|
Client *next;
|
||||||
|
Client *snext;
|
||||||
|
Monitor *mon;
|
||||||
|
@@ -200,6 +200,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 setsticky(Client *c, int sticky);
|
||||||
|
static void setlayout(const Arg *arg);
|
||||||
|
static void setmfact(const Arg *arg);
|
||||||
|
static void setup(void);
|
||||||
|
@@ -212,6 +213,7 @@ static void tagmon(const Arg *arg);
|
||||||
|
static void tile(Monitor *m);
|
||||||
|
static void togglebar(const Arg *arg);
|
||||||
|
static void togglefloating(const Arg *arg);
|
||||||
|
+static void togglesticky(const Arg *arg);
|
||||||
|
static void toggletag(const Arg *arg);
|
||||||
|
static void toggleview(const Arg *arg);
|
||||||
|
static void unfocus(Client *c, int setfocus);
|
||||||
|
@@ -526,6 +528,10 @@ clientmessage(XEvent *e)
|
||||||
|
|| cme->data.l[2] == netatom[NetWMFullscreen])
|
||||||
|
setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */
|
||||||
|
|| (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen)));
|
||||||
|
+
|
||||||
|
+ if (cme->data.l[1] == netatom[NetWMSticky]
|
||||||
|
+ || cme->data.l[2] == netatom[NetWMSticky])
|
||||||
|
+ setsticky(c, (cme->data.l[0] == 1 || (cme->data.l[0] == 2 && !c->issticky)));
|
||||||
|
} else if (cme->message_type == netatom[NetActiveWindow]) {
|
||||||
|
if (c != selmon->sel && !c->isurgent)
|
||||||
|
seturgent(c, 1);
|
||||||
|
@@ -1498,6 +1504,23 @@ setfullscreen(Client *c, int fullscreen)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+void
|
||||||
|
+setsticky(Client *c, int sticky)
|
||||||
|
+{
|
||||||
|
+
|
||||||
|
+ if(sticky && !c->issticky) {
|
||||||
|
+ XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32,
|
||||||
|
+ PropModeReplace, (unsigned char *) &netatom[NetWMSticky], 1);
|
||||||
|
+ c->issticky = 1;
|
||||||
|
+ } else if(!sticky && c->issticky){
|
||||||
|
+ XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32,
|
||||||
|
+ PropModeReplace, (unsigned char *)0, 0);
|
||||||
|
+ c->issticky = 0;
|
||||||
|
+ arrange(c->mon);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
void
|
||||||
|
setlayout(const Arg *arg)
|
||||||
|
{
|
||||||
|
@@ -1560,6 +1583,7 @@ setup(void)
|
||||||
|
netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False);
|
||||||
|
netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False);
|
||||||
|
netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
|
||||||
|
+ netatom[NetWMSticky] = XInternAtom(dpy, "_NET_WM_STATE_STICKY", False);
|
||||||
|
netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False);
|
||||||
|
netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False);
|
||||||
|
netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False);
|
||||||
|
@@ -1719,6 +1743,15 @@ togglefloating(const Arg *arg)
|
||||||
|
arrange(selmon);
|
||||||
|
}
|
||||||
|
|
||||||
|
+void
|
||||||
|
+togglesticky(const Arg *arg)
|
||||||
|
+{
|
||||||
|
+ if (!selmon->sel)
|
||||||
|
+ return;
|
||||||
|
+ setsticky(selmon->sel, !selmon->sel->issticky);
|
||||||
|
+ arrange(selmon);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void
|
||||||
|
toggletag(const Arg *arg)
|
||||||
|
{
|
||||||
|
@@ -2009,10 +2042,13 @@ updatewindowtype(Client *c)
|
||||||
|
Atom state = getatomprop(c, netatom[NetWMState]);
|
||||||
|
Atom wtype = getatomprop(c, netatom[NetWMWindowType]);
|
||||||
|
|
||||||
|
- if (state == netatom[NetWMFullscreen])
|
||||||
|
- setfullscreen(c, 1);
|
||||||
|
- if (wtype == netatom[NetWMWindowTypeDialog])
|
||||||
|
- c->isfloating = 1;
|
||||||
|
+ if (state == netatom[NetWMFullscreen])
|
||||||
|
+ setfullscreen(c, 1);
|
||||||
|
+ if (state == netatom[NetWMSticky]) {
|
||||||
|
+ setsticky(c, 1);
|
||||||
|
+ }
|
||||||
|
+ if (wtype == netatom[NetWMWindowTypeDialog])
|
||||||
|
+ c->isfloating = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
@@ -2147,3 +2183,4 @@ main(int argc, char *argv[])
|
||||||
|
XCloseDisplay(dpy);
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
--
|
||||||
|
2.38.1
|
||||||
|
|
65
patches/dwm-stickyindicator-fancybarfix-6.2.diff
Normal file
65
patches/dwm-stickyindicator-fancybarfix-6.2.diff
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
diff -pu dwm.fancybarpatch/config.def.h dwm.stickyindicator-fancybarfix/config.def.h
|
||||||
|
--- dwm.fancybarpatch/config.def.h 2021-03-01 20:52:06.470291172 -0600
|
||||||
|
+++ dwm.stickyindicator-fancybarfix/config.def.h 2021-03-15 21:12:57.823301478 -0500
|
||||||
|
@@ -17,6 +17,8 @@ static const char *colors[][3] = {
|
||||||
|
[SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
|
||||||
|
[SchemeSel] = { col_gray4, col_cyan, col_cyan },
|
||||||
|
};
|
||||||
|
+static const XPoint stickyicon[] = { {0,0}, {4,0}, {4,8}, {2,6}, {0,8}, {0,0} }; /* represents the icon as an array of vertices */
|
||||||
|
+static const XPoint stickyiconbb = {4,8}; /* defines the bottom right corner of the polygon's bounding box (speeds up scaling) */
|
||||||
|
|
||||||
|
/* tagging */
|
||||||
|
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
|
||||||
|
diff -pu dwm.fancybarpatch/drw.c dwm.stickyindicator-fancybarfix/drw.c
|
||||||
|
--- dwm.fancybarpatch/drw.c 2021-03-01 20:39:31.890253915 -0600
|
||||||
|
+++ dwm.stickyindicator-fancybarfix/drw.c 2021-03-15 21:13:39.643301192 -0500
|
||||||
|
@@ -248,6 +248,26 @@ drw_rect(Drw *drw, int x, int y, unsigne
|
||||||
|
XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
+void
|
||||||
|
+drw_polygon(Drw *drw, int x, int y, int ow, int oh, int sw, int sh, const XPoint *points, int npoints, int shape, int filled) /* wrapper function to scale and draw a polygon with X11 */
|
||||||
|
+{
|
||||||
|
+ if (!drw || !drw->scheme)
|
||||||
|
+ return;
|
||||||
|
+ XSetForeground(drw->dpy, drw->gc, drw->scheme[ColFg].pixel);
|
||||||
|
+ if (!filled) { /* reduces the scaled width and height by 1 when drawing the outline to compensate for X11 drawing the line 1 pixel over */
|
||||||
|
+ sw -= 1;
|
||||||
|
+ sh -= 1;
|
||||||
|
+ }
|
||||||
|
+ XPoint scaledpoints[npoints];
|
||||||
|
+ memcpy(scaledpoints, points, npoints);
|
||||||
|
+ for (int v = 0; v < npoints; v++)
|
||||||
|
+ scaledpoints[v] = (XPoint){ .x = points[v].x * sw / ow + x, .y = points[v].y * sh / oh + y };
|
||||||
|
+ if (filled)
|
||||||
|
+ XFillPolygon(drw->dpy, drw->drawable, drw->gc, scaledpoints, npoints, shape, CoordModeOrigin); /* Change shape to 'Convex' or 'Complex' in dwm.c if the shape is not 'Nonconvex' */
|
||||||
|
+ else
|
||||||
|
+ XDrawLines(drw->dpy, drw->drawable, drw->gc, scaledpoints, npoints, CoordModeOrigin);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int
|
||||||
|
drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert)
|
||||||
|
{
|
||||||
|
diff -pu dwm.fancybarpatch/drw.h dwm.stickyindicator-fancybarfix/drw.h
|
||||||
|
--- dwm.fancybarpatch/drw.h 2021-03-01 20:39:31.890253915 -0600
|
||||||
|
+++ dwm.stickyindicator-fancybarfix/drw.h 2021-03-15 21:14:04.169967692 -0500
|
||||||
|
@@ -51,6 +51,7 @@ void drw_setscheme(Drw *drw, Clr *scm);
|
||||||
|
|
||||||
|
/* Drawing functions */
|
||||||
|
void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert);
|
||||||
|
+void drw_polygon(Drw *drw, int x, int y, int ow, int oh, int sw, int sh, const XPoint *points, int npoints, int shape, int filled);
|
||||||
|
int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert);
|
||||||
|
|
||||||
|
/* Map functions */
|
||||||
|
diff -pu dwm.fancybarpatch/dwm.c dwm.stickyindicator-fancybarfix/dwm.c
|
||||||
|
--- dwm.fancybarpatch/dwm.c 2021-03-01 20:52:06.470291172 -0600
|
||||||
|
+++ dwm.stickyindicator-fancybarfix/dwm.c 2021-03-15 21:16:48.056633227 -0500
|
||||||
|
@@ -760,6 +760,8 @@ drawbar(Monitor *m)
|
||||||
|
drw_text(drw, x, 0, tw, bh, lrpad / 2, c->name, 0);
|
||||||
|
if (c->isfloating)
|
||||||
|
drw_rect(drw, x + boxs, boxs, boxw, boxw, c->isfixed, 0);
|
||||||
|
+ if (c->issticky)
|
||||||
|
+ drw_polygon(drw, x + boxs, c->isfloating ? boxs * 2 + boxw : boxs, stickyiconbb.x, stickyiconbb.y, boxw, boxw * stickyiconbb.y / stickyiconbb.x, stickyicon, LENGTH(stickyicon), Nonconvex, c->tags & c->mon->tagset[c->mon->seltags]);
|
||||||
|
x += tw;
|
||||||
|
w -= tw;
|
||||||
|
}
|
56
patches/dwm-urgborder-6.2.diff
Normal file
56
patches/dwm-urgborder-6.2.diff
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
From f20e5593e154e7e46c3f7100bd1378c7844b5ec8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Dirk Leichsenring <dlei@reddott.de>
|
||||||
|
Date: Sun, 21 Jun 2020 14:00:40 +0200
|
||||||
|
Subject: [PATCH] Make the borders of urgent windows a different color - for dwm 6.2
|
||||||
|
|
||||||
|
---
|
||||||
|
config.def.h | 2 ++
|
||||||
|
dwm.c | 7 +++++--
|
||||||
|
2 files changed, 7 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/config.def.h b/config.def.h
|
||||||
|
index 1c0b587..1cb4492 100644
|
||||||
|
--- a/config.def.h
|
||||||
|
+++ b/config.def.h
|
||||||
|
@@ -12,10 +12,12 @@ static const char col_gray2[] = "#444444";
|
||||||
|
static const char col_gray3[] = "#bbbbbb";
|
||||||
|
static const char col_gray4[] = "#eeeeee";
|
||||||
|
static const char col_cyan[] = "#005577";
|
||||||
|
+static const char col_urgborder[] = "#ff0000";
|
||||||
|
static const char *colors[][3] = {
|
||||||
|
/* fg bg border */
|
||||||
|
[SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
|
||||||
|
[SchemeSel] = { col_gray4, col_cyan, col_cyan },
|
||||||
|
+ [SchemeUrg] = { col_gray4, col_cyan, col_urgborder },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* tagging */
|
||||||
|
diff --git a/dwm.c b/dwm.c
|
||||||
|
index 4465af1..fda4013 100644
|
||||||
|
--- a/dwm.c
|
||||||
|
+++ b/dwm.c
|
||||||
|
@@ -59,7 +59,7 @@
|
||||||
|
|
||||||
|
/* enums */
|
||||||
|
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
|
||||||
|
-enum { SchemeNorm, SchemeSel }; /* color schemes */
|
||||||
|
+enum { SchemeNorm, SchemeSel, SchemeUrg }; /* color schemes */
|
||||||
|
enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
|
||||||
|
NetWMFullscreen, NetActiveWindow, NetWMWindowType,
|
||||||
|
NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
|
||||||
|
@@ -2022,8 +2022,11 @@ updatewmhints(Client *c)
|
||||||
|
if (c == selmon->sel && wmh->flags & XUrgencyHint) {
|
||||||
|
wmh->flags &= ~XUrgencyHint;
|
||||||
|
XSetWMHints(dpy, c->win, wmh);
|
||||||
|
- } else
|
||||||
|
+ } else {
|
||||||
|
c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0;
|
||||||
|
+ if (c->isurgent)
|
||||||
|
+ XSetWindowBorder(dpy, c->win, scheme[SchemeUrg][ColBorder].pixel);
|
||||||
|
+ }
|
||||||
|
if (wmh->flags & InputHint)
|
||||||
|
c->neverfocus = !wmh->input;
|
||||||
|
else
|
||||||
|
--
|
||||||
|
2.27.0
|
||||||
|
|
101
patches/dwm-uselessgap-20211119-58414bee958f2.diff
Normal file
101
patches/dwm-uselessgap-20211119-58414bee958f2.diff
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
From 58414bee958f2e7ed91d6fe31f503ec4a406981b Mon Sep 17 00:00:00 2001
|
||||||
|
From: cirala <thim@cederlund.de>
|
||||||
|
Date: Fri, 19 Nov 2021 18:14:07 +0100
|
||||||
|
Subject: [PATCH] Fix for dwm-uselessgap
|
||||||
|
Previous versions of the patch doubles the
|
||||||
|
gap between the master and slave stacks.
|
||||||
|
|
||||||
|
---
|
||||||
|
config.def.h | 3 ++-
|
||||||
|
dwm.c | 38 +++++++++++++++++++++++++++++++-------
|
||||||
|
2 files changed, 33 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/config.def.h b/config.def.h
|
||||||
|
index a2ac963..17a205f 100644
|
||||||
|
--- a/config.def.h
|
||||||
|
+++ b/config.def.h
|
||||||
|
@@ -2,6 +2,7 @@
|
||||||
|
|
||||||
|
/* appearance */
|
||||||
|
static const unsigned int borderpx = 1; /* border pixel of windows */
|
||||||
|
+static const unsigned int gappx = 6; /* gaps between windows */
|
||||||
|
static const unsigned int snap = 32; /* snap pixel */
|
||||||
|
static const int showbar = 1; /* 0 means no bar */
|
||||||
|
static const int topbar = 1; /* 0 means bottom bar */
|
||||||
|
@@ -34,7 +35,7 @@ static const Rule rules[] = {
|
||||||
|
/* layout(s) */
|
||||||
|
static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
|
||||||
|
static const int nmaster = 1; /* number of clients in master area */
|
||||||
|
-static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */
|
||||||
|
+static const int resizehints = 0; /* 1 means respect size hints in tiled resizals */
|
||||||
|
static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
|
||||||
|
|
||||||
|
static const Layout layouts[] = {
|
||||||
|
diff --git a/dwm.c b/dwm.c
|
||||||
|
index 5e4d494..b626e89 100644
|
||||||
|
--- a/dwm.c
|
||||||
|
+++ b/dwm.c
|
||||||
|
@@ -52,8 +52,8 @@
|
||||||
|
#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]))
|
||||||
|
#define LENGTH(X) (sizeof X / sizeof X[0])
|
||||||
|
#define MOUSEMASK (BUTTONMASK|PointerMotionMask)
|
||||||
|
-#define WIDTH(X) ((X)->w + 2 * (X)->bw)
|
||||||
|
-#define HEIGHT(X) ((X)->h + 2 * (X)->bw)
|
||||||
|
+#define WIDTH(X) ((X)->w + 2 * (X)->bw + gappx)
|
||||||
|
+#define HEIGHT(X) ((X)->h + 2 * (X)->bw + gappx)
|
||||||
|
#define TAGMASK ((1 << LENGTH(tags)) - 1)
|
||||||
|
#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
|
||||||
|
|
||||||
|
@@ -1277,12 +1277,36 @@ void
|
||||||
|
resizeclient(Client *c, int x, int y, int w, int h)
|
||||||
|
{
|
||||||
|
XWindowChanges wc;
|
||||||
|
+ unsigned int n;
|
||||||
|
+ unsigned int gapoffset;
|
||||||
|
+ unsigned int gapincr;
|
||||||
|
+ Client *nbc;
|
||||||
|
|
||||||
|
- c->oldx = c->x; c->x = wc.x = x;
|
||||||
|
- c->oldy = c->y; c->y = wc.y = y;
|
||||||
|
- c->oldw = c->w; c->w = wc.width = w;
|
||||||
|
- c->oldh = c->h; c->h = wc.height = h;
|
||||||
|
wc.border_width = c->bw;
|
||||||
|
+
|
||||||
|
+ /* Get number of clients for the client's monitor */
|
||||||
|
+ for (n = 0, nbc = nexttiled(c->mon->clients); nbc; nbc = nexttiled(nbc->next), n++);
|
||||||
|
+
|
||||||
|
+ /* Do nothing if layout is floating */
|
||||||
|
+ if (c->isfloating || c->mon->lt[c->mon->sellt]->arrange == NULL) {
|
||||||
|
+ gapincr = gapoffset = 0;
|
||||||
|
+ } else {
|
||||||
|
+ /* Remove border and gap if layout is monocle or only one client */
|
||||||
|
+ if (c->mon->lt[c->mon->sellt]->arrange == monocle || n == 1) {
|
||||||
|
+ gapoffset = 0;
|
||||||
|
+ gapincr = -2 * borderpx;
|
||||||
|
+ wc.border_width = 0;
|
||||||
|
+ } else {
|
||||||
|
+ gapoffset = gappx;
|
||||||
|
+ gapincr = 2 * gappx;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ c->oldx = c->x; c->x = wc.x = x + gapoffset;
|
||||||
|
+ c->oldy = c->y; c->y = wc.y = y + gapoffset;
|
||||||
|
+ c->oldw = c->w; c->w = wc.width = w - gapincr;
|
||||||
|
+ c->oldh = c->h; c->h = wc.height = h - gapincr;
|
||||||
|
+
|
||||||
|
XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
|
||||||
|
configure(c);
|
||||||
|
XSync(dpy, False);
|
||||||
|
@@ -1688,7 +1712,7 @@ tile(Monitor *m)
|
||||||
|
for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
||||||
|
if (i < m->nmaster) {
|
||||||
|
h = (m->wh - my) / (MIN(n, m->nmaster) - i);
|
||||||
|
- resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0);
|
||||||
|
+ resize(c, m->wx, m->wy + my, mw - (2*c->bw) + (n > 1 ? gappx : 0), h - (2*c->bw), 0);
|
||||||
|
if (my + HEIGHT(c) < m->wh)
|
||||||
|
my += HEIGHT(c);
|
||||||
|
} else {
|
||||||
|
--
|
||||||
|
2.33.1
|
||||||
|
|
58
patches/dwm-warp-6.2.diff
Normal file
58
patches/dwm-warp-6.2.diff
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
diff --git a/dwm.c b/dwm.c
|
||||||
|
index 4465af1..bf74f60 100644
|
||||||
|
--- a/dwm.c
|
||||||
|
+++ b/dwm.c
|
||||||
|
@@ -227,6 +227,7 @@ static void updatetitle(Client *c);
|
||||||
|
static void updatewindowtype(Client *c);
|
||||||
|
static void updatewmhints(Client *c);
|
||||||
|
static void view(const Arg *arg);
|
||||||
|
+static void warp(const Client *c);
|
||||||
|
static Client *wintoclient(Window w);
|
||||||
|
static Monitor *wintomon(Window w);
|
||||||
|
static int xerror(Display *dpy, XErrorEvent *ee);
|
||||||
|
@@ -827,6 +828,7 @@ focusmon(const Arg *arg)
|
||||||
|
unfocus(selmon->sel, 0);
|
||||||
|
selmon = m;
|
||||||
|
focus(NULL);
|
||||||
|
+ warp(selmon->sel);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
@@ -1367,6 +1369,8 @@ restack(Monitor *m)
|
||||||
|
}
|
||||||
|
XSync(dpy, False);
|
||||||
|
while (XCheckMaskEvent(dpy, EnterWindowMask, &ev));
|
||||||
|
+ if (m == selmon && (m->tagset[m->seltags] & m->sel->tags) && selmon->lt[selmon->sellt] != &layouts[2])
|
||||||
|
+ warp(m->sel);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
@@ -2044,6 +2048,28 @@ view(const Arg *arg)
|
||||||
|
arrange(selmon);
|
||||||
|
}
|
||||||
|
|
||||||
|
+void
|
||||||
|
+warp(const Client *c)
|
||||||
|
+{
|
||||||
|
+ int x, y;
|
||||||
|
+
|
||||||
|
+ if (!c) {
|
||||||
|
+ XWarpPointer(dpy, None, root, 0, 0, 0, 0, selmon->wx + selmon->ww/2, selmon->wy + selmon->wh/2);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!getrootptr(&x, &y) ||
|
||||||
|
+ (x > c->x - c->bw &&
|
||||||
|
+ y > c->y - c->bw &&
|
||||||
|
+ x < c->x + c->w + c->bw*2 &&
|
||||||
|
+ y < c->y + c->h + c->bw*2) ||
|
||||||
|
+ (y > c->mon->by && y < c->mon->by + bh) ||
|
||||||
|
+ (c->mon->topbar && !y))
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w / 2, c->h / 2);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
Client *
|
||||||
|
wintoclient(Window w)
|
||||||
|
{
|
Loading…
Reference in New Issue
Block a user