From d58e23814e8b7134e549e55769872824fb50b092 Mon Sep 17 00:00:00 2001 From: Santiago Lo Coco Date: Fri, 13 Aug 2021 15:11:27 -0300 Subject: [PATCH] Added dmenu_terminal --- Makefile | 6 +- config.def.h | 2 +- config.def.h.orig | 25 -- config.h | 28 -- dmenu | Bin 43496 -> 0 bytes dmenu.1.orig | 197 ------------ dmenu.c.orig | 796 ---------------------------------------------- dmenu.o | Bin 33904 -> 0 bytes dmenu_terminal | 7 + drw.o | Bin 10616 -> 0 bytes stest | Bin 17080 -> 0 bytes stest.o | Bin 5288 -> 0 bytes util.o | Bin 2256 -> 0 bytes 13 files changed, 12 insertions(+), 1049 deletions(-) delete mode 100644 config.def.h.orig delete mode 100644 config.h delete mode 100755 dmenu delete mode 100644 dmenu.1.orig delete mode 100644 dmenu.c.orig delete mode 100644 dmenu.o create mode 100755 dmenu_terminal delete mode 100644 drw.o delete mode 100755 stest delete mode 100644 stest.o delete mode 100644 util.o diff --git a/Makefile b/Makefile index fe864c3..0358a24 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ clean: dist: clean mkdir -p dmenu-$(VERSION) cp LICENSE Makefile README arg.h config.def.h config.mk dmenu.1\ - drw.h util.h dmenu_path dmenu_run stest.1 $(SRC)\ + drw.h util.h dmenu_path dmenu_run dmenu_terminal stest.1 $(SRC)\ dmenu-$(VERSION) tar -cf dmenu-$(VERSION).tar dmenu-$(VERSION) gzip dmenu-$(VERSION).tar @@ -42,10 +42,11 @@ dist: clean install: all mkdir -p $(DESTDIR)$(PREFIX)/bin - cp -f dmenu dmenu_path dmenu_run stest $(DESTDIR)$(PREFIX)/bin + cp -f dmenu dmenu_path dmenu_run dmenu_terminal stest $(DESTDIR)$(PREFIX)/bin chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_path chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_run + chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_terminal chmod 755 $(DESTDIR)$(PREFIX)/bin/stest mkdir -p $(DESTDIR)$(MANPREFIX)/man1 sed "s/VERSION/$(VERSION)/g" < dmenu.1 > $(DESTDIR)$(MANPREFIX)/man1/dmenu.1 @@ -57,6 +58,7 @@ uninstall: rm -f $(DESTDIR)$(PREFIX)/bin/dmenu\ $(DESTDIR)$(PREFIX)/bin/dmenu_path\ $(DESTDIR)$(PREFIX)/bin/dmenu_run\ + $(DESTDIR)$(PREFIX)/bin/dmenu_terminal\ $(DESTDIR)$(PREFIX)/bin/stest\ $(DESTDIR)$(MANPREFIX)/man1/dmenu.1\ $(DESTDIR)$(MANPREFIX)/man1/stest.1 diff --git a/config.def.h b/config.def.h index bd88a8b..13665a4 100644 --- a/config.def.h +++ b/config.def.h @@ -3,7 +3,7 @@ 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 int min_width = 750; /* minimum width when centered */ /* -fn option overrides fonts[0]; default X11 font or font set */ static const char *fonts[] = { "monospace:size=10" diff --git a/config.def.h.orig b/config.def.h.orig deleted file mode 100644 index d041d6f..0000000 --- a/config.def.h.orig +++ /dev/null @@ -1,25 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -/* Default settings; can be overriden by command line. */ - -static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ -static int centered = 1; /* -c option; centers dmenu on screen */ -static int min_width = 500; /* minimum width when centered */ -/* -fn option overrides fonts[0]; default X11 font or font set */ -static const char *fonts[] = { - "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/config.h b/config.h deleted file mode 100644 index bd88a8b..0000000 --- a/config.h +++ /dev/null @@ -1,28 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -/* Default settings; can be overriden by command line. */ - -static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ -static int centered = 1; /* -c option; centers dmenu on screen */ -static int min_width = 500; /* minimum width when centered */ -/* -fn option overrides fonts[0]; default X11 font or font set */ -static const char *fonts[] = { - "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[] = " "; - -/* Size of the window border */ -static const unsigned int border_width = 5; diff --git a/dmenu b/dmenu deleted file mode 100755 index d216354c28b26a2cc06a64be4eff260db0c2019d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43496 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 diff --git a/dmenu.1.orig b/dmenu.1.orig deleted file mode 100644 index 2ab848a..0000000 --- a/dmenu.1.orig +++ /dev/null @@ -1,197 +0,0 @@ -.TH DMENU 1 dmenu\-VERSION -.SH NAME -dmenu \- dynamic menu -.SH SYNOPSIS -.B dmenu -.RB [ \-bfsv ] -.RB [ \-l -.IR lines ] -.RB [ \-m -.IR monitor ] -.RB [ \-p -.IR prompt ] -.RB [ \-fn -.IR font ] -.RB [ \-nb -.IR color ] -.RB [ \-nf -.IR color ] -.RB [ \-sb -.IR color ] -.RB [ \-sf -.IR color ] -.RB [ \-w -.IR windowid ] -.P -.BR dmenu_run " ..." -.SH DESCRIPTION -.B dmenu -is a dynamic menu for X, which reads a list of newline\-separated items from -stdin. When the user selects an item and presses Return, their choice is printed -to stdout and dmenu terminates. Entering text will narrow the items to those -matching the tokens in the input. -.P -.B dmenu_run -is a script used by -.IR dwm (1) -which lists programs in the user's $PATH and runs the result in their $SHELL. -.SH OPTIONS -.TP -.B \-b -dmenu appears at the bottom of the screen. -.TP -.B \-c -dmenu appears centered on the screen. -.TP -.B \-f -dmenu grabs the keyboard before reading stdin if not reading from a tty. This -is faster, but will lock up X until stdin reaches end\-of\-file. -.TP -.B \-s -dmenu matches menu items case sensitively. -.TP -.BI \-l " lines" -dmenu lists items vertically, with the given number of lines. -.TP -.BI \-m " monitor" -dmenu is displayed on the monitor number supplied. Monitor numbers are starting -from 0. -.TP -.BI \-p " prompt" -defines the prompt to be displayed to the left of the input field. -.TP -.BI \-fn " font" -defines the font or font set used. -.TP -.BI \-nb " color" -defines the normal background color. -.IR #RGB , -.IR #RRGGBB , -and X color names are supported. -.TP -.BI \-nf " color" -defines the normal foreground color. -.TP -.BI \-sb " color" -defines the selected background color. -.TP -.BI \-sf " color" -defines the selected foreground color. -.TP -.B \-v -prints version information to stdout, then exits. -.TP -.BI \-w " windowid" -embed into windowid. -.SH USAGE -dmenu is completely controlled by the keyboard. Items are selected using the -arrow keys, page up, page down, home, and end. -.TP -.B Tab -Copy the selected item to the input field. -.TP -.B Return -Confirm selection. Prints the selected item to stdout and exits, returning -success. -.TP -.B Ctrl-Return -Confirm selection. Prints the selected item to stdout and continues. -.TP -.B Shift\-Return -Confirm input. Prints the input text to stdout and exits, returning success. -.TP -.B Escape -Exit without selecting an item, returning failure. -.TP -.B Ctrl-Left -Move cursor to the start of the current word -.TP -.B Ctrl-Right -Move cursor to the end of the current word -.TP -.B C\-a -Home -.TP -.B C\-b -Left -.TP -.B C\-c -Escape -.TP -.B C\-d -Delete -.TP -.B C\-e -End -.TP -.B C\-f -Right -.TP -.B C\-g -Escape -.TP -.B C\-h -Backspace -.TP -.B C\-i -Tab -.TP -.B C\-j -Return -.TP -.B C\-J -Shift-Return -.TP -.B C\-k -Delete line right -.TP -.B C\-m -Return -.TP -.B C\-M -Shift-Return -.TP -.B C\-n -Down -.TP -.B C\-p -Up -.TP -.B C\-u -Delete line left -.TP -.B C\-w -Delete word left -.TP -.B C\-y -Paste from primary X selection -.TP -.B C\-Y -Paste from X clipboard -.TP -.B M\-b -Move cursor to the start of the current word -.TP -.B M\-f -Move cursor to the end of the current word -.TP -.B M\-g -Home -.TP -.B M\-G -End -.TP -.B M\-h -Up -.TP -.B M\-j -Page down -.TP -.B M\-k -Page up -.TP -.B M\-l -Down -.SH SEE ALSO -.IR dwm (1), -.IR stest (1) diff --git a/dmenu.c.orig b/dmenu.c.orig deleted file mode 100644 index 0ef20d7..0000000 --- a/dmenu.c.orig +++ /dev/null @@ -1,796 +0,0 @@ -/* 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 LENGTH(X) (sizeof X / sizeof X[0]) -#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 char * cistrstr(const char *s, const char *sub); -static int (*fstrncmp)(const char *, const char *, size_t) = strncasecmp; -static char *(*fstrstr)(const char *, const char *) = cistrstr; - -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 : MIN(TEXTW(next->text), n)) > n) - break; - for (i = 0, prev = curr; prev && prev->left; prev = prev->left) - if ((i += (lines > 0) ? bh : MIN(TEXTW(prev->left->text), n)) > n) - break; -} - -static int -max_textw(void) -{ - int len = 0; - for (struct item *item = items; item && item->text; item++) - len = MAX(TEXTW(item->text), len); - return len; -} - -static void -cleanup(void) -{ - size_t i; - - XUngrabKey(dpy, AnyKey, AnyModifier, root); - for (i = 0; i < SchemeLast; i++) - free(scheme[i]); - drw_free(drw); - XSync(dpy, False); - XCloseDisplay(dpy); -} - -static char * -cistrstr(const char *s, const char *sub) -{ - size_t len; - - for (len = strlen(sub); *s; s++) - if (!strncasecmp(s, sub, len)) - return (char *)s; - 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, MIN(TEXTW(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 %u 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[32]; - int len; - KeySym ksym; - Status status; - - len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status); - switch (status) { - default: /* XLookupNone, XBufferOverflow */ - return; - case XLookupChars: - goto insert; - case XLookupKeySym: - case XLookupBoth: - 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: - movewordedge(-1); - goto draw; - case XK_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(*buf)) - insert(buf, len); - break; - case XK_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: - 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: - if (sel == matches) { - cursor = 0; - break; - } - sel = curr = matches; - calcoffsets(); - break; - case XK_Left: - if (cursor > 0 && (!sel || !sel->left || lines > 0)) { - cursor = nextrune(-1); - break; - } - if (lines > 0) - return; - /* fallthrough */ - case XK_Up: - if (sel && sel->left && (sel = sel->left)->right == curr) { - curr = prev; - calcoffsets(); - } - break; - case XK_Next: - if (!next) - return; - sel = curr = next; - calcoffsets(); - break; - case XK_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: - if (text[cursor] != '\0') { - cursor = nextrune(+1); - break; - } - if (lines > 0) - return; - /* fallthrough */ - case XK_Down: - if (sel && sel->right && (sel = sel->right) == next) { - curr = next; - calcoffsets(); - } - break; - case XK_Tab: - if (!sel) - return; - strncpy(text, sel->text, sizeof text - 1); - text[sizeof text - 1] = '\0'; - cursor = strlen(text); - 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 buf[sizeof text], *p; - size_t i, imax = 0, size = 0; - unsigned int tmpmax = 0; - - /* read each line from stdin and add it to the item list */ - for (i = 0; fgets(buf, sizeof buf, stdin); i++) { - if (i + 1 >= size / sizeof *items) - if (!(items = realloc(items, (size += BUFSIZ)))) - die("cannot realloc %u bytes:", size); - if ((p = strchr(buf, '\n'))) - *p = '\0'; - if (!(items[i].text = strdup(buf))) - die("cannot strdup %u bytes:", strlen(buf) + 1); - items[i].out = 0; - drw_font_getexts(drw->fonts, buf, strlen(buf), &tmpmax, NULL); - if (tmpmax > inputw) { - inputw = tmpmax; - imax = i; - } - } - if (items) - items[i].text = NULL; - inputw = items ? TEXTW(items[imax].text) : 0; - 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"}; -#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 + 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))) { - 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])) - break; - - if (centered) { - mw = MIN(MAX(max_textw() + promptw, min_width), info[i].width); - x = info[i].x_org + ((info[i].width - mw) / 2); - y = info[i].y_org + ((info[i].height - mh) / 2); - } else { - x = info[i].x_org; - y = info[i].y_org + (topbar ? 0 : info[i].height - mh); - mw = info[i].width; - } - XFree(info); - } else -#endif - { - if (!XGetWindowAttributes(dpy, parentwin, &wa)) - die("could not get embedding window attributes: 0x%lx", - parentwin); - - 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; - } - } - inputw = MIN(inputw, mw/3); - match(); - - /* create menu window */ - swa.override_redirect = True; - swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; - swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; - win = XCreateWindow(dpy, parentwin, 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) { - 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) -{ - fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" - " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); - exit(1); -} - -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], "-c")) /* centers dmenu on screen */ - centered = 1; - else if (!strcmp(argv[i], "-s")) { /* case-sensitive item matching */ - fstrncmp = strncmp; - fstrstr = strstr; - } 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; - -#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/dmenu.o b/dmenu.o deleted file mode 100644 index ab0861e2f2cd1b19701088fce7e958dfaaa76244..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33904 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 hTNAzrHZ*N77~_80OFtOK--GAW&) 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 E4;(^$uK)l5 diff --git a/stest.o b/stest.o deleted file mode 100644 index c7926cec7aa2152edb0566d0edeafe9af99b6459..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5288 zcmbW4Z){sv6~M3Uv@uQbOaD+Z%9zWXk!s7su3$>bit>`UeI5=i^v^&|=eYKB64kLY z`?*QcP&38pa9wv3Y=8h!*!WPvB#H)<4^wBY?OG6%%0TdCpnaIwEN^O&rWTED=A7$$ z?3;_<7moCN@A=(x&pr3vbKko@5svP1yIhRK#lFbe8d1j1^|tH7ygJN!na1{-<(;US zmCs`ls+#4GVdX9SdC^TZV}GRd?g6v(f%(|mL*PGYmb>}~pw%oD0|Nk{W5o`5dAH@N z-5sjdt^!`-&RL<`SbQL$+clxvz2&ihzn|S?Y$uy!tZ=vU_jCpg|n79Pi zZ7JmAQ`QcDf8Kv+Fn%PFv{F;k>A6R8`NFaJg~I?d{?ts`!djMU2y|UPyoUWx57wXm zY=52^4@E0H^NfSW0b~DxO181jtUT<6>>Yq5UXi_h05I)Wn^(sIUW^PY0C63f+gbLQ z%T=xT0iea9L2db6sGQpCD!!@}YslUkEUa5xaI->>xpc|fc%}Ad?A)kEO0R`6B|YQi z`vS(&EthdB%!*a*>6eV+U$x>-!78%-HEkJlOuKlqa`4+@m1Ad@-gC{zjm2-eSV0>v zrvu*c<#!5e_$o#kSL&-9uSAwEdmqS%BWqT8kkQf&Qw!hZW}#P&QZ3vt3Ma23U842X8CjglK@h7Eq|xAQx=ou5ag_J*m&58U1GaOM|b!Kc7OT6 zR(~j{Z_|SekE9%O%=L}0GS@<{YxCM}?~`DR`SwZC_8BY< zU+(}ELBXPUE=PR5r`=<|zLTB@eb?QdA-As&%tm}(m^n002-}B*?Gx^ZukVa!#OJSc zjraymuQGhWldH#kLrdLX^1bf&47zWFG+))~W^hoI!(qU@N(d!fz-0 zuRHL#1J5|{lmnl2;CTnW;J{13*Gucka}wAY2m7ZT_>Ua;GYHHwyAaTrd z6!h6&-aA>1BIUz`m+ir{WpTE z>u_DM|Ao-sQ26sge@Ef`J^~TCF+dR2{~Zo|KyaGZdEqyx@E;1kL-Hf%;jm&~754O9 z!gw~pL;I4H{Cr&E^aa6Y%-ad!=Rv5WAeYYzKX33uN5y!>YY20Td|M=}D{+z@= zCGi&|ewW05FLA%b|0X!C+v7riTjC#;?BAFCY>~JR9e`jV&v&x}@0U34`z7Jm5FFP* z&J#cADA+7axc)i*+vapXnw0n&QRju8KR#>6k1!oR0?l%oYB?(%*KKRTW_mJi$C-Wv zzA1Vxiwc^Dboe~AjDW;*c43a`iR|pGm4RNFtZnIV+a2WJ9-&WV3i@0QJ}f!=xae+8 z$5OfYtR=_wf7bob50_58p$!8=$;*ocx>#o3hCi5txYon)$TBGw&BVO`&UK(KPnykvtVr`XFYr;Q5F5De6!8hjUlQ y#x7qI8yXb*h<7x6)c*K?OU*q%>|59X@~39e`c>B&?`)m=;~!@fyw}U3_Wv*7_h}IT diff --git a/util.o b/util.o deleted file mode 100644 index 5dee2d71351881ac743ab3aad98bf048e9418476..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2256 zcmbuAO-vI(6vtl+O2yJv;DEtH538XGZdwu}sY(hISal;sYD6xzv|DNHm)orYH4!5o znx+W{4<0;l@M7Y@M2{vkdhp88lXx`210FmWOzL~PGceh-7k$a(z4^WWo0*-N-F-Zz zPCFeA;O2laIP7r>5Ib@hN6at+9_WF2rMj;?`SA^rQZ=Mer5cwaN>!BpBBfT~Kd#Pdi57IXJv{LIlJ%oXR0}h26 zO6?MMu=iD|uSv?E)yZa}*iFN_B@8>@pKd z4WqS39nEm1Z_AH)lZKk6+wI=!=4gxd#-wvr;j>1?t<=pGnPBl#Dw)d_Q(=Ia$;q&P zXy)3DfIk$JM`T(HbYk;kqwT~LIKj~%#`oO8`p1xw^;-@c53Yk_#pf7wceyrDJb?TZ z%l#%l?(sc!Uh(X)+$hVPWVxFj7bC45&EE+>o2{}P2dg{GTB8YJ*ZOBew z^D&L+=s8+(xeY(xhL5%3(Kh^Q8y-VW>*wn>_Yc`z8$DEvY)(#rtWE|YozEzq;)(e9ggTXg`+BG?n{j$BYFzKfn2hw)xLsrc=lr}tF0bZ|)$C<c4h$Z5=ftq)->jX8o%G(JCHFVFG$xsPCiV)J9mMd%lqpif{F@;dG> z3rv*exj=+1w6~Dadnw*kDk-sg`?~DUa}Tv7wbyU5dip+zX0Oj-veo%-5=7(k)A`eT z%