From 79b7d1005e46b5a076010d7c10b9ebb6b4d55c4d Mon Sep 17 00:00:00 2001 From: mequidis Date: Sat, 2 Jul 2022 19:36:48 +0300 Subject: [PATCH] dmenu -> rofi --- .config/herbstluftwm/autostart | 7 +- .config/herbstluftwm/scripts/exitmenu | 4 +- .config/herbstluftwm/scripts/resizestep | 4 +- .config/herbstluftwm/scripts/togglemaster | 4 +- .config/herbstluftwm/scripts/volume | 2 +- .config/mequidots/dmenu-5.0/LICENSE | 30 - .config/mequidots/dmenu-5.0/Makefile | 64 -- .config/mequidots/dmenu-5.0/README | 24 - .config/mequidots/dmenu-5.0/arg.h | 49 - .config/mequidots/dmenu-5.0/config.def.h | 27 - .config/mequidots/dmenu-5.0/config.h | 26 - .config/mequidots/dmenu-5.0/config.mk | 31 - .../mequidots/dmenu-5.0/dmenu-border-4.9.diff | 25 - .../mequidots/dmenu-5.0/dmenu-center-4.8.diff | 56 -- .../dmenu-5.0/dmenu-fuzzymatch-4.9.diff | 163 ---- .config/mequidots/dmenu-5.0/dmenu.1 | 194 ---- .config/mequidots/dmenu-5.0/dmenu.c | 870 ------------------ .config/mequidots/dmenu-5.0/dmenu.c.orig | 781 ---------------- .config/mequidots/dmenu-5.0/dmenu.o | Bin 35120 -> 0 bytes .config/mequidots/dmenu-5.0/dmenu_path | 13 - .config/mequidots/dmenu-5.0/dmenu_run | 2 - .config/mequidots/dmenu-5.0/drw.c | 436 --------- .config/mequidots/dmenu-5.0/drw.h | 57 -- .config/mequidots/dmenu-5.0/drw.o | Bin 10584 -> 0 bytes .config/mequidots/dmenu-5.0/stest | Bin 17080 -> 0 bytes .config/mequidots/dmenu-5.0/stest.1 | 90 -- .config/mequidots/dmenu-5.0/stest.c | 109 --- .config/mequidots/dmenu-5.0/stest.o | Bin 5296 -> 0 bytes .config/mequidots/dmenu-5.0/util.c | 35 - .config/mequidots/dmenu-5.0/util.h | 8 - .config/mequidots/dmenu-5.0/util.o | Bin 2256 -> 0 bytes .config/mequidots/packagelist | 2 + .config/scripts/util/dcalc | 23 - 33 files changed, 13 insertions(+), 3123 deletions(-) delete mode 100644 .config/mequidots/dmenu-5.0/LICENSE delete mode 100644 .config/mequidots/dmenu-5.0/Makefile delete mode 100644 .config/mequidots/dmenu-5.0/README delete mode 100644 .config/mequidots/dmenu-5.0/arg.h delete mode 100644 .config/mequidots/dmenu-5.0/config.def.h delete mode 100644 .config/mequidots/dmenu-5.0/config.h delete mode 100644 .config/mequidots/dmenu-5.0/config.mk delete mode 100644 .config/mequidots/dmenu-5.0/dmenu-border-4.9.diff delete mode 100644 .config/mequidots/dmenu-5.0/dmenu-center-4.8.diff delete mode 100644 .config/mequidots/dmenu-5.0/dmenu-fuzzymatch-4.9.diff delete mode 100644 .config/mequidots/dmenu-5.0/dmenu.1 delete mode 100644 .config/mequidots/dmenu-5.0/dmenu.c delete mode 100644 .config/mequidots/dmenu-5.0/dmenu.c.orig delete mode 100644 .config/mequidots/dmenu-5.0/dmenu.o delete mode 100755 .config/mequidots/dmenu-5.0/dmenu_path delete mode 100755 .config/mequidots/dmenu-5.0/dmenu_run delete mode 100644 .config/mequidots/dmenu-5.0/drw.c delete mode 100644 .config/mequidots/dmenu-5.0/drw.h delete mode 100644 .config/mequidots/dmenu-5.0/drw.o delete mode 100755 .config/mequidots/dmenu-5.0/stest delete mode 100644 .config/mequidots/dmenu-5.0/stest.1 delete mode 100644 .config/mequidots/dmenu-5.0/stest.c delete mode 100644 .config/mequidots/dmenu-5.0/stest.o delete mode 100644 .config/mequidots/dmenu-5.0/util.c delete mode 100644 .config/mequidots/dmenu-5.0/util.h delete mode 100644 .config/mequidots/dmenu-5.0/util.o delete mode 100755 .config/scripts/util/dcalc diff --git a/.config/herbstluftwm/autostart b/.config/herbstluftwm/autostart index bd89997..8352b9c 100755 --- a/.config/herbstluftwm/autostart +++ b/.config/herbstluftwm/autostart @@ -33,11 +33,11 @@ scripts="$XDG_CONFIG_HOME/herbstluftwm/scripts" terminal=kitty browser=firefox -calculator=dcalc +calculator="rofi -show calc" calendar="$terminal -e nvim +Agenda" feed_reader="$terminal -e newsboat" file_manager=thunar -launcher="dmenu_run -nb $color0 -nf $color15 -sb $color1 -sf $color15" +launcher="rofi -show run" music_player="$terminal -e ncmpcpp" screen_locker="i3lock -c 000000" @@ -223,4 +223,5 @@ pidof dunst || dunst & pidof mpd || mpd & pidof flameshot || flameshot & pidof lxpolkit || lxpolkit & -wal -R && ~/.fehbg +wal -R +~/.fehbg diff --git a/.config/herbstluftwm/scripts/exitmenu b/.config/herbstluftwm/scripts/exitmenu index 260afed..e0d76b8 100755 --- a/.config/herbstluftwm/scripts/exitmenu +++ b/.config/herbstluftwm/scripts/exitmenu @@ -1,6 +1,6 @@ #!/bin/bash -dmenu="dmenu -p exit" -choice=$(echo -e "shutdown\nrestart\nlogoff\nscreenlock" | $dmenu) +menu="rofi -dmenu" +choice=$(echo -e "shutdown\nrestart\nlogoff\nscreenlock" | $menu) case $choice in diff --git a/.config/herbstluftwm/scripts/resizestep b/.config/herbstluftwm/scripts/resizestep index 53b718d..e37800e 100755 --- a/.config/herbstluftwm/scripts/resizestep +++ b/.config/herbstluftwm/scripts/resizestep @@ -1,7 +1,7 @@ #!/bin/bash -dmenu="dmenu -p resize" +menu="rofi -dmenu" -resizestep=$(echo -e "0.04\n0.01\n0.004\n0.001" | $dmenu) +resizestep=$(echo -e "0.04\n0.01\n0.004\n0.001" | $menu) confpath=$XDG_CONFIG_HOME/herbstluftwm/autostart diff --git a/.config/herbstluftwm/scripts/togglemaster b/.config/herbstluftwm/scripts/togglemaster index bd59b72..4c1d95f 100755 --- a/.config/herbstluftwm/scripts/togglemaster +++ b/.config/herbstluftwm/scripts/togglemaster @@ -1,8 +1,8 @@ #!/bin/bash -dmenu="dmenu -p toggle" +menu="rofi -dmenu" -choice=$(echo -e "picom\nwindowcovering\nframeborderwidth\nresizestep" | $dmenu) +choice=$(echo -e "picom\nwindowcovering\nframeborderwidth\nresizestep" | $menu) case $choice in diff --git a/.config/herbstluftwm/scripts/volume b/.config/herbstluftwm/scripts/volume index 27ed87f..3b2a4e9 100755 --- a/.config/herbstluftwm/scripts/volume +++ b/.config/herbstluftwm/scripts/volume @@ -1,6 +1,6 @@ #!/bin/bash -dmenu="dmenu -p volume" +menu="rofi -menu" volume=$(echo -e "0\n25\n50\n75\n100" | $dmenu) pulsemixer --set-volume $volume diff --git a/.config/mequidots/dmenu-5.0/LICENSE b/.config/mequidots/dmenu-5.0/LICENSE deleted file mode 100644 index 3afd28e..0000000 --- a/.config/mequidots/dmenu-5.0/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -MIT/X Consortium License - -© 2006-2019 Anselm R Garbe -© 2006-2008 Sander van Dijk -© 2006-2007 Michał Janeczek -© 2007 Kris Maglione -© 2009 Gottox -© 2009 Markus Schnalke -© 2009 Evan Gates -© 2010-2012 Connor Lane Smith -© 2014-2020 Hiltjo Posthuma -© 2015-2019 Quentin Rameau - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/.config/mequidots/dmenu-5.0/Makefile b/.config/mequidots/dmenu-5.0/Makefile deleted file mode 100644 index a03a95c..0000000 --- a/.config/mequidots/dmenu-5.0/Makefile +++ /dev/null @@ -1,64 +0,0 @@ -# dmenu - dynamic menu -# See LICENSE file for copyright and license details. - -include config.mk - -SRC = drw.c dmenu.c stest.c util.c -OBJ = $(SRC:.c=.o) - -all: options dmenu stest - -options: - @echo dmenu build options: - @echo "CFLAGS = $(CFLAGS)" - @echo "LDFLAGS = $(LDFLAGS)" - @echo "CC = $(CC)" - -.c.o: - $(CC) -c $(CFLAGS) $< - -config.h: - cp config.def.h $@ - -$(OBJ): arg.h config.h config.mk drw.h - -dmenu: dmenu.o drw.o util.o - $(CC) -o $@ dmenu.o drw.o util.o $(LDFLAGS) - -stest: stest.o - $(CC) -o $@ stest.o $(LDFLAGS) - -clean: - rm -f dmenu stest $(OBJ) dmenu-$(VERSION).tar.gz - -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)\ - dmenu-$(VERSION) - tar -cf dmenu-$(VERSION).tar dmenu-$(VERSION) - gzip dmenu-$(VERSION).tar - rm -rf dmenu-$(VERSION) - -install: all - mkdir -p $(DESTDIR)$(PREFIX)/bin - cp -f dmenu dmenu_path dmenu_run 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/stest - mkdir -p $(DESTDIR)$(MANPREFIX)/man1 - sed "s/VERSION/$(VERSION)/g" < dmenu.1 > $(DESTDIR)$(MANPREFIX)/man1/dmenu.1 - sed "s/VERSION/$(VERSION)/g" < stest.1 > $(DESTDIR)$(MANPREFIX)/man1/stest.1 - chmod 644 $(DESTDIR)$(MANPREFIX)/man1/dmenu.1 - chmod 644 $(DESTDIR)$(MANPREFIX)/man1/stest.1 - -uninstall: - rm -f $(DESTDIR)$(PREFIX)/bin/dmenu\ - $(DESTDIR)$(PREFIX)/bin/dmenu_path\ - $(DESTDIR)$(PREFIX)/bin/dmenu_run\ - $(DESTDIR)$(PREFIX)/bin/stest\ - $(DESTDIR)$(MANPREFIX)/man1/dmenu.1\ - $(DESTDIR)$(MANPREFIX)/man1/stest.1 - -.PHONY: all options clean dist install uninstall diff --git a/.config/mequidots/dmenu-5.0/README b/.config/mequidots/dmenu-5.0/README deleted file mode 100644 index a8fcdfe..0000000 --- a/.config/mequidots/dmenu-5.0/README +++ /dev/null @@ -1,24 +0,0 @@ -dmenu - dynamic menu -==================== -dmenu is an efficient dynamic menu for X. - - -Requirements ------------- -In order to build dmenu you need the Xlib header files. - - -Installation ------------- -Edit config.mk to match your local setup (dmenu is installed into -the /usr/local namespace by default). - -Afterwards enter the following command to build and install dmenu -(if necessary as root): - - make clean install - - -Running dmenu -------------- -See the man page for details. diff --git a/.config/mequidots/dmenu-5.0/arg.h b/.config/mequidots/dmenu-5.0/arg.h deleted file mode 100644 index e94e02b..0000000 --- a/.config/mequidots/dmenu-5.0/arg.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copy me if you can. - * by 20h - */ - -#ifndef ARG_H__ -#define ARG_H__ - -extern char *argv0; - -/* use main(int argc, char *argv[]) */ -#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\ - argv[0] && argv[0][0] == '-'\ - && argv[0][1];\ - argc--, argv++) {\ - char argc_;\ - char **argv_;\ - int brk_;\ - if (argv[0][1] == '-' && argv[0][2] == '\0') {\ - argv++;\ - argc--;\ - break;\ - }\ - for (brk_ = 0, argv[0]++, argv_ = argv;\ - argv[0][0] && !brk_;\ - argv[0]++) {\ - if (argv_ != argv)\ - break;\ - argc_ = argv[0][0];\ - switch (argc_) - -#define ARGEND }\ - } - -#define ARGC() argc_ - -#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\ - ((x), abort(), (char *)0) :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\ - (char *)0 :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#endif diff --git a/.config/mequidots/dmenu-5.0/config.def.h b/.config/mequidots/dmenu-5.0/config.def.h deleted file mode 100644 index e850105..0000000 --- a/.config/mequidots/dmenu-5.0/config.def.h +++ /dev/null @@ -1,27 +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 fuzzy = 1; /* -F option; if 0, dmenu doesn't use fuzzy matching */ -/* -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/.config/mequidots/dmenu-5.0/config.h b/.config/mequidots/dmenu-5.0/config.h deleted file mode 100644 index 8f1f75d..0000000 --- a/.config/mequidots/dmenu-5.0/config.h +++ /dev/null @@ -1,26 +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 fuzzy = 1; /* -F option; if 0, dmenu doesn't use fuzzy matching */ -/* -fn option overrides fonts[0]; default X11 font or font set */ -static const char *fonts[] = { - "mononoki:size=15" -}; -static const char *prompt = NULL; /* -p option; prompt to the left of input field */ -static const char *colors[SchemeLast][2] = { - /* fg bg */ - [SchemeNorm] = { "#817f7f", "#0e0e0e" }, - [SchemeSel] = { "#eeeeee", "#817f7f" }, - [SchemeOut] = { "#000000", "#00ffff" }, -}; -/* -l option; if nonzero, dmenu uses vertical list with given number of lines */ -static unsigned int lines = 8; - -/* - * Characters not considered part of a word while deleting words - * for example: " /?\"&[]" - */ -static const char worddelimiters[] = " "; - -static const unsigned int border_width = 2; diff --git a/.config/mequidots/dmenu-5.0/config.mk b/.config/mequidots/dmenu-5.0/config.mk deleted file mode 100644 index 0c84121..0000000 --- a/.config/mequidots/dmenu-5.0/config.mk +++ /dev/null @@ -1,31 +0,0 @@ -# dmenu version -VERSION = 5.0 - -# paths -PREFIX = /usr/local -MANPREFIX = $(PREFIX)/share/man - -X11INC = /usr/X11R6/include -X11LIB = /usr/X11R6/lib - -# Xinerama, comment if you don't want it -XINERAMALIBS = -lXinerama -XINERAMAFLAGS = -DXINERAMA - -# freetype -FREETYPELIBS = -lfontconfig -lXft -FREETYPEINC = /usr/include/freetype2 -# OpenBSD (uncomment) -#FREETYPEINC = $(X11INC)/freetype2 - -# includes and libs -INCS = -I$(X11INC) -I$(FREETYPEINC) -LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) -lm - -# flags -CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS) -CFLAGS = -std=c99 -pedantic -Wall -Os $(INCS) $(CPPFLAGS) -LDFLAGS = $(LIBS) - -# compiler and linker -CC = cc diff --git a/.config/mequidots/dmenu-5.0/dmenu-border-4.9.diff b/.config/mequidots/dmenu-5.0/dmenu-border-4.9.diff deleted file mode 100644 index 89b4437..0000000 --- a/.config/mequidots/dmenu-5.0/dmenu-border-4.9.diff +++ /dev/null @@ -1,25 +0,0 @@ -diff -up dmenu-4.9-b/config.def.h dmenu-4.9-a/config.def.h ---- dmenu-4.9-b/config.def.h 2019-02-02 13:55:02.000000000 +0100 -+++ dmenu-4.9-a/config.def.h 2019-05-19 02:10:12.740040403 +0200 -@@ -21,3 +21,6 @@ static unsigned int lines = 0; - * for example: " /?\"&[]" - */ - static const char worddelimiters[] = " "; -+ -+/* Size of the window border */ -+static const unsigned int border_width = 5; -diff -up dmenu-4.9-b/dmenu.c dmenu-4.9-a/dmenu.c ---- dmenu-4.9-b/dmenu.c 2019-02-02 13:55:02.000000000 +0100 -+++ dmenu-4.9-a/dmenu.c 2019-05-19 02:11:20.966710117 +0200 -@@ -654,9 +654,10 @@ 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); -+ XSetWindowBorder(dpy, win, scheme[SchemeSel][ColBg].pixel); - XSetClassHint(dpy, win, &ch); - - /* open input methods */ diff --git a/.config/mequidots/dmenu-5.0/dmenu-center-4.8.diff b/.config/mequidots/dmenu-5.0/dmenu-center-4.8.diff deleted file mode 100644 index a970fcb..0000000 --- a/.config/mequidots/dmenu-5.0/dmenu-center-4.8.diff +++ /dev/null @@ -1,56 +0,0 @@ -diff --git a/dmenu.c b/dmenu.c -index 5e9c367..2268ea9 100644 ---- a/dmenu.c -+++ b/dmenu.c -@@ -88,6 +88,15 @@ calcoffsets(void) - 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) - { -@@ -598,6 +607,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))) { -@@ -624,9 +634,9 @@ setup(void) - if (INTERSECT(x, y, 1, 1, info[i])) - break; - -- x = info[i].x_org; -- y = info[i].y_org + (topbar ? 0 : info[i].height - mh); -- mw = info[i].width; -+ mw = MIN(MAX(max_textw() + promptw, 100), info[i].width); -+ x = info[i].x_org + ((info[i].width - mw) / 2); -+ y = info[i].y_org + ((info[i].height - mh) / 2); - XFree(info); - } else - #endif -@@ -634,11 +644,10 @@ 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; -+ mw = MIN(MAX(max_textw() + promptw, 100), wa.width); -+ x = (wa.width - mw) / 2; -+ y = (wa.height - mh) / 2; - } -- promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; - inputw = MIN(inputw, mw/3); - match(); - diff --git a/.config/mequidots/dmenu-5.0/dmenu-fuzzymatch-4.9.diff b/.config/mequidots/dmenu-5.0/dmenu-fuzzymatch-4.9.diff deleted file mode 100644 index 9fd206d..0000000 --- a/.config/mequidots/dmenu-5.0/dmenu-fuzzymatch-4.9.diff +++ /dev/null @@ -1,163 +0,0 @@ -From 94353eb52055927d9079f3d9e33da1c954abf386 Mon Sep 17 00:00:00 2001 -From: aleks -Date: Wed, 26 Jun 2019 13:25:10 +0200 -Subject: [PATCH] Add support for fuzzy-matching - ---- - config.def.h | 1 + - config.mk | 2 +- - dmenu.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 91 insertions(+), 1 deletion(-) - -diff --git a/config.def.h b/config.def.h -index 1edb647..51612b9 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -2,6 +2,7 @@ - /* Default settings; can be overriden by command line. */ - - static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ -+static int fuzzy = 1; /* -F option; if 0, dmenu doesn't use fuzzy matching */ - /* -fn option overrides fonts[0]; default X11 font or font set */ - static const char *fonts[] = { - "monospace:size=10" -diff --git a/config.mk b/config.mk -index 0929b4a..d14309a 100644 ---- a/config.mk -+++ b/config.mk -@@ -20,7 +20,7 @@ FREETYPEINC = /usr/include/freetype2 - - # includes and libs - INCS = -I$(X11INC) -I$(FREETYPEINC) --LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) -+LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) -lm - - # flags - CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS) -diff --git a/dmenu.c b/dmenu.c -index 6b8f51b..96ddc98 100644 ---- a/dmenu.c -+++ b/dmenu.c -@@ -1,6 +1,7 @@ - /* See LICENSE file for copyright and license details. */ - #include - #include -+#include - #include - #include - #include -@@ -32,6 +33,7 @@ struct item { - char *text; - struct item *left, *right; - int out; -+ double distance; - }; - - static char text[BUFSIZ] = ""; -@@ -210,9 +212,94 @@ grabkeyboard(void) - die("cannot grab keyboard"); - } - -+int -+compare_distance(const void *a, const void *b) -+{ -+ struct item *da = *(struct item **) a; -+ struct item *db = *(struct item **) b; -+ -+ if (!db) -+ return 1; -+ if (!da) -+ return -1; -+ -+ return da->distance == db->distance ? 0 : da->distance < db->distance ? -1 : 1; -+} -+ -+void -+fuzzymatch(void) -+{ -+ /* bang - we have so much memory */ -+ struct item *it; -+ struct item **fuzzymatches = NULL; -+ char c; -+ int number_of_matches = 0, i, pidx, sidx, eidx; -+ int text_len = strlen(text), itext_len; -+ -+ matches = matchend = NULL; -+ -+ /* walk through all items */ -+ for (it = items; it && it->text; it++) { -+ if (text_len) { -+ itext_len = strlen(it->text); -+ pidx = 0; /* pointer */ -+ sidx = eidx = -1; /* start of match, end of match */ -+ /* walk through item text */ -+ for (i = 0; i < itext_len && (c = it->text[i]); i++) { -+ /* fuzzy match pattern */ -+ if (!fstrncmp(&text[pidx], &c, 1)) { -+ if(sidx == -1) -+ sidx = i; -+ pidx++; -+ if (pidx == text_len) { -+ eidx = i; -+ break; -+ } -+ } -+ } -+ /* build list of matches */ -+ if (eidx != -1) { -+ /* compute distance */ -+ /* add penalty if match starts late (log(sidx+2)) -+ * add penalty for long a match without many matching characters */ -+ it->distance = log(sidx + 2) + (double)(eidx - sidx - text_len); -+ /* fprintf(stderr, "distance %s %f\n", it->text, it->distance); */ -+ appenditem(it, &matches, &matchend); -+ number_of_matches++; -+ } -+ } else { -+ appenditem(it, &matches, &matchend); -+ } -+ } -+ -+ if (number_of_matches) { -+ /* initialize array with matches */ -+ if (!(fuzzymatches = realloc(fuzzymatches, number_of_matches * sizeof(struct item*)))) -+ die("cannot realloc %u bytes:", number_of_matches * sizeof(struct item*)); -+ for (i = 0, it = matches; it && i < number_of_matches; i++, it = it->right) { -+ fuzzymatches[i] = it; -+ } -+ /* sort matches according to distance */ -+ qsort(fuzzymatches, number_of_matches, sizeof(struct item*), compare_distance); -+ /* rebuild list of matches */ -+ matches = matchend = NULL; -+ for (i = 0, it = fuzzymatches[i]; i < number_of_matches && it && \ -+ it->text; i++, it = fuzzymatches[i]) { -+ appenditem(it, &matches, &matchend); -+ } -+ free(fuzzymatches); -+ } -+ curr = sel = matches; -+ calcoffsets(); -+} -+ - static void - match(void) - { -+ if (fuzzy) { -+ fuzzymatch(); -+ return; -+ } - static char **tokv = NULL; - static int tokn = 0; - -@@ -702,6 +789,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], "-F")) /* grabs keyboard before reading stdin */ -+ fuzzy = 0; - else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ - fstrncmp = strncasecmp; - fstrstr = cistrstr; --- -2.22.0 - diff --git a/.config/mequidots/dmenu-5.0/dmenu.1 b/.config/mequidots/dmenu-5.0/dmenu.1 deleted file mode 100644 index 323f93c..0000000 --- a/.config/mequidots/dmenu-5.0/dmenu.1 +++ /dev/null @@ -1,194 +0,0 @@ -.TH DMENU 1 dmenu\-VERSION -.SH NAME -dmenu \- dynamic menu -.SH SYNOPSIS -.B dmenu -.RB [ \-bfiv ] -.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 \-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 \-i -dmenu matches menu items case insensitively. -.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/.config/mequidots/dmenu-5.0/dmenu.c b/.config/mequidots/dmenu-5.0/dmenu.c deleted file mode 100644 index 2b8e43f..0000000 --- a/.config/mequidots/dmenu-5.0/dmenu.c +++ /dev/null @@ -1,870 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#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; - double distance; -}; - -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 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"); -} - -int -compare_distance(const void *a, const void *b) -{ - struct item *da = *(struct item **) a; - struct item *db = *(struct item **) b; - - if (!db) - return 1; - if (!da) - return -1; - - return da->distance == db->distance ? 0 : da->distance < db->distance ? -1 : 1; -} - -void -fuzzymatch(void) -{ - /* bang - we have so much memory */ - struct item *it; - struct item **fuzzymatches = NULL; - char c; - int number_of_matches = 0, i, pidx, sidx, eidx; - int text_len = strlen(text), itext_len; - - matches = matchend = NULL; - - /* walk through all items */ - for (it = items; it && it->text; it++) { - if (text_len) { - itext_len = strlen(it->text); - pidx = 0; /* pointer */ - sidx = eidx = -1; /* start of match, end of match */ - /* walk through item text */ - for (i = 0; i < itext_len && (c = it->text[i]); i++) { - /* fuzzy match pattern */ - if (!fstrncmp(&text[pidx], &c, 1)) { - if(sidx == -1) - sidx = i; - pidx++; - if (pidx == text_len) { - eidx = i; - break; - } - } - } - /* build list of matches */ - if (eidx != -1) { - /* compute distance */ - /* add penalty if match starts late (log(sidx+2)) - * add penalty for long a match without many matching characters */ - it->distance = log(sidx + 2) + (double)(eidx - sidx - text_len); - /* fprintf(stderr, "distance %s %f\n", it->text, it->distance); */ - appenditem(it, &matches, &matchend); - number_of_matches++; - } - } else { - appenditem(it, &matches, &matchend); - } - } - - if (number_of_matches) { - /* initialize array with matches */ - if (!(fuzzymatches = realloc(fuzzymatches, number_of_matches * sizeof(struct item*)))) - die("cannot realloc %u bytes:", number_of_matches * sizeof(struct item*)); - for (i = 0, it = matches; it && i < number_of_matches; i++, it = it->right) { - fuzzymatches[i] = it; - } - /* sort matches according to distance */ - qsort(fuzzymatches, number_of_matches, sizeof(struct item*), compare_distance); - /* rebuild list of matches */ - matches = matchend = NULL; - for (i = 0, it = fuzzymatches[i]; i < number_of_matches && it && \ - it->text; i++, it = fuzzymatches[i]) { - appenditem(it, &matches, &matchend); - } - free(fuzzymatches); - } - curr = sel = matches; - calcoffsets(); -} - -static void -match(void) -{ - if (fuzzy) { - fuzzymatch(); - return; - } - 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; - - mw = MIN(MAX(max_textw() + promptw, 100), info[i].width); - x = info[i].x_org + ((info[i].width - mw) / 2); - y = info[i].y_org + ((info[i].height - mh) / 2); - XFree(info); - } else -#endif - { - if (!XGetWindowAttributes(dpy, parentwin, &wa)) - die("could not get embedding window attributes: 0x%lx", - parentwin); - mw = MIN(MAX(max_textw() + promptw, 100), wa.width); - x = (wa.width - mw) / 2; - y = (wa.height - mh) / 2; - } - 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, border_width, - CopyFromParent, CopyFromParent, CopyFromParent, - CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); - XSetWindowBorder(dpy, win, scheme[SchemeSel][ColBg].pixel); - 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], "-F")) /* grabs keyboard before reading stdin */ - fuzzy = 0; - 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; - -#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/.config/mequidots/dmenu-5.0/dmenu.c.orig b/.config/mequidots/dmenu-5.0/dmenu.c.orig deleted file mode 100644 index e5ea433..0000000 --- a/.config/mequidots/dmenu-5.0/dmenu.c.orig +++ /dev/null @@ -1,781 +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 int (*fstrncmp)(const char *, const char *, size_t) = strncmp; -static char *(*fstrstr)(const char *, const char *) = strstr; - -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; - - mw = MIN(MAX(max_textw() + promptw, 100), info[i].width); - x = info[i].x_org + ((info[i].width - mw) / 2); - y = info[i].y_org + ((info[i].height - mh) / 2); - XFree(info); - } else -#endif - { - if (!XGetWindowAttributes(dpy, parentwin, &wa)) - die("could not get embedding window attributes: 0x%lx", - parentwin); - mw = MIN(MAX(max_textw() + promptw, 100), wa.width); - x = (wa.width - mw) / 2; - y = (wa.height - mh) / 2; - } - 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, border_width, - CopyFromParent, CopyFromParent, CopyFromParent, - CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); - XSetWindowBorder(dpy, win, scheme[SchemeSel][ColBg].pixel); - 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], "-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; - -#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/.config/mequidots/dmenu-5.0/dmenu.o b/.config/mequidots/dmenu-5.0/dmenu.o deleted file mode 100644 index 33a7f520ecadee0f4dc7bf3b6ae445c04c99f3ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35120 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 -#include -#include -#include -#include - -#include "drw.h" -#include "util.h" - -#define UTF_INVALID 0xFFFD -#define UTF_SIZ 4 - -static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; -static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; -static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; -static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; - -static long -utf8decodebyte(const char c, size_t *i) -{ - for (*i = 0; *i < (UTF_SIZ + 1); ++(*i)) - if (((unsigned char)c & utfmask[*i]) == utfbyte[*i]) - return (unsigned char)c & ~utfmask[*i]; - return 0; -} - -static size_t -utf8validate(long *u, size_t i) -{ - if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) - *u = UTF_INVALID; - for (i = 1; *u > utfmax[i]; ++i) - ; - return i; -} - -static size_t -utf8decode(const char *c, long *u, size_t clen) -{ - size_t i, j, len, type; - long udecoded; - - *u = UTF_INVALID; - if (!clen) - return 0; - udecoded = utf8decodebyte(c[0], &len); - if (!BETWEEN(len, 1, UTF_SIZ)) - return 1; - for (i = 1, j = 1; i < clen && j < len; ++i, ++j) { - udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type); - if (type) - return j; - } - if (j < len) - return 0; - *u = udecoded; - utf8validate(u, len); - - return len; -} - -Drw * -drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) -{ - Drw *drw = ecalloc(1, sizeof(Drw)); - - drw->dpy = dpy; - drw->screen = screen; - drw->root = root; - drw->w = w; - drw->h = h; - drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); - drw->gc = XCreateGC(dpy, root, 0, NULL); - XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); - - return drw; -} - -void -drw_resize(Drw *drw, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - drw->w = w; - drw->h = h; - if (drw->drawable) - XFreePixmap(drw->dpy, drw->drawable); - drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); -} - -void -drw_free(Drw *drw) -{ - XFreePixmap(drw->dpy, drw->drawable); - XFreeGC(drw->dpy, drw->gc); - drw_fontset_free(drw->fonts); - free(drw); -} - -/* This function is an implementation detail. Library users should use - * drw_fontset_create instead. - */ -static Fnt * -xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) -{ - Fnt *font; - XftFont *xfont = NULL; - FcPattern *pattern = NULL; - - if (fontname) { - /* Using the pattern found at font->xfont->pattern does not yield the - * same substitution results as using the pattern returned by - * FcNameParse; using the latter results in the desired fallback - * behaviour whereas the former just results in missing-character - * rectangles being drawn, at least with some fonts. */ - if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) { - fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname); - return NULL; - } - if (!(pattern = FcNameParse((FcChar8 *) fontname))) { - fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname); - XftFontClose(drw->dpy, xfont); - return NULL; - } - } else if (fontpattern) { - if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) { - fprintf(stderr, "error, cannot load font from pattern.\n"); - return NULL; - } - } else { - die("no font specified."); - } - - /* Do not allow using color fonts. This is a workaround for a BadLength - * error from Xft with color glyphs. Modelled on the Xterm workaround. See - * https://bugzilla.redhat.com/show_bug.cgi?id=1498269 - * https://lists.suckless.org/dev/1701/30932.html - * https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=916349 - * and lots more all over the internet. - */ - FcBool iscol; - if(FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == FcResultMatch && iscol) { - XftFontClose(drw->dpy, xfont); - return NULL; - } - - font = ecalloc(1, sizeof(Fnt)); - font->xfont = xfont; - font->pattern = pattern; - font->h = xfont->ascent + xfont->descent; - font->dpy = drw->dpy; - - return font; -} - -static void -xfont_free(Fnt *font) -{ - if (!font) - return; - if (font->pattern) - FcPatternDestroy(font->pattern); - XftFontClose(font->dpy, font->xfont); - free(font); -} - -Fnt* -drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) -{ - Fnt *cur, *ret = NULL; - size_t i; - - if (!drw || !fonts) - return NULL; - - for (i = 1; i <= fontcount; i++) { - if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) { - cur->next = ret; - ret = cur; - } - } - return (drw->fonts = ret); -} - -void -drw_fontset_free(Fnt *font) -{ - if (font) { - drw_fontset_free(font->next); - xfont_free(font); - } -} - -void -drw_clr_create(Drw *drw, Clr *dest, const char *clrname) -{ - if (!drw || !dest || !clrname) - return; - - if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen), - clrname, dest)) - die("error, cannot allocate color '%s'", clrname); -} - -/* Wrapper to create color schemes. The caller has to call free(3) on the - * returned color scheme when done using it. */ -Clr * -drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) -{ - size_t i; - Clr *ret; - - /* need at least two colors for a scheme */ - if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor)))) - return NULL; - - for (i = 0; i < clrcount; i++) - drw_clr_create(drw, &ret[i], clrnames[i]); - return ret; -} - -void -drw_setfontset(Drw *drw, Fnt *set) -{ - if (drw) - drw->fonts = set; -} - -void -drw_setscheme(Drw *drw, Clr *scm) -{ - if (drw) - drw->scheme = scm; -} - -void -drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert) -{ - if (!drw || !drw->scheme) - return; - XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel); - if (filled) - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - else - XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1); -} - -int -drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert) -{ - char buf[1024]; - int ty; - unsigned int ew; - XftDraw *d = NULL; - Fnt *usedfont, *curfont, *nextfont; - size_t i, len; - int utf8strlen, utf8charlen, render = x || y || w || h; - long utf8codepoint = 0; - const char *utf8str; - FcCharSet *fccharset; - FcPattern *fcpattern; - FcPattern *match; - XftResult result; - int charexists = 0; - - if (!drw || (render && !drw->scheme) || !text || !drw->fonts) - return 0; - - if (!render) { - w = ~w; - } else { - XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - d = XftDrawCreate(drw->dpy, drw->drawable, - DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen)); - x += lpad; - w -= lpad; - } - - usedfont = drw->fonts; - while (1) { - utf8strlen = 0; - utf8str = text; - nextfont = NULL; - while (*text) { - utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ); - for (curfont = drw->fonts; curfont; curfont = curfont->next) { - charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); - if (charexists) { - if (curfont == usedfont) { - utf8strlen += utf8charlen; - text += utf8charlen; - } else { - nextfont = curfont; - } - break; - } - } - - if (!charexists || nextfont) - break; - else - charexists = 0; - } - - if (utf8strlen) { - drw_font_getexts(usedfont, utf8str, utf8strlen, &ew, NULL); - /* shorten text if necessary */ - for (len = MIN(utf8strlen, sizeof(buf) - 1); len && ew > w; len--) - drw_font_getexts(usedfont, utf8str, len, &ew, NULL); - - if (len) { - memcpy(buf, utf8str, len); - buf[len] = '\0'; - if (len < utf8strlen) - for (i = len; i && i > len - 3; buf[--i] = '.') - ; /* NOP */ - - if (render) { - ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; - XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], - usedfont->xfont, x, ty, (XftChar8 *)buf, len); - } - x += ew; - w -= ew; - } - } - - if (!*text) { - break; - } else if (nextfont) { - charexists = 0; - usedfont = nextfont; - } else { - /* Regardless of whether or not a fallback font is found, the - * character must be drawn. */ - charexists = 1; - - fccharset = FcCharSetCreate(); - FcCharSetAddChar(fccharset, utf8codepoint); - - if (!drw->fonts->pattern) { - /* Refer to the comment in xfont_create for more information. */ - die("the first font in the cache must be loaded from a font string."); - } - - fcpattern = FcPatternDuplicate(drw->fonts->pattern); - FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset); - FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue); - FcPatternAddBool(fcpattern, FC_COLOR, FcFalse); - - FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); - FcDefaultSubstitute(fcpattern); - match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); - - FcCharSetDestroy(fccharset); - FcPatternDestroy(fcpattern); - - if (match) { - usedfont = xfont_create(drw, NULL, match); - if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) { - for (curfont = drw->fonts; curfont->next; curfont = curfont->next) - ; /* NOP */ - curfont->next = usedfont; - } else { - xfont_free(usedfont); - usedfont = drw->fonts; - } - } - } - } - if (d) - XftDrawDestroy(d); - - return x + (render ? w : 0); -} - -void -drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y); - XSync(drw->dpy, False); -} - -unsigned int -drw_fontset_getwidth(Drw *drw, const char *text) -{ - if (!drw || !drw->fonts || !text) - return 0; - return drw_text(drw, 0, 0, 0, 0, 0, text, 0); -} - -void -drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h) -{ - XGlyphInfo ext; - - if (!font || !text) - return; - - XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext); - if (w) - *w = ext.xOff; - if (h) - *h = font->h; -} - -Cur * -drw_cur_create(Drw *drw, int shape) -{ - Cur *cur; - - if (!drw || !(cur = ecalloc(1, sizeof(Cur)))) - return NULL; - - cur->cursor = XCreateFontCursor(drw->dpy, shape); - - return cur; -} - -void -drw_cur_free(Drw *drw, Cur *cursor) -{ - if (!cursor) - return; - - XFreeCursor(drw->dpy, cursor->cursor); - free(cursor); -} diff --git a/.config/mequidots/dmenu-5.0/drw.h b/.config/mequidots/dmenu-5.0/drw.h deleted file mode 100644 index 4c67419..0000000 --- a/.config/mequidots/dmenu-5.0/drw.h +++ /dev/null @@ -1,57 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -typedef struct { - Cursor cursor; -} Cur; - -typedef struct Fnt { - Display *dpy; - unsigned int h; - XftFont *xfont; - FcPattern *pattern; - struct Fnt *next; -} Fnt; - -enum { ColFg, ColBg }; /* Clr scheme index */ -typedef XftColor Clr; - -typedef struct { - unsigned int w, h; - Display *dpy; - int screen; - Window root; - Drawable drawable; - GC gc; - Clr *scheme; - Fnt *fonts; -} Drw; - -/* Drawable abstraction */ -Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h); -void drw_resize(Drw *drw, unsigned int w, unsigned int h); -void drw_free(Drw *drw); - -/* Fnt abstraction */ -Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount); -void drw_fontset_free(Fnt* set); -unsigned int drw_fontset_getwidth(Drw *drw, const char *text); -void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); - -/* Colorscheme abstraction */ -void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); -Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); - -/* Cursor abstraction */ -Cur *drw_cur_create(Drw *drw, int shape); -void drw_cur_free(Drw *drw, Cur *cursor); - -/* Drawing context manipulation */ -void drw_setfontset(Drw *drw, Fnt *set); -void drw_setscheme(Drw *drw, Clr *scm); - -/* Drawing functions */ -void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert); -int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert); - -/* Map functions */ -void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); diff --git a/.config/mequidots/dmenu-5.0/drw.o b/.config/mequidots/dmenu-5.0/drw.o deleted file mode 100644 index 57700fd5a8de8afefcb924e12f501da0236c1fb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10584 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 N$<$a@W>Ch8e+MEzfm8qh diff --git a/.config/mequidots/dmenu-5.0/stest.1 b/.config/mequidots/dmenu-5.0/stest.1 deleted file mode 100644 index 2667d8a..0000000 --- a/.config/mequidots/dmenu-5.0/stest.1 +++ /dev/null @@ -1,90 +0,0 @@ -.TH STEST 1 dmenu\-VERSION -.SH NAME -stest \- filter a list of files by properties -.SH SYNOPSIS -.B stest -.RB [ -abcdefghlpqrsuwx ] -.RB [ -n -.IR file ] -.RB [ -o -.IR file ] -.RI [ file ...] -.SH DESCRIPTION -.B stest -takes a list of files and filters by the files' properties, analogous to -.IR test (1). -Files which pass all tests are printed to stdout. If no files are given, stest -reads files from stdin. -.SH OPTIONS -.TP -.B \-a -Test hidden files. -.TP -.B \-b -Test that files are block specials. -.TP -.B \-c -Test that files are character specials. -.TP -.B \-d -Test that files are directories. -.TP -.B \-e -Test that files exist. -.TP -.B \-f -Test that files are regular files. -.TP -.B \-g -Test that files have their set-group-ID flag set. -.TP -.B \-h -Test that files are symbolic links. -.TP -.B \-l -Test the contents of a directory given as an argument. -.TP -.BI \-n " file" -Test that files are newer than -.IR file . -.TP -.BI \-o " file" -Test that files are older than -.IR file . -.TP -.B \-p -Test that files are named pipes. -.TP -.B \-q -No files are printed, only the exit status is returned. -.TP -.B \-r -Test that files are readable. -.TP -.B \-s -Test that files are not empty. -.TP -.B \-u -Test that files have their set-user-ID flag set. -.TP -.B \-v -Invert the sense of tests, only failing files pass. -.TP -.B \-w -Test that files are writable. -.TP -.B \-x -Test that files are executable. -.SH EXIT STATUS -.TP -.B 0 -At least one file passed all tests. -.TP -.B 1 -No files passed all tests. -.TP -.B 2 -An error occurred. -.SH SEE ALSO -.IR dmenu (1), -.IR test (1) diff --git a/.config/mequidots/dmenu-5.0/stest.c b/.config/mequidots/dmenu-5.0/stest.c deleted file mode 100644 index 7a7b0bc..0000000 --- a/.config/mequidots/dmenu-5.0/stest.c +++ /dev/null @@ -1,109 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include - -#include -#include -#include -#include -#include -#include - -#include "arg.h" -char *argv0; - -#define FLAG(x) (flag[(x)-'a']) - -static void test(const char *, const char *); -static void usage(void); - -static int match = 0; -static int flag[26]; -static struct stat old, new; - -static void -test(const char *path, const char *name) -{ - struct stat st, ln; - - if ((!stat(path, &st) && (FLAG('a') || name[0] != '.') /* hidden files */ - && (!FLAG('b') || S_ISBLK(st.st_mode)) /* block special */ - && (!FLAG('c') || S_ISCHR(st.st_mode)) /* character special */ - && (!FLAG('d') || S_ISDIR(st.st_mode)) /* directory */ - && (!FLAG('e') || access(path, F_OK) == 0) /* exists */ - && (!FLAG('f') || S_ISREG(st.st_mode)) /* regular file */ - && (!FLAG('g') || st.st_mode & S_ISGID) /* set-group-id flag */ - && (!FLAG('h') || (!lstat(path, &ln) && S_ISLNK(ln.st_mode))) /* symbolic link */ - && (!FLAG('n') || st.st_mtime > new.st_mtime) /* newer than file */ - && (!FLAG('o') || st.st_mtime < old.st_mtime) /* older than file */ - && (!FLAG('p') || S_ISFIFO(st.st_mode)) /* named pipe */ - && (!FLAG('r') || access(path, R_OK) == 0) /* readable */ - && (!FLAG('s') || st.st_size > 0) /* not empty */ - && (!FLAG('u') || st.st_mode & S_ISUID) /* set-user-id flag */ - && (!FLAG('w') || access(path, W_OK) == 0) /* writable */ - && (!FLAG('x') || access(path, X_OK) == 0)) != FLAG('v')) { /* executable */ - if (FLAG('q')) - exit(0); - match = 1; - puts(name); - } -} - -static void -usage(void) -{ - fprintf(stderr, "usage: %s [-abcdefghlpqrsuvwx] " - "[-n file] [-o file] [file...]\n", argv0); - exit(2); /* like test(1) return > 1 on error */ -} - -int -main(int argc, char *argv[]) -{ - struct dirent *d; - char path[PATH_MAX], *line = NULL, *file; - size_t linesiz = 0; - ssize_t n; - DIR *dir; - int r; - - ARGBEGIN { - case 'n': /* newer than file */ - case 'o': /* older than file */ - file = EARGF(usage()); - if (!(FLAG(ARGC()) = !stat(file, (ARGC() == 'n' ? &new : &old)))) - perror(file); - break; - default: - /* miscellaneous operators */ - if (strchr("abcdefghlpqrsuvwx", ARGC())) - FLAG(ARGC()) = 1; - else - usage(); /* unknown flag */ - } ARGEND; - - if (!argc) { - /* read list from stdin */ - while ((n = getline(&line, &linesiz, stdin)) > 0) { - if (n && line[n - 1] == '\n') - line[n - 1] = '\0'; - test(line, line); - } - free(line); - } else { - for (; argc; argc--, argv++) { - if (FLAG('l') && (dir = opendir(*argv))) { - /* test directory contents */ - while ((d = readdir(dir))) { - r = snprintf(path, sizeof path, "%s/%s", - *argv, d->d_name); - if (r >= 0 && (size_t)r < sizeof path) - test(path, d->d_name); - } - closedir(dir); - } else { - test(*argv, *argv); - } - } - } - return match ? 0 : 1; -} diff --git a/.config/mequidots/dmenu-5.0/stest.o b/.config/mequidots/dmenu-5.0/stest.o deleted file mode 100644 index 4ffa35781ceb87544318703168121b14c0b3d301..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5296 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 G$Nv|r18WKZ diff --git a/.config/mequidots/dmenu-5.0/util.c b/.config/mequidots/dmenu-5.0/util.c deleted file mode 100644 index fe044fc..0000000 --- a/.config/mequidots/dmenu-5.0/util.c +++ /dev/null @@ -1,35 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include - -#include "util.h" - -void * -ecalloc(size_t nmemb, size_t size) -{ - void *p; - - if (!(p = calloc(nmemb, size))) - die("calloc:"); - return p; -} - -void -die(const char *fmt, ...) { - va_list ap; - - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - - if (fmt[0] && fmt[strlen(fmt)-1] == ':') { - fputc(' ', stderr); - perror(NULL); - } else { - fputc('\n', stderr); - } - - exit(1); -} diff --git a/.config/mequidots/dmenu-5.0/util.h b/.config/mequidots/dmenu-5.0/util.h deleted file mode 100644 index f633b51..0000000 --- a/.config/mequidots/dmenu-5.0/util.h +++ /dev/null @@ -1,8 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -#define MAX(A, B) ((A) > (B) ? (A) : (B)) -#define MIN(A, B) ((A) < (B) ? (A) : (B)) -#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B)) - -void die(const char *fmt, ...); -void *ecalloc(size_t nmemb, size_t size); diff --git a/.config/mequidots/dmenu-5.0/util.o b/.config/mequidots/dmenu-5.0/util.o deleted file mode 100644 index 3b48c2f667e0d2c6574012f800ee0078a6ec0b61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2256 zcmbuAO-vI(6vy8dl!~RTzyX7Y9#%sW+)xuEsY(hISal->YD6xzl&v)O%k9>Hnurk( zP1A&f2M-=Ncro!{qDK=NJ$U8lNj#e10S_JwCiT7D8JKL^i@s#?-u&MG&CJfs?mnK- zCS8&Q+$0!*!ycyqu_K3Z#0n$eg)W#=EBoq`AKwtE6;mEoD{(oZRy0}FDp5J6VKl#9 zH^aVQRKD#CYI4yRd@iq{+!uT)Z&?17ylMG2@>|Qlm+O}QAaA2zQmgH!2QW}^z=2R* ztzO0s_P(mMb$O2^`qWxn_N%q1JoGs#``w7q_YSdi;5!Deb`jL-d5X+IwX#DCc3TOx ziqYDmwnn(zvlYO+MMDkC?RIW;aGA@L9d=QES$UEU@q?mCR-fsW8CQ_;@%l zFm?S#Fc1nUA%)fg?brg?Xge_lE|BWP_?}Cwe+(H}ukAp3FbmR(U+VXCxHnMThx`=F z{U$%^^*?o8_3p9UFw31}xtm@$Bh4Mn-wr<;&9ZF=t2@lvqY0OSrMl2}3wmp9$WCDM zGmYrzIht{$1;5aOkF?;?7W`TZ9z#y+=j*oi57|r$J(SH%R!M=PjSs<6Mu(EQq#Fh# zrnKp?Q7th&IXO2GPsB&Zw21`VPZy0$-b|y)$m)4W7t3Y}idaxEKwrt2pxf66$~YgH z3mfh7pN4I(38K-R>A=SMJA!CV{YM*HdO9<%{~~a@Yn<;0oNhhmy8;*WzXX0<(C-VJ z?gSsFgI#o5XPdx1jMH;bMJHF zOGz^c%3`Smicz2r$?+uxB~{4f^gK%P1yfh>6+K%rlc~F`eW@w=PUa^AHZ_jildHUBCOxd_KBw*UFgRI?O%ion14Z=jpk+rbXFAduL8Y?WM{Au zXL3T8%{nJy+=&N~)0qESAHrH1^BgwO`22jmJjdtfK7t8~t&c4ip$txn zFj1Q00ueUR-a>vBHNJ=BuaS-;8Z>H8#_vp$Q-X6L_25RK1I=TGl3 zujl9AY;LNf{|Z@*c@M@kq_dvJbe=sTh%h)$9l_Xe2Za6;&FZ(=`X3%B?Z8?87wdl# AdH?_b diff --git a/.config/mequidots/packagelist b/.config/mequidots/packagelist index ee30ecb..dfac59c 100644 --- a/.config/mequidots/packagelist +++ b/.config/mequidots/packagelist @@ -32,6 +32,8 @@ python-pywal qpwgraph qtile ripgrep +rofi +rofi-calc themix-theme-oomox-git thunar thunar-archive-plugin diff --git a/.config/scripts/util/dcalc b/.config/scripts/util/dcalc deleted file mode 100755 index 1704b6f..0000000 --- a/.config/scripts/util/dcalc +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -choice=$(echo -e " " | dmenu -p "calc") - -while :; do - case $choice in - - "exit") - break - ;; - - "copy") - echo $answer | xclip -selection clipboard - break - ;; - - *) - answer=$(qalc $choice) - ;; - - esac - choice=$(echo -e "copy\nexit " | dmenu -p "$answer") -done