overlays: customscripts: misc changes, patches: moved to home
Signed-off-by: Amneesh Singh <natto@weirdnatto.in>
This commit is contained in:
		
							
								
								
									
										335
									
								
								home/natto/patches/dmenu.patch
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										335
									
								
								home/natto/patches/dmenu.patch
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,335 @@
 | 
			
		||||
diff --color -ru dmenu-5.2/config.def.h dmenu-5.2-a/config.def.h
 | 
			
		||||
--- dmenu-5.2/config.def.h	2022-10-04 23:06:58.000000000 +0530
 | 
			
		||||
+++ dmenu-5.2-a/config.def.h	2022-11-25 02:20:05.393693557 +0530
 | 
			
		||||
@@ -2,16 +2,21 @@
 | 
			
		||||
 /* Default settings; can be overriden by command line. */
 | 
			
		||||
 
 | 
			
		||||
 static int topbar = 1;                      /* -b  option; if 0, dmenu appears at bottom     */
 | 
			
		||||
+static int centered = 1;                    /* -c option; centers dmenu on screen */
 | 
			
		||||
+static int min_width = 500;                    /* minimum width when centered */
 | 
			
		||||
 /* -fn option overrides fonts[0]; default X11 font or font set */
 | 
			
		||||
 static const char *fonts[] = {
 | 
			
		||||
-	"monospace:size=10"
 | 
			
		||||
+	"Consolas:pixelsize=15"
 | 
			
		||||
 };
 | 
			
		||||
 static const char *prompt      = NULL;      /* -p  option; prompt to the left of input field */
 | 
			
		||||
 static const char *colors[SchemeLast][2] = {
 | 
			
		||||
 	/*     fg         bg       */
 | 
			
		||||
-	[SchemeNorm] = { "#bbbbbb", "#222222" },
 | 
			
		||||
-	[SchemeSel] = { "#eeeeee", "#005577" },
 | 
			
		||||
+	[SchemeNorm] = { "#839496", "#002b36" },
 | 
			
		||||
+	[SchemeSel] = { "#002b36", "#839496" },
 | 
			
		||||
+	[SchemeSelHighlight] = { "#d33682", "#839496" },
 | 
			
		||||
+	[SchemeNormHighlight] = { "#2aa198", "#002b36" },
 | 
			
		||||
 	[SchemeOut] = { "#000000", "#00ffff" },
 | 
			
		||||
+	[SchemeOutHighlight] = { "#fdf6e3", "#cb4b16" },
 | 
			
		||||
 };
 | 
			
		||||
 /* -l option; if nonzero, dmenu uses vertical list with given number of lines */
 | 
			
		||||
 static unsigned int lines      = 0;
 | 
			
		||||
@@ -21,3 +26,5 @@
 | 
			
		||||
  * for example: " /?\"&[]"
 | 
			
		||||
  */
 | 
			
		||||
 static const char worddelimiters[] = " ";
 | 
			
		||||
+/* Size of the window border */
 | 
			
		||||
+static const unsigned int border_width = 4;
 | 
			
		||||
Only in dmenu-5.2-a: config.h
 | 
			
		||||
diff --color -ru dmenu-5.2/dmenu.1 dmenu-5.2-a/dmenu.1
 | 
			
		||||
--- dmenu-5.2/dmenu.1	2022-10-04 23:06:58.000000000 +0530
 | 
			
		||||
+++ dmenu-5.2-a/dmenu.1	2022-11-25 02:20:05.393693557 +0530
 | 
			
		||||
@@ -40,6 +40,9 @@
 | 
			
		||||
 .B \-b
 | 
			
		||||
 dmenu appears at the bottom of the screen.
 | 
			
		||||
 .TP
 | 
			
		||||
+.B \-c
 | 
			
		||||
+dmenu appears centered on the screen.
 | 
			
		||||
+.TP
 | 
			
		||||
 .B \-f
 | 
			
		||||
 dmenu grabs the keyboard before reading stdin if not reading from a tty. This
 | 
			
		||||
 is faster, but will lock up X until stdin reaches end\-of\-file.
 | 
			
		||||
diff --color -ru dmenu-5.2/dmenu.c dmenu-5.2-a/dmenu.c
 | 
			
		||||
--- dmenu-5.2/dmenu.c	2022-10-04 23:06:58.000000000 +0530
 | 
			
		||||
+++ dmenu-5.2-a/dmenu.c	2022-11-25 02:22:42.610351072 +0530
 | 
			
		||||
@@ -26,8 +26,7 @@
 | 
			
		||||
 #define TEXTW(X)              (drw_fontset_getwidth(drw, (X)) + lrpad)
 | 
			
		||||
 
 | 
			
		||||
 /* enums */
 | 
			
		||||
-enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */
 | 
			
		||||
-
 | 
			
		||||
+enum { SchemeNorm, SchemeSel, SchemeOut, SchemeNormHighlight, SchemeSelHighlight, SchemeOutHighlight, SchemeLast }; /* color schemes */
 | 
			
		||||
 struct item {
 | 
			
		||||
 	char *text;
 | 
			
		||||
 	struct item *left, *right;
 | 
			
		||||
@@ -96,6 +95,15 @@
 | 
			
		||||
 			break;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+static int
 | 
			
		||||
+max_textw(void)
 | 
			
		||||
+{
 | 
			
		||||
+	int len = 0;
 | 
			
		||||
+	for (struct item *item = items; item && item->text; item++)
 | 
			
		||||
+		len = MAX(TEXTW(item->text), len);
 | 
			
		||||
+	return len;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 static void
 | 
			
		||||
 cleanup(void)
 | 
			
		||||
 {
 | 
			
		||||
@@ -130,6 +138,43 @@
 | 
			
		||||
 	return NULL;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+static void
 | 
			
		||||
+drawhighlights(struct item *item, int x, int y, int maxw)
 | 
			
		||||
+{
 | 
			
		||||
+	char restorechar, tokens[sizeof text], *highlight,  *token;
 | 
			
		||||
+	int indentx, highlightlen;
 | 
			
		||||
+
 | 
			
		||||
+	drw_setscheme(drw, scheme[item == sel ? SchemeSelHighlight : item->out ? SchemeOutHighlight : SchemeNormHighlight]);
 | 
			
		||||
+	strcpy(tokens, text);
 | 
			
		||||
+	for (token = strtok(tokens, " "); token; token = strtok(NULL, " ")) {
 | 
			
		||||
+		highlight = fstrstr(item->text, token);
 | 
			
		||||
+		while (highlight) {
 | 
			
		||||
+			// Move item str end, calc width for highlight indent, & restore
 | 
			
		||||
+			highlightlen = highlight - item->text;
 | 
			
		||||
+			restorechar = *highlight;
 | 
			
		||||
+			item->text[highlightlen] = '\0';
 | 
			
		||||
+			indentx = TEXTW(item->text);
 | 
			
		||||
+			item->text[highlightlen] = restorechar;
 | 
			
		||||
+
 | 
			
		||||
+			// Move highlight str end, draw highlight, & restore
 | 
			
		||||
+			restorechar = highlight[strlen(token)];
 | 
			
		||||
+			highlight[strlen(token)] = '\0';
 | 
			
		||||
+			if (indentx - (lrpad / 2) - 1 < maxw)
 | 
			
		||||
+				drw_text(
 | 
			
		||||
+					drw,
 | 
			
		||||
+					x + indentx - (lrpad / 2) - 1,
 | 
			
		||||
+					y,
 | 
			
		||||
+					MIN(maxw - indentx, TEXTW(highlight) - lrpad),
 | 
			
		||||
+					bh, 0, highlight, 0
 | 
			
		||||
+				);
 | 
			
		||||
+			highlight[strlen(token)] = restorechar;
 | 
			
		||||
+
 | 
			
		||||
+			if (strlen(highlight) - strlen(token) < strlen(token)) break;
 | 
			
		||||
+			highlight = fstrstr(highlight + strlen(token), token);
 | 
			
		||||
+		}
 | 
			
		||||
+	}
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 static int
 | 
			
		||||
 drawitem(struct item *item, int x, int y, int w)
 | 
			
		||||
 {
 | 
			
		||||
@@ -140,7 +185,9 @@
 | 
			
		||||
 	else
 | 
			
		||||
 		drw_setscheme(drw, scheme[SchemeNorm]);
 | 
			
		||||
 
 | 
			
		||||
-	return drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0);
 | 
			
		||||
+	int r = drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0);
 | 
			
		||||
+	drawhighlights(item, x, y, w);
 | 
			
		||||
+	return r;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static void
 | 
			
		||||
@@ -529,6 +576,119 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static void
 | 
			
		||||
+buttonpress(XEvent *e)
 | 
			
		||||
+{
 | 
			
		||||
+	struct item *item;
 | 
			
		||||
+	XButtonPressedEvent *ev = &e->xbutton;
 | 
			
		||||
+	int x = 0, y = 0, h = bh, w;
 | 
			
		||||
+
 | 
			
		||||
+	if (ev->window != win)
 | 
			
		||||
+		return;
 | 
			
		||||
+
 | 
			
		||||
+	/* right-click: exit */
 | 
			
		||||
+	if (ev->button == Button3)
 | 
			
		||||
+		exit(1);
 | 
			
		||||
+
 | 
			
		||||
+	if (prompt && *prompt)
 | 
			
		||||
+		x += promptw;
 | 
			
		||||
+
 | 
			
		||||
+	/* input field */
 | 
			
		||||
+	w = (lines > 0 || !matches) ? mw - x : inputw;
 | 
			
		||||
+
 | 
			
		||||
+	/* left-click on input: clear input,
 | 
			
		||||
+	 * NOTE: if there is no left-arrow the space for < is reserved so
 | 
			
		||||
+	 *       add that to the input width */
 | 
			
		||||
+	if (ev->button == Button1 &&
 | 
			
		||||
+	   ((lines <= 0 && ev->x >= 0 && ev->x <= x + w +
 | 
			
		||||
+	   ((!prev || !curr->left) ? TEXTW("<") : 0)) ||
 | 
			
		||||
+	   (lines > 0 && ev->y >= y && ev->y <= y + h))) {
 | 
			
		||||
+		insert(NULL, -cursor);
 | 
			
		||||
+		drawmenu();
 | 
			
		||||
+		return;
 | 
			
		||||
+	}
 | 
			
		||||
+	/* middle-mouse click: paste selection */
 | 
			
		||||
+	if (ev->button == Button2) {
 | 
			
		||||
+		XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY,
 | 
			
		||||
+		                  utf8, utf8, win, CurrentTime);
 | 
			
		||||
+		drawmenu();
 | 
			
		||||
+		return;
 | 
			
		||||
+	}
 | 
			
		||||
+	/* scroll up */
 | 
			
		||||
+	if (ev->button == Button4 && prev) {
 | 
			
		||||
+		sel = curr = prev;
 | 
			
		||||
+		calcoffsets();
 | 
			
		||||
+		drawmenu();
 | 
			
		||||
+		return;
 | 
			
		||||
+	}
 | 
			
		||||
+	/* scroll down */
 | 
			
		||||
+	if (ev->button == Button5 && next) {
 | 
			
		||||
+		sel = curr = next;
 | 
			
		||||
+		calcoffsets();
 | 
			
		||||
+		drawmenu();
 | 
			
		||||
+		return;
 | 
			
		||||
+	}
 | 
			
		||||
+	if (ev->button != Button1)
 | 
			
		||||
+		return;
 | 
			
		||||
+	if (ev->state & ~ControlMask)
 | 
			
		||||
+		return;
 | 
			
		||||
+	if (lines > 0) {
 | 
			
		||||
+		/* vertical list: (ctrl)left-click on item */
 | 
			
		||||
+		w = mw - x;
 | 
			
		||||
+		for (item = curr; item != next; item = item->right) {
 | 
			
		||||
+			y += h;
 | 
			
		||||
+			if (ev->y >= y && ev->y <= (y + h)) {
 | 
			
		||||
+				puts(item->text);
 | 
			
		||||
+				if (!(ev->state & ControlMask))
 | 
			
		||||
+					exit(0);
 | 
			
		||||
+				sel = item;
 | 
			
		||||
+				if (sel) {
 | 
			
		||||
+					sel->out = 1;
 | 
			
		||||
+					drawmenu();
 | 
			
		||||
+				}
 | 
			
		||||
+				return;
 | 
			
		||||
+			}
 | 
			
		||||
+		}
 | 
			
		||||
+	} else if (matches) {
 | 
			
		||||
+		/* left-click on left arrow */
 | 
			
		||||
+		x += inputw;
 | 
			
		||||
+		w = TEXTW("<");
 | 
			
		||||
+		if (prev && curr->left) {
 | 
			
		||||
+			if (ev->x >= x && ev->x <= x + w) {
 | 
			
		||||
+				sel = curr = prev;
 | 
			
		||||
+				calcoffsets();
 | 
			
		||||
+				drawmenu();
 | 
			
		||||
+				return;
 | 
			
		||||
+			}
 | 
			
		||||
+		}
 | 
			
		||||
+		/* horizontal list: (ctrl)left-click on item */
 | 
			
		||||
+		for (item = curr; item != next; item = item->right) {
 | 
			
		||||
+			x += w;
 | 
			
		||||
+			w = MIN(TEXTW(item->text), mw - x - TEXTW(">"));
 | 
			
		||||
+			if (ev->x >= x && ev->x <= x + w) {
 | 
			
		||||
+				puts(item->text);
 | 
			
		||||
+				if (!(ev->state & ControlMask))
 | 
			
		||||
+					exit(0);
 | 
			
		||||
+				sel = item;
 | 
			
		||||
+				if (sel) {
 | 
			
		||||
+					sel->out = 1;
 | 
			
		||||
+					drawmenu();
 | 
			
		||||
+				}
 | 
			
		||||
+				return;
 | 
			
		||||
+			}
 | 
			
		||||
+		}
 | 
			
		||||
+		/* left-click on right arrow */
 | 
			
		||||
+		w = TEXTW(">");
 | 
			
		||||
+		x = mw - w;
 | 
			
		||||
+		if (next && ev->x >= x && ev->x <= x + w) {
 | 
			
		||||
+			sel = curr = next;
 | 
			
		||||
+			calcoffsets();
 | 
			
		||||
+			drawmenu();
 | 
			
		||||
+			return;
 | 
			
		||||
+		}
 | 
			
		||||
+	}
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+static void
 | 
			
		||||
 paste(void)
 | 
			
		||||
 {
 | 
			
		||||
 	char *p, *q;
 | 
			
		||||
@@ -582,6 +742,9 @@
 | 
			
		||||
 				break;
 | 
			
		||||
 			cleanup();
 | 
			
		||||
 			exit(1);
 | 
			
		||||
+		case ButtonPress:
 | 
			
		||||
+			buttonpress(&ev);
 | 
			
		||||
+			break;
 | 
			
		||||
 		case Expose:
 | 
			
		||||
 			if (ev.xexpose.count == 0)
 | 
			
		||||
 				drw_map(drw, win, 0, 0, mw, mh);
 | 
			
		||||
@@ -632,6 +795,7 @@
 | 
			
		||||
 	bh = drw->fonts->h + 2;
 | 
			
		||||
 	lines = MAX(lines, 0);
 | 
			
		||||
 	mh = (lines + 1) * bh;
 | 
			
		||||
+	promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0;
 | 
			
		||||
 #ifdef XINERAMA
 | 
			
		||||
 	i = 0;
 | 
			
		||||
 	if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) {
 | 
			
		||||
@@ -658,9 +822,16 @@
 | 
			
		||||
 				if (INTERSECT(x, y, 1, 1, info[i]) != 0)
 | 
			
		||||
 					break;
 | 
			
		||||
 
 | 
			
		||||
-		x = info[i].x_org;
 | 
			
		||||
-		y = info[i].y_org + (topbar ? 0 : info[i].height - mh);
 | 
			
		||||
-		mw = info[i].width;
 | 
			
		||||
+		if (centered) {
 | 
			
		||||
+			mw = MIN(MAX(max_textw() + promptw, min_width), info[i].width);
 | 
			
		||||
+			x = info[i].x_org + ((info[i].width  - mw) / 2);
 | 
			
		||||
+			y = info[i].y_org + ((info[i].height - mh) / 2);
 | 
			
		||||
+		} else {
 | 
			
		||||
+			x = info[i].x_org;
 | 
			
		||||
+			y = info[i].y_org + (topbar ? 0 : info[i].height - mh);
 | 
			
		||||
+			mw = info[i].width;
 | 
			
		||||
+		}
 | 
			
		||||
+
 | 
			
		||||
 		XFree(info);
 | 
			
		||||
 	} else
 | 
			
		||||
 #endif
 | 
			
		||||
@@ -668,21 +839,29 @@
 | 
			
		||||
 		if (!XGetWindowAttributes(dpy, parentwin, &wa))
 | 
			
		||||
 			die("could not get embedding window attributes: 0x%lx",
 | 
			
		||||
 			    parentwin);
 | 
			
		||||
-		x = 0;
 | 
			
		||||
-		y = topbar ? 0 : wa.height - mh;
 | 
			
		||||
-		mw = wa.width;
 | 
			
		||||
+
 | 
			
		||||
+		if (centered) {
 | 
			
		||||
+			mw = MIN(MAX(max_textw() + promptw, min_width), wa.width);
 | 
			
		||||
+			x = (wa.width  - mw) / 2;
 | 
			
		||||
+			y = (wa.height - mh) / 2;
 | 
			
		||||
+		} else {
 | 
			
		||||
+			x = 0;
 | 
			
		||||
+			y = topbar ? 0 : wa.height - mh;
 | 
			
		||||
+			mw = wa.width;
 | 
			
		||||
+		}
 | 
			
		||||
 	}
 | 
			
		||||
-	promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0;
 | 
			
		||||
 	inputw = mw / 3; /* input width: ~33% of monitor width */
 | 
			
		||||
 	match();
 | 
			
		||||
 
 | 
			
		||||
 	/* create menu window */
 | 
			
		||||
 	swa.override_redirect = True;
 | 
			
		||||
 	swa.background_pixel = scheme[SchemeNorm][ColBg].pixel;
 | 
			
		||||
-	swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask;
 | 
			
		||||
-	win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0,
 | 
			
		||||
+	swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask |
 | 
			
		||||
+	                 ButtonPressMask;
 | 
			
		||||
+	win = XCreateWindow(dpy, parentwin, x, y, mw, mh, border_width,
 | 
			
		||||
 	                    CopyFromParent, CopyFromParent, CopyFromParent,
 | 
			
		||||
 	                    CWOverrideRedirect | CWBackPixel | CWEventMask, &swa);
 | 
			
		||||
+	XSetWindowBorder(dpy, win, scheme[SchemeSel][ColBg].pixel);
 | 
			
		||||
 	XSetClassHint(dpy, win, &ch);
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -729,6 +908,8 @@
 | 
			
		||||
 			topbar = 0;
 | 
			
		||||
 		else if (!strcmp(argv[i], "-f"))   /* grabs keyboard before reading stdin */
 | 
			
		||||
 			fast = 1;
 | 
			
		||||
+		else if (!strcmp(argv[i], "-c"))   /* centers dmenu on screen */
 | 
			
		||||
+			centered = 1;
 | 
			
		||||
 		else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */
 | 
			
		||||
 			fstrncmp = strncasecmp;
 | 
			
		||||
 			fstrstr = cistrstr;
 | 
			
		||||
							
								
								
									
										602
									
								
								home/natto/patches/dwm.patch
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										602
									
								
								home/natto/patches/dwm.patch
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,602 @@
 | 
			
		||||
diff --color -u a/config.def.h b/config.def.h
 | 
			
		||||
--- a/config.def.h	2019-02-02 18:25:28.000000000 +0530
 | 
			
		||||
+++ b/config.def.h	2021-05-21 00:15:46.365943100 +0530
 | 
			
		||||
@@ -1,50 +1,55 @@
 | 
			
		||||
 /* See LICENSE file for copyright and license details. */
 | 
			
		||||
 
 | 
			
		||||
 /* appearance */
 | 
			
		||||
-static const unsigned int borderpx  = 1;        /* border pixel of windows */
 | 
			
		||||
+static const unsigned int borderpx  = 4;        /* 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 */
 | 
			
		||||
-static const char *fonts[]          = { "monospace:size=10" };
 | 
			
		||||
-static const char dmenufont[]       = "monospace:size=10";
 | 
			
		||||
-static const char col_gray1[]       = "#222222";
 | 
			
		||||
-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 *fonts[] = {"Consolas:pixelsize=15",
 | 
			
		||||
+                              "Font Awesome 5 Free Solid:pixelsize=15",
 | 
			
		||||
+                              "Font Awesome 5 Brands:pixelsize=15"};
 | 
			
		||||
+static const char col_1[] = "#1d2021";
 | 
			
		||||
+static const char col_2[] = "#444444";
 | 
			
		||||
+static const char col_3[] = "#bbbbbb";
 | 
			
		||||
+static const char col_4[] = "#1d2021";
 | 
			
		||||
+static const char col_5[] = "#ebdbb2";
 | 
			
		||||
+static const char *colors[][3] = {
 | 
			
		||||
+    /*               fg         bg         border   */
 | 
			
		||||
+    [SchemeNorm] = {col_3, col_1, col_2},
 | 
			
		||||
+    [SchemeSel] = {col_4, col_5, col_5},
 | 
			
		||||
 };
 | 
			
		||||
-
 | 
			
		||||
 /* tagging */
 | 
			
		||||
-static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
 | 
			
		||||
 
 | 
			
		||||
-static const Rule rules[] = {
 | 
			
		||||
+static const char *tags[] = {"", "", "", "", "", "", "", "", ""};
 | 
			
		||||
+
 | 
			
		||||
+static const Rule rules[0];// = {
 | 
			
		||||
 	/* xprop(1):
 | 
			
		||||
 	 *	WM_CLASS(STRING) = instance, class
 | 
			
		||||
 	 *	WM_NAME(STRING) = title
 | 
			
		||||
 	 */
 | 
			
		||||
 	/* class      instance    title       tags mask     isfloating   monitor */
 | 
			
		||||
-	{ "Gimp",     NULL,       NULL,       0,            1,           -1 },
 | 
			
		||||
-	{ "Firefox",  NULL,       NULL,       1 << 8,       0,           -1 },
 | 
			
		||||
-};
 | 
			
		||||
+//	{ "Gimp",     NULL,       NULL,       0,            1,           -1 },
 | 
			
		||||
+//	{ "Firefox",  NULL,       NULL,       1 << 8,       0,           -1 },
 | 
			
		||||
+//};
 | 
			
		||||
 
 | 
			
		||||
 /* 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 nmaster     = 0;    /* number of clients in master area */
 | 
			
		||||
+static const int resizehints = 0;    /* 1 means respect size hints in tiled resizals */
 | 
			
		||||
 
 | 
			
		||||
 static const Layout layouts[] = {
 | 
			
		||||
 	/* symbol     arrange function */
 | 
			
		||||
-	{ "[]=",      tile },    /* first entry is default */
 | 
			
		||||
-	{ "><>",      NULL },    /* no layout function means floating behavior */
 | 
			
		||||
+	{ "|M|",      centeredmaster },
 | 
			
		||||
+	{ "><>",      NULL },
 | 
			
		||||
 	{ "[M]",      monocle },
 | 
			
		||||
+	{ "[]=",      tile }, 
 | 
			
		||||
+	{ ">M>",      centeredfloatingmaster },
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 /* key definitions */
 | 
			
		||||
-#define MODKEY Mod1Mask
 | 
			
		||||
+#define MODKEY Mod4Mask
 | 
			
		||||
+#define Print 0x0000ff61
 | 
			
		||||
 #define TAGKEYS(KEY,TAG) \
 | 
			
		||||
 	{ MODKEY,                       KEY,      view,           {.ui = 1 << TAG} }, \
 | 
			
		||||
 	{ MODKEY|ControlMask,           KEY,      toggleview,     {.ui = 1 << TAG} }, \
 | 
			
		||||
@@ -55,45 +60,66 @@
 | 
			
		||||
 #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
 | 
			
		||||
 
 | 
			
		||||
 /* commands */
 | 
			
		||||
-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 };
 | 
			
		||||
-
 | 
			
		||||
+static char dmenumon[2] = "0";
 | 
			
		||||
+static const char *dmenucmd[] = { "dmenu_run","-l","20", NULL};
 | 
			
		||||
+static const char *termcmd[]  = { "st",NULL };
 | 
			
		||||
+static const char *ss1[] ={"flameshot", "full" ,"-p","/home/natto/Pictures",NULL};
 | 
			
		||||
+static const char *ss2[] ={"flameshot", "gui" ,"-p","/home/natto/Pictures",NULL};
 | 
			
		||||
+static const char *ss3[] ={"flameshot", "full" ,"-p","/home/natto/Pictures","-d","10000",NULL};
 | 
			
		||||
+static const char *mpc1[] = {"mpc", "next",NULL};
 | 
			
		||||
+static const char *mpc2[] = {"mpc", "prev",NULL};
 | 
			
		||||
+static const char *mpc3[] = {"mpc", "toggle",NULL};
 | 
			
		||||
+static const char *mpc4[] = {"mpc", "seek","+00:00:05",NULL};
 | 
			
		||||
+static const char *mpc5[] = {"mpc", "seek","-00:00:05",NULL};
 | 
			
		||||
+static const char *volinc[] = {"pamixer", "-i","5",NULL};
 | 
			
		||||
+static const char *voldec[] = {"pamixer", "-d", "5",NULL};
 | 
			
		||||
 static Key keys[] = {
 | 
			
		||||
 	/* modifier                     key        function        argument */
 | 
			
		||||
-	{ MODKEY,                       XK_p,      spawn,          {.v = dmenucmd } },
 | 
			
		||||
-	{ MODKEY|ShiftMask,             XK_Return, spawn,          {.v = termcmd } },
 | 
			
		||||
+	{ MODKEY,                       XK_d,      spawn,          {.v = dmenucmd } },
 | 
			
		||||
+	{ MODKEY,                       XK_Return, spawn,          {.v = termcmd } },
 | 
			
		||||
 	{ MODKEY,                       XK_b,      togglebar,      {0} },
 | 
			
		||||
 	{ MODKEY,                       XK_j,      focusstack,     {.i = +1 } },
 | 
			
		||||
 	{ MODKEY,                       XK_k,      focusstack,     {.i = -1 } },
 | 
			
		||||
 	{ MODKEY,                       XK_i,      incnmaster,     {.i = +1 } },
 | 
			
		||||
-	{ MODKEY,                       XK_d,      incnmaster,     {.i = -1 } },
 | 
			
		||||
+	{ MODKEY,                       XK_o,      incnmaster,     {.i = -1 } },
 | 
			
		||||
 	{ MODKEY,                       XK_h,      setmfact,       {.f = -0.05} },
 | 
			
		||||
 	{ MODKEY,                       XK_l,      setmfact,       {.f = +0.05} },
 | 
			
		||||
-	{ MODKEY,                       XK_Return, zoom,           {0} },
 | 
			
		||||
+	{ MODKEY|ShiftMask,             XK_Return, zoom,           {0} },
 | 
			
		||||
 	{ MODKEY,                       XK_Tab,    view,           {0} },
 | 
			
		||||
-	{ MODKEY|ShiftMask,             XK_c,      killclient,     {0} },
 | 
			
		||||
-	{ MODKEY,                       XK_t,      setlayout,      {.v = &layouts[0]} },
 | 
			
		||||
-	{ MODKEY,                       XK_f,      setlayout,      {.v = &layouts[1]} },
 | 
			
		||||
+	{ MODKEY|ShiftMask,             XK_q,      killclient,     {0} },
 | 
			
		||||
+	{ MODKEY,                       XK_t,      setlayout,      {.v = &layouts[3]} },
 | 
			
		||||
+	{ MODKEY|ShiftMask,             XK_f,      setlayout,      {.v = &layouts[1]} },
 | 
			
		||||
 	{ MODKEY,                       XK_m,      setlayout,      {.v = &layouts[2]} },
 | 
			
		||||
+	{ MODKEY,                       XK_u,      setlayout,      {.v = &layouts[0]} },
 | 
			
		||||
+	{ MODKEY|ShiftMask,             XK_u,      setlayout,      {.v = &layouts[4]} },
 | 
			
		||||
+	{ MODKEY,                       XK_f,      togglefullscr,     {0} },
 | 
			
		||||
 	{ MODKEY,                       XK_space,  setlayout,      {0} },
 | 
			
		||||
 	{ MODKEY|ShiftMask,             XK_space,  togglefloating, {0} },
 | 
			
		||||
 	{ MODKEY,                       XK_0,      view,           {.ui = ~0 } },
 | 
			
		||||
 	{ MODKEY|ShiftMask,             XK_0,      tag,            {.ui = ~0 } },
 | 
			
		||||
-	{ MODKEY,                       XK_comma,  focusmon,       {.i = -1 } },
 | 
			
		||||
-	{ MODKEY,                       XK_period, focusmon,       {.i = +1 } },
 | 
			
		||||
-	{ MODKEY|ShiftMask,             XK_comma,  tagmon,         {.i = -1 } },
 | 
			
		||||
-	{ MODKEY|ShiftMask,             XK_period, tagmon,         {.i = +1 } },
 | 
			
		||||
+    {0,                             Print,     spawn,          {.v = ss1} },
 | 
			
		||||
+    {ShiftMask,                     Print,     spawn,          {.v = ss2} },
 | 
			
		||||
+    {Mod1Mask,                      Print,     spawn,          {.v = ss3} },
 | 
			
		||||
+    {MODKEY,                        XK_p,      spawn,          {.v = mpc3} },
 | 
			
		||||
+    {MODKEY|ShiftMask,              XK_h,      spawn,          {.v = mpc1} },
 | 
			
		||||
+    {MODKEY|ShiftMask,              XK_k,      spawn,          {.v = mpc2} },
 | 
			
		||||
+    {MODKEY|ShiftMask,              XK_r,      spawn,          {.v = mpc4} },
 | 
			
		||||
+    {MODKEY|ShiftMask,              XK_a,      spawn,          {.v = mpc5} },
 | 
			
		||||
+    {MODKEY|ShiftMask,              XK_period, spawn,          {.v = volinc} },
 | 
			
		||||
+    {MODKEY|ShiftMask,              XK_comma,  spawn,          {.v = voldec} },
 | 
			
		||||
+	//{ MODKEY,                       XK_comma,  focusmon,       {.i = -1 } },
 | 
			
		||||
+	//{ MODKEY,                       XK_period, focusmon,       {.i = +1 } },
 | 
			
		||||
+	//{ MODKEY|ShiftMask,             XK_comma,  tagmon,         {.i = -1 } },
 | 
			
		||||
+	//{ MODKEY|ShiftMask,             XK_period, tagmon,         {.i = +1 } },
 | 
			
		||||
 	TAGKEYS(                        XK_1,                      0)
 | 
			
		||||
 	TAGKEYS(                        XK_2,                      1)
 | 
			
		||||
-	TAGKEYS(                        XK_3,                      2)
 | 
			
		||||
-	TAGKEYS(                        XK_4,                      3)
 | 
			
		||||
+	TAGKEYS(                        XK_3,                      2) TAGKEYS(                        XK_4,                      3)
 | 
			
		||||
 	TAGKEYS(                        XK_5,                      4)
 | 
			
		||||
 	TAGKEYS(                        XK_6,                      5)
 | 
			
		||||
 	TAGKEYS(                        XK_7,                      6)
 | 
			
		||||
 	TAGKEYS(                        XK_8,                      7)
 | 
			
		||||
 	TAGKEYS(                        XK_9,                      8)
 | 
			
		||||
-	{ MODKEY|ShiftMask,             XK_q,      quit,           {0} },
 | 
			
		||||
+	{ MODKEY|ShiftMask,             XK_e,      quit,           {0} },
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 /* button definitions */
 | 
			
		||||
Only in b: config.def.h.orig
 | 
			
		||||
diff --color -u a/config.mk b/config.mk
 | 
			
		||||
--- a/config.mk	2019-02-02 18:25:28.000000000 +0530
 | 
			
		||||
+++ b/config.mk	2021-05-21 00:15:46.366562100 +0530
 | 
			
		||||
@@ -25,7 +25,7 @@
 | 
			
		||||
 LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS}
 | 
			
		||||
 
 | 
			
		||||
 # flags
 | 
			
		||||
-CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
 | 
			
		||||
+CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
 | 
			
		||||
 #CFLAGS   = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
 | 
			
		||||
 CFLAGS   = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS}
 | 
			
		||||
 LDFLAGS  = ${LIBS}
 | 
			
		||||
diff --color -u a/drw.c b/drw.c
 | 
			
		||||
--- a/drw.c	2019-02-02 18:25:28.000000000 +0530
 | 
			
		||||
+++ b/drw.c	2021-05-21 00:15:46.366998100 +0530
 | 
			
		||||
@@ -95,6 +95,7 @@
 | 
			
		||||
 {
 | 
			
		||||
 	XFreePixmap(drw->dpy, drw->drawable);
 | 
			
		||||
 	XFreeGC(drw->dpy, drw->gc);
 | 
			
		||||
+	drw_fontset_free(drw->fonts);
 | 
			
		||||
 	free(drw);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
diff --color -u a/dwm.1 b/dwm.1
 | 
			
		||||
--- a/dwm.1	2019-02-02 18:25:28.000000000 +0530
 | 
			
		||||
+++ b/dwm.1	2021-05-21 00:15:46.367636200 +0530
 | 
			
		||||
@@ -33,7 +33,7 @@
 | 
			
		||||
 .SH OPTIONS
 | 
			
		||||
 .TP
 | 
			
		||||
 .B \-v
 | 
			
		||||
-prints version information to standard output, then exits.
 | 
			
		||||
+prints version information to stderr, then exits.
 | 
			
		||||
 .SH USAGE
 | 
			
		||||
 .SS Status bar
 | 
			
		||||
 .TP
 | 
			
		||||
diff --color -u a/dwm.c b/dwm.c
 | 
			
		||||
--- a/dwm.c	2019-02-02 18:25:28.000000000 +0530
 | 
			
		||||
+++ b/dwm.c	2021-05-21 00:15:46.368968400 +0530
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -169,6 +169,7 @@
 | 
			
		||||
 static void focusin(XEvent *e);
 | 
			
		||||
 static void focusmon(const Arg *arg);
 | 
			
		||||
 static void focusstack(const Arg *arg);
 | 
			
		||||
+static Atom getatomprop(Client *c, Atom prop);
 | 
			
		||||
 static int getrootptr(int *x, int *y);
 | 
			
		||||
 static long getstate(Window w);
 | 
			
		||||
 static int gettextprop(Window w, Atom atom, char *text, unsigned int size);
 | 
			
		||||
@@ -193,6 +194,7 @@
 | 
			
		||||
 static void resizemouse(const Arg *arg);
 | 
			
		||||
 static void restack(Monitor *m);
 | 
			
		||||
 static void run(void);
 | 
			
		||||
+static void runAutostart(void);
 | 
			
		||||
 static void scan(void);
 | 
			
		||||
 static int sendevent(Client *c, Atom proto);
 | 
			
		||||
 static void sendmon(Client *c, Monitor *m);
 | 
			
		||||
@@ -211,6 +213,7 @@
 | 
			
		||||
 static void tile(Monitor *);
 | 
			
		||||
 static void togglebar(const Arg *arg);
 | 
			
		||||
 static void togglefloating(const Arg *arg);
 | 
			
		||||
+static void togglefullscr(const Arg *arg);
 | 
			
		||||
 static void toggletag(const Arg *arg);
 | 
			
		||||
 static void toggleview(const Arg *arg);
 | 
			
		||||
 static void unfocus(Client *c, int setfocus);
 | 
			
		||||
@@ -233,6 +236,8 @@
 | 
			
		||||
 static int xerrordummy(Display *dpy, XErrorEvent *ee);
 | 
			
		||||
 static int xerrorstart(Display *dpy, XErrorEvent *ee);
 | 
			
		||||
 static void zoom(const Arg *arg);
 | 
			
		||||
+static void centeredmaster(Monitor *m);
 | 
			
		||||
+static void centeredfloatingmaster(Monitor *m);
 | 
			
		||||
 
 | 
			
		||||
 /* variables */
 | 
			
		||||
 static const char broken[] = "broken";
 | 
			
		||||
@@ -416,7 +421,7 @@
 | 
			
		||||
 void
 | 
			
		||||
 buttonpress(XEvent *e)
 | 
			
		||||
 {
 | 
			
		||||
-	unsigned int i, x, click;
 | 
			
		||||
+	unsigned int i, x, click, occ = 0;
 | 
			
		||||
 	Arg arg = {0};
 | 
			
		||||
 	Client *c;
 | 
			
		||||
 	Monitor *m;
 | 
			
		||||
@@ -431,15 +436,20 @@
 | 
			
		||||
 	}
 | 
			
		||||
 	if (ev->window == selmon->barwin) {
 | 
			
		||||
 		i = x = 0;
 | 
			
		||||
-		do
 | 
			
		||||
+		for (c = m->clients; c; c = c->next)
 | 
			
		||||
+			occ |= c->tags == 255 ? 0 : c->tags;
 | 
			
		||||
+		do {
 | 
			
		||||
+			/* do not reserve space for vacant tags */
 | 
			
		||||
+			if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i))
 | 
			
		||||
+				continue;
 | 
			
		||||
 			x += TEXTW(tags[i]);
 | 
			
		||||
-		while (ev->x >= x && ++i < LENGTH(tags));
 | 
			
		||||
+		} while (ev->x >= x && ++i < LENGTH(tags));
 | 
			
		||||
 		if (i < LENGTH(tags)) {
 | 
			
		||||
 			click = ClkTagBar;
 | 
			
		||||
 			arg.ui = 1 << i;
 | 
			
		||||
 		} else if (ev->x < x + blw)
 | 
			
		||||
 			click = ClkLtSymbol;
 | 
			
		||||
-		else if (ev->x > selmon->ww - TEXTW(stext))
 | 
			
		||||
+		else if (ev->x > selmon->ww - (int)TEXTW(stext))
 | 
			
		||||
 			click = ClkStatusText;
 | 
			
		||||
 		else
 | 
			
		||||
 			click = ClkWinTitle;
 | 
			
		||||
@@ -695,7 +705,7 @@
 | 
			
		||||
 void
 | 
			
		||||
 drawbar(Monitor *m)
 | 
			
		||||
 {
 | 
			
		||||
-	int x, w, sw = 0;
 | 
			
		||||
+	int x, w, tw = 0;
 | 
			
		||||
 	int boxs = drw->fonts->h / 9;
 | 
			
		||||
 	int boxw = drw->fonts->h / 6 + 2;
 | 
			
		||||
 	unsigned int i, occ = 0, urg = 0;
 | 
			
		||||
@@ -704,31 +714,31 @@
 | 
			
		||||
 	/* 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]);
 | 
			
		||||
-		sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
 | 
			
		||||
-		drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0);
 | 
			
		||||
+		tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
 | 
			
		||||
+		drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0);
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	for (c = m->clients; c; c = c->next) {
 | 
			
		||||
-		occ |= c->tags;
 | 
			
		||||
+		occ |= c->tags == 255 ? 0 : c->tags;
 | 
			
		||||
 		if (c->isurgent)
 | 
			
		||||
 			urg |= c->tags;
 | 
			
		||||
 	}
 | 
			
		||||
 	x = 0;
 | 
			
		||||
 	for (i = 0; i < LENGTH(tags); i++) {
 | 
			
		||||
+		/* do not draw vacant tags */
 | 
			
		||||
+		if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i))
 | 
			
		||||
+		continue;
 | 
			
		||||
+
 | 
			
		||||
 		w = TEXTW(tags[i]);
 | 
			
		||||
 		drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]);
 | 
			
		||||
 		drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i);
 | 
			
		||||
-		if (occ & 1 << i)
 | 
			
		||||
-			drw_rect(drw, x + boxs, boxs, boxw, boxw,
 | 
			
		||||
-				m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
 | 
			
		||||
-				urg & 1 << i);
 | 
			
		||||
 		x += w;
 | 
			
		||||
 	}
 | 
			
		||||
 	w = blw = TEXTW(m->ltsymbol);
 | 
			
		||||
 	drw_setscheme(drw, scheme[SchemeNorm]);
 | 
			
		||||
 	x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
 | 
			
		||||
 
 | 
			
		||||
-	if ((w = m->ww - sw - x) > bh) {
 | 
			
		||||
+	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);
 | 
			
		||||
@@ -1276,12 +1286,46 @@
 | 
			
		||||
 resizeclient(Client *c, int x, int y, int w, int h)
 | 
			
		||||
 {
 | 
			
		||||
 	XWindowChanges wc;
 | 
			
		||||
+	unsigned int n;
 | 
			
		||||
+	unsigned int gapoffset;
 | 
			
		||||
+	unsigned int gapincr;
 | 
			
		||||
+	Client *nbc;
 | 
			
		||||
+
 | 
			
		||||
+	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++);
 | 
			
		||||
 
 | 
			
		||||
-	c->oldx = c->x; c->x = wc.x = x;
 | 
			
		||||
-	c->oldy = c->y; c->y = wc.y = y;
 | 
			
		||||
+	/* 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;
 | 
			
		||||
 	c->oldw = c->w; c->w = wc.width = w;
 | 
			
		||||
 	c->oldh = c->h; c->h = wc.height = h;
 | 
			
		||||
 	wc.border_width = c->bw;
 | 
			
		||||
+	if (((nexttiled(c->mon->clients) == c && !nexttiled(c->next))
 | 
			
		||||
+	    || &monocle == c->mon->lt[c->mon->sellt]->arrange)
 | 
			
		||||
+	    && !c->isfullscreen && !c->isfloating
 | 
			
		||||
+	    && NULL != c->mon->lt[c->mon->sellt]->arrange) {
 | 
			
		||||
+		c->w = wc.width += c->bw * 2;
 | 
			
		||||
+		c->h = wc.height += c->bw * 2;
 | 
			
		||||
+		wc.border_width = 0;
 | 
			
		||||
+	}
 | 
			
		||||
 	XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
 | 
			
		||||
 	configure(c);
 | 
			
		||||
 	XSync(dpy, False);
 | 
			
		||||
@@ -1381,6 +1425,12 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
+runAutostart(void) {
 | 
			
		||||
+	system("cd ~/.dwm; ./autostart_blocking.sh");
 | 
			
		||||
+	system("cd ~/.dwm; ./autostart.sh &");
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+void
 | 
			
		||||
 scan(void)
 | 
			
		||||
 {
 | 
			
		||||
 	unsigned int i, num;
 | 
			
		||||
@@ -1520,7 +1570,7 @@
 | 
			
		||||
 	if (!arg || !selmon->lt[selmon->sellt]->arrange)
 | 
			
		||||
 		return;
 | 
			
		||||
 	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
 | 
			
		||||
-	if (f < 0.1 || f > 0.9)
 | 
			
		||||
+	if (f < 0.05 || f > 0.95)
 | 
			
		||||
 		return;
 | 
			
		||||
 	selmon->mfact = f;
 | 
			
		||||
 	arrange(selmon);
 | 
			
		||||
@@ -1688,11 +1738,13 @@
 | 
			
		||||
 		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);
 | 
			
		||||
-			my += HEIGHT(c);
 | 
			
		||||
+			if (my + HEIGHT(c) < m->wh)
 | 
			
		||||
+				my += HEIGHT(c);
 | 
			
		||||
 		} else {
 | 
			
		||||
 			h = (m->wh - ty) / (n - i);
 | 
			
		||||
 			resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0);
 | 
			
		||||
-			ty += HEIGHT(c);
 | 
			
		||||
+			if (ty + HEIGHT(c) < m->wh)
 | 
			
		||||
+				ty += HEIGHT(c);
 | 
			
		||||
 		}
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -1720,6 +1772,13 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
+togglefullscr(const Arg *arg)
 | 
			
		||||
+{
 | 
			
		||||
+  if(selmon->sel)
 | 
			
		||||
+    setfullscreen(selmon->sel, !selmon->sel->isfullscreen);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+void
 | 
			
		||||
 toggletag(const Arg *arg)
 | 
			
		||||
 {
 | 
			
		||||
 	unsigned int newtags;
 | 
			
		||||
@@ -2142,8 +2201,112 @@
 | 
			
		||||
 		die("pledge");
 | 
			
		||||
 #endif /* __OpenBSD__ */
 | 
			
		||||
 	scan();
 | 
			
		||||
+	runAutostart();
 | 
			
		||||
 	run();
 | 
			
		||||
 	cleanup();
 | 
			
		||||
 	XCloseDisplay(dpy);
 | 
			
		||||
 	return EXIT_SUCCESS;
 | 
			
		||||
 }
 | 
			
		||||
+
 | 
			
		||||
+void
 | 
			
		||||
+centeredmaster(Monitor *m)
 | 
			
		||||
+{
 | 
			
		||||
+	unsigned int i, n, h, mw, mx, my, oty, ety, tw;
 | 
			
		||||
+	Client *c;
 | 
			
		||||
+
 | 
			
		||||
+	/* count number of clients in the selected monitor */
 | 
			
		||||
+	for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
 | 
			
		||||
+	if (n == 0)
 | 
			
		||||
+		return;
 | 
			
		||||
+
 | 
			
		||||
+	/* initialize areas */
 | 
			
		||||
+	mw = m->ww;
 | 
			
		||||
+	mx = 0;
 | 
			
		||||
+	my = 0;
 | 
			
		||||
+	tw = mw;
 | 
			
		||||
+
 | 
			
		||||
+	if (n > m->nmaster) {
 | 
			
		||||
+		/* go mfact box in the center if more than nmaster clients */
 | 
			
		||||
+		mw = m->nmaster ? m->ww * m->mfact : 0;
 | 
			
		||||
+		tw = m->ww - mw;
 | 
			
		||||
+
 | 
			
		||||
+		if (n - m->nmaster > 1) {
 | 
			
		||||
+			/* only one client */
 | 
			
		||||
+			mx = (m->ww - mw) / 2;
 | 
			
		||||
+			tw = (m->ww - mw) / 2;
 | 
			
		||||
+		}
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
+	oty = 0;
 | 
			
		||||
+	ety = 0;
 | 
			
		||||
+	for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
 | 
			
		||||
+	if (i < m->nmaster) {
 | 
			
		||||
+		/* nmaster clients are stacked vertically, in the center
 | 
			
		||||
+		 * of the screen */
 | 
			
		||||
+		h = (m->wh - my) / (MIN(n, m->nmaster) - i);
 | 
			
		||||
+		resize(c, m->wx + mx, m->wy + my, mw - (2*c->bw),
 | 
			
		||||
+		       h - (2*c->bw), 0);
 | 
			
		||||
+		my += HEIGHT(c);
 | 
			
		||||
+	} else {
 | 
			
		||||
+		/* stack clients are stacked vertically */
 | 
			
		||||
+		if ((i - m->nmaster) % 2 ) {
 | 
			
		||||
+			h = (m->wh - ety) / ( (1 + n - i) / 2);
 | 
			
		||||
+			resize(c, m->wx, m->wy + ety, tw - (2*c->bw),
 | 
			
		||||
+			       h - (2*c->bw), 0);
 | 
			
		||||
+			ety += HEIGHT(c);
 | 
			
		||||
+		} else {
 | 
			
		||||
+			h = (m->wh - oty) / ((1 + n - i) / 2);
 | 
			
		||||
+			resize(c, m->wx + mx + mw, m->wy + oty,
 | 
			
		||||
+			       tw - (2*c->bw), h - (2*c->bw), 0);
 | 
			
		||||
+			oty += HEIGHT(c);
 | 
			
		||||
+		}
 | 
			
		||||
+	}
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+void
 | 
			
		||||
+centeredfloatingmaster(Monitor *m)
 | 
			
		||||
+{
 | 
			
		||||
+	unsigned int i, n, w, mh, mw, mx, mxo, my, myo, tx;
 | 
			
		||||
+	Client *c;
 | 
			
		||||
+
 | 
			
		||||
+	/* count number of clients in the selected monitor */
 | 
			
		||||
+	for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
 | 
			
		||||
+	if (n == 0)
 | 
			
		||||
+		return;
 | 
			
		||||
+
 | 
			
		||||
+	/* initialize nmaster area */
 | 
			
		||||
+	if (n > m->nmaster) {
 | 
			
		||||
+		/* go mfact box in the center if more than nmaster clients */
 | 
			
		||||
+		if (m->ww > m->wh) {
 | 
			
		||||
+			mw = m->nmaster ? m->ww * m->mfact : 0;
 | 
			
		||||
+			mh = m->nmaster ? m->wh * 0.9 : 0;
 | 
			
		||||
+		} else {
 | 
			
		||||
+			mh = m->nmaster ? m->wh * m->mfact : 0;
 | 
			
		||||
+			mw = m->nmaster ? m->ww * 0.9 : 0;
 | 
			
		||||
+		}
 | 
			
		||||
+		mx = mxo = (m->ww - mw) / 2;
 | 
			
		||||
+		my = myo = (m->wh - mh) / 2;
 | 
			
		||||
+	} else {
 | 
			
		||||
+		/* go fullscreen if all clients are in the master area */
 | 
			
		||||
+		mh = m->wh;
 | 
			
		||||
+		mw = m->ww;
 | 
			
		||||
+		mx = mxo = 0;
 | 
			
		||||
+		my = myo = 0;
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
+	for(i = tx = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
 | 
			
		||||
+	if (i < m->nmaster) {
 | 
			
		||||
+		/* nmaster clients are stacked horizontally, in the center
 | 
			
		||||
+		 * of the screen */
 | 
			
		||||
+		w = (mw + mxo - mx) / (MIN(n, m->nmaster) - i);
 | 
			
		||||
+		resize(c, m->wx + mx, m->wy + my, w - (2*c->bw),
 | 
			
		||||
+		       mh - (2*c->bw), 0);
 | 
			
		||||
+		mx += WIDTH(c);
 | 
			
		||||
+	} else {
 | 
			
		||||
+		/* stack clients are stacked horizontally */
 | 
			
		||||
+		w = (m->ww - tx) / (n - i);
 | 
			
		||||
+		resize(c, m->wx + tx, m->wy, w - (2*c->bw),
 | 
			
		||||
+		       m->wh - (2*c->bw), 0);
 | 
			
		||||
+		tx += WIDTH(c);
 | 
			
		||||
+	}
 | 
			
		||||
+}
 | 
			
		||||
Only in b: dwm.c.orig
 | 
			
		||||
Only in b: .git
 | 
			
		||||
Only in a: LICENSE
 | 
			
		||||
diff --color -u a/README b/README
 | 
			
		||||
--- a/README	2019-02-02 18:25:28.000000000 +0530
 | 
			
		||||
+++ b/README	2021-05-21 00:15:46.365490600 +0530
 | 
			
		||||
@@ -1,48 +1 @@
 | 
			
		||||
-dwm - dynamic window manager
 | 
			
		||||
-============================
 | 
			
		||||
-dwm is an extremely fast, small, and dynamic window manager for X.
 | 
			
		||||
-
 | 
			
		||||
-
 | 
			
		||||
-Requirements
 | 
			
		||||
-------------
 | 
			
		||||
-In order to build dwm you need the Xlib header files.
 | 
			
		||||
-
 | 
			
		||||
-
 | 
			
		||||
-Installation
 | 
			
		||||
-------------
 | 
			
		||||
-Edit config.mk to match your local setup (dwm is installed into
 | 
			
		||||
-the /usr/local namespace by default).
 | 
			
		||||
-
 | 
			
		||||
-Afterwards enter the following command to build and install dwm (if
 | 
			
		||||
-necessary as root):
 | 
			
		||||
-
 | 
			
		||||
-    make clean install
 | 
			
		||||
-
 | 
			
		||||
-
 | 
			
		||||
-Running dwm
 | 
			
		||||
------------
 | 
			
		||||
-Add the following line to your .xinitrc to start dwm using startx:
 | 
			
		||||
-
 | 
			
		||||
-    exec dwm
 | 
			
		||||
-
 | 
			
		||||
-In order to connect dwm to a specific display, make sure that
 | 
			
		||||
-the DISPLAY environment variable is set correctly, e.g.:
 | 
			
		||||
-
 | 
			
		||||
-    DISPLAY=foo.bar:1 exec dwm
 | 
			
		||||
-
 | 
			
		||||
-(This will start dwm on display :1 of the host foo.bar.)
 | 
			
		||||
-
 | 
			
		||||
-In order to display status info in the bar, you can do something
 | 
			
		||||
-like this in your .xinitrc:
 | 
			
		||||
-
 | 
			
		||||
-    while xsetroot -name "`date` `uptime | sed 's/.*,//'`"
 | 
			
		||||
-    do
 | 
			
		||||
-    	sleep 1
 | 
			
		||||
-    done &
 | 
			
		||||
-    exec dwm
 | 
			
		||||
-
 | 
			
		||||
-
 | 
			
		||||
-Configuration
 | 
			
		||||
--------------
 | 
			
		||||
-The configuration of dwm is done by creating a custom config.h
 | 
			
		||||
-and (re)compiling the source code.
 | 
			
		||||
+Forked from dwm https://git.suckless.org/dwm and applied official patches
 | 
			
		||||
							
								
								
									
										690
									
								
								home/natto/patches/st.patch
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										690
									
								
								home/natto/patches/st.patch
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,690 @@
 | 
			
		||||
diff --color -ru st-0.9/config.def.h st-0.9-a/config.def.h
 | 
			
		||||
--- st-0.9/config.def.h	2022-10-04 23:11:26.000000000 +0530
 | 
			
		||||
+++ st-0.9-a/config.def.h	2022-11-25 02:12:19.384259019 +0530
 | 
			
		||||
@@ -3,9 +3,10 @@
 | 
			
		||||
 /*
 | 
			
		||||
  * appearance
 | 
			
		||||
  *
 | 
			
		||||
- * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
 | 
			
		||||
  */
 | 
			
		||||
-static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true";
 | 
			
		||||
+static char *font = "Fira Mono:style=Regular:pixelsize=18";
 | 
			
		||||
+static char *font2[] = { "Font Awesome 5 Free Solid:pixelsize=16",
 | 
			
		||||
+                         "Font Awesome 5 Brands:pixelsize=16" };
 | 
			
		||||
 static int borderpx = 2;
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
@@ -16,7 +17,7 @@
 | 
			
		||||
  * 4: value of shell in /etc/passwd
 | 
			
		||||
  * 5: value of shell in config.h
 | 
			
		||||
  */
 | 
			
		||||
-static char *shell = "/bin/sh";
 | 
			
		||||
+static char *shell = "/usr/bin/env zsh";
 | 
			
		||||
 char *utmp = NULL;
 | 
			
		||||
 /* scroll program: to enable use a string like "scroll" */
 | 
			
		||||
 char *scroll = NULL;
 | 
			
		||||
@@ -95,33 +96,44 @@
 | 
			
		||||
 
 | 
			
		||||
 /* Terminal colors (16 first used in escape sequence) */
 | 
			
		||||
 static const char *colorname[] = {
 | 
			
		||||
-	/* 8 normal colors */
 | 
			
		||||
-	"black",
 | 
			
		||||
-	"red3",
 | 
			
		||||
-	"green3",
 | 
			
		||||
-	"yellow3",
 | 
			
		||||
-	"blue2",
 | 
			
		||||
-	"magenta3",
 | 
			
		||||
-	"cyan3",
 | 
			
		||||
-	"gray90",
 | 
			
		||||
-
 | 
			
		||||
-	/* 8 bright colors */
 | 
			
		||||
-	"gray50",
 | 
			
		||||
-	"red",
 | 
			
		||||
-	"green",
 | 
			
		||||
-	"yellow",
 | 
			
		||||
-	"#5c5cff",
 | 
			
		||||
-	"magenta",
 | 
			
		||||
-	"cyan",
 | 
			
		||||
-	"white",
 | 
			
		||||
-
 | 
			
		||||
-	[255] = 0,
 | 
			
		||||
-
 | 
			
		||||
-	/* more colors can be added after 255 to use with DefaultXX */
 | 
			
		||||
-	"#cccccc",
 | 
			
		||||
-	"#555555",
 | 
			
		||||
-	"gray90", /* default foreground colour */
 | 
			
		||||
-	"black", /* default background colour */
 | 
			
		||||
+  	/* solarized dark */
 | 
			
		||||
+	"#073642",  /*  0: black    */
 | 
			
		||||
+	"#dc322f",  /*  1: red      */
 | 
			
		||||
+	"#859900",  /*  2: green    */
 | 
			
		||||
+	"#b58900",  /*  3: yellow   */
 | 
			
		||||
+	"#268bd2",  /*  4: blue     */
 | 
			
		||||
+	"#d33682",  /*  5: magenta  */
 | 
			
		||||
+	"#2aa198",  /*  6: cyan     */
 | 
			
		||||
+	"#eee8d5",  /*  7: white    */
 | 
			
		||||
+	"#002b36",  /*  8: brblack  */
 | 
			
		||||
+	"#cb4b16",  /*  9: brred    */
 | 
			
		||||
+	"#586e75",  /* 10: brgreen  */
 | 
			
		||||
+	"#657b83",  /* 11: bryellow */
 | 
			
		||||
+	"#839496",  /* 12: brblue   */
 | 
			
		||||
+	"#6c71c4",  /* 13: brmagenta*/
 | 
			
		||||
+	"#93a1a1",  /* 14: brcyan   */
 | 
			
		||||
+	"#fdf6e3",  /* 15: brwhite  */
 | 
			
		||||
+};
 | 
			
		||||
+
 | 
			
		||||
+/* Terminal colors for alternate (light) palette */
 | 
			
		||||
+static const char *altcolorname[] = {
 | 
			
		||||
+	/* solarized light */
 | 
			
		||||
+	"#eee8d5",  /*  0: black    */
 | 
			
		||||
+	"#dc322f",  /*  1: red      */
 | 
			
		||||
+	"#859900",  /*  2: green    */
 | 
			
		||||
+	"#b58900",  /*  3: yellow   */
 | 
			
		||||
+	"#268bd2",  /*  4: blue     */
 | 
			
		||||
+	"#d33682",  /*  5: magenta  */
 | 
			
		||||
+	"#2aa198",  /*  6: cyan     */
 | 
			
		||||
+	"#073642",  /*  7: white    */
 | 
			
		||||
+	"#fdf6e3",  /*  8: brblack  */
 | 
			
		||||
+	"#cb4b16",  /*  9: brred    */
 | 
			
		||||
+	"#93a1a1",  /* 10: brgreen  */
 | 
			
		||||
+	"#839496",  /* 11: bryellow */
 | 
			
		||||
+	"#657b83",  /* 12: brblue   */
 | 
			
		||||
+	"#6c71c4",  /* 13: brmagenta*/
 | 
			
		||||
+	"#586e75",  /* 14: brcyan   */
 | 
			
		||||
+	"#002b36",  /* 15: brwhite  */
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -129,10 +141,10 @@
 | 
			
		||||
  * Default colors (colorname index)
 | 
			
		||||
  * foreground, background, cursor, reverse cursor
 | 
			
		||||
  */
 | 
			
		||||
-unsigned int defaultfg = 258;
 | 
			
		||||
-unsigned int defaultbg = 259;
 | 
			
		||||
-unsigned int defaultcs = 256;
 | 
			
		||||
-static unsigned int defaultrcs = 257;
 | 
			
		||||
+unsigned int defaultfg = 12;
 | 
			
		||||
+unsigned int defaultbg = 8;
 | 
			
		||||
+unsigned int defaultcs = 14;
 | 
			
		||||
+static unsigned int defaultrcs = 15;
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
  * Default shape of cursor
 | 
			
		||||
@@ -156,7 +168,6 @@
 | 
			
		||||
 static unsigned int mouseshape = XC_xterm;
 | 
			
		||||
 static unsigned int mousefg = 7;
 | 
			
		||||
 static unsigned int mousebg = 0;
 | 
			
		||||
-
 | 
			
		||||
 /*
 | 
			
		||||
  * Color used to display font attributes when fontconfig selected a font which
 | 
			
		||||
  * doesn't match the ones requested.
 | 
			
		||||
@@ -176,6 +187,8 @@
 | 
			
		||||
  */
 | 
			
		||||
 static MouseShortcut mshortcuts[] = {
 | 
			
		||||
 	/* mask                 button   function        argument       release */
 | 
			
		||||
+  { XK_ANY_MOD,            Button4, kscrollup,      {.i = 1}},
 | 
			
		||||
+  { XK_ANY_MOD,            Button5, kscrolldown,    {.i = 1}},
 | 
			
		||||
 	{ XK_ANY_MOD,           Button2, selpaste,       {.i = 0},      1 },
 | 
			
		||||
 	{ ShiftMask,            Button4, ttysend,        {.s = "\033[5;2~"} },
 | 
			
		||||
 	{ XK_ANY_MOD,           Button4, ttysend,        {.s = "\031"} },
 | 
			
		||||
@@ -193,14 +206,17 @@
 | 
			
		||||
 	{ ControlMask,          XK_Print,       toggleprinter,  {.i =  0} },
 | 
			
		||||
 	{ ShiftMask,            XK_Print,       printscreen,    {.i =  0} },
 | 
			
		||||
 	{ XK_ANY_MOD,           XK_Print,       printsel,       {.i =  0} },
 | 
			
		||||
-	{ TERMMOD,              XK_Prior,       zoom,           {.f = +1} },
 | 
			
		||||
-	{ TERMMOD,              XK_Next,        zoom,           {.f = -1} },
 | 
			
		||||
-	{ TERMMOD,              XK_Home,        zoomreset,      {.f =  0} },
 | 
			
		||||
+	{ ShiftMask,            XK_Prior,       zoom,           {.f = +1} },
 | 
			
		||||
+	{ ShiftMask,            XK_Next,        zoom,           {.f = -1} },
 | 
			
		||||
+	{ ShiftMask,            XK_Home,        zoomreset,      {.f =  0} },
 | 
			
		||||
 	{ TERMMOD,              XK_C,           clipcopy,       {.i =  0} },
 | 
			
		||||
 	{ TERMMOD,              XK_V,           clippaste,      {.i =  0} },
 | 
			
		||||
 	{ TERMMOD,              XK_Y,           selpaste,       {.i =  0} },
 | 
			
		||||
 	{ ShiftMask,            XK_Insert,      selpaste,       {.i =  0} },
 | 
			
		||||
 	{ TERMMOD,              XK_Num_Lock,    numlock,        {.i =  0} },
 | 
			
		||||
+	{ XK_ANY_MOD,           XK_Page_Up,     kscrollup,      {.i = -1} },
 | 
			
		||||
+	{ XK_ANY_MOD,           XK_Page_Down,   kscrolldown,    {.i = -1} },
 | 
			
		||||
+  { XK_ANY_MOD,           XK_F6,          swapcolors,     {.i =  0} },
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
diff --color -ru st-0.9/st.c st-0.9-a/st.c
 | 
			
		||||
--- st-0.9/st.c	2022-10-04 23:11:26.000000000 +0530
 | 
			
		||||
+++ st-0.9-a/st.c	2022-11-25 02:12:19.384259019 +0530
 | 
			
		||||
@@ -35,6 +35,7 @@
 | 
			
		||||
 #define ESC_ARG_SIZ   16
 | 
			
		||||
 #define STR_BUF_SIZ   ESC_BUF_SIZ
 | 
			
		||||
 #define STR_ARG_SIZ   ESC_ARG_SIZ
 | 
			
		||||
+#define HISTSIZE      2000
 | 
			
		||||
 
 | 
			
		||||
 /* macros */
 | 
			
		||||
 #define IS_SET(flag)		((term.mode & (flag)) != 0)
 | 
			
		||||
@@ -42,6 +43,9 @@
 | 
			
		||||
 #define ISCONTROLC1(c)		(BETWEEN(c, 0x80, 0x9f))
 | 
			
		||||
 #define ISCONTROL(c)		(ISCONTROLC0(c) || ISCONTROLC1(c))
 | 
			
		||||
 #define ISDELIM(u)		(u && wcschr(worddelimiters, u))
 | 
			
		||||
+#define TLINE(y)		((y) < term.scr ? term.hist[((y) + term.histi - \
 | 
			
		||||
+				term.scr + HISTSIZE + 1) % HISTSIZE] : \
 | 
			
		||||
+				term.line[(y) - term.scr])
 | 
			
		||||
 
 | 
			
		||||
 enum term_mode {
 | 
			
		||||
 	MODE_WRAP        = 1 << 0,
 | 
			
		||||
@@ -115,6 +119,9 @@
 | 
			
		||||
 	int col;      /* nb col */
 | 
			
		||||
 	Line *line;   /* screen */
 | 
			
		||||
 	Line *alt;    /* alternate screen */
 | 
			
		||||
+	Line hist[HISTSIZE]; /* history buffer */
 | 
			
		||||
+	int histi;    /* history index */
 | 
			
		||||
+	int scr;      /* scroll back */
 | 
			
		||||
 	int *dirty;   /* dirtyness of lines */
 | 
			
		||||
 	TCursor c;    /* cursor */
 | 
			
		||||
 	int ocx;      /* old cursor col */
 | 
			
		||||
@@ -185,8 +192,8 @@
 | 
			
		||||
 static void tputtab(int);
 | 
			
		||||
 static void tputc(Rune);
 | 
			
		||||
 static void treset(void);
 | 
			
		||||
-static void tscrollup(int, int);
 | 
			
		||||
-static void tscrolldown(int, int);
 | 
			
		||||
+static void tscrollup(int, int, int);
 | 
			
		||||
+static void tscrolldown(int, int, int);
 | 
			
		||||
 static void tsetattr(const int *, int);
 | 
			
		||||
 static void tsetchar(Rune, const Glyph *, int, int);
 | 
			
		||||
 static void tsetdirt(int, int);
 | 
			
		||||
@@ -409,10 +416,10 @@
 | 
			
		||||
 {
 | 
			
		||||
 	int i = term.col;
 | 
			
		||||
 
 | 
			
		||||
-	if (term.line[y][i - 1].mode & ATTR_WRAP)
 | 
			
		||||
+	if (TLINE(y)[i - 1].mode & ATTR_WRAP)
 | 
			
		||||
 		return i;
 | 
			
		||||
 
 | 
			
		||||
-	while (i > 0 && term.line[y][i - 1].u == ' ')
 | 
			
		||||
+	while (i > 0 && TLINE(y)[i - 1].u == ' ')
 | 
			
		||||
 		--i;
 | 
			
		||||
 
 | 
			
		||||
 	return i;
 | 
			
		||||
@@ -521,7 +528,7 @@
 | 
			
		||||
 		 * Snap around if the word wraps around at the end or
 | 
			
		||||
 		 * beginning of a line.
 | 
			
		||||
 		 */
 | 
			
		||||
-		prevgp = &term.line[*y][*x];
 | 
			
		||||
+		prevgp = &TLINE(*y)[*x];
 | 
			
		||||
 		prevdelim = ISDELIM(prevgp->u);
 | 
			
		||||
 		for (;;) {
 | 
			
		||||
 			newx = *x + direction;
 | 
			
		||||
@@ -536,14 +543,14 @@
 | 
			
		||||
 					yt = *y, xt = *x;
 | 
			
		||||
 				else
 | 
			
		||||
 					yt = newy, xt = newx;
 | 
			
		||||
-				if (!(term.line[yt][xt].mode & ATTR_WRAP))
 | 
			
		||||
+				if (!(TLINE(yt)[xt].mode & ATTR_WRAP))
 | 
			
		||||
 					break;
 | 
			
		||||
 			}
 | 
			
		||||
 
 | 
			
		||||
 			if (newx >= tlinelen(newy))
 | 
			
		||||
 				break;
 | 
			
		||||
 
 | 
			
		||||
-			gp = &term.line[newy][newx];
 | 
			
		||||
+			gp = &TLINE(newy)[newx];
 | 
			
		||||
 			delim = ISDELIM(gp->u);
 | 
			
		||||
 			if (!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim
 | 
			
		||||
 					|| (delim && gp->u != prevgp->u)))
 | 
			
		||||
@@ -564,14 +571,14 @@
 | 
			
		||||
 		*x = (direction < 0) ? 0 : term.col - 1;
 | 
			
		||||
 		if (direction < 0) {
 | 
			
		||||
 			for (; *y > 0; *y += direction) {
 | 
			
		||||
-				if (!(term.line[*y-1][term.col-1].mode
 | 
			
		||||
+				if (!(TLINE(*y-1)[term.col-1].mode
 | 
			
		||||
 						& ATTR_WRAP)) {
 | 
			
		||||
 					break;
 | 
			
		||||
 				}
 | 
			
		||||
 			}
 | 
			
		||||
 		} else if (direction > 0) {
 | 
			
		||||
 			for (; *y < term.row-1; *y += direction) {
 | 
			
		||||
-				if (!(term.line[*y][term.col-1].mode
 | 
			
		||||
+				if (!(TLINE(*y)[term.col-1].mode
 | 
			
		||||
 						& ATTR_WRAP)) {
 | 
			
		||||
 					break;
 | 
			
		||||
 				}
 | 
			
		||||
@@ -602,13 +609,13 @@
 | 
			
		||||
 		}
 | 
			
		||||
 
 | 
			
		||||
 		if (sel.type == SEL_RECTANGULAR) {
 | 
			
		||||
-			gp = &term.line[y][sel.nb.x];
 | 
			
		||||
+			gp = &TLINE(y)[sel.nb.x];
 | 
			
		||||
 			lastx = sel.ne.x;
 | 
			
		||||
 		} else {
 | 
			
		||||
-			gp = &term.line[y][sel.nb.y == y ? sel.nb.x : 0];
 | 
			
		||||
+			gp = &TLINE(y)[sel.nb.y == y ? sel.nb.x : 0];
 | 
			
		||||
 			lastx = (sel.ne.y == y) ? sel.ne.x : term.col-1;
 | 
			
		||||
 		}
 | 
			
		||||
-		last = &term.line[y][MIN(lastx, linelen-1)];
 | 
			
		||||
+		last = &TLINE(y)[MIN(lastx, linelen-1)];
 | 
			
		||||
 		while (last >= gp && last->u == ' ')
 | 
			
		||||
 			--last;
 | 
			
		||||
 
 | 
			
		||||
@@ -844,6 +851,9 @@
 | 
			
		||||
 ttywrite(const char *s, size_t n, int may_echo)
 | 
			
		||||
 {
 | 
			
		||||
 	const char *next;
 | 
			
		||||
+	Arg arg = (Arg) { .i = term.scr };
 | 
			
		||||
+
 | 
			
		||||
+	kscrolldown(&arg);
 | 
			
		||||
 
 | 
			
		||||
 	if (may_echo && IS_SET(MODE_ECHO))
 | 
			
		||||
 		twrite(s, n, 1);
 | 
			
		||||
@@ -1055,13 +1065,53 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
-tscrolldown(int orig, int n)
 | 
			
		||||
+kscrolldown(const Arg* a)
 | 
			
		||||
+{
 | 
			
		||||
+	int n = a->i;
 | 
			
		||||
+
 | 
			
		||||
+	if (n < 0)
 | 
			
		||||
+		n = term.row + n;
 | 
			
		||||
+
 | 
			
		||||
+	if (n > term.scr)
 | 
			
		||||
+		n = term.scr;
 | 
			
		||||
+
 | 
			
		||||
+	if (term.scr > 0) {
 | 
			
		||||
+		term.scr -= n;
 | 
			
		||||
+		selscroll(0, -n);
 | 
			
		||||
+		tfulldirt();
 | 
			
		||||
+	}
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+void
 | 
			
		||||
+kscrollup(const Arg* a)
 | 
			
		||||
+{
 | 
			
		||||
+	int n = a->i;
 | 
			
		||||
+
 | 
			
		||||
+	if (n < 0)
 | 
			
		||||
+		n = term.row + n;
 | 
			
		||||
+
 | 
			
		||||
+	if (term.scr <= HISTSIZE-n) {
 | 
			
		||||
+		term.scr += n;
 | 
			
		||||
+		selscroll(0, n);
 | 
			
		||||
+		tfulldirt();
 | 
			
		||||
+	}
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+void
 | 
			
		||||
+tscrolldown(int orig, int n, int copyhist)
 | 
			
		||||
 {
 | 
			
		||||
 	int i;
 | 
			
		||||
 	Line temp;
 | 
			
		||||
 
 | 
			
		||||
 	LIMIT(n, 0, term.bot-orig+1);
 | 
			
		||||
 
 | 
			
		||||
+	if (copyhist) {
 | 
			
		||||
+		term.histi = (term.histi - 1 + HISTSIZE) % HISTSIZE;
 | 
			
		||||
+		temp = term.hist[term.histi];
 | 
			
		||||
+		term.hist[term.histi] = term.line[term.bot];
 | 
			
		||||
+		term.line[term.bot] = temp;
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
 	tsetdirt(orig, term.bot-n);
 | 
			
		||||
 	tclearregion(0, term.bot-n+1, term.col-1, term.bot);
 | 
			
		||||
 
 | 
			
		||||
@@ -1071,17 +1121,28 @@
 | 
			
		||||
 		term.line[i-n] = temp;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
-	selscroll(orig, n);
 | 
			
		||||
+	if (term.scr == 0)
 | 
			
		||||
+		selscroll(orig, n);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
-tscrollup(int orig, int n)
 | 
			
		||||
+tscrollup(int orig, int n, int copyhist)
 | 
			
		||||
 {
 | 
			
		||||
 	int i;
 | 
			
		||||
 	Line temp;
 | 
			
		||||
 
 | 
			
		||||
 	LIMIT(n, 0, term.bot-orig+1);
 | 
			
		||||
 
 | 
			
		||||
+	if (copyhist) {
 | 
			
		||||
+		term.histi = (term.histi + 1) % HISTSIZE;
 | 
			
		||||
+		temp = term.hist[term.histi];
 | 
			
		||||
+		term.hist[term.histi] = term.line[orig];
 | 
			
		||||
+		term.line[orig] = temp;
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
+	if (term.scr > 0 && term.scr < HISTSIZE)
 | 
			
		||||
+		term.scr = MIN(term.scr + n, HISTSIZE-1);
 | 
			
		||||
+
 | 
			
		||||
 	tclearregion(0, orig, term.col-1, orig+n-1);
 | 
			
		||||
 	tsetdirt(orig+n, term.bot);
 | 
			
		||||
 
 | 
			
		||||
@@ -1091,7 +1152,8 @@
 | 
			
		||||
 		term.line[i+n] = temp;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
-	selscroll(orig, -n);
 | 
			
		||||
+	if (term.scr == 0)
 | 
			
		||||
+		selscroll(orig, -n);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
@@ -1120,7 +1182,7 @@
 | 
			
		||||
 	int y = term.c.y;
 | 
			
		||||
 
 | 
			
		||||
 	if (y == term.bot) {
 | 
			
		||||
-		tscrollup(term.top, 1);
 | 
			
		||||
+		tscrollup(term.top, 1, 1);
 | 
			
		||||
 	} else {
 | 
			
		||||
 		y++;
 | 
			
		||||
 	}
 | 
			
		||||
@@ -1285,14 +1347,14 @@
 | 
			
		||||
 tinsertblankline(int n)
 | 
			
		||||
 {
 | 
			
		||||
 	if (BETWEEN(term.c.y, term.top, term.bot))
 | 
			
		||||
-		tscrolldown(term.c.y, n);
 | 
			
		||||
+		tscrolldown(term.c.y, n, 0);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
 tdeleteline(int n)
 | 
			
		||||
 {
 | 
			
		||||
 	if (BETWEEN(term.c.y, term.top, term.bot))
 | 
			
		||||
-		tscrollup(term.c.y, n);
 | 
			
		||||
+		tscrollup(term.c.y, n, 0);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 int32_t
 | 
			
		||||
@@ -1729,11 +1791,11 @@
 | 
			
		||||
 		break;
 | 
			
		||||
 	case 'S': /* SU -- Scroll <n> line up */
 | 
			
		||||
 		DEFAULT(csiescseq.arg[0], 1);
 | 
			
		||||
-		tscrollup(term.top, csiescseq.arg[0]);
 | 
			
		||||
+		tscrollup(term.top, csiescseq.arg[0], 0);
 | 
			
		||||
 		break;
 | 
			
		||||
 	case 'T': /* SD -- Scroll <n> line down */
 | 
			
		||||
 		DEFAULT(csiescseq.arg[0], 1);
 | 
			
		||||
-		tscrolldown(term.top, csiescseq.arg[0]);
 | 
			
		||||
+		tscrolldown(term.top, csiescseq.arg[0], 0);
 | 
			
		||||
 		break;
 | 
			
		||||
 	case 'L': /* IL -- Insert <n> blank lines */
 | 
			
		||||
 		DEFAULT(csiescseq.arg[0], 1);
 | 
			
		||||
@@ -2296,7 +2358,7 @@
 | 
			
		||||
 		return 0;
 | 
			
		||||
 	case 'D': /* IND -- Linefeed */
 | 
			
		||||
 		if (term.c.y == term.bot) {
 | 
			
		||||
-			tscrollup(term.top, 1);
 | 
			
		||||
+			tscrollup(term.top, 1, 1);
 | 
			
		||||
 		} else {
 | 
			
		||||
 			tmoveto(term.c.x, term.c.y+1);
 | 
			
		||||
 		}
 | 
			
		||||
@@ -2309,7 +2371,7 @@
 | 
			
		||||
 		break;
 | 
			
		||||
 	case 'M': /* RI -- Reverse index */
 | 
			
		||||
 		if (term.c.y == term.top) {
 | 
			
		||||
-			tscrolldown(term.top, 1);
 | 
			
		||||
+			tscrolldown(term.top, 1, 1);
 | 
			
		||||
 		} else {
 | 
			
		||||
 			tmoveto(term.c.x, term.c.y-1);
 | 
			
		||||
 		}
 | 
			
		||||
@@ -2523,7 +2585,7 @@
 | 
			
		||||
 void
 | 
			
		||||
 tresize(int col, int row)
 | 
			
		||||
 {
 | 
			
		||||
-	int i;
 | 
			
		||||
+	int i, j;
 | 
			
		||||
 	int minrow = MIN(row, term.row);
 | 
			
		||||
 	int mincol = MIN(col, term.col);
 | 
			
		||||
 	int *bp;
 | 
			
		||||
@@ -2560,6 +2622,14 @@
 | 
			
		||||
 	term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty));
 | 
			
		||||
 	term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs));
 | 
			
		||||
 
 | 
			
		||||
+	for (i = 0; i < HISTSIZE; i++) {
 | 
			
		||||
+		term.hist[i] = xrealloc(term.hist[i], col * sizeof(Glyph));
 | 
			
		||||
+		for (j = mincol; j < col; j++) {
 | 
			
		||||
+			term.hist[i][j] = term.c.attr;
 | 
			
		||||
+			term.hist[i][j].u = ' ';
 | 
			
		||||
+		}
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
 	/* resize each row to new width, zero-pad if needed */
 | 
			
		||||
 	for (i = 0; i < minrow; i++) {
 | 
			
		||||
 		term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph));
 | 
			
		||||
@@ -2618,7 +2688,7 @@
 | 
			
		||||
 			continue;
 | 
			
		||||
 
 | 
			
		||||
 		term.dirty[y] = 0;
 | 
			
		||||
-		xdrawline(term.line[y], x1, y, x2);
 | 
			
		||||
+		xdrawline(TLINE(y), x1, y, x2);
 | 
			
		||||
 	}
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -2639,8 +2709,9 @@
 | 
			
		||||
 		cx--;
 | 
			
		||||
 
 | 
			
		||||
 	drawregion(0, 0, term.col, term.row);
 | 
			
		||||
-	xdrawcursor(cx, term.c.y, term.line[term.c.y][cx],
 | 
			
		||||
-			term.ocx, term.ocy, term.line[term.ocy][term.ocx]);
 | 
			
		||||
+	if (term.scr == 0)
 | 
			
		||||
+		xdrawcursor(cx, term.c.y, term.line[term.c.y][cx],
 | 
			
		||||
+				term.ocx, term.ocy, term.line[term.ocy][term.ocx]);
 | 
			
		||||
 	term.ocx = cx;
 | 
			
		||||
 	term.ocy = term.c.y;
 | 
			
		||||
 	xfinishdraw();
 | 
			
		||||
diff --color -ru st-0.9/st.h st-0.9-a/st.h
 | 
			
		||||
--- st-0.9/st.h	2022-10-04 23:11:26.000000000 +0530
 | 
			
		||||
+++ st-0.9-a/st.h	2022-11-25 02:12:19.385259029 +0530
 | 
			
		||||
@@ -81,6 +81,8 @@
 | 
			
		||||
 void redraw(void);
 | 
			
		||||
 void draw(void);
 | 
			
		||||
 
 | 
			
		||||
+void kscrolldown(const Arg *);
 | 
			
		||||
+void kscrollup(const Arg *);
 | 
			
		||||
 void printscreen(const Arg *);
 | 
			
		||||
 void printsel(const Arg *);
 | 
			
		||||
 void sendbreak(const Arg *);
 | 
			
		||||
@@ -120,6 +122,7 @@
 | 
			
		||||
 extern int allowaltscreen;
 | 
			
		||||
 extern int allowwindowops;
 | 
			
		||||
 extern char *termname;
 | 
			
		||||
+extern int usealtcolors;
 | 
			
		||||
 extern unsigned int tabspaces;
 | 
			
		||||
 extern unsigned int defaultfg;
 | 
			
		||||
 extern unsigned int defaultbg;
 | 
			
		||||
diff --color -ru st-0.9/x.c st-0.9-a/x.c
 | 
			
		||||
--- st-0.9/x.c	2022-10-04 23:11:26.000000000 +0530
 | 
			
		||||
+++ st-0.9-a/x.c	2022-11-25 02:12:19.385259029 +0530
 | 
			
		||||
@@ -55,6 +55,7 @@
 | 
			
		||||
 static void clippaste(const Arg *);
 | 
			
		||||
 static void numlock(const Arg *);
 | 
			
		||||
 static void selpaste(const Arg *);
 | 
			
		||||
+static void swapcolors(const Arg *);
 | 
			
		||||
 static void zoom(const Arg *);
 | 
			
		||||
 static void zoomabs(const Arg *);
 | 
			
		||||
 static void zoomreset(const Arg *);
 | 
			
		||||
@@ -157,6 +158,7 @@
 | 
			
		||||
 static int xloadcolor(int, const char *, Color *);
 | 
			
		||||
 static int xloadfont(Font *, FcPattern *);
 | 
			
		||||
 static void xloadfonts(const char *, double);
 | 
			
		||||
+static void xloadsparefont();
 | 
			
		||||
 static void xunloadfont(Font *);
 | 
			
		||||
 static void xunloadfonts(void);
 | 
			
		||||
 static void xsetenv(void);
 | 
			
		||||
@@ -254,6 +256,8 @@
 | 
			
		||||
 
 | 
			
		||||
 static uint buttons; /* bit field of pressed buttons */
 | 
			
		||||
 
 | 
			
		||||
+int usealtcolors = 0; /* 1 to use alternate palette */
 | 
			
		||||
+
 | 
			
		||||
 void
 | 
			
		||||
 clipcopy(const Arg *dummy)
 | 
			
		||||
 {
 | 
			
		||||
@@ -293,6 +297,14 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
+swapcolors(const Arg *dummy)
 | 
			
		||||
+{
 | 
			
		||||
+ usealtcolors = !usealtcolors;
 | 
			
		||||
+ xloadcols();
 | 
			
		||||
+ redraw();
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+void
 | 
			
		||||
 zoom(const Arg *arg)
 | 
			
		||||
 {
 | 
			
		||||
 	Arg larg;
 | 
			
		||||
@@ -306,6 +318,7 @@
 | 
			
		||||
 {
 | 
			
		||||
 	xunloadfonts();
 | 
			
		||||
 	xloadfonts(usedfont, arg->f);
 | 
			
		||||
+	xloadsparefont();
 | 
			
		||||
 	cresize(0, 0);
 | 
			
		||||
 	redraw();
 | 
			
		||||
 	xhints();
 | 
			
		||||
@@ -766,6 +779,11 @@
 | 
			
		||||
 	return x == 0 ? 0 : 0x3737 + 0x2828 * x;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+const char* getcolorname(int i)
 | 
			
		||||
+{
 | 
			
		||||
+    return (usealtcolors) ?  altcolorname[i] : colorname[i];
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 int
 | 
			
		||||
 xloadcolor(int i, const char *name, Color *ncolor)
 | 
			
		||||
 {
 | 
			
		||||
@@ -784,7 +802,7 @@
 | 
			
		||||
 			return XftColorAllocValue(xw.dpy, xw.vis,
 | 
			
		||||
 			                          xw.cmap, &color, ncolor);
 | 
			
		||||
 		} else
 | 
			
		||||
-			name = colorname[i];
 | 
			
		||||
+			name = getcolorname(i);
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	return XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, ncolor);
 | 
			
		||||
@@ -807,8 +825,8 @@
 | 
			
		||||
 
 | 
			
		||||
 	for (i = 0; i < dc.collen; i++)
 | 
			
		||||
 		if (!xloadcolor(i, NULL, &dc.col[i])) {
 | 
			
		||||
-			if (colorname[i])
 | 
			
		||||
-				die("could not allocate color '%s'\n", colorname[i]);
 | 
			
		||||
+			if (getcolorname(i))
 | 
			
		||||
+				die("could not allocate color '%s'\n", getcolorname(i));
 | 
			
		||||
 			else
 | 
			
		||||
 				die("could not allocate color %d\n", i);
 | 
			
		||||
 		}
 | 
			
		||||
@@ -1050,6 +1068,67 @@
 | 
			
		||||
 	FcPatternDestroy(pattern);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+ void
 | 
			
		||||
+xloadsparefont()
 | 
			
		||||
+{
 | 
			
		||||
+FcPattern *fontpattern, *match;
 | 
			
		||||
+FcResult result;
 | 
			
		||||
+
 | 
			
		||||
+/* add font2 to font cache as first 4 entries */
 | 
			
		||||
+if ( font2[0] == '-' )
 | 
			
		||||
+  fontpattern = XftXlfdParse(font2, False, False);
 | 
			
		||||
+else
 | 
			
		||||
+  fontpattern = FcNameParse((FcChar8 *)font2);
 | 
			
		||||
+if ( fontpattern ) {
 | 
			
		||||
+  /* Allocate memory for the new cache entries. */
 | 
			
		||||
+  frccap += 4;
 | 
			
		||||
+  frc = xrealloc(frc, frccap * sizeof(Fontcache));
 | 
			
		||||
+  /* add Normal */
 | 
			
		||||
+  match = FcFontMatch(NULL, fontpattern, &result);
 | 
			
		||||
+  if ( match ) 
 | 
			
		||||
+    frc[frclen].font = XftFontOpenPattern(xw.dpy, match);
 | 
			
		||||
+    if ( frc[frclen].font ) {
 | 
			
		||||
+      frc[frclen].flags = FRC_NORMAL;
 | 
			
		||||
+      frclen++;
 | 
			
		||||
+    } else
 | 
			
		||||
+      FcPatternDestroy(match);
 | 
			
		||||
+  /* add Italic */
 | 
			
		||||
+  FcPatternDel(fontpattern, FC_SLANT);
 | 
			
		||||
+  FcPatternAddInteger(fontpattern, FC_SLANT, FC_SLANT_ITALIC);
 | 
			
		||||
+  match = FcFontMatch(NULL, fontpattern, &result);
 | 
			
		||||
+  if ( match )
 | 
			
		||||
+    frc[frclen].font = XftFontOpenPattern(xw.dpy, match);
 | 
			
		||||
+    if ( frc[frclen].font ) {
 | 
			
		||||
+      frc[frclen].flags = FRC_ITALIC;
 | 
			
		||||
+      frclen++;
 | 
			
		||||
+    } else
 | 
			
		||||
+      FcPatternDestroy(match);
 | 
			
		||||
+  /* add Italic Bold */
 | 
			
		||||
+  FcPatternDel(fontpattern, FC_WEIGHT);
 | 
			
		||||
+  FcPatternAddInteger(fontpattern, FC_WEIGHT, FC_WEIGHT_BOLD);
 | 
			
		||||
+  match = FcFontMatch(NULL, fontpattern, &result);
 | 
			
		||||
+  if ( match )
 | 
			
		||||
+    frc[frclen].font = XftFontOpenPattern(xw.dpy, match);
 | 
			
		||||
+    if ( frc[frclen].font ) {
 | 
			
		||||
+      frc[frclen].flags = FRC_ITALICBOLD;
 | 
			
		||||
+      frclen++;
 | 
			
		||||
+    } else 
 | 
			
		||||
+      FcPatternDestroy(match);
 | 
			
		||||
+  /* add Bold */
 | 
			
		||||
+  FcPatternDel(fontpattern, FC_SLANT);
 | 
			
		||||
+  FcPatternAddInteger(fontpattern, FC_SLANT, FC_SLANT_ROMAN);
 | 
			
		||||
+  match = FcFontMatch(NULL, fontpattern, &result);
 | 
			
		||||
+  if ( match )
 | 
			
		||||
+    frc[frclen].font = XftFontOpenPattern(xw.dpy, match);
 | 
			
		||||
+    if ( frc[frclen].font ) {
 | 
			
		||||
+      frc[frclen].flags = FRC_BOLD;
 | 
			
		||||
+      frclen++;
 | 
			
		||||
+    } else 
 | 
			
		||||
+      FcPatternDestroy(match);
 | 
			
		||||
+  FcPatternDestroy(fontpattern);
 | 
			
		||||
+	}
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 void
 | 
			
		||||
 xunloadfont(Font *f)
 | 
			
		||||
 {
 | 
			
		||||
@@ -1147,6 +1226,10 @@
 | 
			
		||||
 	usedfont = (opt_font == NULL)? font : opt_font;
 | 
			
		||||
 	xloadfonts(usedfont, 0);
 | 
			
		||||
 
 | 
			
		||||
+	/* spare font (font2) */
 | 
			
		||||
+	xloadsparefont();
 | 
			
		||||
+
 | 
			
		||||
+
 | 
			
		||||
 	/* colors */
 | 
			
		||||
 	xw.cmap = XDefaultColormap(xw.dpy, xw.scr);
 | 
			
		||||
 	xloadcols();
 | 
			
		||||
@@ -1200,13 +1283,13 @@
 | 
			
		||||
 	cursor = XCreateFontCursor(xw.dpy, mouseshape);
 | 
			
		||||
 	XDefineCursor(xw.dpy, xw.win, cursor);
 | 
			
		||||
 
 | 
			
		||||
-	if (XParseColor(xw.dpy, xw.cmap, colorname[mousefg], &xmousefg) == 0) {
 | 
			
		||||
+	if (XParseColor(xw.dpy, xw.cmap, getcolorname(mousefg), &xmousefg) == 0) {
 | 
			
		||||
 		xmousefg.red   = 0xffff;
 | 
			
		||||
 		xmousefg.green = 0xffff;
 | 
			
		||||
 		xmousefg.blue  = 0xffff;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
-	if (XParseColor(xw.dpy, xw.cmap, colorname[mousebg], &xmousebg) == 0) {
 | 
			
		||||
+	if (XParseColor(xw.dpy, xw.cmap, getcolorname(mousebg), &xmousebg) == 0) {
 | 
			
		||||
 		xmousebg.red   = 0x0000;
 | 
			
		||||
 		xmousebg.green = 0x0000;
 | 
			
		||||
 		xmousebg.blue  = 0x0000;
 | 
			
		||||
@@ -1414,7 +1497,7 @@
 | 
			
		||||
 
 | 
			
		||||
 	/* Change basic system colors [0-7] to bright system colors [8-15] */
 | 
			
		||||
 	if ((base.mode & ATTR_BOLD_FAINT) == ATTR_BOLD && BETWEEN(base.fg, 0, 7))
 | 
			
		||||
-		fg = &dc.col[base.fg + 8];
 | 
			
		||||
+		fg = &dc.col[base.fg];
 | 
			
		||||
 
 | 
			
		||||
 	if (IS_SET(MODE_REVERSE)) {
 | 
			
		||||
 		if (fg == &dc.col[defaultfg]) {
 | 
			
		||||
@@ -1642,6 +1725,8 @@
 | 
			
		||||
 int
 | 
			
		||||
 xstartdraw(void)
 | 
			
		||||
 {
 | 
			
		||||
+	if (IS_SET(MODE_VISIBLE))
 | 
			
		||||
+		XCopyArea(xw.dpy, xw.win, xw.buf, dc.gc, 0, 0, win.w, win.h, 0, 0);
 | 
			
		||||
 	return IS_SET(MODE_VISIBLE);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user