From 658154035f3ab68d39e9b7bdf985a34478104d12 Mon Sep 17 00:00:00 2001 From: DarthMooMancer Date: Sat, 20 Sep 2025 17:21:29 -0400 Subject: [PATCH] wip --- .bash_profile | 4 + .config/picom.conf | 2 +- .config/suckless/dmenu/config.h | 3 + .config/suckless/dmenu/config.h.orig | 23 + .config/suckless/dmenu/dmenu | Bin 42184 -> 0 bytes .config/suckless/dmenu/dmenu.c | 28 +- .config/suckless/dmenu/dmenu.c.orig | 746 ++++++++++++++++++ .config/suckless/dmenu/dmenu.c.rej | 30 + .config/suckless/dmenu/dmenu.o | Bin 30600 -> 0 bytes .config/suckless/dmenu/dmenu_path | 6 +- .config/suckless/dmenu/dmenu_run | 2 - .config/suckless/dmenu/drw.o | Bin 11464 -> 0 bytes .../dmenu-center-20250407-b1e217b.diff | 121 +++ .config/suckless/dmenu/util.o | Bin 2472 -> 0 bytes .config/tmux/tmux.conf | 1 + .local/bin/dmenu-sessionizer.sh | 10 + env.sh | 2 + 17 files changed, 966 insertions(+), 12 deletions(-) create mode 100644 .bash_profile create mode 100644 .config/suckless/dmenu/config.h.orig delete mode 100755 .config/suckless/dmenu/dmenu create mode 100644 .config/suckless/dmenu/dmenu.c.orig create mode 100644 .config/suckless/dmenu/dmenu.c.rej delete mode 100644 .config/suckless/dmenu/dmenu.o delete mode 100644 .config/suckless/dmenu/drw.o create mode 100644 .config/suckless/dmenu/patches/dmenu-center-20250407-b1e217b.diff delete mode 100644 .config/suckless/dmenu/util.o create mode 100755 .local/bin/dmenu-sessionizer.sh diff --git a/.bash_profile b/.bash_profile new file mode 100644 index 0000000..0eaf2d6 --- /dev/null +++ b/.bash_profile @@ -0,0 +1,4 @@ +if [ -f ~/.bashrc ]; then + . ~/.bashrc +fi + diff --git a/.config/picom.conf b/.config/picom.conf index ad73f1f..1d3183c 100644 --- a/.config/picom.conf +++ b/.config/picom.conf @@ -5,7 +5,7 @@ frame-opacity = 1; inner-border-width = 0 -corner-radius = 3 +corner-radius = 5 blur-method = "dual_kawase" blur-background = true diff --git a/.config/suckless/dmenu/config.h b/.config/suckless/dmenu/config.h index f91f1f3..4528664 100644 --- a/.config/suckless/dmenu/config.h +++ b/.config/suckless/dmenu/config.h @@ -2,6 +2,9 @@ /* 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 */ +static const float menu_height_ratio = 4.0f; /* This is the ratio used in the original calculation */ /* -fn option overrides fonts[0]; default X11 font or font set */ static const char *prompt = NULL; /* -p option; prompt to the left of input field */ static const char *fonts[] = { diff --git a/.config/suckless/dmenu/config.h.orig b/.config/suckless/dmenu/config.h.orig new file mode 100644 index 0000000..f91f1f3 --- /dev/null +++ b/.config/suckless/dmenu/config.h.orig @@ -0,0 +1,23 @@ +/* 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 char *prompt = NULL; /* -p option; prompt to the left of input field */ +static const char *fonts[] = { + "CaskaydiaCove NFM style:SemiBold:size=11" +}; +static const char *colors[SchemeLast][2] = { + [SchemeNorm] = { "#D3C6AA", "#272E33" }, + [SchemeSel] = { "#272E33", "#DBBC7F" }, + [SchemeOut] = { "#E67E80", "#272E33" }, +}; + +/* -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/.config/suckless/dmenu/dmenu b/.config/suckless/dmenu/dmenu deleted file mode 100755 index 125d3276177da8508a4e8bd2dabe938a72d6a223..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42184 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 diff --git a/.config/suckless/dmenu/dmenu.c b/.config/suckless/dmenu/dmenu.c index 3dd9e3e..c03a119 100644 --- a/.config/suckless/dmenu/dmenu.c +++ b/.config/suckless/dmenu/dmenu.c @@ -25,6 +25,7 @@ enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ struct item { char *text; + unsigned int width; struct item *left, *right; int out; }; @@ -91,6 +92,15 @@ calcoffsets(void) break; } +static int +max_textw(void) +{ + int len = 0; + for (struct item *item = items; item && item->text; item++) + len = MAX(item->width, len); + return len; +} + static void cleanup(void) { @@ -559,6 +569,7 @@ readstdin(void) line[len - 1] = '\0'; if (!(items[i].text = strdup(line))) die("strdup:"); + items[i].width = TEXTW(line); items[i].out = 0; } @@ -627,15 +638,22 @@ setup(void) bh = drw->fonts->h + 2; lines = MAX(lines, 0); mh = (lines + 1) * bh; + promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; { if (!XGetWindowAttributes(dpy, parentwin, &wa)) die("could not get embedding window attributes: 0x%lx", parentwin); - x = 0; - y = topbar ? 0 : wa.height - mh; - mw = wa.width; + + if (centered) { + mw = MIN(MAX(max_textw() + promptw, min_width), wa.width); + x = (wa.width - mw) / 2; + y = (wa.height - mh) / 2; + } else { + x = 0; + y = topbar ? 0 : wa.height - mh; + mw = wa.width; + } } - promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; inputw = mw / 3; /* input width: ~33% of monitor width */ match(); @@ -689,6 +707,8 @@ main(int argc, char *argv[]) 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; diff --git a/.config/suckless/dmenu/dmenu.c.orig b/.config/suckless/dmenu/dmenu.c.orig new file mode 100644 index 0000000..3dd9e3e --- /dev/null +++ b/.config/suckless/dmenu/dmenu.c.orig @@ -0,0 +1,746 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#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 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 +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 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"}; + /* 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 + 2; + lines = MAX(lines, 0); + mh = (lines + 1) * bh; + { + 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; + } + promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; + inputw = mw / 3; /* input width: ~33% of monitor width */ + match(); + + /* create menu window */ + swa.override_redirect = True; + swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; + swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; + win = XCreateWindow(dpy, 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" + " [-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], "-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], "-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; + + if (fast && !isatty(0)) { + grabkeyboard(); + readstdin(); + } else { + readstdin(); + grabkeyboard(); + } + setup(); + run(); + + return 1; /* unreachable */ +} diff --git a/.config/suckless/dmenu/dmenu.c.rej b/.config/suckless/dmenu/dmenu.c.rej new file mode 100644 index 0000000..e2640e3 --- /dev/null +++ b/.config/suckless/dmenu/dmenu.c.rej @@ -0,0 +1,30 @@ +--- dmenu.c ++++ dmenu.c +@@ -647,6 +658,7 @@ setup(void) + 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))) { +@@ -673,9 +685,16 @@ 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; ++ 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) / menu_height_ratio); ++ } 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 diff --git a/.config/suckless/dmenu/dmenu.o b/.config/suckless/dmenu/dmenu.o deleted file mode 100644 index fe7075cd7f7ad71278dcdff842dddfe542589ac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30600 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 DzpMDW diff --git a/.config/suckless/dmenu/dmenu_path b/.config/suckless/dmenu/dmenu_path index 3a7cda7..b17bf21 100755 --- a/.config/suckless/dmenu/dmenu_path +++ b/.config/suckless/dmenu/dmenu_path @@ -6,8 +6,4 @@ cache="$cachedir/dmenu_run" [ ! -e "$cachedir" ] && mkdir -p "$cachedir" IFS=: -if stest -dqr -n "$cache" $PATH; then - stest -flx $PATH | sort -u | tee "$cache" -else - cat "$cache" -fi +cat "$cache" diff --git a/.config/suckless/dmenu/dmenu_run b/.config/suckless/dmenu/dmenu_run index 834ede5..e69de29 100755 --- a/.config/suckless/dmenu/dmenu_run +++ b/.config/suckless/dmenu/dmenu_run @@ -1,2 +0,0 @@ -#!/bin/sh -dmenu_path | dmenu "$@" | ${SHELL:-"/bin/sh"} & diff --git a/.config/suckless/dmenu/drw.o b/.config/suckless/dmenu/drw.o deleted file mode 100644 index 69dbfa9f910b2da334855d573d810016a6cee0e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11464 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 TbCK}Az4Z=B(Roci-Q)ikvLk1R diff --git a/.config/suckless/dmenu/patches/dmenu-center-20250407-b1e217b.diff b/.config/suckless/dmenu/patches/dmenu-center-20250407-b1e217b.diff new file mode 100644 index 0000000..ec0fc39 --- /dev/null +++ b/.config/suckless/dmenu/patches/dmenu-center-20250407-b1e217b.diff @@ -0,0 +1,121 @@ +From 95a444534c230de79000348b0e12f8644aac8b15 Mon Sep 17 00:00:00 2001 +From: leliel +Date: Mon, 7 Apr 2025 01:00:01 +0000 +Subject: [PATCH] Increased speed for long files with emojis. + +--- + config.h | 3 +++ + dmenu.c | 40 ++++++++++++++++++++++++++++++++++------ + 3 files changed, 40 insertions(+), 6 deletions(-) + +diff --git a/config.h b/config.h +index 1edb647..832896f 100644 +--- a/config.h ++++ b/config.h +@@ -2,6 +2,9 @@ + /* 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 */ ++static const float menu_height_ratio = 4.0f; /* This is the ratio used in the original calculation */ + /* -fn option overrides fonts[0]; default X11 font or font set */ + static const char *fonts[] = { + "monospace:size=10" +diff --git a/dmenu.c b/dmenu.c +index fd49549..ceb52c7 100644 +--- a/dmenu.c ++++ b/dmenu.c +@@ -29,6 +29,7 @@ enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ + + struct item { + char *text; ++ unsigned int width; + struct item *left, *right; + int out; + }; +@@ -95,6 +96,15 @@ calcoffsets(void) + break; + } + ++static int ++max_textw(void) ++{ ++ int len = 0; ++ for (struct item *item = items; item && item->text; item++) ++ len = MAX(item->width, len); ++ return len; ++} ++ + static void + cleanup(void) + { +@@ -563,6 +573,7 @@ readstdin(void) + line[len - 1] = '\0'; + if (!(items[i].text = strdup(line))) + die("strdup:"); ++ items[i].width = TEXTW(line); + + items[i].out = 0; + } +@@ -636,6 +647,7 @@ setup(void) + 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))) { +@@ -662,9 +674,16 @@ 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; ++ 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) / menu_height_ratio); ++ } 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 +@@ -672,9 +691,16 @@ 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; ++ ++ if (centered) { ++ mw = MIN(MAX(max_textw() + promptw, min_width), wa.width); ++ x = (wa.width - mw) / 2; ++ y = (wa.height - mh) / 2; ++ } else { ++ x = 0; ++ y = topbar ? 0 : wa.height - mh; ++ mw = wa.width; ++ } + } + promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; + inputw = mw / 3; /* input width: ~33% of monitor width */ +@@ -733,6 +759,8 @@ main(int argc, char *argv[]) + 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; +-- +2.49.0 + + diff --git a/.config/suckless/dmenu/util.o b/.config/suckless/dmenu/util.o deleted file mode 100644 index 5dd48bf05707c29dd79ea9c028b4d6e8fb4493f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2472 zcmbuAO>7%Q6vy8tE(tWX(+W_eQnW%-u%)uHDTpY1$S5vZkU;@jRlvb)opoc?@tXA* zrGP{b1!)yU>VX3X4jede;J~2=4v4zyp+{~A^-{s9hf1{SjSr>oKRc5QTU$c#q_^+Q z?|tm-%58A?>VXVqQCi^Vq53LO?Iy2#I#DOiD`eUCfqAE zkt=I5tI9W?A$inKuBC$yC$|>{BKbY-oHkRf{jCR75Nwha0^eobjXNri*+3jh$M>c~x?fx8{nyD^pLGt-OiiEXdScyPe#qvp))K~}6+Rvu$8ihE-?_H0ysZ47^941aqJ5618ob3B)M9<|oYPLIi_ zfoylYCVBP6GAsBZAoEzWO)t)RtU}=J_Ubmr;-4&@cE=ER>Lm8i9`P<5$vGS+%QAHn|Mbm%3#S0ccq&fPd z#^gU@<>Qna?y?U-KGaB6JBFL{KwkgsnhZ{{m2qlUjTeWVz?0#+ByS~<0ePqTee&W6 z1Eg2H3VF?FZH+%TV>g9%cW=-t~Oe6uojw`{Xgq+ zIhMluji`oIb>;tyUMD@Y-td$hWP^3Bro)|U5s+nB*JID&nlIEGf-H}+f}8Ir7-Thb z-;}1g#)mz^ik|Zt9GEiQ~q%Q$HUC zN94ZA4DYvnR?+7RUB8ThC1(8%dY2ufX6vv2%lZ!2j@tiq{p&F6g8j#L#oXWQ|EPO& u8qMnoZRmMmAJ8&ekDl4RXGGs?*u}sS-EN2MXKz&fH+udb>|~}+w*C&KO+bzS diff --git a/.config/tmux/tmux.conf b/.config/tmux/tmux.conf index 5b589c6..3e1c5ec 100644 --- a/.config/tmux/tmux.conf +++ b/.config/tmux/tmux.conf @@ -5,6 +5,7 @@ bind M-, send-prefix set -g focus-events on set-option -g default-terminal "tmux-256color" set-option -as terminal-features ',xterm-ghostty:RGB' +set-option -g default-shell $SHELL set -g status-style 'fg=#7FBBB3 bg=default' set -g base-index 1 set -g pane-base-index 1 diff --git a/.local/bin/dmenu-sessionizer.sh b/.local/bin/dmenu-sessionizer.sh new file mode 100755 index 0000000..2aad65d --- /dev/null +++ b/.local/bin/dmenu-sessionizer.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +sessions=$(tmux ls -F '#S' 2>/dev/null) +count=$(echo "$sessions" | wc -l) + +# Clamp to max 10 +[ "$count" -gt 10 ] && count=10 + +tmux=$(tmux ls -F '#S' | dmenu -c -l $count -p "Sessions:") +[ -z "$tmux" ] && exit 0 +ghostty -e tmux attach -t $tmux diff --git a/env.sh b/env.sh index ecc5a74..f4153f6 100755 --- a/env.sh +++ b/env.sh @@ -23,6 +23,7 @@ ORIGINAL_DOTS=( "${DOTFILES_LOCAL}bin/" "${DOTFILES_HOME}.xinitrc" "${DOTFILES_HOME}.bashrc" + "${DOTFILES_HOME}.bash_profile" ) COPY_DOTS=( "${CONFIG}nvim/" @@ -35,6 +36,7 @@ COPY_DOTS=( "${LOCAL}bin/" "${PERSONAL_HOME}.xinitrc" "${PERSONAL_HOME}.bashrc" + "${PERSONAL_HOME}.bash_profile" ) for x in "${!ORIGINAL_DOTS[@]}"; do