added patches for suckless stuff
This commit is contained in:
		
							
								
								
									
										12
									
								
								.github/workflows/main.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.github/workflows/main.yml
									
									
									
									
										vendored
									
									
								
							@@ -33,7 +33,7 @@ jobs:
 | 
			
		||||
    strategy:
 | 
			
		||||
      matrix:
 | 
			
		||||
        host:
 | 
			
		||||
          - Marisa
 | 
			
		||||
          #- Marisa
 | 
			
		||||
          #- Satori
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v2.3.4
 | 
			
		||||
@@ -53,8 +53,9 @@ jobs:
 | 
			
		||||
    strategy:
 | 
			
		||||
      matrix:
 | 
			
		||||
        home:
 | 
			
		||||
          - ottan
 | 
			
		||||
          #- natto
 | 
			
		||||
        homeaarch:
 | 
			
		||||
          - ottan
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v2.3.4
 | 
			
		||||
      - uses: cachix/install-nix-action@v13
 | 
			
		||||
@@ -66,5 +67,12 @@ jobs:
 | 
			
		||||
        with:
 | 
			
		||||
          name: natto1784
 | 
			
		||||
          authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
 | 
			
		||||
      - uses: uraimo/run-on-arch-action@v2.0.5
 | 
			
		||||
        name: Run commands
 | 
			
		||||
        id: runcmd
 | 
			
		||||
        with:
 | 
			
		||||
          arch: aarch64
 | 
			
		||||
          distro: ubuntu-latest
 | 
			
		||||
          run: nix build -L .#hm-configs.${{ matrix.homeaarch }}.activationPackage
 | 
			
		||||
     - run: nix build -L .#hm-configs.${{ matrix.home }}.activationPackage
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,15 +19,21 @@ in
 | 
			
		||||
  age = {
 | 
			
		||||
    sshKeyPaths = [ "${home}/.ssh/id_ed25519" ];
 | 
			
		||||
    secrets = {
 | 
			
		||||
      fish_variables = {
 | 
			
		||||
 /*     fish_variables = {
 | 
			
		||||
        file = ./secrets/fish_variables.age;
 | 
			
		||||
        path = "${home}/.config/fish/fish_variables";
 | 
			
		||||
        mode = "660";
 | 
			
		||||
        };
 | 
			
		||||
*/
 | 
			
		||||
      mpdasrc = {
 | 
			
		||||
        file = ./secrets/mpdasrc.age;
 | 
			
		||||
        path = "${home}/.config/mpdasrc";
 | 
			
		||||
      };
 | 
			
		||||
      zshrc = {
 | 
			
		||||
        file = ./secrets/.zshrc.age;
 | 
			
		||||
        path = "${home}/.zshrc";
 | 
			
		||||
        mode = "660";
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
  home = {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								home/secrets/.zshrc.age
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								home/secrets/.zshrc.age
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
age-encryption.org/v1
 | 
			
		||||
-> ssh-ed25519 kIk5ZQ d7rjGwJPo5zOXvqh2gYgTE08d6NaXXPNNiYlJLAotns
 | 
			
		||||
ZmolHuoLbsi/Oql88ZCBk4QgSKwPltDJoBD8cigfBkQ
 | 
			
		||||
-> Tf/-grease Ca3wR, S?z
 | 
			
		||||
VDYunDSnXz6uPifwdoPfACLpk3a6oVgmcbPH5MeHQ3RgYZHqd0DBRMPCuvZY7YW7
 | 
			
		||||
1L3FuDfLWlUJKMiqSuRnK2R7x6RIg3oumWKjyl1d9jtZWQ3JSmQRqsr2qi7FGA
 | 
			
		||||
--- N47PibVyn76ZSrO8etxah5ZiSZcjc+Fi2a1IFlbVZtY
 | 
			
		||||
<<3C><>Cq<1B>S<EFBFBD><53>G\<5C><03>וt<D795>\I<>}ʂ
 | 
			
		||||
<EFBFBD><EFBFBD><07><>y$$<04><14><>`!<21><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>u<08>ó<EFBFBD>c[W<><57><EFBFBD>(<28><><EFBFBD>=A<>װ<EFBFBD><01><><EFBFBD>h<><68>)~<7E>47<34>g<03><><EFBFBD><EFBFBD>H<EFBFBD>.$<24><>S<EFBFBD>m<EFBFBD>X<EFBFBD><58><03><>(<28><><1D>4<EFBFBD><34> A<><41><EFBFBD>|%<25>1<>h/A<><41>I̱a<CCB1>)<29>ŽW<C5BD><57><EFBFBD><EFBFBD><EFBFBD>-Z<><14>,V<>p<0B><><EFBFBD>ޙ<0E><>mϏ&<26>ע<15>X<EFBFBD>k<EFBFBD>ˈ&<11><>
 | 
			
		||||
j<><6A>n<>[<5B><><EFBFBD><EFBFBD>d
 | 
			
		||||
<EFBFBD><EFBFBD><1A>/u<>tqi<71>ױ<EFBFBD>6<10><>&<26>%W<><57>&<26><>1Լ<31>V<EFBFBD><56><EFBFBD><EFBFBD>s<0B>
 | 
			
		||||
ءF<EFBFBD>Wa<1D>_<EFBFBD><5F><EFBFBD><EFBFBD>g<EFBFBD>FO<46><05><><EFBFBD>)`4<>]<5D>N<EFBFBD><4E>	5<>݈<EFBFBD><DD88>{<7B>굙<EFBFBD>&<26><1C><>|A<>~ܸ<><DCB8><EFBFBD><EFBFBD>߶<EFBFBD>&<1B><><EFBFBD><EFBFBD>v<EFBFBD>w
 | 
			
		||||
@@ -1,30 +0,0 @@
 | 
			
		||||
/* See LICENSE file for copyright and license details. */
 | 
			
		||||
/* 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[] = {
 | 
			
		||||
	"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", "#1d2021" },
 | 
			
		||||
	[SchemeSel] = { "#1d2021", "#ebdbb2" },
 | 
			
		||||
//	[SchemeSelHighlight] = { "#000080", "#ebdbb2" },
 | 
			
		||||
//	[SchemeNormHighlight] = { "#ffc978", "#1d2021" },
 | 
			
		||||
	[SchemeOut] = { "#000000", "#00ffff" },
 | 
			
		||||
//	Settings[SchemeOutHighlight] = { "#ffc978", "#00ffff" },
 | 
			
		||||
};
 | 
			
		||||
/* -l option; if nonzero, dmenu uses vertical list with given number of lines */
 | 
			
		||||
static unsigned int lines      = 0;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Characters not considered part of a word while deleting words
 | 
			
		||||
 * for example: " /?\"&[]"
 | 
			
		||||
 */
 | 
			
		||||
static const char worddelimiters[] = " ";
 | 
			
		||||
/* Size of the window border */
 | 
			
		||||
static const unsigned int border_width = 4;
 | 
			
		||||
@@ -1,32 +1,27 @@
 | 
			
		||||
final: prev: {
 | 
			
		||||
 | 
			
		||||
  dmenu = prev.dmenu.overrideAttrs (oldAttrs: rec {
 | 
			
		||||
    configFile = prev.writeText "config.def.h" (builtins.readFile ./dmenu/config.def.h);
 | 
			
		||||
    src = builtins.fetchTarball {
 | 
			
		||||
      url = "https://dl.suckless.org/tools/dmenu-5.0.tar.gz";
 | 
			
		||||
      sha256 = "0gjjbh49j85rpbmiqj236g4c1zb1h8xh41mcjsvnzgwn72893mk6";
 | 
			
		||||
    };
 | 
			
		||||
    patches = [./suckless/dmenu.patch];
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  ncmpcpp = prev.ncmpcpp.override {
 | 
			
		||||
    visualizerSupport = true;
 | 
			
		||||
    clockSupport = true;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  dwm = prev.dwm.overrideAttrs (oldAttrs: rec {
 | 
			
		||||
    src = prev.fetchFromGitHub {
 | 
			
		||||
      owner = "natto1784";
 | 
			
		||||
      repo = "dwm";
 | 
			
		||||
      rev = "a3896f13d20218ce07a7b646459cd5ce6ed2f27d";
 | 
			
		||||
      sha256 = "sha256-iyUFeZwqZ6veMs+3lBcpBLENN4r27QlkARfAL3OJvks=";
 | 
			
		||||
    src = builtins.fetchTarball {
 | 
			
		||||
      url = "https://dl.suckless.org/dwm/dwm-6.2.tar.gz";
 | 
			
		||||
      sha256 = "0qdh8amfkjpvbwffar0byybcqi5w7v1wdqb39h75521haa6mh8xg";
 | 
			
		||||
    };
 | 
			
		||||
    patches = [./suckless/dwm.patch];
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  st = prev.st.overrideAttrs (oldAttrs: rec {
 | 
			
		||||
    src = prev.fetchFromGitHub {
 | 
			
		||||
      owner = "natto1784";
 | 
			
		||||
      repo = "st";
 | 
			
		||||
      rev = "0cd1e394e6d07c5f605ae23070c40de9690bafb1";
 | 
			
		||||
      sha256 = "sha256-EY5Amz16Drc4i0uEAYTPEHcGex0s3pzHDqfDp4Z5OGY=";
 | 
			
		||||
    src = builtins.fetchTarball {
 | 
			
		||||
        url = "https://dl.suckless.org/st/st-0.8.4.tar.gz";
 | 
			
		||||
        sha256 = "01z6i60fmdi5h6g80rgvqr6d00jxszphrldx07w4v6nq8cq2r4nr";
 | 
			
		||||
      };
 | 
			
		||||
 #   patch = prev.writeText "st.patch" (builtins.readFile ./st.patch);
 | 
			
		||||
 #   patchPhase = "patch -t < ${patch}";
 | 
			
		||||
    patches = [./suckless/st.patch];
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  kbd = prev.kbd.overrideAttrs (oldAttrs: rec{
 | 
			
		||||
@@ -35,6 +30,11 @@ final: prev: {
 | 
			
		||||
    postInstall = "${oldAttrs.postInstall}\n cp ${colemak-dh} $out/share/keymaps/i386/colemak/colemak-dh.map\n gzip $out/share/keymaps/i386/colemak/colemak-dh.map";
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  ncmpcpp = prev.ncmpcpp.override {
 | 
			
		||||
    visualizerSupport = true;
 | 
			
		||||
    clockSupport = true;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  picom = prev.picom.overrideAttrs (oldAttrs: rec{
 | 
			
		||||
    version = "Next";
 | 
			
		||||
    src = prev.fetchFromGitHub {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										338
									
								
								overlays/suckless/dmenu.patch
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										338
									
								
								overlays/suckless/dmenu.patch
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,338 @@
 | 
			
		||||
diff --color -u a/config.def.h b/config.def.h
 | 
			
		||||
--- a/config.def.h	2020-09-02 22:07:07.000000000 +0530
 | 
			
		||||
+++ b/config.def.h	2021-05-21 00:20:28.562140000 +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] = { "#bbbbbb", "#1d2021" },
 | 
			
		||||
+	[SchemeSel] = { "#1d2021", "#ebdbb2" },
 | 
			
		||||
+	[SchemeSelHighlight] = { "#000080", "#ebdbb2" },
 | 
			
		||||
+	[SchemeNormHighlight] = { "#ffc978", "#1d2021" },
 | 
			
		||||
 	[SchemeOut] = { "#000000", "#00ffff" },
 | 
			
		||||
+	[SchemeOutHighlight] = { "#ffc978", "#00ffff" },
 | 
			
		||||
 };
 | 
			
		||||
 /* -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 b: config.def.h.orig
 | 
			
		||||
diff --color -u a/dmenu.1 b/dmenu.1
 | 
			
		||||
--- a/dmenu.1	2020-09-02 22:07:07.000000000 +0530
 | 
			
		||||
+++ b/dmenu.1	2020-12-29 02:11:41.804718200 +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 -u a/dmenu.c b/dmenu.c
 | 
			
		||||
--- a/dmenu.c	2020-09-02 22:07:07.000000000 +0530
 | 
			
		||||
+++ b/dmenu.c	2020-12-29 02:24:03.168766600 +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;
 | 
			
		||||
@@ -89,6 +88,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)
 | 
			
		||||
 {
 | 
			
		||||
@@ -113,6 +121,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)
 | 
			
		||||
 {
 | 
			
		||||
@@ -123,7 +168,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
 | 
			
		||||
@@ -501,6 +548,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;
 | 
			
		||||
@@ -561,6 +721,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);
 | 
			
		||||
@@ -611,6 +774,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))) {
 | 
			
		||||
@@ -637,9 +801,16 @@
 | 
			
		||||
 				if (INTERSECT(x, y, 1, 1, info[i]))
 | 
			
		||||
 					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
 | 
			
		||||
@@ -647,21 +818,30 @@
 | 
			
		||||
 		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 = MIN(inputw, mw/3);
 | 
			
		||||
 	match();
 | 
			
		||||
 
 | 
			
		||||
 	/* create menu window */
 | 
			
		||||
 	swa.override_redirect = True;
 | 
			
		||||
 	swa.background_pixel = scheme[SchemeNorm][ColBg].pixel;
 | 
			
		||||
+	swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask |
 | 
			
		||||
+	                 ButtonPressMask;
 | 
			
		||||
 	swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask;
 | 
			
		||||
-	win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0,
 | 
			
		||||
+	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);
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -709,6 +889,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;
 | 
			
		||||
Only in b: dmenu.c.orig
 | 
			
		||||
Only in a: dmenu_path
 | 
			
		||||
Only in a: dmenu_run
 | 
			
		||||
							
								
								
									
										602
									
								
								overlays/suckless/dwm.patch
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										602
									
								
								overlays/suckless/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
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
diff '--color=auto' -u a/config.def.h b/config.def.h
 | 
			
		||||
--- a/config.def.h	2021-05-18 08:15:14.270294000 +0530
 | 
			
		||||
+++ b/config.def.h	2021-05-18 07:53:37.126991600 +0530
 | 
			
		||||
@@ -3,9 +3,8 @@
 | 
			
		||||
diff --color -u a/config.def.h b/config.def.h
 | 
			
		||||
--- a/config.def.h	2020-06-19 14:59:45.000000000 +0530
 | 
			
		||||
+++ b/config.def.h	2021-05-21 05:21:13.476454500 +0530
 | 
			
		||||
@@ -3,9 +3,10 @@
 | 
			
		||||
 /*
 | 
			
		||||
  * appearance
 | 
			
		||||
  *
 | 
			
		||||
@@ -9,10 +9,12 @@ diff '--color=auto' -u a/config.def.h b/config.def.h
 | 
			
		||||
  */
 | 
			
		||||
-static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true";
 | 
			
		||||
+static char *font = "Fira Mono:style=Regular:pixelsize=16";
 | 
			
		||||
+static char *font2[] = { "Font Awesome 5 Free Solid:pixelsize=15",
 | 
			
		||||
+                         "Font Awesome 5 Brands:pixelsize=15" };
 | 
			
		||||
 static int borderpx = 2;
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
@@ -16,7 +15,7 @@
 | 
			
		||||
@@ -16,7 +17,7 @@
 | 
			
		||||
  * 4: value of shell in /etc/passwd
 | 
			
		||||
  * 5: value of shell in config.h
 | 
			
		||||
  */
 | 
			
		||||
@@ -21,7 +23,7 @@ diff '--color=auto' -u a/config.def.h b/config.def.h
 | 
			
		||||
 char *utmp = NULL;
 | 
			
		||||
 /* scroll program: to enable use a string like "scroll" */
 | 
			
		||||
 char *scroll = NULL;
 | 
			
		||||
@@ -95,42 +94,37 @@
 | 
			
		||||
@@ -95,42 +96,37 @@
 | 
			
		||||
 
 | 
			
		||||
 /* Terminal colors (16 first used in escape sequence) */
 | 
			
		||||
 static const char *colorname[] = {
 | 
			
		||||
@@ -90,7 +92,7 @@ diff '--color=auto' -u a/config.def.h b/config.def.h
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
  * Default shape of cursor
 | 
			
		||||
@@ -154,7 +148,6 @@
 | 
			
		||||
@@ -154,7 +150,6 @@
 | 
			
		||||
 static unsigned int mouseshape = XC_xterm;
 | 
			
		||||
 static unsigned int mousefg = 7;
 | 
			
		||||
 static unsigned int mousebg = 0;
 | 
			
		||||
@@ -98,7 +100,7 @@ diff '--color=auto' -u a/config.def.h b/config.def.h
 | 
			
		||||
 /*
 | 
			
		||||
  * Color used to display font attributes when fontconfig selected a font which
 | 
			
		||||
  * doesn't match the ones requested.
 | 
			
		||||
@@ -173,32 +166,36 @@
 | 
			
		||||
@@ -173,32 +168,36 @@
 | 
			
		||||
  * Beware that overloading Button1 will disable the selection.
 | 
			
		||||
  */
 | 
			
		||||
 static MouseShortcut mshortcuts[] = {
 | 
			
		||||
@@ -155,7 +157,7 @@ diff '--color=auto' -u a/config.def.h b/config.def.h
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
@@ -226,229 +223,229 @@
 | 
			
		||||
@@ -226,229 +225,229 @@
 | 
			
		||||
  * If you want keys other than the X11 function keys (0xFD00 - 0xFFFF)
 | 
			
		||||
  * to be mapped below, add them to this array.
 | 
			
		||||
  */
 | 
			
		||||
@@ -597,7 +599,7 @@ diff '--color=auto' -u a/config.def.h b/config.def.h
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
@@ -459,14 +456,13 @@
 | 
			
		||||
@@ -459,14 +458,13 @@
 | 
			
		||||
  * If no match is found, regular selection is used.
 | 
			
		||||
  */
 | 
			
		||||
 static uint selmasks[] = {
 | 
			
		||||
@@ -616,9 +618,11 @@ diff '--color=auto' -u a/config.def.h b/config.def.h
 | 
			
		||||
+static char ascii_printable[] = " !\"#$%&'()*+,-./0123456789:;<=>?"
 | 
			
		||||
+                                "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
 | 
			
		||||
+                                "`abcdefghijklmnopqrstuvwxyz{|}~";
 | 
			
		||||
diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
--- a/st.c	2021-05-18 08:15:14.274578800 +0530
 | 
			
		||||
+++ b/st.c	2021-03-19 01:52:39.516045300 +0530
 | 
			
		||||
Only in b: config.def.h.orig
 | 
			
		||||
Only in b: config.def.h.rej
 | 
			
		||||
diff --color -u a/st.c b/st.c
 | 
			
		||||
--- a/st.c	2020-06-19 14:59:45.000000000 +0530
 | 
			
		||||
+++ b/st.c	2021-05-21 05:07:22.806708800 +0530
 | 
			
		||||
@@ -35,6 +35,7 @@
 | 
			
		||||
 #define ESC_ARG_SIZ   16
 | 
			
		||||
 #define STR_BUF_SIZ   ESC_BUF_SIZ
 | 
			
		||||
@@ -647,67 +651,18 @@ diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
 	int *dirty;   /* dirtyness of lines */
 | 
			
		||||
 	TCursor c;    /* cursor */
 | 
			
		||||
 	int ocx;      /* old cursor col */
 | 
			
		||||
@@ -184,20 +191,20 @@
 | 
			
		||||
@@ -184,8 +191,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 tsetattr(const int *, int);
 | 
			
		||||
-static void tsetchar(Rune, const Glyph *, int, int);
 | 
			
		||||
+static void tscrollup(int, int, int);
 | 
			
		||||
+static void tscrolldown(int, int, int);
 | 
			
		||||
+static void tsetattr(int *, int);
 | 
			
		||||
+static void tsetchar(Rune, Glyph *, int, int);
 | 
			
		||||
 static void tsetattr(int *, int);
 | 
			
		||||
 static void tsetchar(Rune, Glyph *, int, int);
 | 
			
		||||
 static void tsetdirt(int, int);
 | 
			
		||||
 static void tsetscroll(int, int);
 | 
			
		||||
 static void tswapscreen(void);
 | 
			
		||||
-static void tsetmode(int, int, const int *, int);
 | 
			
		||||
+static void tsetmode(int, int, int *, int);
 | 
			
		||||
 static int twrite(const char *, int, int);
 | 
			
		||||
 static void tfulldirt(void);
 | 
			
		||||
 static void tcontrolcode(uchar );
 | 
			
		||||
 static void tdectest(char );
 | 
			
		||||
 static void tdefutf8(char);
 | 
			
		||||
-static int32_t tdefcolor(const int *, int *, int);
 | 
			
		||||
+static int32_t tdefcolor(int *, int *, int);
 | 
			
		||||
 static void tdeftran(char);
 | 
			
		||||
 static void tstrsequence(uchar);
 | 
			
		||||
 
 | 
			
		||||
@@ -226,10 +233,10 @@
 | 
			
		||||
 static int cmdfd;
 | 
			
		||||
 static pid_t pid;
 | 
			
		||||
 
 | 
			
		||||
-static const uchar utfbyte[UTF_SIZ + 1] = {0x80,    0, 0xC0, 0xE0, 0xF0};
 | 
			
		||||
-static const uchar utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
 | 
			
		||||
-static const Rune utfmin[UTF_SIZ + 1] = {       0,    0,  0x80,  0x800,  0x10000};
 | 
			
		||||
-static const Rune utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
 | 
			
		||||
+static uchar utfbyte[UTF_SIZ + 1] = {0x80,    0, 0xC0, 0xE0, 0xF0};
 | 
			
		||||
+static uchar utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
 | 
			
		||||
+static Rune utfmin[UTF_SIZ + 1] = {       0,    0,  0x80,  0x800,  0x10000};
 | 
			
		||||
+static Rune utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
 | 
			
		||||
 
 | 
			
		||||
 ssize_t
 | 
			
		||||
 xwrite(int fd, const char *s, size_t len)
 | 
			
		||||
@@ -269,14 +276,12 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 char *
 | 
			
		||||
-xstrdup(const char *s)
 | 
			
		||||
+xstrdup(char *s)
 | 
			
		||||
 {
 | 
			
		||||
-	char *p;
 | 
			
		||||
-
 | 
			
		||||
-	if ((p = strdup(s)) == NULL)
 | 
			
		||||
+	if ((s = strdup(s)) == NULL)
 | 
			
		||||
 		die("strdup: %s\n", strerror(errno));
 | 
			
		||||
 
 | 
			
		||||
-	return p;
 | 
			
		||||
+	return s;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 size_t
 | 
			
		||||
@@ -416,10 +421,10 @@
 | 
			
		||||
@@ -414,10 +421,10 @@
 | 
			
		||||
 {
 | 
			
		||||
 	int i = term.col;
 | 
			
		||||
 
 | 
			
		||||
@@ -720,16 +675,7 @@ diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
 		--i;
 | 
			
		||||
 
 | 
			
		||||
 	return i;
 | 
			
		||||
@@ -520,7 +525,7 @@
 | 
			
		||||
 {
 | 
			
		||||
 	int newx, newy, xt, yt;
 | 
			
		||||
 	int delim, prevdelim;
 | 
			
		||||
-	const Glyph *gp, *prevgp;
 | 
			
		||||
+	Glyph *gp, *prevgp;
 | 
			
		||||
 
 | 
			
		||||
 	switch (sel.snap) {
 | 
			
		||||
 	case SNAP_WORD:
 | 
			
		||||
@@ -528,7 +533,7 @@
 | 
			
		||||
@@ -526,7 +533,7 @@
 | 
			
		||||
 		 * Snap around if the word wraps around at the end or
 | 
			
		||||
 		 * beginning of a line.
 | 
			
		||||
 		 */
 | 
			
		||||
@@ -738,7 +684,7 @@ diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
 		prevdelim = ISDELIM(prevgp->u);
 | 
			
		||||
 		for (;;) {
 | 
			
		||||
 			newx = *x + direction;
 | 
			
		||||
@@ -543,14 +548,14 @@
 | 
			
		||||
@@ -541,14 +548,14 @@
 | 
			
		||||
 					yt = *y, xt = *x;
 | 
			
		||||
 				else
 | 
			
		||||
 					yt = newy, xt = newx;
 | 
			
		||||
@@ -755,7 +701,7 @@ diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
 			delim = ISDELIM(gp->u);
 | 
			
		||||
 			if (!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim
 | 
			
		||||
 					|| (delim && gp->u != prevgp->u)))
 | 
			
		||||
@@ -571,14 +576,14 @@
 | 
			
		||||
@@ -569,14 +576,14 @@
 | 
			
		||||
 		*x = (direction < 0) ? 0 : term.col - 1;
 | 
			
		||||
 		if (direction < 0) {
 | 
			
		||||
 			for (; *y > 0; *y += direction) {
 | 
			
		||||
@@ -772,16 +718,7 @@ diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
 						& ATTR_WRAP)) {
 | 
			
		||||
 					break;
 | 
			
		||||
 				}
 | 
			
		||||
@@ -593,7 +598,7 @@
 | 
			
		||||
 {
 | 
			
		||||
 	char *str, *ptr;
 | 
			
		||||
 	int y, bufsize, lastx, linelen;
 | 
			
		||||
-	const Glyph *gp, *last;
 | 
			
		||||
+	Glyph *gp, *last;
 | 
			
		||||
 
 | 
			
		||||
 	if (sel.ob.x == -1)
 | 
			
		||||
 		return NULL;
 | 
			
		||||
@@ -609,13 +614,13 @@
 | 
			
		||||
@@ -607,13 +614,13 @@
 | 
			
		||||
 		}
 | 
			
		||||
 
 | 
			
		||||
 		if (sel.type == SEL_RECTANGULAR) {
 | 
			
		||||
@@ -798,16 +735,7 @@ diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
 		while (last >= gp && last->u == ' ')
 | 
			
		||||
 			--last;
 | 
			
		||||
 
 | 
			
		||||
@@ -760,7 +765,7 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 int
 | 
			
		||||
-ttynew(const char *line, char *cmd, const char *out, char **args)
 | 
			
		||||
+ttynew(char *line, char *cmd, char *out, char **args)
 | 
			
		||||
 {
 | 
			
		||||
 	int m, s;
 | 
			
		||||
 
 | 
			
		||||
@@ -850,6 +855,9 @@
 | 
			
		||||
@@ -848,6 +855,9 @@
 | 
			
		||||
 ttywrite(const char *s, size_t n, int may_echo)
 | 
			
		||||
 {
 | 
			
		||||
 	const char *next;
 | 
			
		||||
@@ -817,7 +745,7 @@ diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
 
 | 
			
		||||
 	if (may_echo && IS_SET(MODE_ECHO))
 | 
			
		||||
 		twrite(s, n, 1);
 | 
			
		||||
@@ -1061,13 +1069,53 @@
 | 
			
		||||
@@ -1059,13 +1069,53 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
@@ -872,7 +800,7 @@ diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
 	tsetdirt(orig, term.bot-n);
 | 
			
		||||
 	tclearregion(0, term.bot-n+1, term.col-1, term.bot);
 | 
			
		||||
 
 | 
			
		||||
@@ -1077,17 +1125,28 @@
 | 
			
		||||
@@ -1075,17 +1125,28 @@
 | 
			
		||||
 		term.line[i-n] = temp;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@@ -903,7 +831,7 @@ diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
 	tclearregion(0, orig, term.col-1, orig+n-1);
 | 
			
		||||
 	tsetdirt(orig+n, term.bot);
 | 
			
		||||
 
 | 
			
		||||
@@ -1097,7 +1156,8 @@
 | 
			
		||||
@@ -1095,7 +1156,8 @@
 | 
			
		||||
 		term.line[i+n] = temp;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@@ -913,7 +841,7 @@ diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
@@ -1126,7 +1186,7 @@
 | 
			
		||||
@@ -1124,7 +1186,7 @@
 | 
			
		||||
 	int y = term.c.y;
 | 
			
		||||
 
 | 
			
		||||
 	if (y == term.bot) {
 | 
			
		||||
@@ -922,19 +850,7 @@ diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
 	} else {
 | 
			
		||||
 		y++;
 | 
			
		||||
 	}
 | 
			
		||||
@@ -1188,9 +1248,9 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
-tsetchar(Rune u, const Glyph *attr, int x, int y)
 | 
			
		||||
+tsetchar(Rune u, Glyph *attr, int x, int y)
 | 
			
		||||
 {
 | 
			
		||||
-	static const char *vt100_0[62] = { /* 0x41 - 0x7e */
 | 
			
		||||
+	static char *vt100_0[62] = { /* 0x41 - 0x7e */
 | 
			
		||||
 		"↑", "↓", "→", "←", "█", "▚", "☃", /* A - G */
 | 
			
		||||
 		0, 0, 0, 0, 0, 0, 0, 0, /* H - O */
 | 
			
		||||
 		0, 0, 0, 0, 0, 0, 0, 0, /* P - W */
 | 
			
		||||
@@ -1291,18 +1351,18 @@
 | 
			
		||||
@@ -1289,14 +1351,14 @@
 | 
			
		||||
 tinsertblankline(int n)
 | 
			
		||||
 {
 | 
			
		||||
 	if (BETWEEN(term.c.y, term.top, term.bot))
 | 
			
		||||
@@ -951,33 +867,7 @@ diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 int32_t
 | 
			
		||||
-tdefcolor(const int *attr, int *npar, int l)
 | 
			
		||||
+tdefcolor(int *attr, int *npar, int l)
 | 
			
		||||
 {
 | 
			
		||||
 	int32_t idx = -1;
 | 
			
		||||
 	uint r, g, b;
 | 
			
		||||
@@ -1352,7 +1412,7 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
-tsetattr(const int *attr, int l)
 | 
			
		||||
+tsetattr(int *attr, int l)
 | 
			
		||||
 {
 | 
			
		||||
 	int i;
 | 
			
		||||
 	int32_t idx;
 | 
			
		||||
@@ -1470,9 +1530,9 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
-tsetmode(int priv, int set, const int *args, int narg)
 | 
			
		||||
+tsetmode(int priv, int set, int *args, int narg)
 | 
			
		||||
 {
 | 
			
		||||
-	int alt; const int *lim;
 | 
			
		||||
+	int alt, *lim;
 | 
			
		||||
 
 | 
			
		||||
 	for (lim = args + narg; args < lim; ++args) {
 | 
			
		||||
 		if (priv) {
 | 
			
		||||
@@ -1735,11 +1795,11 @@
 | 
			
		||||
@@ -1733,11 +1795,11 @@
 | 
			
		||||
 		break;
 | 
			
		||||
 	case 'S': /* SU -- Scroll <n> line up */
 | 
			
		||||
 		DEFAULT(csiescseq.arg[0], 1);
 | 
			
		||||
@@ -991,16 +881,23 @@ diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
 		break;
 | 
			
		||||
 	case 'L': /* IL -- Insert <n> blank lines */
 | 
			
		||||
 		DEFAULT(csiescseq.arg[0], 1);
 | 
			
		||||
@@ -2022,7 +2082,7 @@
 | 
			
		||||
 tdumpline(int n)
 | 
			
		||||
 {
 | 
			
		||||
 	char buf[UTF_SIZ];
 | 
			
		||||
-	const Glyph *bp, *end;
 | 
			
		||||
+	Glyph *bp, *end;
 | 
			
		||||
 
 | 
			
		||||
 	bp = &term.line[n][0];
 | 
			
		||||
 	end = &bp[MIN(tlinelen(n), term.col) - 1];
 | 
			
		||||
@@ -2251,7 +2311,7 @@
 | 
			
		||||
@@ -1853,7 +1915,15 @@
 | 
			
		||||
 	case ']': /* OSC -- Operating System Command */
 | 
			
		||||
 		switch (par) {
 | 
			
		||||
 		case 0:
 | 
			
		||||
+			if (narg > 1) {
 | 
			
		||||
+				xsettitle(strescseq.args[1]);
 | 
			
		||||
+				xseticontitle(strescseq.args[1]);
 | 
			
		||||
+			}
 | 
			
		||||
+			return;
 | 
			
		||||
 		case 1:
 | 
			
		||||
+			if (narg > 1)
 | 
			
		||||
+				xseticontitle(strescseq.args[1]);
 | 
			
		||||
+			return;
 | 
			
		||||
 		case 2:
 | 
			
		||||
 			if (narg > 1)
 | 
			
		||||
 				xsettitle(strescseq.args[1]);
 | 
			
		||||
@@ -2241,7 +2311,7 @@
 | 
			
		||||
 		return 0;
 | 
			
		||||
 	case 'D': /* IND -- Linefeed */
 | 
			
		||||
 		if (term.c.y == term.bot) {
 | 
			
		||||
@@ -1009,7 +906,7 @@ diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
 		} else {
 | 
			
		||||
 			tmoveto(term.c.x, term.c.y+1);
 | 
			
		||||
 		}
 | 
			
		||||
@@ -2264,7 +2324,7 @@
 | 
			
		||||
@@ -2254,7 +2324,7 @@
 | 
			
		||||
 		break;
 | 
			
		||||
 	case 'M': /* RI -- Reverse index */
 | 
			
		||||
 		if (term.c.y == term.top) {
 | 
			
		||||
@@ -1018,7 +915,7 @@ diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
 		} else {
 | 
			
		||||
 			tmoveto(term.c.x, term.c.y-1);
 | 
			
		||||
 		}
 | 
			
		||||
@@ -2474,7 +2534,7 @@
 | 
			
		||||
@@ -2464,7 +2534,7 @@
 | 
			
		||||
 void
 | 
			
		||||
 tresize(int col, int row)
 | 
			
		||||
 {
 | 
			
		||||
@@ -1027,7 +924,7 @@ diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
 	int minrow = MIN(row, term.row);
 | 
			
		||||
 	int mincol = MIN(col, term.col);
 | 
			
		||||
 	int *bp;
 | 
			
		||||
@@ -2511,6 +2571,14 @@
 | 
			
		||||
@@ -2501,6 +2571,14 @@
 | 
			
		||||
 	term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty));
 | 
			
		||||
 	term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs));
 | 
			
		||||
 
 | 
			
		||||
@@ -1042,7 +939,7 @@ diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
 	/* 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));
 | 
			
		||||
@@ -2569,7 +2637,7 @@
 | 
			
		||||
@@ -2559,7 +2637,7 @@
 | 
			
		||||
 			continue;
 | 
			
		||||
 
 | 
			
		||||
 		term.dirty[y] = 0;
 | 
			
		||||
@@ -1051,7 +948,7 @@ diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
 	}
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -2590,8 +2658,9 @@
 | 
			
		||||
@@ -2580,8 +2658,9 @@
 | 
			
		||||
 		cx--;
 | 
			
		||||
 
 | 
			
		||||
 	drawregion(0, 0, term.col, term.row);
 | 
			
		||||
@@ -1063,9 +960,9 @@ diff '--color=auto' -u a/st.c b/st.c
 | 
			
		||||
 	term.ocx = cx;
 | 
			
		||||
 	term.ocy = term.c.y;
 | 
			
		||||
 	xfinishdraw();
 | 
			
		||||
diff '--color=auto' -u a/st.h b/st.h
 | 
			
		||||
--- a/st.h	2021-05-18 08:15:14.275523400 +0530
 | 
			
		||||
+++ b/st.h	2021-03-19 01:52:39.517474600 +0530
 | 
			
		||||
diff --color -u a/st.h b/st.h
 | 
			
		||||
--- a/st.h	2020-06-19 14:59:45.000000000 +0530
 | 
			
		||||
+++ b/st.h	2021-05-21 05:07:22.806891600 +0530
 | 
			
		||||
@@ -81,6 +81,8 @@
 | 
			
		||||
 void redraw(void);
 | 
			
		||||
 void draw(void);
 | 
			
		||||
@@ -1075,62 +972,149 @@ diff '--color=auto' -u a/st.h b/st.h
 | 
			
		||||
 void printscreen(const Arg *);
 | 
			
		||||
 void printsel(const Arg *);
 | 
			
		||||
 void sendbreak(const Arg *);
 | 
			
		||||
@@ -91,7 +93,7 @@
 | 
			
		||||
 void tresize(int, int);
 | 
			
		||||
 void tsetdirtattr(int);
 | 
			
		||||
 void ttyhangup(void);
 | 
			
		||||
-int ttynew(const char *, char *, const char *, char **);
 | 
			
		||||
+int ttynew(char *, char *, char *, char **);
 | 
			
		||||
 size_t ttyread(void);
 | 
			
		||||
 void ttyresize(int, int);
 | 
			
		||||
 void ttywrite(const char *, size_t, int);
 | 
			
		||||
@@ -109,7 +111,7 @@
 | 
			
		||||
 
 | 
			
		||||
 void *xmalloc(size_t);
 | 
			
		||||
 void *xrealloc(void *, size_t);
 | 
			
		||||
-char *xstrdup(const char *);
 | 
			
		||||
+char *xstrdup(char *);
 | 
			
		||||
 
 | 
			
		||||
 /* config.h globals */
 | 
			
		||||
 extern char *utmp;
 | 
			
		||||
diff '--color=auto' -u a/x.c b/x.c
 | 
			
		||||
--- a/x.c	2021-05-18 08:15:14.281235100 +0530
 | 
			
		||||
+++ b/x.c	2021-03-19 01:52:25.361188800 +0530
 | 
			
		||||
@@ -156,7 +156,7 @@
 | 
			
		||||
 static void xhints(void);
 | 
			
		||||
diff --color -u a/win.h b/win.h
 | 
			
		||||
--- a/win.h	2020-06-19 14:59:45.000000000 +0530
 | 
			
		||||
+++ b/win.h	2021-05-21 05:07:22.805511800 +0530
 | 
			
		||||
@@ -30,6 +30,7 @@
 | 
			
		||||
 void xfinishdraw(void);
 | 
			
		||||
 void xloadcols(void);
 | 
			
		||||
 int xsetcolorname(int, const char *);
 | 
			
		||||
+void xseticontitle(char *);
 | 
			
		||||
 void xsettitle(char *);
 | 
			
		||||
 int xsetcursor(int);
 | 
			
		||||
 void xsetmode(int, unsigned int);
 | 
			
		||||
diff --color -u a/x.c b/x.c
 | 
			
		||||
--- a/x.c	2020-06-19 14:59:45.000000000 +0530
 | 
			
		||||
+++ b/x.c	2021-05-21 05:20:09.551000300 +0530
 | 
			
		||||
@@ -93,7 +93,7 @@
 | 
			
		||||
 	Window win;
 | 
			
		||||
 	Drawable buf;
 | 
			
		||||
 	GlyphFontSpec *specbuf; /* font spec buffer used for rendering */
 | 
			
		||||
-	Atom xembed, wmdeletewin, netwmname, netwmpid;
 | 
			
		||||
+	Atom xembed, wmdeletewin, netwmname, netwmiconname, netwmpid;
 | 
			
		||||
 	struct {
 | 
			
		||||
 		XIM xim;
 | 
			
		||||
 		XIC xic;
 | 
			
		||||
@@ -157,6 +157,7 @@
 | 
			
		||||
 static int xloadcolor(int, const char *, Color *);
 | 
			
		||||
 static int xloadfont(Font *, FcPattern *);
 | 
			
		||||
-static void xloadfonts(const char *, double);
 | 
			
		||||
+static void xloadfonts(char *, double);
 | 
			
		||||
 static void xloadfonts(char *, double);
 | 
			
		||||
+static void xloadsparefont();
 | 
			
		||||
 static void xunloadfont(Font *);
 | 
			
		||||
 static void xunloadfonts(void);
 | 
			
		||||
 static void xsetenv(void);
 | 
			
		||||
@@ -387,9 +387,7 @@
 | 
			
		||||
 			button = 3;
 | 
			
		||||
 		} else {
 | 
			
		||||
 			button -= Button1;
 | 
			
		||||
-			if (button >= 7)
 | 
			
		||||
-				button += 128 - 7;
 | 
			
		||||
-			else if (button >= 3)
 | 
			
		||||
+			if (button >= 3)
 | 
			
		||||
 				button += 64 - 3;
 | 
			
		||||
 		}
 | 
			
		||||
 		if (e->xbutton.type == ButtonPress) {
 | 
			
		||||
@@ -952,7 +950,7 @@
 | 
			
		||||
@@ -306,6 +307,7 @@
 | 
			
		||||
 {
 | 
			
		||||
 	xunloadfonts();
 | 
			
		||||
 	xloadfonts(usedfont, arg->f);
 | 
			
		||||
+	xloadsparefont();
 | 
			
		||||
 	cresize(0, 0);
 | 
			
		||||
 	redraw();
 | 
			
		||||
 	xhints();
 | 
			
		||||
@@ -1020,6 +1022,67 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
-xloadfonts(const char *fontstr, double fontsize)
 | 
			
		||||
+xloadfonts(char *fontstr, double fontsize)
 | 
			
		||||
+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)
 | 
			
		||||
 {
 | 
			
		||||
 	FcPattern *pattern;
 | 
			
		||||
 	double fontval;
 | 
			
		||||
@@ -960,7 +958,7 @@
 | 
			
		||||
 	if (fontstr[0] == '-')
 | 
			
		||||
 		pattern = XftXlfdParse(fontstr, False, False);
 | 
			
		||||
 	else
 | 
			
		||||
-		pattern = FcNameParse((const FcChar8 *)fontstr);
 | 
			
		||||
+		pattern = FcNameParse((FcChar8 *)fontstr);
 | 
			
		||||
 	XftFontClose(xw.dpy, f->match);
 | 
			
		||||
@@ -1116,6 +1179,9 @@
 | 
			
		||||
 	usedfont = (opt_font == NULL)? font : opt_font;
 | 
			
		||||
 	xloadfonts(usedfont, 0);
 | 
			
		||||
 
 | 
			
		||||
 	if (!pattern)
 | 
			
		||||
 		die("can't open font %s\n", fontstr);
 | 
			
		||||
+	/* spare font (font2) */
 | 
			
		||||
+	xloadsparefont();
 | 
			
		||||
+
 | 
			
		||||
 	/* colors */
 | 
			
		||||
 	xw.cmap = XDefaultColormap(xw.dpy, xw.scr);
 | 
			
		||||
 	xloadcols();
 | 
			
		||||
@@ -1186,6 +1252,7 @@
 | 
			
		||||
 	xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False);
 | 
			
		||||
 	xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False);
 | 
			
		||||
 	xw.netwmname = XInternAtom(xw.dpy, "_NET_WM_NAME", False);
 | 
			
		||||
+	xw.netwmiconname = XInternAtom(xw.dpy, "_NET_WM_ICON_NAME", False);
 | 
			
		||||
 	XSetWMProtocols(xw.dpy, xw.win, &xw.wmdeletewin, 1);
 | 
			
		||||
 
 | 
			
		||||
 	xw.netwmpid = XInternAtom(xw.dpy, "_NET_WM_PID", False);
 | 
			
		||||
@@ -1580,6 +1647,19 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void
 | 
			
		||||
+xseticontitle(char *p)
 | 
			
		||||
+{
 | 
			
		||||
+	XTextProperty prop;
 | 
			
		||||
+	DEFAULT(p, opt_title);
 | 
			
		||||
+
 | 
			
		||||
+	Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle,
 | 
			
		||||
+			&prop);
 | 
			
		||||
+	XSetWMIconName(xw.dpy, xw.win, &prop);
 | 
			
		||||
+	XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmiconname);
 | 
			
		||||
+	XFree(prop.value);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+void
 | 
			
		||||
 xsettitle(char *p)
 | 
			
		||||
 {
 | 
			
		||||
 	XTextProperty prop;
 | 
			
		||||
Only in b: x.c.orig
 | 
			
		||||
		Reference in New Issue
	
	Block a user