From ff525961b385d36c00eba03f6458cf99a02c572b Mon Sep 17 00:00:00 2001 From: coast Date: Sat, 12 Jul 2025 05:28:27 +0330 Subject: [PATCH] stuff before reinstall --- suckless/config.h | 140 +++ suckless/dmenu/config.def.h | 5 + suckless/dmenu/config.def.h.orig | 25 + suckless/dmenu/config.h | 7 +- suckless/dmenu/dmenu | Bin 42296 -> 42456 bytes suckless/dmenu/dmenu.1 | 24 + suckless/dmenu/dmenu.c | 151 ++- suckless/dmenu/dmenu.c.orig | 924 ++++++++++++++++++ suckless/dmenu/dmenu.c.rej | 15 + suckless/dmenu/dmenu.o | Bin 32224 -> 36304 bytes .../dmenu/patch/dmenu-bar-height-5.2.diff | 27 + suckless/dmenu/patch/dmenu-border-5.2.diff | 37 + .../dmenu/patch/dmenu-mousesupport-5.3.diff | 145 +++ suckless/dmenu/patch/dmenu-xyw-5.2.diff | 99 ++ suckless/dwm | 2 +- suckless/dwmsrc | 1 - suckless/slstatus/config.h | 12 +- suckless/slstatus/slstatus | Bin 31248 -> 31248 bytes suckless/slstatus/slstatus.o | Bin 6184 -> 6416 bytes suckless/st/config.h | 10 +- suckless/st/st | Bin 120544 -> 120544 bytes suckless/st/x.o | Bin 86904 -> 86904 bytes 22 files changed, 1600 insertions(+), 24 deletions(-) create mode 100644 suckless/config.h create mode 100644 suckless/dmenu/config.def.h.orig create mode 100644 suckless/dmenu/dmenu.c.orig create mode 100644 suckless/dmenu/dmenu.c.rej create mode 100644 suckless/dmenu/patch/dmenu-bar-height-5.2.diff create mode 100644 suckless/dmenu/patch/dmenu-border-5.2.diff create mode 100644 suckless/dmenu/patch/dmenu-mousesupport-5.3.diff create mode 100644 suckless/dmenu/patch/dmenu-xyw-5.2.diff delete mode 160000 suckless/dwmsrc diff --git a/suckless/config.h b/suckless/config.h new file mode 100644 index 0000000..0694415 --- /dev/null +++ b/suckless/config.h @@ -0,0 +1,140 @@ +#include +static const unsigned int borderpx = 2; /* 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 *colors[][3] = { + [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, + [SchemeSel] = { col_gray4, col_cyan, col_cyan }, +}; + +static const unsigned int gappih = 30; +static const unsigned int gappiv = 30; +static const unsigned int gappoh = 30; +static const unsigned int gappov = 30; +static const int smartgaps = 0; + +static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; + +static const float mfact = 0.55; +static const int nmaster = 1; +static const int resizehints = 1; +static const int lockfullscreen = 1; + +static const Layout layouts[] = { + { "[]=", tile }, +}; + +static const Rule rules[] = { + { NULL }, +}; + + +#define MODKEY Mod4Mask +#define TAGKEYS(KEY,TAG) \ + { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ + { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, + +#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } + +#include "movestack.c" +#include "shiftview.c" +#define VOL_UP "amixer set Master 10%+ unmute; kill -44 $(pidof dwmblocks)" +#define XK_UP "amixer set Master 5%+ unmute; kill -44 $(pidof dwmblocks)" +#define VOL_DOWN "amixer set Master 10%- unmute; kill -44 $(pidof dwmblocks)" +#define XK_DOWN "amixer set Master 5%- unmute; kill -44 $(pidof dwmblocks)" +#define VOL_MUTE "amixer set Master toggle; kill -44 $(pidof dwmblocks)" +#define VOL_KILL "kill -44 $(pidof dwmblocks)" + +static char dmenumon[2] = "0"; +static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; +static const char *termcmd[] = { "st", NULL }; +static const char *filemgr[] = { "st", "-e", "ranger", NULL }; +static const char *screenie[] = {"screenie", NULL }; +static const char *newsraft[] = {"st", "-e", "newsraft", NULL}; +#define VOL_UP "amixer set Master 10%+ unmute; kill -44 $(pidof dwmblocks)" +#define XK_UP "amixer set Master 5%+ unmute; kill -44 $(pidof dwmblocks)" +#define VOL_DOWN "amixer set Master 10%- unmute; kill -44 $(pidof dwmblocks)" +#define XK_DOWN "amixer set Master 5%- unmute; kill -44 $(pidof dwmblocks)" +#define VOL_MUTE "amixer set Master toggle; kill -44 $(pidof dwmblocks)" +#define VOL_KILL "kill -44 $(pidof dwmblocks)" + +static const Key keys[] = { + { MODKEY, XK_r, spawn, {.v = dmenucmd } }, + { MODKEY, XK_Return, spawn, {.v = termcmd } }, + { MODKEY, XK_f, spawn, {.v = filemgr } }, + { 0, XK_Print, spawn, {.v = screenie} }, + { MODKEY|ShiftMask, XK_b, spawn, SHCMD("chromium-bin") }, + { MODKEY, XK_b, togglebar, {0} }, + { 0, XK_Print, spawn, {.v = screenie } }, + { MODKEY|ShiftMask, XK_b, spawn, {.v = newsraft } }, + { MODKEY|ControlMask, XK_b, togglebar, {0} }, + { MODKEY, XK_j, focusstack, {.i = +1 } }, + { MODKEY, XK_k, focusstack, {.i = -1 } }, + { MODKEY|ShiftMask, XK_i, incnmaster, {.i = +1 } }, + { MODKEY|ShiftMask, XK_d, incnmaster, {.i = -1 } }, + { MODKEY, XK_h, setmfact, {.f = -0.05} }, + { MODKEY, XK_l, setmfact, {.f = +0.05} }, + { MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } }, + { MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } }, + { MODKEY|ShiftMask, XK_Return, zoom, {0} }, + { MODKEY, XK_Tab, view, {0} }, + { MODKEY, XK_s, killclient, {0} }, + { MODKEY|ShiftMask, XK_t, setlayout, {.v = &layouts[0]} }, + { MODKEY|ShiftMask, XK_f, setlayout, {.v = &layouts[1]} }, + { MODKEY|ShiftMask, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XK_space, setlayout, {0} }, + { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, + { MODKEY, XK_w, togglefullscr, {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 } }, + { MODKEY, XK_m, shiftview, {.i = +1} }, + { MODKEY, XK_n, shiftview, {.i = -1} }, + TAGKEYS( XK_1, 0) + TAGKEYS( XK_2, 1) + 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} }, + { Mod1Mask, XK_equal, spawn, SHCMD(VOL_UP) }, + { Mod1Mask, XK_minus, spawn, SHCMD(VOL_DOWN) }, + { Mod1Mask, XK_m, spawn, SHCMD(VOL_MUTE) }, + { 0, XF86XK_AudioMute, spawn, SHCMD(VOL_MUTE) }, + { 0, XF86XK_AudioRaiseVolume, spawn, SHCMD(XK_UP) }, + { 0, XF86XK_AudioLowerVolume, spawn, SHCMD(XK_DOWN) }, +}; + +/* button definitions */ +/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ +static const Button buttons[] = { + /* 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} }, + { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, + { ClkTagBar, 0, Button1, view, {0} }, + { ClkTagBar, 0, Button3, toggleview, {0} }, + { ClkTagBar, MODKEY, Button1, tag, {0} }, + { ClkTagBar, MODKEY, Button3, toggletag, {0} }, +}; + diff --git a/suckless/dmenu/config.def.h b/suckless/dmenu/config.def.h index 1edb647..31dbeca 100644 --- a/suckless/dmenu/config.def.h +++ b/suckless/dmenu/config.def.h @@ -3,6 +3,8 @@ 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 int user_bh = 0; /* add an defined amount of pixels to the bar height */ + static const char *fonts[] = { "monospace:size=10" }; @@ -21,3 +23,6 @@ static unsigned int lines = 0; * for example: " /?\"&[]" */ static const char worddelimiters[] = " "; + +/* Size of the window border */ +static unsigned int border_width = 0; diff --git a/suckless/dmenu/config.def.h.orig b/suckless/dmenu/config.def.h.orig new file mode 100644 index 0000000..f0f5160 --- /dev/null +++ b/suckless/dmenu/config.def.h.orig @@ -0,0 +1,25 @@ +/* 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 */ +/* -fn option overrides fonts[0]; default X11 font or font set */ +static const int user_bh = 0; /* add an defined amount of pixels to the bar height */ + +static const char *fonts[] = { + "monospace:size=10" +}; +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" }, +}; +/* -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[] = " "; diff --git a/suckless/dmenu/config.h b/suckless/dmenu/config.h index ad70a45..31dbeca 100644 --- a/suckless/dmenu/config.h +++ b/suckless/dmenu/config.h @@ -1,8 +1,10 @@ /* See LICENSE file for copyright and license details. */ /* Default settings; can be overriden by command line. */ -static int topbar = 0; /* -b option; if 0, dmenu appears at bottom */ +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 int user_bh = 0; /* add an defined amount of pixels to the bar height */ + static const char *fonts[] = { "monospace:size=10" }; @@ -21,3 +23,6 @@ static unsigned int lines = 0; * for example: " /?\"&[]" */ static const char worddelimiters[] = " "; + +/* Size of the window border */ +static unsigned int border_width = 0; diff --git a/suckless/dmenu/dmenu b/suckless/dmenu/dmenu index 12d70df8f58d0ac8b30b5349313de4c3f35d7f9b..df152b0fdaaf1ac0f45b96f11e889a558aeaece6 100755 GIT binary patch delta 15765 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 + 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) { @@ -586,6 +702,9 @@ run(void) break; cleanup(); exit(1); + case ButtonPress: + buttonpress(&ev); + break; case Expose: if (ev.xexpose.count == 0) drw_map(drw, win, 0, 0, mw, mh); @@ -633,7 +752,8 @@ setup(void) utf8 = XInternAtom(dpy, "UTF8_STRING", False); /* calculate menu geometry */ - bh = drw->fonts->h + 2; + bh = drw->fonts->h; + bh = user_bh ? bh + user_bh : bh + 2; lines = MAX(lines, 0); mh = (lines + 1) * bh; #ifdef XINERAMA @@ -662,9 +782,9 @@ setup(void) if (INTERSECT(x, y, 1, 1, info[i]) != 0) break; - x = info[i].x_org; - y = info[i].y_org + (topbar ? 0 : info[i].height - mh); - mw = info[i].width; + x = info[i].x_org + dmx; + y = info[i].y_org + (topbar ? dmy : info[i].height - mh - dmy); + mw = (dmw>0 ? dmw : info[i].width);; XFree(info); } else #endif @@ -672,9 +792,9 @@ setup(void) 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; + x = dmx; + y = topbar ? dmy : wa.height - mh - dmy; + mw = (dmw>0 ? dmw : wa.width); } promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; inputw = mw / 3; /* input width: ~33% of monitor width */ @@ -683,10 +803,14 @@ setup(void) /* create menu window */ swa.override_redirect = True; swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; - swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; - win = XCreateWindow(dpy, root, x, y, mw, mh, 0, + swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask | + ButtonPressMask; + + win = XCreateWindow(dpy, parentwin, x, y, mw, mh, border_width, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); + if (border_width) + XSetWindowBorder(dpy, win, scheme[SchemeSel][ColBg].pixel); XSetClassHint(dpy, win, &ch); /* input methods */ @@ -715,6 +839,7 @@ static void usage(void) { die("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" + " [-x xoffset] [-y yoffset] [-z width]\n" " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]"); } @@ -741,6 +866,12 @@ main(int argc, char *argv[]) /* these options take one argument */ else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */ lines = atoi(argv[++i]); + else if (!strcmp(argv[i], "-x")) /* window x offset */ + dmx = atoi(argv[++i]); + else if (!strcmp(argv[i], "-y")) /* window y offset (from bottom up if -b) */ + dmy = atoi(argv[++i]); + else if (!strcmp(argv[i], "-z")) /* make dmenu this wide */ + dmw = atoi(argv[++i]); else if (!strcmp(argv[i], "-m")) mon = atoi(argv[++i]); else if (!strcmp(argv[i], "-p")) /* adds prompt to left of input field */ @@ -757,6 +888,8 @@ main(int argc, char *argv[]) colors[SchemeSel][ColFg] = argv[++i]; else if (!strcmp(argv[i], "-w")) /* embedding window id */ embed = argv[++i]; + else if (!strcmp(argv[i], "-bw")) + border_width = atoi(argv[++i]); /* border width */ else usage(); diff --git a/suckless/dmenu/dmenu.c.orig b/suckless/dmenu/dmenu.c.orig new file mode 100644 index 0000000..cd0550d --- /dev/null +++ b/suckless/dmenu/dmenu.c.orig @@ -0,0 +1,924 @@ +/* See LICENSE file for copyright and license details. */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#ifdef XINERAMA +#include +#endif +#include + +#include "drw.h" +#include "util.h" + +/* macros */ +#define INTERSECT(x,y,w,h,r) (MAX(0, MIN((x)+(w),(r).x_org+(r).width) - MAX((x),(r).x_org)) \ + * MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org))) +#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) + +/* enums */ +enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ + +struct item { + char *text; + struct item *left, *right; + int out; +}; + +static char text[BUFSIZ] = ""; +static char *embed; +static int bh, mw, mh; +static int dmx = 0; /* put dmenu at this x offset */ +static int dmy = 0; /* put dmenu at this y offset (measured from the bottom if topbar is 0) */ +static unsigned int dmw = 0; /* make dmenu this wide */ +static int inputw = 0, promptw; +static int lrpad; /* sum of left and right padding */ +static size_t cursor; +static struct item *items = NULL; +static struct item *matches, *matchend; +static struct item *prev, *curr, *next, *sel; +static int mon = -1, screen; + +static Atom clip, utf8; +static Display *dpy; +static Window root, parentwin, win; +static XIC xic; + +static Drw *drw; +static Clr *scheme[SchemeLast]; + +#include "config.h" + +static int (*fstrncmp)(const char *, const char *, size_t) = strncmp; +static char *(*fstrstr)(const char *, const char *) = strstr; + +static unsigned int +textw_clamp(const char *str, unsigned int n) +{ + unsigned int w = drw_fontset_getwidth_clamp(drw, str, n) + lrpad; + return MIN(w, n); +} + +static void +appenditem(struct item *item, struct item **list, struct item **last) +{ + if (*last) + (*last)->right = item; + else + *list = item; + + item->left = *last; + item->right = NULL; + *last = item; +} + +static void +calcoffsets(void) +{ + int i, n; + + if (lines > 0) + n = lines * bh; + else + n = mw - (promptw + inputw + TEXTW("<") + TEXTW(">")); + /* calculate which items will begin the next page and previous page */ + for (i = 0, next = curr; next; next = next->right) + if ((i += (lines > 0) ? bh : textw_clamp(next->text, n)) > n) + break; + for (i = 0, prev = curr; prev && prev->left; prev = prev->left) + if ((i += (lines > 0) ? bh : textw_clamp(prev->left->text, n)) > n) + break; +} + +static void +cleanup(void) +{ + size_t i; + + XUngrabKeyboard(dpy, CurrentTime); + for (i = 0; i < SchemeLast; i++) + free(scheme[i]); + for (i = 0; items && items[i].text; ++i) + free(items[i].text); + free(items); + drw_free(drw); + XSync(dpy, False); + XCloseDisplay(dpy); +} + +static char * +cistrstr(const char *h, const char *n) +{ + size_t i; + + if (!n[0]) + return (char *)h; + + for (; *h; ++h) { + for (i = 0; n[i] && tolower((unsigned char)n[i]) == + tolower((unsigned char)h[i]); ++i) + ; + if (n[i] == '\0') + return (char *)h; + } + return NULL; +} + +static int +drawitem(struct item *item, int x, int y, int w) +{ + if (item == sel) + drw_setscheme(drw, scheme[SchemeSel]); + else if (item->out) + drw_setscheme(drw, scheme[SchemeOut]); + else + drw_setscheme(drw, scheme[SchemeNorm]); + + return drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0); +} + +static void +drawmenu(void) +{ + unsigned int curpos; + struct item *item; + int x = 0, y = 0, w; + + drw_setscheme(drw, scheme[SchemeNorm]); + drw_rect(drw, 0, 0, mw, mh, 1, 1); + + if (prompt && *prompt) { + drw_setscheme(drw, scheme[SchemeSel]); + x = drw_text(drw, x, 0, promptw, bh, lrpad / 2, prompt, 0); + } + /* draw input field */ + w = (lines > 0 || !matches) ? mw - x : inputw; + drw_setscheme(drw, scheme[SchemeNorm]); + drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); + + curpos = TEXTW(text) - TEXTW(&text[cursor]); + if ((curpos += lrpad / 2 - 1) < w) { + drw_setscheme(drw, scheme[SchemeNorm]); + drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0); + } + + if (lines > 0) { + /* draw vertical list */ + for (item = curr; item != next; item = item->right) + drawitem(item, x, y += bh, mw - x); + } else if (matches) { + /* draw horizontal list */ + x += inputw; + w = TEXTW("<"); + if (curr->left) { + drw_setscheme(drw, scheme[SchemeNorm]); + drw_text(drw, x, 0, w, bh, lrpad / 2, "<", 0); + } + x += w; + for (item = curr; item != next; item = item->right) + x = drawitem(item, x, 0, textw_clamp(item->text, mw - x - TEXTW(">"))); + if (next) { + w = TEXTW(">"); + drw_setscheme(drw, scheme[SchemeNorm]); + drw_text(drw, mw - w, 0, w, bh, lrpad / 2, ">", 0); + } + } + drw_map(drw, win, 0, 0, mw, mh); +} + +static void +grabfocus(void) +{ + struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000 }; + Window focuswin; + int i, revertwin; + + for (i = 0; i < 100; ++i) { + XGetInputFocus(dpy, &focuswin, &revertwin); + if (focuswin == win) + return; + XSetInputFocus(dpy, win, RevertToParent, CurrentTime); + nanosleep(&ts, NULL); + } + die("cannot grab focus"); +} + +static void +grabkeyboard(void) +{ + struct timespec ts = { .tv_sec = 0, .tv_nsec = 1000000 }; + int i; + + if (embed) + return; + /* try to grab keyboard, we may have to wait for another process to ungrab */ + for (i = 0; i < 1000; i++) { + if (XGrabKeyboard(dpy, DefaultRootWindow(dpy), True, GrabModeAsync, + GrabModeAsync, CurrentTime) == GrabSuccess) + return; + nanosleep(&ts, NULL); + } + die("cannot grab keyboard"); +} + +static void +match(void) +{ + static char **tokv = NULL; + static int tokn = 0; + + char buf[sizeof text], *s; + int i, tokc = 0; + size_t len, textsize; + struct item *item, *lprefix, *lsubstr, *prefixend, *substrend; + + strcpy(buf, text); + /* separate input text into tokens to be matched individually */ + for (s = strtok(buf, " "); s; tokv[tokc - 1] = s, s = strtok(NULL, " ")) + if (++tokc > tokn && !(tokv = realloc(tokv, ++tokn * sizeof *tokv))) + die("cannot realloc %zu bytes:", tokn * sizeof *tokv); + len = tokc ? strlen(tokv[0]) : 0; + + matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL; + textsize = strlen(text) + 1; + for (item = items; item && item->text; item++) { + for (i = 0; i < tokc; i++) + if (!fstrstr(item->text, tokv[i])) + break; + if (i != tokc) /* not all tokens match */ + continue; + /* exact matches go first, then prefixes, then substrings */ + if (!tokc || !fstrncmp(text, item->text, textsize)) + appenditem(item, &matches, &matchend); + else if (!fstrncmp(tokv[0], item->text, len)) + appenditem(item, &lprefix, &prefixend); + else + appenditem(item, &lsubstr, &substrend); + } + if (lprefix) { + if (matches) { + matchend->right = lprefix; + lprefix->left = matchend; + } else + matches = lprefix; + matchend = prefixend; + } + if (lsubstr) { + if (matches) { + matchend->right = lsubstr; + lsubstr->left = matchend; + } else + matches = lsubstr; + matchend = substrend; + } + curr = sel = matches; + calcoffsets(); +} + +static void +insert(const char *str, ssize_t n) +{ + if (strlen(text) + n > sizeof text - 1) + return; + /* move existing text out of the way, insert new text, and update cursor */ + memmove(&text[cursor + n], &text[cursor], sizeof text - cursor - MAX(n, 0)); + if (n > 0) + memcpy(&text[cursor], str, n); + cursor += n; + match(); +} + +static size_t +nextrune(int inc) +{ + ssize_t n; + + /* return location of next utf8 rune in the given direction (+1 or -1) */ + for (n = cursor + inc; n + inc >= 0 && (text[n] & 0xc0) == 0x80; n += inc) + ; + return n; +} + +static void +movewordedge(int dir) +{ + if (dir < 0) { /* move cursor to the start of the word*/ + while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)])) + cursor = nextrune(-1); + while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)])) + cursor = nextrune(-1); + } else { /* move cursor to the end of the word */ + while (text[cursor] && strchr(worddelimiters, text[cursor])) + cursor = nextrune(+1); + while (text[cursor] && !strchr(worddelimiters, text[cursor])) + cursor = nextrune(+1); + } +} + +static void +keypress(XKeyEvent *ev) +{ + char buf[64]; + int len; + KeySym ksym = NoSymbol; + Status status; + + len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status); + switch (status) { + default: /* XLookupNone, XBufferOverflow */ + return; + case XLookupChars: /* composed string from input method */ + goto insert; + case XLookupKeySym: + case XLookupBoth: /* a KeySym and a string are returned: use keysym */ + break; + } + + if (ev->state & ControlMask) { + switch(ksym) { + case XK_a: ksym = XK_Home; break; + case XK_b: ksym = XK_Left; break; + case XK_c: ksym = XK_Escape; break; + case XK_d: ksym = XK_Delete; break; + case XK_e: ksym = XK_End; break; + case XK_f: ksym = XK_Right; break; + case XK_g: ksym = XK_Escape; break; + case XK_h: ksym = XK_BackSpace; break; + case XK_i: ksym = XK_Tab; break; + case XK_j: /* fallthrough */ + case XK_J: /* fallthrough */ + case XK_m: /* fallthrough */ + case XK_M: ksym = XK_Return; ev->state &= ~ControlMask; break; + case XK_n: ksym = XK_Down; break; + case XK_p: ksym = XK_Up; break; + + case XK_k: /* delete right */ + text[cursor] = '\0'; + match(); + break; + case XK_u: /* delete left */ + insert(NULL, 0 - cursor); + break; + case XK_w: /* delete word */ + while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)])) + insert(NULL, nextrune(-1) - cursor); + while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)])) + insert(NULL, nextrune(-1) - cursor); + break; + case XK_y: /* paste selection */ + case XK_Y: + XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY, + utf8, utf8, win, CurrentTime); + return; + case XK_Left: + case XK_KP_Left: + movewordedge(-1); + goto draw; + case XK_Right: + case XK_KP_Right: + movewordedge(+1); + goto draw; + case XK_Return: + case XK_KP_Enter: + break; + case XK_bracketleft: + cleanup(); + exit(1); + default: + return; + } + } else if (ev->state & Mod1Mask) { + switch(ksym) { + case XK_b: + movewordedge(-1); + goto draw; + case XK_f: + movewordedge(+1); + goto draw; + case XK_g: ksym = XK_Home; break; + case XK_G: ksym = XK_End; break; + case XK_h: ksym = XK_Up; break; + case XK_j: ksym = XK_Next; break; + case XK_k: ksym = XK_Prior; break; + case XK_l: ksym = XK_Down; break; + default: + return; + } + } + + switch(ksym) { + default: +insert: + if (!iscntrl((unsigned char)*buf)) + insert(buf, len); + break; + case XK_Delete: + case XK_KP_Delete: + if (text[cursor] == '\0') + return; + cursor = nextrune(+1); + /* fallthrough */ + case XK_BackSpace: + if (cursor == 0) + return; + insert(NULL, nextrune(-1) - cursor); + break; + case XK_End: + case XK_KP_End: + if (text[cursor] != '\0') { + cursor = strlen(text); + break; + } + if (next) { + /* jump to end of list and position items in reverse */ + curr = matchend; + calcoffsets(); + curr = prev; + calcoffsets(); + while (next && (curr = curr->right)) + calcoffsets(); + } + sel = matchend; + break; + case XK_Escape: + cleanup(); + exit(1); + case XK_Home: + case XK_KP_Home: + if (sel == matches) { + cursor = 0; + break; + } + sel = curr = matches; + calcoffsets(); + break; + case XK_Left: + case XK_KP_Left: + if (cursor > 0 && (!sel || !sel->left || lines > 0)) { + cursor = nextrune(-1); + break; + } + if (lines > 0) + return; + /* fallthrough */ + case XK_Up: + case XK_KP_Up: + if (sel && sel->left && (sel = sel->left)->right == curr) { + curr = prev; + calcoffsets(); + } + break; + case XK_Next: + case XK_KP_Next: + if (!next) + return; + sel = curr = next; + calcoffsets(); + break; + case XK_Prior: + case XK_KP_Prior: + if (!prev) + return; + sel = curr = prev; + calcoffsets(); + break; + case XK_Return: + case XK_KP_Enter: + puts((sel && !(ev->state & ShiftMask)) ? sel->text : text); + if (!(ev->state & ControlMask)) { + cleanup(); + exit(0); + } + if (sel) + sel->out = 1; + break; + case XK_Right: + case XK_KP_Right: + if (text[cursor] != '\0') { + cursor = nextrune(+1); + break; + } + if (lines > 0) + return; + /* fallthrough */ + case XK_Down: + case XK_KP_Down: + if (sel && sel->right && (sel = sel->right) == next) { + curr = next; + calcoffsets(); + } + break; + case XK_Tab: + if (!sel) + return; + cursor = strnlen(sel->text, sizeof text - 1); + memcpy(text, sel->text, cursor); + text[cursor] = '\0'; + match(); + break; + } + +draw: + drawmenu(); +} + +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; + int di; + unsigned long dl; + Atom da; + + /* we have been given the current selection, now insert it into input */ + if (XGetWindowProperty(dpy, win, utf8, 0, (sizeof text / 4) + 1, False, + utf8, &da, &di, &dl, &dl, (unsigned char **)&p) + == Success && p) { + insert(p, (q = strchr(p, '\n')) ? q - p : (ssize_t)strlen(p)); + XFree(p); + } + drawmenu(); +} + +static void +readstdin(void) +{ + char *line = NULL; + size_t i, itemsiz = 0, linesiz = 0; + ssize_t len; + + /* read each line from stdin and add it to the item list */ + for (i = 0; (len = getline(&line, &linesiz, stdin)) != -1; i++) { + if (i + 1 >= itemsiz) { + itemsiz += 256; + if (!(items = realloc(items, itemsiz * sizeof(*items)))) + die("cannot realloc %zu bytes:", itemsiz * sizeof(*items)); + } + if (line[len - 1] == '\n') + line[len - 1] = '\0'; + if (!(items[i].text = strdup(line))) + die("strdup:"); + + items[i].out = 0; + } + free(line); + if (items) + items[i].text = NULL; + lines = MIN(lines, i); +} + +static void +run(void) +{ + XEvent ev; + + while (!XNextEvent(dpy, &ev)) { + if (XFilterEvent(&ev, win)) + continue; + switch(ev.type) { + case DestroyNotify: + if (ev.xdestroywindow.window != win) + break; + cleanup(); + exit(1); + case ButtonPress: + buttonpress(&ev); + break; + case Expose: + if (ev.xexpose.count == 0) + drw_map(drw, win, 0, 0, mw, mh); + break; + case FocusIn: + /* regrab focus from parent window */ + if (ev.xfocus.window != win) + grabfocus(); + break; + case KeyPress: + keypress(&ev.xkey); + break; + case SelectionNotify: + if (ev.xselection.property == utf8) + paste(); + break; + case VisibilityNotify: + if (ev.xvisibility.state != VisibilityUnobscured) + XRaiseWindow(dpy, win); + break; + } + } +} + +static void +setup(void) +{ + int x, y, i, j; + unsigned int du; + XSetWindowAttributes swa; + XIM xim; + Window w, dw, *dws; + XWindowAttributes wa; + XClassHint ch = {"dmenu", "dmenu"}; +#ifdef XINERAMA + XineramaScreenInfo *info; + Window pw; + int a, di, n, area = 0; +#endif + /* init appearance */ + for (j = 0; j < SchemeLast; j++) + scheme[j] = drw_scm_create(drw, colors[j], 2); + + clip = XInternAtom(dpy, "CLIPBOARD", False); + utf8 = XInternAtom(dpy, "UTF8_STRING", False); + + /* calculate menu geometry */ + bh = drw->fonts->h; + bh = user_bh ? bh + user_bh : bh + 2; + lines = MAX(lines, 0); + mh = (lines + 1) * bh; +#ifdef XINERAMA + i = 0; + if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) { + XGetInputFocus(dpy, &w, &di); + if (mon >= 0 && mon < n) + i = mon; + else if (w != root && w != PointerRoot && w != None) { + /* find top-level window containing current input focus */ + do { + if (XQueryTree(dpy, (pw = w), &dw, &w, &dws, &du) && dws) + XFree(dws); + } while (w != root && w != pw); + /* find xinerama screen with which the window intersects most */ + if (XGetWindowAttributes(dpy, pw, &wa)) + for (j = 0; j < n; j++) + if ((a = INTERSECT(wa.x, wa.y, wa.width, wa.height, info[j])) > area) { + area = a; + i = j; + } + } + /* no focused window is on screen, so use pointer location instead */ + if (mon < 0 && !area && XQueryPointer(dpy, root, &dw, &dw, &x, &y, &di, &di, &du)) + for (i = 0; i < n; i++) + if (INTERSECT(x, y, 1, 1, info[i]) != 0) + break; + + x = info[i].x_org + dmx; + y = info[i].y_org + (topbar ? dmy : info[i].height - mh - dmy); + mw = (dmw>0 ? dmw : info[i].width);; + XFree(info); + } else +#endif + { + if (!XGetWindowAttributes(dpy, parentwin, &wa)) + die("could not get embedding window attributes: 0x%lx", + parentwin); + x = dmx; + y = topbar ? dmy : wa.height - mh - dmy; + mw = (dmw>0 ? dmw : wa.width); + } + promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; + inputw = mw / 3; /* input width: ~33% of monitor width */ + match(); + + /* create menu window */ + swa.override_redirect = True; + swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; + swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask | + ButtonPressMask; + + win = XCreateWindow(dpy, root, x, y, mw, mh, 0, + CopyFromParent, CopyFromParent, CopyFromParent, + CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); + XSetClassHint(dpy, win, &ch); + + /* input methods */ + if ((xim = XOpenIM(dpy, NULL, NULL, NULL)) == NULL) + die("XOpenIM failed: could not open input device"); + + xic = XCreateIC(xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, + XNClientWindow, win, XNFocusWindow, win, NULL); + + XMapRaised(dpy, win); + if (embed) { + XReparentWindow(dpy, win, parentwin, x, y); + XSelectInput(dpy, parentwin, FocusChangeMask | SubstructureNotifyMask); + if (XQueryTree(dpy, parentwin, &dw, &w, &dws, &du) && dws) { + for (i = 0; i < du && dws[i] != win; ++i) + XSelectInput(dpy, dws[i], FocusChangeMask); + XFree(dws); + } + grabfocus(); + } + drw_resize(drw, mw, mh); + drawmenu(); +} + +static void +usage(void) +{ + die("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" + " [-x xoffset] [-y yoffset] [-z width]\n" + " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]"); +} + +int +main(int argc, char *argv[]) +{ + XWindowAttributes wa; + int i, fast = 0; + + for (i = 1; i < argc; i++) + /* these options take no arguments */ + if (!strcmp(argv[i], "-v")) { /* prints version information */ + puts("dmenu-"VERSION); + exit(0); + } else if (!strcmp(argv[i], "-b")) /* appears at the bottom of the screen */ + topbar = 0; + else if (!strcmp(argv[i], "-f")) /* grabs keyboard before reading stdin */ + fast = 1; + else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ + fstrncmp = strncasecmp; + fstrstr = cistrstr; + } else if (i + 1 == argc) + usage(); + /* these options take one argument */ + else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */ + lines = atoi(argv[++i]); + else if (!strcmp(argv[i], "-x")) /* window x offset */ + dmx = atoi(argv[++i]); + else if (!strcmp(argv[i], "-y")) /* window y offset (from bottom up if -b) */ + dmy = atoi(argv[++i]); + else if (!strcmp(argv[i], "-z")) /* make dmenu this wide */ + dmw = atoi(argv[++i]); + else if (!strcmp(argv[i], "-m")) + mon = atoi(argv[++i]); + else if (!strcmp(argv[i], "-p")) /* adds prompt to left of input field */ + prompt = argv[++i]; + else if (!strcmp(argv[i], "-fn")) /* font or font set */ + fonts[0] = argv[++i]; + else if (!strcmp(argv[i], "-nb")) /* normal background color */ + colors[SchemeNorm][ColBg] = argv[++i]; + else if (!strcmp(argv[i], "-nf")) /* normal foreground color */ + colors[SchemeNorm][ColFg] = argv[++i]; + else if (!strcmp(argv[i], "-sb")) /* selected background color */ + colors[SchemeSel][ColBg] = argv[++i]; + else if (!strcmp(argv[i], "-sf")) /* selected foreground color */ + colors[SchemeSel][ColFg] = argv[++i]; + else if (!strcmp(argv[i], "-w")) /* embedding window id */ + embed = argv[++i]; + else + usage(); + + if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) + fputs("warning: no locale support\n", stderr); + if (!(dpy = XOpenDisplay(NULL))) + die("cannot open display"); + screen = DefaultScreen(dpy); + root = RootWindow(dpy, screen); + if (!embed || !(parentwin = strtol(embed, NULL, 0))) + parentwin = root; + if (!XGetWindowAttributes(dpy, parentwin, &wa)) + die("could not get embedding window attributes: 0x%lx", + parentwin); + drw = drw_create(dpy, screen, root, wa.width, wa.height); + if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) + die("no fonts could be loaded."); + lrpad = drw->fonts->h; + +#ifdef __OpenBSD__ + if (pledge("stdio rpath", NULL) == -1) + die("pledge"); +#endif + + if (fast && !isatty(0)) { + grabkeyboard(); + readstdin(); + } else { + readstdin(); + grabkeyboard(); + } + setup(); + run(); + + return 1; /* unreachable */ +} diff --git a/suckless/dmenu/dmenu.c.rej b/suckless/dmenu/dmenu.c.rej new file mode 100644 index 0000000..8513019 --- /dev/null +++ b/suckless/dmenu/dmenu.c.rej @@ -0,0 +1,15 @@ +--- dmenu.c ++++ dmenu.c +@@ -684,9 +684,11 @@ setup(void) + swa.override_redirect = True; + swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; + swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; +- win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0, ++ win = XCreateWindow(dpy, parentwin, x, y, mw, mh, border_width, + CopyFromParent, CopyFromParent, CopyFromParent, + CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); ++ if (border_width) ++ XSetWindowBorder(dpy, win, scheme[SchemeSel][ColBg].pixel); + XSetClassHint(dpy, win, &ch); + + diff --git a/suckless/dmenu/dmenu.o b/suckless/dmenu/dmenu.o index ca55188a10e709792c358b0d4a969609a5b5bc6e..28cfe19b758b07035ab0bd585fbe04c6a122bf1a 100644 GIT binary patch literal 36304 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[O>;uj}iaQN%jEck#8bCLvfa$EjXs(`=EJ(OFc2cQGRN=&7etfwtuUgwp+oW8EOyo@zJmA$#aaFi#d&<&C^(jv$FchaM_bpE{y!Um6X z)WhZ4tvKs>!Gr%(@r`89Va3@GA1luFo-*1dL>tkbKa-vl6=ywXD$et?91nh>;;d($ z2d`3`{m`uVda`q+;_bw5RGj5ED9-xtP@L`D>cL-Dd=uq+NbzID|3`4yk3JI|{m*)a zpJEeoy|AB0E6#R?6lXu=D$epninAXsQJm!$6Gt2GhKk#V>7{UBjYCycM$viC` zr3RkcGyf&Y(=?}F&t1f++4l3hiI1`B`uXpOk5zmt&9?%I|B2*-ia$s^Q}J6!&v?Zj zBl#S~`8~PGiZ_yfa}|G*^h{HHEcq>8@jh}G*E9Q*{qHLIpOgNm;-hFDQ=&Ngzf5uV zf4So9e{NrF&+jSU1xlX%U!yqtf05#UB|UYDv;P|vXaC0)f1LCzQ=I+3Lh%sIlU6Cd zm-MtNeje4=jf(Fl`E`oFLi}dMUnjm^@i&QYQ2Z_8w<-QNvj0xSU!wN2QSrBk->W#c zxBC_UCbgdj6rV#S2LOe-!6>KdSh5N&cAP zei73(5au73c9Mp!knTPf&5b zU*h{DE^h(p=kEY8=NH;?l%DU5w*H!|`0K=T6+eUK4g8%w)_)7h^LO@`-%OnE+n6`e z{M%LfXVCZ{-~Ytx_=|L1D^c?Mi1T;zSpPxd-*k z#jA!MdpOIn}$Z-HUe-~J` zPvljpR{m{t3a`@H;p43_8b@YW%Kz?{Fs+pRc%4>z6c#c1rm{UN(~ z`I2~Lm6HvhjIsMgeAE=HtIReZAj+<(j8{6@Rn5&#c2fhMpm+#AO_kj*1f;Sl4&S%3 z$coX4Ndc1TG~0Y8$jPp5SOVY7iaXixk0Hmh;j{k}%-5Ib{HpqvZ1@P5{a}q%9$N&T zJF0|FB>f+U0BFD}q1Tc6_2tvicDlZC1XUlOI$wh$tlIp3Vh`>N+x`1AK47=RwAfcL za6dU0j*(OKV3Y}|^jwDJ`#B%bemv|^MyJo9^v*X1CkPBabwY5C`A<}w)ARRDI2vU! z@VyF<^Mk3Y(wDte9Ry7*7;)-#4NP`AO0pl2s}>Ovw`${z5ot}%70OZ zmEds@^T%6foqrtIQ2Fns{By0E{@+0Vkv(XD-B9^&p#1M8dCVWXg3iAk80OD*!l4bB zb{C*i-f?yCz6&Dwm}PJup!AaAv6j6Z7{1$dT>Vq}5=`bJ9sfT~!X z{sBlkl>hSA*c^C%g#N>+AgAZ{J5=77GJqW$_ZfDN(}snx>Gb%zj55(A$e(6*&ir9^ X&%fG#Xwy*XZ(eItY~h5o*XjQk$pv+6 literal 32224 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 + 2; ++ bh = drw->fonts->h; ++ bh = user_bh ? bh + user_bh : bh + 2; + lines = MAX(lines, 0); + mh = (lines + 1) * bh; + #ifdef XINERAMA diff --git a/suckless/dmenu/patch/dmenu-border-5.2.diff b/suckless/dmenu/patch/dmenu-border-5.2.diff new file mode 100644 index 0000000..515c3c8 --- /dev/null +++ b/suckless/dmenu/patch/dmenu-border-5.2.diff @@ -0,0 +1,37 @@ +diff --git a/config.def.h b/config.def.h +index 1edb647..dd3eb31 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -21,3 +21,6 @@ static unsigned int lines = 0; + * for example: " /?\"&[]" + */ + static const char worddelimiters[] = " "; ++ ++/* Size of the window border */ ++static unsigned int border_width = 0; +diff --git a/dmenu.c b/dmenu.c +index 27b7a30..7c130fc 100644 +--- a/dmenu.c ++++ b/dmenu.c +@@ -684,9 +684,11 @@ setup(void) + swa.override_redirect = True; + swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; + swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; +- win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0, ++ win = XCreateWindow(dpy, parentwin, x, y, mw, mh, border_width, + CopyFromParent, CopyFromParent, CopyFromParent, + CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); ++ if (border_width) ++ XSetWindowBorder(dpy, win, scheme[SchemeSel][ColBg].pixel); + XSetClassHint(dpy, win, &ch); + + +@@ -757,6 +759,8 @@ main(int argc, char *argv[]) + colors[SchemeSel][ColFg] = argv[++i]; + else if (!strcmp(argv[i], "-w")) /* embedding window id */ + embed = argv[++i]; ++ else if (!strcmp(argv[i], "-bw")) ++ border_width = atoi(argv[++i]); /* border width */ + else + usage(); + diff --git a/suckless/dmenu/patch/dmenu-mousesupport-5.3.diff b/suckless/dmenu/patch/dmenu-mousesupport-5.3.diff new file mode 100644 index 0000000..cf18e51 --- /dev/null +++ b/suckless/dmenu/patch/dmenu-mousesupport-5.3.diff @@ -0,0 +1,145 @@ +diff --git a/dmenu.c b/dmenu.c +index 40f93e0..d194caf 100644 +--- a/dmenu.c ++++ b/dmenu.c +@@ -527,6 +527,119 @@ draw: + drawmenu(); + } + ++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) + { +@@ -586,6 +699,9 @@ run(void) + break; + cleanup(); + exit(1); ++ case ButtonPress: ++ buttonpress(&ev); ++ break; + case Expose: + if (ev.xexpose.count == 0) + drw_map(drw, win, 0, 0, mw, mh); +@@ -683,7 +799,9 @@ setup(void) + /* create menu window */ + swa.override_redirect = True; + swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; +- swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; ++ swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask | ++ ButtonPressMask; ++ + win = XCreateWindow(dpy, root, x, y, mw, mh, 0, + CopyFromParent, CopyFromParent, CopyFromParent, + CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); diff --git a/suckless/dmenu/patch/dmenu-xyw-5.2.diff b/suckless/dmenu/patch/dmenu-xyw-5.2.diff new file mode 100644 index 0000000..312fb26 --- /dev/null +++ b/suckless/dmenu/patch/dmenu-xyw-5.2.diff @@ -0,0 +1,99 @@ +--- a/dmenu.1 2022-10-04 10:36:58.000000000 -0700 ++++ b/dmenu.1 2024-03-23 19:40:27.116453289 -0700 +@@ -8,6 +8,12 @@ + .IR lines ] + .RB [ \-m + .IR monitor ] ++.RB [ \-x ++.IR xoffset ] ++.RB [ \-y ++.IR yoffset ] ++.RB [ \-z ++.IR width ] + .RB [ \-p + .IR prompt ] + .RB [ \-fn +@@ -54,6 +60,24 @@ + dmenu is displayed on the monitor number supplied. Monitor numbers are starting + from 0. + .TP ++.BI \-x " xoffset" ++dmenu is placed at this offset measured from the left side of the monitor. ++Can be negative. ++If option ++.B \-m ++is present, the measurement will use the given monitor. ++.TP ++.BI \-y " yoffset" ++dmenu is placed at this offset measured from the top of the monitor. If the ++.B \-b ++option is used, the offset is measured from the bottom. Can be negative. ++If option ++.B \-m ++is present, the measurement will use the given monitor. ++.TP ++.BI \-z " width" ++sets the width of the dmenu window. ++.TP + .BI \-p " prompt" + defines the prompt to be displayed to the left of the input field. + .TP +--- a/dmenu.c 2022-10-04 10:36:58.000000000 -0700 ++++ b/dmenu.c 2024-03-23 19:39:53.173081139 -0700 +@@ -37,6 +37,9 @@ + static char text[BUFSIZ] = ""; + static char *embed; + static int bh, mw, mh; ++static int dmx = 0; /* put dmenu at this x offset */ ++static int dmy = 0; /* put dmenu at this y offset (measured from the bottom if topbar is 0) */ ++static unsigned int dmw = 0; /* make dmenu this wide */ + static int inputw = 0, promptw; + static int lrpad; /* sum of left and right padding */ + static size_t cursor; +@@ -658,9 +661,9 @@ + if (INTERSECT(x, y, 1, 1, info[i]) != 0) + break; + +- x = info[i].x_org; +- y = info[i].y_org + (topbar ? 0 : info[i].height - mh); +- mw = info[i].width; ++ x = info[i].x_org + dmx; ++ y = info[i].y_org + (topbar ? dmy : info[i].height - mh - dmy); ++ mw = (dmw>0 ? dmw : info[i].width);; + XFree(info); + } else + #endif +@@ -668,9 +671,9 @@ + 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; ++ x = dmx; ++ y = topbar ? dmy : wa.height - mh - dmy; ++ mw = (dmw>0 ? dmw : wa.width); + } + promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; + inputw = mw / 3; /* input width: ~33% of monitor width */ +@@ -711,6 +714,7 @@ + usage(void) + { + die("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" ++ " [-x xoffset] [-y yoffset] [-z width]\n" + " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]"); + } + +@@ -737,6 +741,12 @@ + /* these options take one argument */ + else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */ + lines = atoi(argv[++i]); ++ else if (!strcmp(argv[i], "-x")) /* window x offset */ ++ dmx = atoi(argv[++i]); ++ else if (!strcmp(argv[i], "-y")) /* window y offset (from bottom up if -b) */ ++ dmy = atoi(argv[++i]); ++ else if (!strcmp(argv[i], "-z")) /* make dmenu this wide */ ++ dmw = atoi(argv[++i]); + else if (!strcmp(argv[i], "-m")) + mon = atoi(argv[++i]); + else if (!strcmp(argv[i], "-p")) /* adds prompt to left of input field */ diff --git a/suckless/dwm b/suckless/dwm index 5d20660..f2552ce 160000 --- a/suckless/dwm +++ b/suckless/dwm @@ -1 +1 @@ -Subproject commit 5d206603f6d85a849a830b088e3d771e8da908fb +Subproject commit f2552ce7a8437dcff48db72b6446b62105a78858 diff --git a/suckless/dwmsrc b/suckless/dwmsrc deleted file mode 160000 index f2552ce..0000000 --- a/suckless/dwmsrc +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f2552ce7a8437dcff48db72b6446b62105a78858 diff --git a/suckless/slstatus/config.h b/suckless/slstatus/config.h index 18badfd..2660a0c 100644 --- a/suckless/slstatus/config.h +++ b/suckless/slstatus/config.h @@ -66,11 +66,9 @@ static const char unknown_str[] = "n/a"; */ static const struct arg args[] = { /* function format argument */ - {run_command, " [VOL %s]", "pamixer --get-volume-human"}, - {ram_used, " [MEM %s] ", NULL}, - // {battery_state, "[%s", "BAT1"}, - // {battery_perc, " %s%] ", "BAT1"}, - {run_command, "[BAT %s] ", "sb-battery"}, - {run_command, "[%s]", "date +%I:%M-%p"}, - + {run_command, "VOL: %s% | ", "pamixer --get-volume"}, + {run_command, "BAT: %s | ", "sb-battery"}, + {temp, "TEMP: %só°”„ | ", "/sys/class/thermal/thermal_zone3/temp"}, + {ram_used, "MEM: %s |", NULL}, + { run_command, " %s", "h=$(date +%I); m=$(date +%M); ap=$(date +%p); printf '%s:%s %s' \"$h\" \"$m\" \"$ap\"" }, }; diff --git a/suckless/slstatus/slstatus b/suckless/slstatus/slstatus index ca782c5e20250ddd39e7bbf9631b0b9724d49b3b..0f068fba1b2a01ce30a96948764355c5572985ec 100755 GIT binary patch delta 3283 zcmZ{n4Nw&48OQfs(A)uc9HForA94x@A_sR^6}5n%VRA;!5UW-ByhDkg5RZ=vS}10W zQ4C}-Pdk#tbnJB6Bn`Htmt?Tx$JuH$qnRPmq@svKtp%fzBqo!lVc!0iy^GtMW{17s z?(cctci(&W-MxpN`>Y3lgW8^WVQTByKeVZ!KT$9K>d# zrxe}i)NfOMUuMD+Od_avkEf0I{DSbR3?Gr0z{?M?B zrzz>h9&OOQP-DMu)EdPKwhZN9fFi;rqcB%Lm_afceDmWUkHZ&@p)7;MOmq^Tv&n@_TR>*hTBV;)2JTyAnd5hYUmZ%^RN>t8%pm-OU5weLdxeaA6!*OlW1d+!gL0e z4W|rAqB2;M%0^H*Y!|FeWh1E@_9$$=%0|&K*gLSrDl5@l*!Y+*ol|9vln^6P5v*Hf z?=!;E3New9rkoe}d4>s47Z<-*p%4ytS_ z)x#cy9aY&m^a|{G*a?-j(ECQo=z9j03HIG{`R-=YB-&VFG0!S%ql{S0GptEv=TbRr z7pzTX=TSH8QP_NyT|mcR@4yzT>_WN=8y|;xR@udr5Qlk&b*pR+IbhphcdBe2wZrzo z_NZ(=9flo-J*2YB=qhYjJmy(t3rQC*d2-_0f?hC%&Nx{q2=?9HW|0rtcb(GweQJXE z{2k?jz|C!*G*d>f_-v`CCOJMhh@0~~EwdY0M|VPPCYp8LIw8NY$CCfU`EKuay}dhk z7Unt2JLWbC!n@BTpOt&FcV`6Q4ON)+by0VHtNpolLs9q9sSsZy92f9bvOl**v!XjE z8{@Edp0tNQa;_-tYxHsfz3le3>g~PuU8iG~vv-#-y8H9vg}bR{&Nb~<7D4zT+@PDJ z;`D6xHtkI>ViJ9nevqx8MoTiwqyv_GadH(6S!T1#9x>xM6Te&G`CH~G#{NKiY!1iO8VK3LQxQP%v(P$5a~(DM1%v(fbQyhu;gd}$i{9qm{=gKhM@xOkYc8?-IwgqRfP z$Y= zrtMAE4Rx-jCTnv|bz{A&&dXk+jjrZuQ@VM1+D}aN z4^AC8b-DfLY3XJ+guAi!spcn5sph7|7>c?J>Wgi3m*R%?Slm2%q6q~okN_r zf~UY9aP<}BfggaQVBRq2!NGzMb`{qP7CMCOI4FYn6m)|{BWMWj1pC3xYiNKU)&pP+ z_N~4_1Ke)?2;rtM2zQOqfcmUMk-M;oF=Lxd=a0ywx7VjLfj(I;i36wU+x00~-uF27)ll*yC;SL|Gxh;^6DHHY&BH+#_U-gU zNw#?GL)ur8$x`V^$rACM3-oPC9_ye*rP;<&+~tjOBfH)tmg+Tl)`U}74HoJwwX!Zc zQkp1^|AQ`<&SG70b5L zzgy)e+}oa+59!yjwMR|MRIMCwEpUAgkIe8IP0hJEs1P^v~?Y$)1nCR5dU$$k2sA}-r z+ZKe_N|Yp93C(F)5TdH`H@7U%eP7*gKo+@zBgxxh()tT>46P+wJK!s#2PmyIJHlU% ddp9fnqR?)&YE}PIv}S92eN|hpXS_9){TI8$Qb_;+ delta 3133 zcmZ{meNYtV9mn@sPvP+HI3(WQ!NHvh2*PnktDYK&!06;`4ntz60gsnE42dFCP*i-Y z8l`9g>Cs<|n$a2buVlt#pw~__jhai<#I`zfY2MI4#g|4%G$Dy?swH{)UG`45OuNJK zdG_=Co@bwZ_P5VH!8q;+jxf7Oh=C1xAS#Q#by5C}5PR-)Pjf zMCYf1W+X`#|Ae-k(b{IYRYBW?+Jn*BT@(DVsNW~I$_Y-WJrS)vG{N_Ux|3#W^yhaf z4@>O! zdkeN$Wgnt6vqV<2PG7FFCMtvV!unO#Ogmt=!#1mI3cU_{0(O_mT4@k=05+(y>7=({ z1}!>$kILGq2(}QmS7m2X6Ko@FSYVVjXBd-lJB+i#5Xbm{xh%)9@e-ma75Z9Ffm zh%X3xa=u*FRp=c40G+jm+YFvVo;_#G9(Hco!oiIvm$uXDIajppd4ljwqEX*P<+*OQ zl=kI%nUOxqJ;GMd`n(J_pAO~~i<4K-rMzr*EhIWlGtue|{W1S6LtTffOdQP$ee9~# zh(~8q!Mx+KH5v-PcxP3syrHq|>;Z)^(uT(JAfmX^sucEML#@>8X> zq0UhkXl<=uzeVuL?Vk>`*4uM4mo3UHb7VG?v!ZCH>pbUzC92f*^Kju6P=6{0rlLWzi3GKiL*aptMj5zS@r-%bf1~?xA-vBil zLD)Ws`)P!o!Uzgp2;bj0Zw60-L2wl81@B%#1N@@J4RLM;r-Sk@TnAVVhOTnn10J}} z`6w87gY$SSyzhYvz>dFjz8bWB#`&AzJ}?4i-Q@hv6eRKUDCqFrnupOb*axl#AN!p1 z--5@$3t;LOoZkRjz%lR>(2R5|y@eZrW1t_DZes?(3h)rP0qg~PzQh2*@=?TVu}pl8 z`xK(^G73Sk{2R_sfG>jQLHD<~A$SuM@G8Q0IL`pz`UmGrWK!nJT-Hoatdzv;cd21z zR)Oo!oJTh=@`oWjgtHZAHoP5^89U~p(1~+|-dX7u9UsuWmHF%-<@gqhSszk^?-BMD zz2t|(!~XrDW&?!>9>&{2DxJ#@*urPjhnQ)T4IBAxY{N< zKczoZFBhi{P(sae%TeUWdO6f%aEWV_VHDzVzN3~JC+nbNHBM2wLVrbQEz)I;5^5Ly zhIl*5a{Bbr!rEEloFS^IHL*>!v33?4qQkZBgc9V>EAk>!N{pcLmr^cX z<9vK`B;T~f5HAnYjKpzXr{#WAS`+f^8L06wRU7bP1wr0adJ*z_+U>WA;te|P&$7IP zL`;=yml}*^h?9d(Am|`n_1oB+!~zm~i!6b~>{Y4^JSrM*((yn(J4NpYX0spYZXh-7 z2vYJ9xr-8magVrt{AOlc%4v9-3hGkD$3|#*T?)HGYwBjPm#C}GCa(K}-l+Rg%EL%Y zdFb-t!5PL#$Ify7mq~QGdPXR9)qyxH*FoxS*p(F9NNrs_9xilJ%UWqhY>O1z62%uQ zwXsc5A9b&NoJHvBS{v&p*0_`P(C$VjGgDuqjoIn_#&uXWyRA=&J=>^HG=+Mb%EeH8 z^Q#(E_O&{-W|PvPIW*Gx9ur67=r^146I8q1&o|9a2v;gW;Yymbd47UwKi#l-zW)9` zdKIE5ph>3iX1g}F^^MTTX1BIKy4CHcoHqCUjqgxHv|nmzb81za_cph-C%TvF35~SP GX8!>rBt3-y diff --git a/suckless/slstatus/slstatus.o b/suckless/slstatus/slstatus.o index d617d74b6537af3e1daecb090478f63fa01ed63a..5a928cd6a817932e086fdf5f0e1482a14681c82e 100644 GIT binary patch delta 815 zcmZ9IT}V@57{}lD=;r3scHGBVk#rOf&JEjE&}`K-X>>+gEzs~zk9lmRo8z3bntf1W z3QGps)5W~=vdiR9S0YYO46me{h_aiYZXzVGo50@FIa2t*`#kUe_k6q`FN1TZ=Dd{M zIq%!C-ME&Bu$;`X4_TnG>oMxN*sB4ekv!BfBq)j~O`zUbGNs|4uUAC`l1L$^X}_M& z5s;H^XO$7QjguqfI-K0bwzQ^Oh|6eB$hD}0_ztE@O|VXNT%ulU*;&>x|_IrLs zyU_-)3VYysErXk3l6W61)Sj{Dv!mJZ zd)Wb5k&qzWlHqghmt%iFMG`Utd08Ar`4RP#Z3~A+u|Ad}p^mKI`??hj zUQO8X|M(PC>KXhD=80c`-Fil48~UrP%cMjz4=m9PlxchOwhoZjh}t|eSsx7@gh^7l zN!yQpHAuG+4=R7bF74oa2Gv69P(_n*$wBQ@U;0qC&B*2saX(fgjWd{fQU_~}4g3I# z&M*ywJw_UmIB0GVe5NZS1BmE!p|8CY`Qv4to9bzwm87!_EJGJ^thu` z$_ycs8_I-`?V3A^7XdR}l-B`0Ow{VB(Fb)xkqKKBw?y?jboCmFjuU?Xn7+yw delta 633 zcmbPWw8CJ529t*HM6G)f3ejQyJ_@SEu?z)?xtSHIMGCsQ>8T~UW%)U!xv9DtrMZcD z3<}Y{uD&2e3JlRsjv)|MaguIQVo6DAQ6)n(NPkLVNveXjs;8BzudZsr=1YuOjFX+2 zH9}<>fWYvr<30us1_qzr>;#YQYJva49-Rk0S`U=6d-U>x6!>(0^Xc8AastTo=nm#E zJm8`E&a>A>{{=|0^*{xm#|)3=!xA2hM?Ed?mhRcSlR1x(QDCwL>#fZaZ1)(2fo4NN z0+d#n{E=OJvjWEpCPtabirnIis*^3b%>)vQ(u)~N^Rn~u%k$!kONu7fb3c(PO3aNf zEly2g$jk$Js4OvuA*nPCY|iFdp3{tsg_9Hc#3gGOAx1L+DFGn<^B)45CmZsKt4>0a zfq#3VHP81TJtRuuDXaO;u0i>P{h#yRzC?wAL z3M%R`Sy4!Q@(CdUsjpCx2q+Cx|BGR>l5iU%(*y3wt3-}5a!xK3HD^qmyi(Mj=?C}Z zSE6>D2CNV*36l-Q%sDLtAv})Bg<|GR6Ids&60>8S0a7x#kW+Y)xCYY-*2!Apc1$N& zCog0bo7?~t0Ww#K+c8Q^ekpFxmAMh$LGOpds$ZyU#S%F<*bAW&^=VTKp@#z`I7zHNFONmbZbc|7& zBO@ukI3uwjb+Q9cB=0bz*z`#!86~C{9blAcj+WXUEycK(i_v(yq$*>!H|qih1_q|- Vodt}_?8e5$_CUOSa{;4n8UUuZH=zIk delta 196 zcmaE`mi@t6_6-UwjGH$rvfO86WSShvBEDIIje~Krg@D9n3-%pMj58;H-2N=(9F60hpVr&EnY<|G2z{vP!H){_A0|U$S&H_edb_Rw9dm!GvxqwkO4FE=GKeqq? diff --git a/suckless/st/x.o b/suckless/st/x.o index 8c62324174215433c75a52e54f39fa8502e25d76..50fa1d497dca282a67ca48b12fff43b7497beeb6 100644 GIT binary patch delta 48 zcmeydjP=Jd)(u+%SQjubFfdKt8KBH*Y+P&)!c3Dt2E3jW$g}xQ;2%y#47+5Cn3{d7|U}&%hVW!C+171%G