From f8838aef8e144e0e9fffe4e6e5eedadb72e68b62 Mon Sep 17 00:00:00 2001 From: Patryk Niedźwiedziński Date: Sun, 13 Sep 2020 11:51:18 +0200 Subject: Add mac like dmenu --- pkgs/dmenu/default.nix | 4 +- pkgs/dmenu/mac-like.diff | 211 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 pkgs/dmenu/mac-like.diff diff --git a/pkgs/dmenu/default.nix b/pkgs/dmenu/default.nix index acb275a..6898019 100644 --- a/pkgs/dmenu/default.nix +++ b/pkgs/dmenu/default.nix @@ -13,7 +13,9 @@ stdenv.mkDerivation rec { buildInputs = [ libX11 libXinerama zlib libXft ]; - inherit patches; + patches = [ + ./mac-like.diff + ]; postPatch = '' sed -ri -e 's!\<(dmenu|dmenu_path|stest)\>!'"$out/bin"'/&!g' dmenu_run diff --git a/pkgs/dmenu/mac-like.diff b/pkgs/dmenu/mac-like.diff new file mode 100644 index 0000000..fb290d5 --- /dev/null +++ b/pkgs/dmenu/mac-like.diff @@ -0,0 +1,211 @@ +diff --git a/.gitignore b/.gitignore +new file mode 100644 +index 0000000..10717b6 +--- /dev/null ++++ b/.gitignore +@@ -0,0 +1,3 @@ ++*.o ++dmenu ++stest +diff --git a/README.md b/README.md +index 79eba94..7653060 100644 +--- a/README.md ++++ b/README.md +@@ -1,4 +1,18 @@ +-# Luke's dmenu ++# Patryk's dmenu ++ ++My patched dmenu configuration. ++ ++- He uses inconsolata ++- He centers `-c` ++- He borders `-bw` ++- He's vertical `-l 10` ++ ++## Installation ++ ++```sh ++make ++sudo make install ++``` + + Extra stuff added to vanilla dmenu: + +diff --git a/config.def.h b/config.def.h +new file mode 100644 +index 0000000..783b5ac +--- /dev/null ++++ b/config.def.h +@@ -0,0 +1,38 @@ ++/* 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 = 0; /* -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[] = { ++ "Inconsolata-14", ++// "JoyPixels:pixelsize=10:antialias=true:autohint=true" ++}; ++static const unsigned int bgalpha = 0xe0; ++static const unsigned int fgalpha = OPAQUE; ++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" }, ++}; ++static const unsigned int alphas[SchemeLast][2] = { ++ /* fgalpha bgalphga */ ++ [SchemeNorm] = { fgalpha, bgalpha }, ++ [SchemeSel] = { fgalpha, bgalpha }, ++ [SchemeOut] = { fgalpha, bgalpha }, ++}; ++ ++/* -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 unsigned int border_width = 0; +diff --git a/config.h b/config.h +index 5fbe225..f3ae7f1 100644 +--- a/config.h ++++ b/config.h +@@ -2,6 +2,8 @@ + /* Default settings; can be overriden by command line. */ + + static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ ++static int centered = 0; /* -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", +@@ -31,3 +33,6 @@ static unsigned int lines = 0; + * for example: " /?\"&[]" + */ + static const char worddelimiters[] = " "; ++ ++/* Size of the window border */ ++static unsigned int border_width = 0; +diff --git a/dmenu.1 b/dmenu.1 +index 4c87074..d408f03 100644 +--- a/dmenu.1 ++++ b/dmenu.1 +@@ -40,6 +40,9 @@ which lists programs in the user's $PATH and runs the result in their $SHELL. + .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. +diff --git a/dmenu.c b/dmenu.c +index 7174098..0cde275 100644 +--- a/dmenu.c ++++ b/dmenu.c +@@ -138,6 +138,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) + { +@@ -796,6 +805,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))) { +@@ -822,9 +832,16 @@ 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; ++ 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 +@@ -832,11 +849,17 @@ setup(void) + if (!XGetWindowAttributes(dpy, parentwin, &wa)) + die("could not get embedding window attributes: 0x%lx", + parentwin); +- x = 0; +- y = topbar ? 0 : wa.height - mh; +- mw = wa.width; ++ ++ if (centered) { ++ mw = MIN(MAX(max_textw() + promptw, min_width), wa.width); ++ x = (wa.width - mw) / 2; ++ y = (wa.height - mh) / 2; ++ } else { ++ x = 0; ++ y = topbar ? 0 : wa.height - mh; ++ mw = wa.width; ++ } + } +- promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; + inputw = MIN(inputw, mw/3); + match(); + +@@ -847,9 +870,11 @@ setup(void) + swa.colormap = cmap; + swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask | + ButtonPressMask; +- win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0, ++ win = XCreateWindow(dpy, parentwin, x, y, mw, mh, border_width, + depth, InputOutput, visual, + CWOverrideRedirect | CWBackPixel | CWColormap | CWEventMask | CWBorderPixel, &swa); ++ if (border_width) ++ XSetWindowBorder(dpy, win, scheme[SchemeSel][ColBg].pixel); + XSetClassHint(dpy, win, &ch); + + /* open input methods */ +@@ -920,6 +945,8 @@ main(int argc, char *argv[]) + topbar = 0; + else if (!strcmp(argv[i], "-f")) /* grabs keyboard before reading stdin */ + fast = 1; ++ else if (!strcmp(argv[i], "-c")) /* centers dmenu on screen */ ++ centered = 1; + else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ + fstrncmp = strncasecmp; + fstrstr = cistrstr; +@@ -948,6 +975,8 @@ main(int argc, char *argv[]) + colors[SchemeSel][ColFg] = argv[++i]; + else if (!strcmp(argv[i], "-w")) /* embedding window id */ + embed = argv[++i]; ++ else if (!strcmp(argv[i], "-bw")) ++ border_width = atoi(argv[++i]); /* border width */ + else + usage(); -- cgit 1.4.1