@@ -38,8 +38,8 @@ static int attachbelow = 1; /* 1 means attach after the currently active wind | |||
static const Layout layouts[] = { | |||
/* symbol arrange function */ | |||
{ "[]=", tile }, /* first entry is default */ | |||
{ "><>", NULL }, /* no layout function means floating behavior */ | |||
{ "T", tile }, /* first entry is default */ | |||
{ "F", NULL }, /* no layout function means floating behavior */ | |||
{ "[M]", monocle }, | |||
{ "|M|", centeredmaster }, | |||
{ ">M>", centeredfloatingmaster }, | |||
@@ -68,6 +68,7 @@ static Key keys[] = { | |||
{ MODKEY, XK_p, spawn, {.v = dmenucmd } }, | |||
{ MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, | |||
{ MODKEY, XK_grave, togglescratch, {.v = scratchpadcmd } }, | |||
{ MODKEY|ControlMask, XK_space, focusmaster, {0} }, | |||
{ MODKEY, XK_b, togglebar, {0} }, | |||
{ MODKEY, XK_j, focusstackvis, {.i = +1 } }, | |||
{ MODKEY, XK_k, focusstackvis, {.i = -1 } }, | |||
@@ -0,0 +1,234 @@ | |||
diff -r 2bcd25cce4ab config.def.h | |||
--- a/config.def.h Sun Sep 27 20:20:14 2009 +0100 | |||
+++ b/config.def.h Mon Oct 05 22:01:49 2009 -0300 | |||
@@ -1,13 +1,16 @@ | |||
/* See LICENSE file for copyright and license details. */ | |||
/* appearance */ | |||
+#define NUMCOLORS 4 // need at least 3 | |||
+static const char colors[NUMCOLORS][ColLast][8] = { | |||
+ // border foreground background | |||
+ { "#cccccc", "#000000", "#cccccc" }, // 0 = normal | |||
+ { "#0066ff", "#ffffff", "#0066ff" }, // 1 = selected | |||
+ { "#0066ff", "#0066ff", "#ffffff" }, // 2 = urgent/warning | |||
+ { "#ff0000", "#ffffff", "#ff0000" }, // 3 = error | |||
+ // add more here | |||
+}; | |||
static const char font[] = "-*-*-medium-*-*-*-14-*-*-*-*-*-*-*"; | |||
-static const char normbordercolor[] = "#cccccc"; | |||
-static const char normbgcolor[] = "#cccccc"; | |||
-static const char normfgcolor[] = "#000000"; | |||
-static const char selbordercolor[] = "#0066ff"; | |||
-static const char selbgcolor[] = "#0066ff"; | |||
-static const char selfgcolor[] = "#ffffff"; | |||
static const unsigned int borderpx = 1; /* border pixel of windows */ | |||
static const unsigned int snap = 32; /* snap pixel */ | |||
static const Bool showbar = True; /* False means no bar */ | |||
@@ -45,7 +48,7 @@ | |||
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } | |||
/* commands */ | |||
-static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL }; | |||
+static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", colors[0][ColBG], "-nf", colors[0][ColFG], "-sb", colors[1][ColBG], "-sf", colors[1][ColFG], NULL }; | |||
static const char *termcmd[] = { "uxterm", NULL }; | |||
static Key keys[] = { | |||
diff -r 2bcd25cce4ab dwm.c | |||
--- a/dwm.c Sun Sep 27 20:20:14 2009 +0100 | |||
+++ b/dwm.c Mon Oct 05 22:01:49 2009 -0300 | |||
@@ -48,6 +48,7 @@ | |||
#define LENGTH(X) (sizeof X / sizeof X[0]) | |||
#define MAX(A, B) ((A) > (B) ? (A) : (B)) | |||
#define MIN(A, B) ((A) < (B) ? (A) : (B)) | |||
+#define MAXCOLORS 8 | |||
#define MOUSEMASK (BUTTONMASK|PointerMotionMask) | |||
#define WIDTH(X) ((X)->w + 2 * (X)->bw) | |||
#define HEIGHT(X) ((X)->h + 2 * (X)->bw) | |||
@@ -95,8 +96,7 @@ | |||
typedef struct { | |||
int x, y, w, h; | |||
- unsigned long norm[ColLast]; | |||
- unsigned long sel[ColLast]; | |||
+ unsigned long colors[MAXCOLORS][ColLast]; | |||
Drawable drawable; | |||
GC gc; | |||
struct { | |||
@@ -172,8 +172,9 @@ | |||
static Monitor *dirtomon(int dir); | |||
static void drawbar(Monitor *m); | |||
static void drawbars(void); | |||
-static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]); | |||
-static void drawtext(const char *text, unsigned long col[ColLast], Bool invert); | |||
+static void drawcoloredtext(char *text); | |||
+static void drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]); | |||
+static void drawtext(const char *text, unsigned long col[ColLast], Bool pad); | |||
static void enternotify(XEvent *e); | |||
static void expose(XEvent *e); | |||
static void focus(Client *c); | |||
@@ -691,14 +692,13 @@ | |||
dc.x = 0; | |||
for(i = 0; i < LENGTH(tags); i++) { | |||
dc.w = TEXTW(tags[i]); | |||
- col = m->tagset[m->seltags] & 1 << i ? dc.sel : dc.norm; | |||
- drawtext(tags[i], col, urg & 1 << i); | |||
- drawsquare(m == selmon && selmon->sel && selmon->sel->tags & 1 << i, | |||
- occ & 1 << i, urg & 1 << i, col); | |||
+ col = dc.colors[ (m->tagset[m->seltags] & 1 << i ? 1:(urg & 1 << i ? 2:0))]; | |||
+ drawtext(tags[i], col, True); | |||
+ drawsquare(m == selmon && selmon->sel && selmon->sel->tags & 1 << i, occ & 1 << i, col); | |||
dc.x += dc.w; | |||
} | |||
dc.w = blw = TEXTW(m->ltsymbol); | |||
- drawtext(m->ltsymbol, dc.norm, False); | |||
+ drawtext(m->ltsymbol, dc.colors[0], True); | |||
dc.x += dc.w; | |||
x = dc.x; | |||
if(m == selmon) { /* status is only drawn on selected monitor */ | |||
@@ -708,19 +708,19 @@ | |||
dc.x = x; | |||
dc.w = m->ww - x; | |||
} | |||
- drawtext(stext, dc.norm, False); | |||
+ drawcoloredtext(stext); | |||
} | |||
else | |||
dc.x = m->ww; | |||
if((dc.w = dc.x - x) > bh) { | |||
dc.x = x; | |||
if(m->sel) { | |||
- col = m == selmon ? dc.sel : dc.norm; | |||
- drawtext(m->sel->name, col, False); | |||
- drawsquare(m->sel->isfixed, m->sel->isfloating, False, col); | |||
+ col = m == selmon ? dc.colors[1] : dc.colors[0]; | |||
+ drawtext(m->sel->name, col, True); | |||
+ drawsquare(m->sel->isfixed, m->sel->isfloating, col); | |||
} | |||
else | |||
- drawtext(NULL, dc.norm, False); | |||
+ drawtext(NULL, dc.colors[0], False); | |||
} | |||
XCopyArea(dpy, dc.drawable, m->barwin, dc.gc, 0, 0, m->ww, bh, 0, 0); | |||
XSync(dpy, False); | |||
@@ -735,12 +735,42 @@ | |||
} | |||
void | |||
-drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) { | |||
+drawcoloredtext(char *text) { | |||
+ Bool first=True; | |||
+ char *buf = text, *ptr = buf, c = 1; | |||
+ unsigned long *col = dc.colors[0]; | |||
+ int i, ox = dc.x; | |||
+ | |||
+ while( *ptr ) { | |||
+ for( i = 0; *ptr < 0 || *ptr > NUMCOLORS; i++, ptr++); | |||
+ if( !*ptr ) break; | |||
+ c=*ptr; | |||
+ *ptr=0; | |||
+ if( i ) { | |||
+ dc.w = selmon->ww - dc.x; | |||
+ drawtext(buf, col, first); | |||
+ dc.x += textnw(buf, i) + textnw(&c,1); | |||
+ if( first ) dc.x += ( dc.font.ascent + dc.font.descent ) / 2; | |||
+ first = False; | |||
+ } else if( first ) { | |||
+ ox = dc.x += textnw(&c,1); | |||
+ } | |||
+ *ptr = c; | |||
+ col = dc.colors[ c-1 ]; | |||
+ buf = ++ptr; | |||
+ } | |||
+ if( !first ) dc.x-=(dc.font.ascent+dc.font.descent)/2; | |||
+ drawtext(buf, col, True); | |||
+ dc.x = ox; | |||
+} | |||
+ | |||
+void | |||
+drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) { | |||
int x; | |||
XGCValues gcv; | |||
XRectangle r = { dc.x, dc.y, dc.w, dc.h }; | |||
- gcv.foreground = col[invert ? ColBG : ColFG]; | |||
+ gcv.foreground = col[ ColFG ]; | |||
XChangeGC(dpy, dc.gc, GCForeground, &gcv); | |||
x = (dc.font.ascent + dc.font.descent + 2) / 4; | |||
r.x = dc.x + 1; | |||
@@ -756,18 +786,18 @@ | |||
} | |||
void | |||
-drawtext(const char *text, unsigned long col[ColLast], Bool invert) { | |||
+drawtext(const char *text, unsigned long col[ColLast], Bool pad) { | |||
char buf[256]; | |||
int i, x, y, h, len, olen; | |||
XRectangle r = { dc.x, dc.y, dc.w, dc.h }; | |||
- XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]); | |||
+ XSetForeground(dpy, dc.gc, col[ ColBG ]); | |||
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); | |||
if(!text) | |||
return; | |||
olen = strlen(text); | |||
- h = dc.font.ascent + dc.font.descent; | |||
- y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; | |||
+ h = pad ? (dc.font.ascent + dc.font.descent) : 0; | |||
+ y = dc.y + ((dc.h + dc.font.ascent - dc.font.descent) / 2); | |||
x = dc.x + (h / 2); | |||
/* shorten text if necessary */ | |||
for(len = MIN(olen, sizeof buf); len && textnw(text, len) > dc.w - h; len--); | |||
@@ -776,7 +806,7 @@ | |||
memcpy(buf, text, len); | |||
if(len < olen) | |||
for(i = len; i && i > len - 3; buf[--i] = '.'); | |||
- XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]); | |||
+ XSetForeground(dpy, dc.gc, col[ ColFG ]); | |||
if(dc.font.set) | |||
XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); | |||
else | |||
@@ -824,7 +854,7 @@ | |||
detachstack(c); | |||
attachstack(c); | |||
grabbuttons(c, True); | |||
- XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]); | |||
+ XSetWindowBorder(dpy, c->win, dc.colors[1][ColBorder]); | |||
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); | |||
} | |||
else | |||
@@ -1132,7 +1162,7 @@ | |||
} | |||
wc.border_width = c->bw; | |||
XConfigureWindow(dpy, w, CWBorderWidth, &wc); | |||
- XSetWindowBorder(dpy, w, dc.norm[ColBorder]); | |||
+ XSetWindowBorder(dpy, w, dc.colors[0][ColBorder]); | |||
configure(c); /* propagates border_width, if size doesn't change */ | |||
updatesizehints(c); | |||
XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); | |||
@@ -1498,12 +1528,11 @@ | |||
cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing); | |||
cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur); | |||
/* init appearance */ | |||
- dc.norm[ColBorder] = getcolor(normbordercolor); | |||
- dc.norm[ColBG] = getcolor(normbgcolor); | |||
- dc.norm[ColFG] = getcolor(normfgcolor); | |||
- dc.sel[ColBorder] = getcolor(selbordercolor); | |||
- dc.sel[ColBG] = getcolor(selbgcolor); | |||
- dc.sel[ColFG] = getcolor(selfgcolor); | |||
+ for(int i=0; i<NUMCOLORS; i++) { | |||
+ dc.colors[i][ColBorder] = getcolor( colors[i][ColBorder] ); | |||
+ dc.colors[i][ColFG] = getcolor( colors[i][ColFG] ); | |||
+ dc.colors[i][ColBG] = getcolor( colors[i][ColBG] ); | |||
+ } | |||
dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen)); | |||
dc.gc = XCreateGC(dpy, root, 0, NULL); | |||
XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); | |||
@@ -1665,7 +1694,7 @@ | |||
if(!c) | |||
return; | |||
grabbuttons(c, False); | |||
- XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]); | |||
+ XSetWindowBorder(dpy, c->win, dc.colors[0][ColBorder]); | |||
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); | |||
} | |||
@@ -0,0 +1,27 @@ | |||
From bd6efd81eabab77c91a3e95b528b19db2d58525b Mon Sep 17 00:00:00 2001 | |||
From: Sacules <leociancalucas@gmail.com> | |||
Date: Sun, 9 Sep 2018 17:12:58 -0300 | |||
Subject: [PATCH] Centers windows names on status bar. | |||
--- | |||
dwm.c | 3 ++- | |||
1 file changed, 2 insertions(+), 1 deletion(-) | |||
diff --git a/dwm.c b/dwm.c | |||
index 4465af1..9d5ef7a 100644 | |||
--- a/dwm.c | |||
+++ b/dwm.c | |||
@@ -730,8 +730,9 @@ drawbar(Monitor *m) | |||
if ((w = m->ww - sw - x) > bh) { | |||
if (m->sel) { | |||
+ int mid = (m->ww - TEXTW(m->sel->name)) / 2 - x; | |||
drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); | |||
- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); | |||
+ drw_text(drw, x, 0, w, bh, mid, m->sel->name, 0); | |||
if (m->sel->isfloating) | |||
drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); | |||
} else { | |||
-- | |||
2.18.0 | |||
@@ -0,0 +1,68 @@ | |||
diff --git a/config.def.h b/config.def.h | |||
index 1c0b587..a516645 100644 | |||
--- a/config.def.h | |||
+++ b/config.def.h | |||
@@ -16,6 +16,11 @@ static const char *colors[][3] = { | |||
/* fg bg border */ | |||
[SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, | |||
[SchemeSel] = { col_gray4, col_cyan, col_cyan }, | |||
+ [SchemeStatus] = { col_gray3, col_gray1, "#000000" }, // Statusbar right {text,background,not used but cannot be empty} | |||
+ [SchemeTagsSel] = { col_gray4, col_cyan, "#000000" }, // Tagbar left selected {text,background,not used but cannot be empty} | |||
+ [SchemeTagsNorm] = { col_gray3, col_gray1, "#000000" }, // Tagbar left unselected {text,background,not used but cannot be empty} | |||
+ [SchemeInfoSel] = { col_gray4, col_cyan, "#000000" }, // infobar middle selected {text,background,not used but cannot be empty} | |||
+ [SchemeInfoNorm] = { col_gray3, col_gray1, "#000000" }, // infobar middle unselected {text,background,not used but cannot be empty} | |||
}; | |||
/* tagging */ | |||
diff --git a/dwm.c b/dwm.c | |||
index 4465af1..0d1d2f7 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, SchemeStatus, SchemeTagsSel, SchemeTagsNorm, SchemeInfoSel, SchemeInfoNorm }; /* color schemes */ | |||
enum { NetSupported, NetWMName, NetWMState, NetWMCheck, | |||
NetWMFullscreen, NetActiveWindow, NetWMWindowType, | |||
NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ | |||
@@ -703,7 +703,7 @@ drawbar(Monitor *m) | |||
/* draw status first so it can be overdrawn by tags later */ | |||
if (m == selmon) { /* status is only drawn on selected monitor */ | |||
- drw_setscheme(drw, scheme[SchemeNorm]); | |||
+ drw_setscheme(drw, scheme[SchemeStatus]); | |||
sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ | |||
drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0); | |||
} | |||
@@ -716,7 +716,7 @@ drawbar(Monitor *m) | |||
x = 0; | |||
for (i = 0; i < LENGTH(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 ? SchemeTagsSel : SchemeTagsNorm]); | |||
drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); | |||
if (occ & 1 << i) | |||
drw_rect(drw, x + boxs, boxs, boxw, boxw, | |||
@@ -725,17 +725,17 @@ drawbar(Monitor *m) | |||
x += w; | |||
} | |||
w = blw = TEXTW(m->ltsymbol); | |||
- drw_setscheme(drw, scheme[SchemeNorm]); | |||
+ drw_setscheme(drw, scheme[SchemeTagsNorm]); | |||
x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); | |||
if ((w = m->ww - sw - x) > bh) { | |||
if (m->sel) { | |||
- drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); | |||
+ drw_setscheme(drw, scheme[m == selmon ? SchemeInfoSel : SchemeInfoNorm]); | |||
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_setscheme(drw, scheme[SchemeInfoNorm]); | |||
drw_rect(drw, x, 0, w, bh, 1, 1); | |||
} | |||
} |
@@ -0,0 +1,239 @@ | |||
diff -up ../dwm-5.8.2-0/config.def.h ./config.def.h | |||
--- ../dwm-5.8.2-0/config.def.h 2010-06-10 22:47:51.660949000 +0200 | |||
+++ ./config.def.h 2010-06-11 00:18:55.082073000 +0200 | |||
@@ -16,6 +16,9 @@ static const Bool topbar = Tr | |||
/* tagging */ | |||
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; | |||
+/* include(s) defining functions */ | |||
+#include "keymodes.pre.h" | |||
+ | |||
static const Rule rules[] = { | |||
/* class instance title tags mask isfloating monitor */ | |||
{ "Gimp", NULL, NULL, 0, True, -1 }, | |||
@@ -47,9 +50,11 @@ static const Layout layouts[] = { | |||
/* commands */ | |||
static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL }; | |||
static const char *termcmd[] = { "uxterm", NULL }; | |||
+static const char *helpcmd[] = { "uxterm", "-e", "man", "dwm", NULL }; | |||
static Key keys[] = { | |||
/* modifier key function argument */ | |||
+ { MODKEY, XK_Escape, setkeymode, {.ui = COMMANDMODE} }, | |||
{ MODKEY, XK_p, spawn, {.v = dmenucmd } }, | |||
{ MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, | |||
{ MODKEY, XK_b, togglebar, {0} }, | |||
@@ -83,6 +88,30 @@ static Key keys[] = { | |||
{ MODKEY|ShiftMask, XK_q, quit, {0} }, | |||
}; | |||
+static Key cmdkeys[] = { | |||
+ /* modifier keys function argument */ | |||
+ { 0, XK_Escape, clearcmd, {0} }, | |||
+ { ControlMask, XK_c, clearcmd, {0} }, | |||
+ { 0, XK_i, setkeymode, {.ui = INSERTMODE} }, | |||
+}; | |||
+static Command commands[] = { | |||
+ /* modifier (4 keys) keysyms (4 keys) function argument */ | |||
+ { {ControlMask, ShiftMask, 0, 0}, {XK_w, XK_h, 0, 0}, setlayout, {.v = &layouts[0]} }, | |||
+ { {ControlMask, 0, 0, 0}, {XK_w, XK_o, 0, 0}, setlayout, {.v = &layouts[2]} }, | |||
+ { {ControlMask, ShiftMask, 0, 0}, {XK_w, XK_o, 0, 0}, onlyclient, {0} }, | |||
+ { {ControlMask, 0, 0, 0}, {XK_w, XK_v, 0, 0}, setlayout, {.v = &layouts[0]} }, | |||
+ { {ControlMask, 0, 0, 0}, {XK_w, XK_less, 0, 0}, setmfact, {.f = -0.05} }, | |||
+ { {ControlMask, ShiftMask, 0, 0}, {XK_w, XK_less, 0, 0}, setmfact, {.f = +0.05} }, | |||
+ { {ControlMask, ShiftMask, 0, 0}, {XK_w, XK_0, 0, 0}, setmfact, {.f = +1.50} }, | |||
+ { {ShiftMask, 0, 0, 0}, {XK_period, XK_e, 0, 0}, spawn, {.v = dmenucmd} }, | |||
+ { {ShiftMask, 0, 0, 0}, {XK_period, XK_o, 0, 0}, spawn, {.v = dmenucmd} }, | |||
+ { {ShiftMask, 0, 0, 0}, {XK_period, XK_h, XK_Return, 0}, spawn, {.v = helpcmd} }, | |||
+ { {ShiftMask, 0, 0, 0}, {XK_period, XK_q, XK_Return, 0}, quit, {0} }, | |||
+ { {ShiftMask, 0, 0, 0}, {XK_period, XK_b, XK_d, XK_Return}, killclient, {0} }, | |||
+ { {ShiftMask, 0, 0, 0}, {XK_period, XK_b, XK_n, XK_Return}, focusstack, {.i = +1} }, | |||
+ { {ShiftMask, 0, ShiftMask, 0}, {XK_period, XK_b, XK_n, XK_Return}, focusstack, {.i = -1} }, | |||
+}; | |||
+ | |||
/* button definitions */ | |||
/* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ | |||
static Button buttons[] = { | |||
@@ -100,3 +129,5 @@ static Button buttons[] = { | |||
{ ClkTagBar, MODKEY, Button3, toggletag, {0} }, | |||
}; | |||
+/* include(s) depending on the configuration variables */ | |||
+#include "keymodes.post.h" | |||
diff -up ../dwm-5.8.2-0/dwm.c ./dwm.c | |||
--- ../dwm-5.8.2-0/dwm.c 2010-06-10 22:47:51.669677000 +0200 | |||
+++ ./dwm.c 2010-06-11 00:18:55.106090000 +0200 | |||
@@ -970,7 +970,7 @@ grabbuttons(Client *c, Bool focused) { | |||
} | |||
void | |||
-grabkeys(void) { | |||
+grabdefkeys(void) { | |||
updatenumlockmask(); | |||
{ | |||
unsigned int i, j; | |||
@@ -1052,7 +1052,7 @@ isuniquegeom(XineramaScreenInfo *unique, | |||
#endif /* XINERAMA */ | |||
void | |||
-keypress(XEvent *e) { | |||
+defkeypress(XEvent *e) { | |||
unsigned int i; | |||
KeySym keysym; | |||
XKeyEvent *ev; | |||
diff -up ../dwm-5.8.2-0/keymodes.post.h ./keymodes.post.h | |||
--- ../dwm-5.8.2-0/keymodes.post.h 2010-06-11 00:21:46.000000000 +0200 | |||
+++ ./keymodes.post.h 2010-06-11 00:18:55.119222000 +0200 | |||
@@ -0,0 +1,124 @@ | |||
+/* See LICENSE file for copyright and license details. */ | |||
+/* © 2010 joten <joten@freenet.de> */ | |||
+ | |||
+/* function implementations */ | |||
+void | |||
+clearcmd(const Arg *arg) { | |||
+ unsigned int i; | |||
+ | |||
+ for(i = 0; i < LENGTH(cmdkeysym); i++) { | |||
+ cmdkeysym[i] = 0; | |||
+ cmdmod[i] = 0; | |||
+ } | |||
+} | |||
+ | |||
+void | |||
+grabkeys(void) { | |||
+ if(keymode == INSERTMODE) { | |||
+ grabdefkeys(); | |||
+ } else if(keymode == COMMANDMODE) { | |||
+ XUngrabKey(dpy, AnyKey, AnyModifier, root); | |||
+ XGrabKey(dpy, AnyKey, AnyModifier, root, | |||
+ True, GrabModeAsync, GrabModeAsync); | |||
+ } | |||
+} | |||
+ | |||
+void | |||
+keypress(XEvent *e) { | |||
+ unsigned int i, j; | |||
+ Arg a = {0}; | |||
+ Bool ismatch = False, maybematch = False; | |||
+ KeySym keysym; | |||
+ XKeyEvent *ev; | |||
+ | |||
+ if(keymode == INSERTMODE) | |||
+ defkeypress(e); | |||
+ else if(keymode == COMMANDMODE) { | |||
+ ev = &e->xkey; | |||
+ keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); | |||
+ if(keysym < XK_Shift_L || keysym > XK_Hyper_R) { | |||
+ for(i = 0; i < LENGTH(cmdkeys); i++) | |||
+ if(keysym == cmdkeys[i].keysym | |||
+ && CLEANMASK(cmdkeys[i].mod) == CLEANMASK(ev->state) | |||
+ && cmdkeys[i].func) { | |||
+ cmdkeys[i].func(&(cmdkeys[i].arg)); | |||
+ ismatch = True; | |||
+ break; | |||
+ } | |||
+ if(!ismatch) { | |||
+ for(j = 0; j < LENGTH(cmdkeysym); j++) | |||
+ if(cmdkeysym[j] == 0) { | |||
+ cmdkeysym[j] = keysym; | |||
+ cmdmod[j] = ev->state; | |||
+ break; | |||
+ } | |||
+ for(i = 0; i < LENGTH(commands); i++) { | |||
+ for(j = 0; j < LENGTH(cmdkeysym); j++) { | |||
+ if(cmdkeysym[j] == commands[i].keysym[j] | |||
+ && CLEANMASK(cmdmod[j]) == CLEANMASK(commands[i].mod[j])) | |||
+ ismatch = True; | |||
+ else if(cmdkeysym[j] == 0 | |||
+ && cmdmod[j] == 0) { | |||
+ ismatch = False; | |||
+ maybematch = True; | |||
+ break; | |||
+ } else { | |||
+ ismatch = False; | |||
+ break; | |||
+ } | |||
+ } | |||
+ if(ismatch) { | |||
+ if(commands[i].func) | |||
+ commands[i].func(&(commands[i].arg)); | |||
+ clearcmd(&a); | |||
+ break; | |||
+ } | |||
+ | |||
+ } | |||
+ if(!maybematch) | |||
+ clearcmd(&a); | |||
+ } | |||
+ } | |||
+ } | |||
+} | |||
+ | |||
+void | |||
+onlyclient(const Arg *arg) { | |||
+ Client *c; | |||
+ XEvent ev; | |||
+ | |||
+ if(!selmon->sel) | |||
+ return; | |||
+ for(c = selmon->clients; c; c = c->next) | |||
+ if(c != selmon->sel && ISVISIBLE(c)) { | |||
+ if(isprotodel(c)) { | |||
+ ev.type = ClientMessage; | |||
+ ev.xclient.window = c->win; | |||
+ ev.xclient.message_type = wmatom[WMProtocols]; | |||
+ ev.xclient.format = 32; | |||
+ ev.xclient.data.l[0] = wmatom[WMDelete]; | |||
+ ev.xclient.data.l[1] = CurrentTime; | |||
+ XSendEvent(dpy, c->win, False, NoEventMask, &ev); | |||
+ } | |||
+ else { | |||
+ XGrabServer(dpy); | |||
+ XSetErrorHandler(xerrordummy); | |||
+ XSetCloseDownMode(dpy, DestroyAll); | |||
+ XKillClient(dpy, c->win); | |||
+ XSync(dpy, False); | |||
+ XSetErrorHandler(xerror); | |||
+ XUngrabServer(dpy); | |||
+ } | |||
+ } | |||
+} | |||
+ | |||
+void | |||
+setkeymode(const Arg *arg) { | |||
+ Arg a = {0}; | |||
+ | |||
+ if(!arg) | |||
+ return; | |||
+ keymode = arg->ui; | |||
+ clearcmd(&a); | |||
+ grabkeys(); | |||
+} | |||
diff -up ../dwm-5.8.2-0/keymodes.pre.h ./keymodes.pre.h | |||
--- ../dwm-5.8.2-0/keymodes.pre.h 2010-06-11 00:21:38.000000000 +0200 | |||
+++ ./keymodes.pre.h 2010-06-11 00:18:55.121759000 +0200 | |||
@@ -0,0 +1,24 @@ | |||
+/* See LICENSE file for copyright and license details. */ | |||
+/* © 2010 joten <joten@freenet.de> */ | |||
+ | |||
+#define COMMANDMODE 1 | |||
+#define INSERTMODE 2 | |||
+ | |||
+typedef struct { | |||
+ unsigned int mod[4]; | |||
+ KeySym keysym[4]; | |||
+ void (*func)(const Arg *); | |||
+ const Arg arg; | |||
+} Command; | |||
+ | |||
+/* function declarations */ | |||
+static void clearcmd(const Arg *arg); | |||
+static void defkeypress(XEvent *e); | |||
+static void grabdefkeys(void); | |||
+static void onlyclient(const Arg *arg); | |||
+static void setkeymode(const Arg *arg); | |||
+ | |||
+/* variables */ | |||
+static unsigned int cmdmod[4]; | |||
+static unsigned int keymode = COMMANDMODE; | |||
+static KeySym cmdkeysym[4]; |
@@ -0,0 +1,101 @@ | |||
From 6b5e23cdf8108a9033acc7c21c8926c0c72647fc Mon Sep 17 00:00:00 2001 | |||
From: Adham Zahran <adhamzahranfms@gmail.com> | |||
Date: Wed, 27 May 2020 18:07:57 +0200 | |||
Subject: [PATCH] Top bar now has buttons that launches programs | |||
--- | |||
config.def.h | 8 ++++++++ | |||
dwm.c | 36 ++++++++++++++++++++++++++++++++++-- | |||
2 files changed, 42 insertions(+), 2 deletions(-) | |||
diff --git a/config.def.h b/config.def.h | |||
index 1c0b587..9231cd5 100644 | |||
--- a/config.def.h | |||
+++ b/config.def.h | |||
@@ -21,6 +21,14 @@ static const char *colors[][3] = { | |||
/* tagging */ | |||
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; | |||
+/* launcher commands (They must be NULL terminated) */ | |||
+static const char* surf[] = { "surf", "duckduckgo.com", NULL }; | |||
+ | |||
+static const Launcher launchers[] = { | |||
+ /* command name to display */ | |||
+ { surf, "surf" }, | |||
+}; | |||
+ | |||
static const Rule rules[] = { | |||
/* xprop(1): | |||
* WM_CLASS(STRING) = instance, class | |||
diff --git a/dwm.c b/dwm.c | |||
index 9fd0286..79e7e20 100644 | |||
--- a/dwm.c | |||
+++ b/dwm.c | |||
@@ -141,6 +141,11 @@ typedef struct { | |||
int monitor; | |||
} Rule; | |||
+typedef struct { | |||
+ const char** command; | |||
+ const char* name; | |||
+} Launcher; | |||
+ | |||
/* function declarations */ | |||
static void applyrules(Client *c); | |||
static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); | |||
@@ -438,9 +443,26 @@ buttonpress(XEvent *e) | |||
if (i < LENGTH(tags)) { | |||
click = ClkTagBar; | |||
arg.ui = 1 << i; | |||
- } else if (ev->x < x + blw) | |||
+ goto execute_handler; | |||
+ } else if (ev->x < x + blw) { | |||
click = ClkLtSymbol; | |||
- else if (ev->x > selmon->ww - TEXTW(stext)) | |||
+ goto execute_handler; | |||
+ } | |||
+ | |||
+ x += blw; | |||
+ | |||
+ for(i = 0; i < LENGTH(launchers); i++) { | |||
+ x += TEXTW(launchers[i].name); | |||
+ | |||
+ if (ev->x < x) { | |||
+ Arg a; | |||
+ a.v = launchers[i].command; | |||
+ spawn(&a); | |||
+ return; | |||
+ } | |||
+ } | |||
+ | |||
+ if (ev->x > selmon->ww - TEXTW(stext)) | |||
click = ClkStatusText; | |||
else | |||
click = ClkWinTitle; | |||
@@ -450,6 +472,9 @@ buttonpress(XEvent *e) | |||
XAllowEvents(dpy, ReplayPointer, CurrentTime); | |||
click = ClkClientWin; | |||
} | |||
+ | |||
+execute_handler: | |||
+ | |||
for (i = 0; i < LENGTH(buttons); i++) | |||
if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button | |||
&& CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) | |||
@@ -728,6 +753,13 @@ drawbar(Monitor *m) | |||
w = blw = TEXTW(m->ltsymbol); | |||
drw_setscheme(drw, scheme[SchemeNorm]); | |||
x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); | |||
+ | |||
+ for (i = 0; i < LENGTH(launchers); i++) | |||
+ { | |||
+ w = TEXTW(launchers[i].name); | |||
+ drw_text(drw, x, 0, w, bh, lrpad / 2, launchers[i].name, urg & 1 << i); | |||
+ x += w; | |||
+ } | |||
if ((w = m->ww - tw - x) > bh) { | |||
if (m->sel) { | |||
-- | |||
2.17.1 | |||
@@ -0,0 +1,248 @@ | |||
From 753860d3435e2968358f2bf8daf70bf625fe75fe Mon Sep 17 00:00:00 2001 | |||
From: Kajetan Puchalski <kajetan.puchalski@tuta.io> | |||
Date: Mon, 5 Oct 2020 11:04:31 +0100 | |||
Subject: [PATCH] Updated Mark patch to work with 6.2 | |||
--- | |||
config.h | 14 +++++-- | |||
drw.h | 2 +- | |||
dwm.c | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- | |||
3 files changed, 118 insertions(+), 9 deletions(-) | |||
diff --git a/config.h b/config.h | |||
index 3858d75..a416c97 100644 | |||
--- a/config.h | |||
+++ b/config.h | |||
@@ -12,10 +12,13 @@ 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 *colors[][3] = { | |||
- /* fg bg border */ | |||
- [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, | |||
- [SchemeSel] = { col_gray4, col_cyan, col_cyan }, | |||
+static const char normmarkcolor[] = "#775500"; /*border color for marked client*/ | |||
+static const char selmarkcolor[] = "#775577"; /*border color for marked client on focus*/ | |||
+ | |||
+static const char *colors[][4] = { | |||
+ /* fg bg border mark */ | |||
+ [SchemeNorm] = { col_gray3, col_gray1, col_gray2, normmarkcolor }, | |||
+ [SchemeSel] = { col_gray4, col_cyan, col_cyan, selmarkcolor }, | |||
}; | |||
/* tagging */ | |||
@@ -94,6 +97,9 @@ static Key keys[] = { | |||
TAGKEYS( XK_8, 7) | |||
TAGKEYS( XK_9, 8) | |||
{ MODKEY|ShiftMask, XK_q, quit, {0} }, | |||
+ { MODKEY, XK_semicolon, togglemark, {0} }, | |||
+ { MODKEY, XK_o, swapfocus, {0} }, | |||
+ { MODKEY, XK_u, swapclient, {0} }, | |||
}; | |||
/* button definitions */ | |||
diff --git a/drw.h b/drw.h | |||
index 4bcd5ad..97aae99 100644 | |||
--- a/drw.h | |||
+++ b/drw.h | |||
@@ -12,7 +12,7 @@ typedef struct Fnt { | |||
struct Fnt *next; | |||
} Fnt; | |||
-enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */ | |||
+enum { ColFg, ColBg, ColBorder, ColMark }; /* Clr scheme index */ | |||
typedef XftColor Clr; | |||
typedef struct { | |||
diff --git a/dwm.c b/dwm.c | |||
index 664c527..195b8eb 100644 | |||
--- a/dwm.c | |||
+++ b/dwm.c | |||
@@ -201,17 +201,21 @@ static void setclientstate(Client *c, long state); | |||
static void setfocus(Client *c); | |||
static void setfullscreen(Client *c, int fullscreen); | |||
static void setlayout(const Arg *arg); | |||
+static void setmark(Client *c); | |||
static void setmfact(const Arg *arg); | |||
static void setup(void); | |||
static void seturgent(Client *c, int urg); | |||
static void showhide(Client *c); | |||
static void sigchld(int unused); | |||
static void spawn(const Arg *arg); | |||
+static void swapclient(const Arg *arg); | |||
+static void swapfocus(const Arg *arg); | |||
static void tag(const Arg *arg); | |||
static void tagmon(const Arg *arg); | |||
static void tile(Monitor *); | |||
static void togglebar(const Arg *arg); | |||
static void togglefloating(const Arg *arg); | |||
+static void togglemark(const Arg *arg); | |||
static void toggletag(const Arg *arg); | |||
static void toggleview(const Arg *arg); | |||
static void unfocus(Client *c, int setfocus); | |||
@@ -268,6 +272,7 @@ static Display *dpy; | |||
static Drw *drw; | |||
static Monitor *mons, *selmon; | |||
static Window root, wmcheckwin; | |||
+static Client *mark; | |||
/* configuration, allows nested code to access above variables */ | |||
#include "config.h" | |||
@@ -796,7 +801,10 @@ focus(Client *c) | |||
detachstack(c); | |||
attachstack(c); | |||
grabbuttons(c, 1); | |||
- XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); | |||
+ if (c == mark) | |||
+ XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColMark].pixel); | |||
+ else | |||
+ XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); | |||
setfocus(c); | |||
} else { | |||
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); | |||
@@ -1052,7 +1060,10 @@ manage(Window w, XWindowAttributes *wa) | |||
wc.border_width = c->bw; | |||
XConfigureWindow(dpy, w, CWBorderWidth, &wc); | |||
- XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); | |||
+ if (c == mark) | |||
+ XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColMark].pixel); | |||
+ else | |||
+ XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); | |||
configure(c); /* propagates border_width, if size doesn't change */ | |||
updatewindowtype(c); | |||
updatesizehints(c); | |||
@@ -1512,6 +1523,23 @@ setlayout(const Arg *arg) | |||
drawbar(selmon); | |||
} | |||
+void | |||
+setmark(Client *c) | |||
+{ | |||
+ if (c == mark) | |||
+ return; | |||
+ if (mark) { | |||
+ XSetWindowBorder(dpy, mark->win, scheme[mark == selmon->sel | |||
+ ? SchemeSel : SchemeNorm][ColBorder].pixel); | |||
+ mark = 0; | |||
+ } | |||
+ if (c) { | |||
+ XSetWindowBorder(dpy, c->win, scheme[c == selmon->sel | |||
+ ? SchemeSel : SchemeNorm][ColMark].pixel); | |||
+ mark = c; | |||
+ } | |||
+} | |||
+ | |||
/* arg > 1.0 will set mfact absolutely */ | |||
void | |||
setmfact(const Arg *arg) | |||
@@ -1570,7 +1598,7 @@ setup(void) | |||
/* init appearance */ | |||
scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); | |||
for (i = 0; i < LENGTH(colors); i++) | |||
- scheme[i] = drw_scm_create(drw, colors[i], 3); | |||
+ scheme[i] = drw_scm_create(drw, colors[i], 4); | |||
/* init bars */ | |||
updatebars(); | |||
updatestatus(); | |||
@@ -1653,6 +1681,75 @@ spawn(const Arg *arg) | |||
} | |||
} | |||
+void | |||
+swapclient(const Arg *arg) | |||
+{ | |||
+ Client *s, *m, t; | |||
+ | |||
+ if (!mark || !selmon->sel || mark == selmon->sel | |||
+ || !selmon->lt[selmon->sellt]->arrange) | |||
+ return; | |||
+ s = selmon->sel; | |||
+ m = mark; | |||
+ t = *s; | |||
+ strcpy(s->name, m->name); | |||
+ s->win = m->win; | |||
+ s->x = m->x; | |||
+ s->y = m->y; | |||
+ s->w = m->w; | |||
+ s->h = m->h; | |||
+ | |||
+ m->win = t.win; | |||
+ strcpy(m->name, t.name); | |||
+ m->x = t.x; | |||
+ m->y = t.y; | |||
+ m->w = t.w; | |||
+ m->h = t.h; | |||
+ | |||
+ selmon->sel = m; | |||
+ mark = s; | |||
+ focus(s); | |||
+ setmark(m); | |||
+ | |||
+ arrange(s->mon); | |||
+ if (s->mon != m->mon) { | |||
+ arrange(m->mon); | |||
+ } | |||
+} | |||
+ | |||
+void | |||
+swapfocus(const Arg *arg) | |||
+{ | |||
+ Client *t; | |||
+ | |||
+ if (!selmon->sel || !mark || selmon->sel == mark) | |||
+ return; | |||
+ t = selmon->sel; | |||
+ if (mark->mon != selmon) { | |||
+ unfocus(selmon->sel, 0); | |||
+ selmon = mark->mon; | |||
+ } | |||
+ if (ISVISIBLE(mark)) { | |||
+ focus(mark); | |||
+ restack(selmon); | |||
+ } else { | |||
+ selmon->seltags ^= 1; | |||
+ selmon->tagset[selmon->seltags] = mark->tags; | |||
+ focus(mark); | |||
+ arrange(selmon); | |||
+ } | |||
+ setmark(t); | |||
+} | |||
+ | |||
+void | |||
+togglemark(const Arg *arg) | |||
+{ | |||
+ if (!selmon->sel) | |||
+ return; | |||
+ setmark(selmon->sel == mark ? 0 : selmon->sel); | |||
+} | |||
+ | |||
+ | |||
void | |||
tag(const Arg *arg) | |||
{ | |||
@@ -1755,7 +1852,10 @@ unfocus(Client *c, int setfocus) | |||
if (!c) | |||
return; | |||
grabbuttons(c, 0); | |||
- XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); | |||
+ if (c == mark) | |||
+ XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColMark].pixel); | |||
+ else | |||
+ XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); | |||
if (setfocus) { | |||
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); | |||
XDeleteProperty(dpy, root, netatom[NetActiveWindow]); | |||
@@ -1768,6 +1868,9 @@ unmanage(Client *c, int destroyed) | |||
Monitor *m = c->mon; | |||
XWindowChanges wc; | |||
+ if (c == mark) | |||
+ setmark(0); | |||
+ | |||
detach(c); | |||
detachstack(c); | |||
if (!destroyed) { | |||
-- | |||
2.28.0 | |||
@@ -0,0 +1,77 @@ | |||
Author: Chris Noxz <chris@noxz.tech> | |||
diff -upN dwm-6.1/config.def.h dwm-nrowgrid-6.1/config.def.h | |||
--- dwm-6.1/config.def.h 2015-11-08 23:11:48.000000000 +0100 | |||
+++ dwm-nrowgrid-6.1/config.def.h 2018-10-01 10:44:05.631382842 +0200 | |||
@@ -34,11 +34,15 @@ static const float mfact = 0.55; /* | |||
static const int nmaster = 1; /* number of clients in master area */ | |||
static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ | |||
+#define FORCE_VSPLIT 1 | |||
+#include "nrowgrid.c" | |||
+ | |||
static const Layout layouts[] = { | |||
/* symbol arrange function */ | |||
{ "[]=", tile }, /* first entry is default */ | |||
{ "><>", NULL }, /* no layout function means floating behavior */ | |||
{ "[M]", monocle }, | |||
+ { "###", nrowgrid }, | |||
}; | |||
/* key definitions */ | |||
diff -upN dwm-6.1/nrowgrid.c dwm-nrowgrid-6.1/nrowgrid.c | |||
--- dwm-6.1/nrowgrid.c 1970-01-01 01:00:00.000000000 +0100 | |||
+++ dwm-nrowgrid-6.1/nrowgrid.c 2018-10-01 10:44:27.741263063 +0200 | |||
@@ -0,0 +1,52 @@ | |||
+void | |||
+nrowgrid(Monitor *m) | |||
+{ | |||
+ unsigned int n = 0, i = 0, ri = 0, ci = 0; /* counters */ | |||
+ unsigned int cx, cy, cw, ch; /* client geometry */ | |||
+ unsigned int uw = 0, uh = 0, uc = 0; /* utilization trackers */ | |||
+ unsigned int cols, rows = m->nmaster + 1; | |||
+ Client *c; | |||
+ | |||
+ /* count clients */ | |||
+ for (c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); | |||
+ | |||
+ /* nothing to do here */ | |||
+ if (n == 0) | |||
+ return; | |||
+ | |||
+ /* force 2 clients to always split vertically */ | |||
+ if (FORCE_VSPLIT && n == 2) | |||
+ rows = 1; | |||
+ | |||
+ /* never allow empty rows */ | |||
+ if (n < rows) | |||
+ rows = n; | |||
+ | |||
+ /* define first row */ | |||
+ cols = n / rows; | |||
+ uc = cols; | |||
+ cy = m->wy; | |||
+ ch = m->wh / rows; | |||
+ uh = ch; | |||
+ | |||
+ for (c = nexttiled(m->clients); c; c = nexttiled(c->next), i++, ci++) { | |||
+ if (ci == cols) { | |||
+ uw = 0; | |||
+ ci = 0; | |||
+ ri++; | |||
+ | |||
+ /* next row */ | |||
+ cols = (n - uc) / (rows - ri); | |||
+ uc += cols; | |||
+ cy = m->wy + uh; | |||
+ ch = (m->wh - uh) / (rows - ri); | |||
+ uh += ch; | |||
+ } | |||
+ | |||
+ cx = m->wx + uw; | |||
+ cw = (m->ww - uw) / (cols - ci); | |||
+ uw += cw; | |||
+ | |||
+ resize(c, cx, cy, cw - 2 * c->bw, ch - 2 * c->bw, 0); | |||
+ } | |||
+} |