A => +8 -0
@@ 1,8 @@
#!/bin/sh -e
for patch in *.patch; do
patch -p1 < $patch
done
make
make DESTDIR="$1" PREFIX=/usr install
A => +2 -0
@@ 1,2 @@
b3971f4f354476a37b2afb498693649009b201550b0c7c88e866af8132b64945 dmenu-4.9.tar.gz
8ef14557b7f138060ee431fcf78cb4175843bcbf61dd4cae170361c2b2161a3e 00-config.patch
A => +3 -0
@@ 1,3 @@
libXft
libXinerama
xorg-server
A => +21 -0
@@ 1,21 @@
--- dmenu-4.9/config.def.h
+++ dmenu-4.9-config/config.def.h
@@ -4,14 +4,14 @@
static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */
/* -fn option overrides fonts[0]; default X11 font or font set */
static const char *fonts[] = {
- "monospace:size=10"
+ "Fira Code:size=14"
};
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" },
- [SchemeOut] = { "#000000", "#00ffff" },
+ [SchemeNorm] = { "#d0d0d0", "#3a3a3a" },
+ [SchemeSel] = { "#e4e4e4", "#85add4" },
+ [SchemeOut] = { "#3a3a3a", "#d0d0d0" },
};
/* -l option; if nonzero, dmenu uses vertical list with given number of lines */
static unsigned int lines = 0;
A => +2 -0
@@ 1,2 @@
https://dl.suckless.org/tools/dmenu-4.9.tar.gz
patches/00-config.patch
A => +1 -0
A => dwm/build +11 -0
@@ 1,11 @@
+#!/bin/sh -e
+
+# Amend install path to '/usr'.
+sed -i'' "s#/usr/local#/usr#" config.mk
+
+for patch in *.patch; do
+ patch -p1 < $patch
+done
+
+make
+make DESTDIR="$1" install
A => dwm/checksums +5 -0
@@ 1,5 @@
+97902e2e007aaeaa3c6e3bed1f81785b817b7413947f1db1d3b62b8da4cd110e dwm-6.2.tar.gz
+96d35796993e2da1a6ed6073df2e9f0a8f48043b66988ef5ca5d754223480a41 00-config.patch
+35672d0838e48cdb1fec4bb16f37dd5ce6bf678b77b914c1dd33ce023abe1e23 01-uselessgaps.patch
+770b11aa24aa0b28d576f727c810958125c9000b95eb94091769e70b5c5b8444 02-notitle.patch
+757749dbde5b63116bacb2117093b72f50f411f09aafd2137bf6a511bf228273 03-scratchpad.patch
A => dwm/depends +2 -0
@@ 1,2 @@
+libXft
+libXinerama
A => dwm/patches/00-config.patch +88 -0
@@ 1,88 @@
+Common subdirectories: dwm/.git and dwm-tmp/.git
+--- dwm/config.def.h
++++ dwm-tmp/config.def.h
+@@ -1,21 +1,20 @@
+ /* See LICENSE file for copyright and license details. */
+
+ /* appearance */
+-static const unsigned int borderpx = 1; /* border pixel of windows */
++static const unsigned int borderpx = 3; /* border pixel of 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 *fonts[] = { "Fira Code:size=14" };
++static const char dmenufont[] = "Fira Code:size=14";
++static const char col_gray1[] = "#3a3a3a";
++static const char col_gray2[] = "#d0d0d0";
++static const char col_gray3[] = "#e4e4e4";
++static const char col_blue[] = "#85add4";
+ static const char *colors[][3] = {
+ /* fg bg border */
+- [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
+- [SchemeSel] = { col_gray4, col_cyan, col_cyan },
++ [SchemeNorm] = { col_gray2, col_gray1, col_gray1 },
++ [SchemeSel] = { col_gray3, col_blue, col_blue },
+ };
+
+ /* tagging */
+@@ -28,13 +27,12 @@
+ */
+ /* class instance title tags mask isfloating monitor */
+ { "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 resizehints = 0; /* 1 means respect size hints in tiled resizals */
+
+ static const Layout layouts[] = {
+ /* symbol arrange function */
+@@ -44,7 +42,7 @@
+ };
+
+ /* key definitions */
+-#define MODKEY Mod1Mask
++#define MODKEY Mod4Mask
+ #define TAGKEYS(KEY,TAG) \
+ { MODKEY, KEY, view, {.ui = 1 << TAG} }, \
+ { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
+@@ -56,23 +54,23 @@
+
+ /* 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 *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray2, "-sb", col_blue, "-sf", col_gray3, NULL };
+ static const char *termcmd[] = { "st", 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_o, incnmaster, {.i = -1 } },
+ { MODKEY, XK_i, incnmaster, {.i = +1 } },
+- { MODKEY, XK_d, 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_q, killclient, {0} },
+ { MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
+ { MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
+ { MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
A => dwm/patches/01-uselessgaps.patch +64 -0
@@ 1,64 @@
+--- dwm-tmp/config.def.h
++++ dwm-tmp.bak/config.def.h
+@@ -2,6 +2,7 @@
+
+ /* appearance */
+ static const unsigned int borderpx = 3; /* 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 */
+--- dwm-tmp/dwm.c
++++ dwm-tmp.bak/dwm.c
+@@ -52,8 +52,8 @@
+ #define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]))
+ #define LENGTH(X) (sizeof X / sizeof X[0])
+ #define MOUSEMASK (BUTTONMASK|PointerMotionMask)
+-#define WIDTH(X) ((X)->w + 2 * (X)->bw)
+-#define HEIGHT(X) ((X)->h + 2 * (X)->bw)
++#define WIDTH(X) ((X)->w + 2 * (X)->bw + gappx)
++#define HEIGHT(X) ((X)->h + 2 * (X)->bw + gappx)
+ #define TAGMASK ((1 << LENGTH(tags)) - 1)
+ #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
+
+@@ -1276,12 +1276,36 @@
+ resizeclient(Client *c, int x, int y, int w, int h)
+ {
+ XWindowChanges wc;
++ unsigned int n;
++ unsigned int gapoffset;
++ unsigned int gapincr;
++ Client *nbc;
+
+- c->oldx = c->x; c->x = wc.x = x;
+- c->oldy = c->y; c->y = wc.y = y;
+- c->oldw = c->w; c->w = wc.width = w;
+- c->oldh = c->h; c->h = wc.height = h;
+ wc.border_width = c->bw;
++
++ /* Get number of clients for the selected monitor */
++ for (n = 0, nbc = nexttiled(selmon->clients); nbc; nbc = nexttiled(nbc->next), n++);
++
++ /* Do nothing if layout is floating */
++ if (c->isfloating || selmon->lt[selmon->sellt]->arrange == NULL) {
++ gapincr = gapoffset = 0;
++ } else {
++ /* Remove border and gap if layout is monocle or only one client */
++ if (selmon->lt[selmon->sellt]->arrange == monocle || n == 1) {
++ gapoffset = 0;
++ gapincr = -2 * borderpx;
++ wc.border_width = 0;
++ } else {
++ gapoffset = gappx;
++ gapincr = 2 * gappx;
++ }
++ }
++
++ c->oldx = c->x; c->x = wc.x = x + gapoffset;
++ c->oldy = c->y; c->y = wc.y = y + gapoffset;
++ c->oldw = c->w; c->w = wc.width = w - gapincr;
++ c->oldh = c->h; c->h = wc.height = h - gapincr;
++
+ XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
+ configure(c);
+ XSync(dpy, False);
A => dwm/patches/02-notitle.patch +64 -0
@@ 1,64 @@
+--- dwm-uselessgaps/config.def.h
++++ dwm-notitle/config.def.h
+@@ -102,7 +102,6 @@
+ /* click event mask button function argument */
+ { ClkLtSymbol, 0, Button1, setlayout, {0} },
+ { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
+- { ClkWinTitle, 0, Button2, zoom, {0} },
+ { ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
+ { ClkClientWin, MODKEY, Button1, movemouse, {0} },
+ { ClkClientWin, MODKEY, Button2, togglefloating, {0} },
+--- dwm-uselessgaps/dwm.c
++++ dwm-notitle/dwm.c
+@@ -64,8 +64,8 @@
+ NetWMFullscreen, NetActiveWindow, NetWMWindowType,
+ NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
+ enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
+-enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
+- ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
++enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkClientWin,
++ ClkRootWin, ClkLast }; /* clicks */
+
+ typedef union {
+ int i;
+@@ -439,10 +439,8 @@
+ arg.ui = 1 << i;
+ } else if (ev->x < x + blw)
+ click = ClkLtSymbol;
+- else if (ev->x > selmon->ww - TEXTW(stext))
+- click = ClkStatusText;
+ else
+- click = ClkWinTitle;
++ click = ClkStatusText;
+ } else if ((c = wintoclient(ev->window))) {
+ focus(c);
+ restack(selmon);
+@@ -729,15 +727,8 @@
+ x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
+
+ if ((w = m->ww - sw - x) > bh) {
+- if (m->sel) {
+- drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
+- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
+- if (m->sel->isfloating)
+- drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
+- } else {
+ drw_setscheme(drw, scheme[SchemeNorm]);
+ drw_rect(drw, x, 0, w, bh, 1, 1);
+- }
+ }
+ drw_map(drw, m->barwin, 0, 0, m->ww, bh);
+ }
+@@ -1235,11 +1226,8 @@
+ drawbars();
+ break;
+ }
+- if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) {
++ if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName])
+ updatetitle(c);
+- if (c == c->mon->sel)
+- drawbar(c->mon);
+- }
+ if (ev->atom == netatom[NetWMWindowType])
+ updatewindowtype(c);
+ }
A => dwm/patches/03-scratchpad.patch +89 -0
@@ 1,89 @@
+Common subdirectories: dwm/.git and dwm-tmp/.git
+--- dwm/config.def.h
++++ dwm-tmp/config.def.h
+@@ -56,11 +56,14 @@
+ 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_gray2, "-sb", col_blue, "-sf", col_gray3, NULL };
+ static const char *termcmd[] = { "st", NULL };
++static const char scratchpadname[] = "scratchpad";
++static const char *scratchpadcmd[] = { "st", "-t", scratchpadname, "-g", "120x34", NULL };
+
+ static Key keys[] = {
+ /* modifier key function argument */
+ { MODKEY, XK_d, spawn, {.v = dmenucmd } },
+ { MODKEY, XK_Return, spawn, {.v = termcmd } },
++ { MODKEY, XK_u, togglescratch, {.v = scratchpadcmd } },
+ { MODKEY, XK_b, togglebar, {0} },
+ { MODKEY, XK_j, focusstack, {.i = +1 } },
+ { MODKEY, XK_k, focusstack, {.i = -1 } },
+--- dwm/dwm.c
++++ dwm-tmp/dwm.c
+@@ -212,6 +212,7 @@
+ static void tile(Monitor *);
+ static void togglebar(const Arg *arg);
+ static void togglefloating(const Arg *arg);
++static void togglescratch(const Arg *arg);
+ static void toggletag(const Arg *arg);
+ static void toggleview(const Arg *arg);
+ static void unfocus(Client *c, int setfocus);
+@@ -272,6 +273,8 @@
+ /* configuration, allows nested code to access above variables */
+ #include "config.h"
+
++static unsigned int scratchtag = 1 << LENGTH(tags);
++
+ /* compile-time check if all tags fit into an unsigned int bit array. */
+ struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
+
+@@ -1050,6 +1053,14 @@
+ && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my);
+ c->bw = borderpx;
+
++ selmon->tagset[selmon->seltags] &= ~scratchtag;
++ if (!strcmp(c->name, scratchpadname)) {
++ c->mon->tagset[c->mon->seltags] |= c->tags = scratchtag;
++ c->isfloating = True;
++ c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2);
++ c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2);
++ }
++
+ wc.border_width = c->bw;
+ XConfigureWindow(dpy, w, CWBorderWidth, &wc);
+ XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel);
+@@ -1642,6 +1653,7 @@
+ {
+ if (arg->v == dmenucmd)
+ dmenumon[0] = '0' + selmon->num;
++ selmon->tagset[selmon->seltags] &= ~scratchtag;
+ if (fork() == 0) {
+ if (dpy)
+ close(ConnectionNumber(dpy));
+@@ -1720,6 +1732,28 @@
+ resize(selmon->sel, selmon->sel->x, selmon->sel->y,
+ selmon->sel->w, selmon->sel->h, 0);
+ arrange(selmon);
++}
++
++void
++togglescratch(const Arg *arg)
++{
++ Client *c;
++ unsigned int found = 0;
++
++ for (c = selmon->clients; c && !(found = c->tags & scratchtag); c = c->next);
++ if (found) {
++ unsigned int newtagset = selmon->tagset[selmon->seltags] ^ scratchtag;
++ if (newtagset) {
++ selmon->tagset[selmon->seltags] = newtagset;
++ focus(NULL);
++ arrange(selmon);
++ }
++ if (ISVISIBLE(c)) {
++ focus(c);
++ restack(selmon);
++ }
++ } else
++ spawn(arg);
+ }
+
+ void
A => dwm/sources +5 -0
@@ 1,5 @@
+https://dl.suckless.org/dwm/dwm-6.2.tar.gz
+patches/00-config.patch
+patches/01-uselessgaps.patch
+patches/02-notitle.patch
+patches/03-scratchpad.patch
A => dwm/version +1 -0
A => fira-code/build +6 -0
@@ 1,6 @@
+#!/bin/sh -e
+
+find ./ -name '*Windows*' -exec rm -rf {} +
+
+install -dm755 "$1/usr/share/fonts/TTF"
+install -Dm644 -- *.ttf "$1/usr/share/fonts/TTF"
A => fira-code/checksums +1 -0
@@ 1,1 @@
+21de9aa0edaa3fd2dc1d87fb9ecec0b67c9b3b18bd1998a19904158067fea7e7 FiraCode.zip
A => fira-code/sources +1 -0
@@ 1,1 @@
+https://github.com/ryanoasis/nerd-fonts/releases/download/v2.1.0/FiraCode.zip
A => fira-code/version +1 -0
A => libgen-cli/build +3 -0
@@ 1,3 @@
+#!/bin/sh -e
+
+go build -o "$1/usr/bin/libgen-cli"
A => libgen-cli/build.bak +4 -0
@@ 1,4 @@
+#!/bin/sh -e
+
+go build -o "$1/usr/bin/fzf"
+install -Dm644 man/man1/fzf.1 "$1/usr/share/man/man1/fzf.1"
A => libgen-cli/checksums +1 -0
@@ 1,1 @@
+1dba6d8268ad8156492a1e57c2c8c7ee393154870c78cec3b9d5dc8cf72d7857 v1.0.5.tar.gz
A => libgen-cli/depends +1 -0
A => libgen-cli/sources +1 -0
@@ 1,1 @@
+https://github.com/ciehanski/libgen-cli/archive/v1.0.5.tar.gz
A => libgen-cli/version +1 -0
A => openmoji/build +4 -0
@@ 1,4 @@
+#!/bin/sh -e
+
+install -dm755 "$1/usr/share/fonts/TTF"
+install -Dm644 -- *.ttf "$1/usr/share/fonts/TTF"
A => openmoji/checksums +1 -0
@@ 1,1 @@
+f068ad956b636e5234d606968564ee93e3360499fa4ce38cfea0ed12629dee07 openmoji-font.zip
A => openmoji/sources +1 -0
@@ 1,1 @@
+https://github.com/hfg-gmuend/openmoji/releases/download/12.2.0/openmoji-font.zip
A => openmoji/version +1 -0
A => sowm/build +8 -0
@@ 1,8 @@
+#!/bin/sh -e
+
+for patch in *.patch; do
+ patch -p1 < $patch
+done
+
+make
+make DESTDIR="$1" install
A => sowm/checksums +2 -0
@@ 1,2 @@
+7e1d1391f8cf8d1b04458d0b4bb3b61684b535dddcc1dd7d37266e81efd57e02 1.6.tar.gz
+9c2850ae43f71e67f1034a6940d7d8cf895cdb3782aa2c2896293c3b7906fca5 58.patch
A => sowm/depends +1 -0
A => sowm/patches/58.patch +130 -0
@@ 1,130 @@
+From 7215a4915d5291e1d19837fca61077e9566b2216 Mon Sep 17 00:00:00 2001
+From: Dylan Araps <dylan.araps@gmail.com>
+Date: Fri, 21 Feb 2020 18:12:32 +0200
+Subject: [PATCH] sowm: Rounded corners
+
+---
+ Makefile | 2 +-
+ config.def.h | 1 +
+ sowm.c | 42 ++++++++++++++++++++++++++++++++++++++++++
+ sowm.h | 1 +
+ 4 files changed, 45 insertions(+), 1 deletion(-)
+
+diff --git a/Makefile b/Makefile
+index 3450a85..ed361f9 100644
+--- a/Makefile
++++ b/Makefile
+@@ -10,7 +10,7 @@ config.h:
+ cp config.def.h config.h
+
+ sowm:
+- $(CC) -O3 $(CFLAGS) -o sowm sowm.c -lX11 $(LDFLAGS)
++ $(CC) -O3 $(CFLAGS) -o sowm sowm.c -lX11 -lXext $(LDFLAGS)
+
+ install: all
+ install -Dm755 sowm $(DESTDIR)$(BINDIR)/sowm
+diff --git a/config.def.h b/config.def.h
+index cae2009..32cf193 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -2,6 +2,7 @@
+ #define CONFIG_H
+
+ #define MOD Mod4Mask
++#define ROUND_CORNERS 20
+
+ const char* menu[] = {"dmenu_run", 0};
+ const char* term[] = {"st", 0};
+diff --git a/sowm.c b/sowm.c
+index 509e28f..16d7424 100644
+--- a/sowm.c
++++ b/sowm.c
+@@ -4,6 +4,7 @@
+ #include <X11/XF86keysym.h>
+ #include <X11/keysym.h>
+ #include <X11/XKBlib.h>
++#include <X11/extensions/shape.h>
+ #include <stdlib.h>
+ #include <signal.h>
+ #include <unistd.h>
+@@ -61,6 +62,9 @@ void notify_motion(XEvent *e) {
+ wy + (mouse.button == 1 ? yd : 0),
+ MAX(1, ww + (mouse.button == 3 ? xd : 0)),
+ MAX(1, wh + (mouse.button == 3 ? yd : 0)));
++
++ if (mouse.button == 3)
++ win_round_corners(mouse.subwindow, ROUND_CORNERS);
+ }
+
+ void key_press(XEvent *e) {
+@@ -142,6 +146,41 @@ void win_fs(const Arg arg) {
+ } else {
+ XMoveResizeWindow(d, cur->w, cur->wx, cur->wy, cur->ww, cur->wh);
+ }
++
++ win_round_corners(cur->w, cur->f ? 0 : ROUND_CORNERS);
++}
++
++void win_round_corners(Window w, int rad) {
++ unsigned int ww, wh, dia = 2 * rad;
++
++ win_size(w, &(int){1}, &(int){1}, &ww, &wh);
++
++ if (ww < dia || wh < dia) return;
++
++ Pixmap mask = XCreatePixmap(d, w, ww, wh, 1);
++
++ if (!mask) return;
++
++ XGCValues xgcv;
++ GC shape_gc = XCreateGC(d, mask, 0, &xgcv);
++
++ if (!shape_gc) {
++ XFreePixmap(d, mask);
++ return;
++ }
++
++ XSetForeground(d, shape_gc, 0);
++ XFillRectangle(d, mask, shape_gc, 0, 0, ww, wh);
++ XSetForeground(d, shape_gc, 1);
++ XFillArc(d, mask, shape_gc, 0, 0, dia, dia, 0, 23040);
++ XFillArc(d, mask, shape_gc, ww-dia-1, 0, dia, dia, 0, 23040);
++ XFillArc(d, mask, shape_gc, 0, wh-dia-1, dia, dia, 0, 23040);
++ XFillArc(d, mask, shape_gc, ww-dia-1, wh-dia-1, dia, dia, 0, 23040);
++ XFillRectangle(d, mask, shape_gc, rad, 0, ww-dia, wh);
++ XFillRectangle(d, mask, shape_gc, 0, rad, ww, wh-dia);
++ XShapeCombineMask(d, w, ShapeBounding, 0, 0, mask, ShapeSet);
++ XFreePixmap(d, mask);
++ XFreeGC(d, shape_gc);
+ }
+
+ void win_to_ws(const Arg arg) {
+@@ -205,6 +244,8 @@ void configure_request(XEvent *e) {
+ .sibling = ev->above,
+ .stack_mode = ev->detail
+ });
++
++ win_round_corners(ev->window, ROUND_CORNERS);
+ }
+
+ void map_request(XEvent *e) {
+@@ -217,6 +258,7 @@ void map_request(XEvent *e) {
+
+ if (wx + wy == 0) win_center((Arg){0});
+
++ win_round_corners(w, ROUND_CORNERS);
+ XMapWindow(d, w);
+ win_focus(list->prev);
+ }
+diff --git a/sowm.h b/sowm.h
+index 455ed93..d35c2f4 100644
+--- a/sowm.h
++++ b/sowm.h
+@@ -51,6 +51,7 @@ void win_focus(client *c);
+ void win_kill(const Arg arg);
+ void win_prev(const Arg arg);
+ void win_next(const Arg arg);
++void win_round_corners(Window w, int rad);
+ void win_to_ws(const Arg arg);
+ void ws_go(const Arg arg);
+
A => sowm/patches/76.patch +81 -0
@@ 1,81 @@
+From a0abfa50545a44a9a83896d28999e27f669cfe04 Mon Sep 17 00:00:00 2001
+From: Unixsys <64293761+Unixsys@users.noreply.github.com>
+Date: Fri, 24 Apr 2020 21:13:18 -0500
+Subject: [PATCH 1/3] Add window splitting functionality in sowm.c
+
+---
+ sowm.c | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git a/sowm.c b/sowm.c
+index 9e2c58d..6ea6642 100644
+--- a/sowm.c
++++ b/sowm.c
+@@ -31,6 +31,18 @@ static void (*events[LASTEvent])(XEvent *e) = {
+
+ #include "config.h"
+
++void win_half(const Arg arg) {
++ char m = arg.com[0][0];
++
++ win_size(cur->w, &wx, &wy, &ww, &wh);
++
++ XMoveResizeWindow(d, cur->w, \
++ (m == 'w' ? wx : m == 'e' ? (wx + ww / 2) : wx),
++ (m == 'n' ? wy : m == 's' ? (wy + wh / 2) : wy),
++ (m == 'w' ? (ww / 2) : m == 'e' ? (ww / 2) : ww),
++ (m == 'n' ? (wh / 2) : m == 's' ? (wh / 2) : wh));
++}
++
+ void win_focus(client *c) {
+ cur = c;
+ XSetInputFocus(d, cur->w, RevertToParent, CurrentTime);
+
+From 5ee73f8db7e2d7a65c30caa0c63efaabc711b7f8 Mon Sep 17 00:00:00 2001
+From: Unixsys <64293761+Unixsys@users.noreply.github.com>
+Date: Fri, 24 Apr 2020 21:16:03 -0500
+Subject: [PATCH 2/3] Add keybinds for window splitting
+
+---
+ config.def.h | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/config.def.h b/config.def.h
+index cae2009..86f0248 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -17,6 +17,12 @@ static struct key keys[] = {
+ {MOD, XK_q, win_kill, {0}},
+ {MOD, XK_c, win_center, {0}},
+ {MOD, XK_f, win_fs, {0}},
++
++ {MOD|Mod1Mask, XK_k, win_half, {.com = (const char*[]){"n"}}},
++ {MOD|Mod1Mask, XK_j, win_half, {.com = (const char*[]){"s"}}},
++ {MOD|Mod1Mask, XK_l, win_half, {.com = (const char*[]){"e"}}},
++ {MOD|Mod1Mask, XK_h, win_half, {.com = (const char*[]){"w"}}},
++
+
+ {Mod1Mask, XK_Tab, win_next, {0}},
+ {Mod1Mask|ShiftMask, XK_Tab, win_prev, {0}},
+
+From a65e215e833d16ee98a063cfd3bf7505c47ce883 Mon Sep 17 00:00:00 2001
+From: Unixsys <64293761+Unixsys@users.noreply.github.com>
+Date: Fri, 24 Apr 2020 21:16:52 -0500
+Subject: [PATCH 3/3] add function declaration
+
+---
+ sowm.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/sowm.h b/sowm.h
+index 455ed93..0d49e36 100644
+--- a/sowm.h
++++ b/sowm.h
+@@ -51,6 +51,7 @@ void win_focus(client *c);
+ void win_kill(const Arg arg);
+ void win_prev(const Arg arg);
+ void win_next(const Arg arg);
++void win_half(const Arg arg);
+ void win_to_ws(const Arg arg);
+ void ws_go(const Arg arg);
+
A => sowm/sources +2 -0
@@ 1,2 @@
+https://github.com/dylanaraps/sowm/archive/1.6.tar.gz
+patches/58.patch
A => sowm/version +1 -0
A => st/build +8 -0
@@ 1,8 @@
+#!/bin/sh -e
+
+for patch in *.patch; do
+ patch -p1 < $patch
+done
+
+make
+make PREFIX=/usr DESTDIR="$1" install
A => st/checksums +2 -0
@@ 1,2 @@
+939ae3da237e7c9489694853c205c7cbd5f2a2f0c17fe41a07477f1df8e28552 st-0.8.3.tar.gz
+28359d872e7c32efdc128848da4653f082144aadb429973513c6b08b5974bc35 00-config.patch
A => st/depends +4 -0
@@ 1,4 @@
+fontconfig
+libX11
+libXft
+ncurses make
A => st/patches/00-config.patch +78 -0
@@ 1,78 @@
+--- ../st-0.8.3/config.def.h
++++ config.def.h
+@@ -5,8 +5,8 @@
+ *
+ * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
+ */
+-static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true";
+-static int borderpx = 2;
++static char *font = "Fira Code:pixelsize=18:antialias=true:autohint=true";
++static int borderpx = 8;
+
+ /*
+ * What program is execed by st depends of these precedence rules:
+@@ -87,30 +87,28 @@
+ /* Terminal colors (16 first used in escape sequence) */
+ static const char *colorname[] = {
+ /* 8 normal colors */
+- "black",
+- "red3",
+- "green3",
+- "yellow3",
+- "blue2",
+- "magenta3",
+- "cyan3",
+- "gray90",
++ [0] = "#4e4e4e", /* black */
++ [1] = "#d68787", /* red */
++ [2] = "#5f885f", /* green */
++ [3] = "#d8af5f", /* yellow */
++ [4] = "#85add4", /* blue */
++ [5] = "#d7afaf", /* magenta */
++ [6] = "#87afaf", /* cyan */
++ [7] = "#d0d0d0", /* white */
+
+ /* 8 bright colors */
+- "gray50",
+- "red",
+- "green",
+- "yellow",
+- "#5c5cff",
+- "magenta",
+- "cyan",
+- "white",
++ [8] = "#626262", /* black */
++ [9] = "#d75f87", /* red */
++ [10] = "#87af87", /* green */
++ [11] = "#ffd787", /* yellow */
++ [12] = "#add4fb", /* blue */
++ [13] = "#ffafaf", /* magenta */
++ [14] = "#87d7d7", /* cyan */
++ [15] = "#e4e4e4", /* white */
+
+- [255] = 0,
+-
+- /* more colors can be added after 255 to use with DefaultXX */
+- "#cccccc",
+- "#555555",
++ /* special colors */
++ [256] = "#3a3a3a", /* background */
++ [257] = "#d0d0d0", /* foreground */
+ };
+
+
+@@ -118,10 +116,10 @@
+ * Default colors (colorname index)
+ * foreground, background, cursor, reverse cursor
+ */
+-unsigned int defaultfg = 7;
+-unsigned int defaultbg = 0;
+-static unsigned int defaultcs = 256;
+-static unsigned int defaultrcs = 257;
++unsigned int defaultfg = 257;
++unsigned int defaultbg = 256;
++static unsigned int defaultcs = 257;
++static unsigned int defaultrcs = 256;
+
+ /*
+ * Default shape of cursor
A => st/sources +2 -0
@@ 1,2 @@
+https://dl.suckless.org/st/st-0.8.3.tar.gz
+patches/00-config.patch
A => st/version +1 -0
A => xcape/build +5 -0
@@ 1,5 @@
+#!/bin/sh -e
+
+make
+make DESTDIR="$1" install
+
A => xcape/checksums +1 -0
@@ 1,1 @@
+a27ed884fd94f03058af65a39edfe3af3f2f8fbb76ba9920002a76be07fb2821 v1.2.tar.gz
A => xcape/depends +7 -0
@@ 1,7 @@
+git
+gcc
+make
+pkgconf
+libX11
+libXtst
+libXi
A => xcape/sources +1 -0
@@ 1,1 @@
+https://github.com/alols/xcape/archive/v1.2.tar.gz
A => xcape/version +1 -0
A => zsh-autosuggestions/build +17 -0
@@ 1,17 @@
+#!/bin/sh -e
+
+
+SRC_DIR := ./src
+
+SRC_FILES := \
+ $(SRC_DIR)/config.zsh \
+ $(SRC_DIR)/util.zsh \
+ $(SRC_DIR)/bind.zsh \
+ $(SRC_DIR)/highlight.zsh \
+ $(SRC_DIR)/widgets.zsh \
+ $(SRC_DIR)/strategies/*.zsh \
+ $(SRC_DIR)/fetch.zsh \
+ $(SRC_DIR)/async.zsh \
+ $(SRC_DIR)/start.zsh
+
+install -Dm644 "$1/usr/share/zsh/plugins/zsh-autosuggestions/zshautosuggestions.zsh"
A => zsh-autosuggestions/checksums +1 -0
@@ 1,1 @@
+0b6e251ced5fd7b5b78ea01f798ecc1b46169743a717567f0ec0a21198a372e8 v0.6.4.tar.gz
A => zsh-autosuggestions/sources +1 -0
@@ 1,1 @@
+https://github.com/zsh-users/zsh-autosuggestions/archive/v0.6.4.tar.gz
A => zsh-autosuggestions/version +1 -0
A => zsh-syntax-highlighting/build +7 -0
@@ 1,7 @@
+#!/bin/sh -e
+
+install -Dm644 zsh-syntax-highlighting.zsh "$1/usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh"
+install -Dm644 .version "$1/usr/share/zsh/plugins/zsh-syntax-highlighting/.version"
+install -Dm644 .revision-hash "$1/usr/share/zsh/plugins/zsh-syntax-highlighting/.revision-hash"
+
+cp -r highlighters "$1/usr/share/zsh/plugins/zsh-syntax-highlighting/"
A => zsh-syntax-highlighting/checksums +1 -0
@@ 1,1 @@
+f5044266ee198468b1bcec881a56e6399e209657d6ed9fa6d21175bc76afdefa 0.7.1.tar.gz
A => zsh-syntax-highlighting/sources +1 -0
@@ 1,1 @@
+https://github.com/zsh-users/zsh-syntax-highlighting/archive/0.7.1.tar.gz
A => zsh-syntax-highlighting/version +1 -0