dmenu

my build of dynamic menu
git clone git://git.kocotian.pl/dmenu.git
Log | Files | Refs | README | LICENSE

commit 61609f8701ef0405749be3112afdf66a89646897
parent 43f7441fb8d1d9ea2a456ef9091d0ef138fbca1a
Author: kocotian <kocotian@kocotian.pl>
Date:   Tue,  2 Feb 2021 09:24:39 +0100

x/y/z offset

Diffstat:
Mconfig.def.h | 10+++++-----
Mdmenu.1 | 24++++++++++++++++++++++++
Mdmenu.c | 23+++++++++++++++++------
Apatches/dmenu-xyw-5.0.diff | 116+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 162 insertions(+), 11 deletions(-)

diff --git a/config.def.h b/config.def.h @@ -12,11 +12,11 @@ static const char *fonts[] = { static const char *prompt = NULL; /* -p option; prompt to the left of input field */ static const char *colors[SchemeLast][2] = { /* fg bg */ - [SchemeNorm] = { "#aaaaaa", "#222222" }, - [SchemeSel] = { "#ffffff", "#444444" }, - [SchemePrpt] = { "#ffffff", "#444444" }, - [SchemeLnNorm] = { "#444444", "#444444" }, - [SchemeLnSel] = { "#d79921", "#d79921" }, + [SchemeNorm] = { "#aaaaaa", "#000000" }, + [SchemeSel] = { "#ffffff", "#222222" }, + [SchemePrpt] = { "#ffffff", "#222222" }, + [SchemeLnNorm] = { "#222222", "#222222" }, + [SchemeLnSel] = { "#98971a", "#98971a" }, [SchemeOut] = { "#000000", "#00ffff" }, }; /* -l and -g options; controls number of lines and columns in grid if > 0 */ diff --git a/dmenu.1 b/dmenu.1 @@ -12,6 +12,12 @@ dmenu \- dynamic menu .IR height ] .RB [ \-m .IR monitor ] +.RB [ \-x +.IR xoffset ] +.RB [ \-y +.IR yoffset ] +.RB [ \-z +.IR width ] .RB [ \-p .IR prompt ] .RB [ \-fn @@ -67,6 +73,24 @@ dmenu uses a menu line of at least 'height' pixels tall, but no less than 8. dmenu is displayed on the monitor number supplied. Monitor numbers are starting from 0. .TP +.BI \-x " xoffset" +dmenu is placed at this offset measured from the left side of the monitor. +Can be negative. +If option +.B \-m +is present, the measurement will use the given monitor. +.TP +.BI \-y " yoffset" +dmenu is placed at this offset measured from the top of the monitor. If the +.B \-b +option is used, the offset is measured from the bottom. Can be negative. +If option +.B \-m +is present, the measurement will use the given monitor. +.TP +.BI \-z " width" +sets the width of the dmenu window. +.TP .BI \-p " prompt" defines the prompt to be displayed to the left of the input field. .TP diff --git a/dmenu.c b/dmenu.c @@ -42,6 +42,9 @@ struct item { static char text[BUFSIZ] = ""; static char *embed; static int bh, mw, mh; +static int dmx = 0; /* put dmenu at this x offset */ +static int dmy = 0; /* put dmenu at this y offset (measured from the bottom if topbar is 0) */ +static unsigned int dmw = 0; /* make dmenu this wide */ static int inputw = 0, promptw; static int lrpad; /* sum of left and right padding */ static size_t cursor; @@ -794,9 +797,11 @@ 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; + /* x = info[i].x_org + dmx; */ + /* y = info[i].y_org + (topbar ? dmy : info[i].height - mh - dmy); */ + x = dmx ? dmx : info[i].x_org; + y = dmy ? dmy : info[i].y_org + (topbar ? dmy : info[i].height - mh); + mw = (dmw>0 ? dmw : info[i].width); XFree(info); } else #endif @@ -804,9 +809,9 @@ setup(void) if (!XGetWindowAttributes(dpy, parentwin, &wa)) die("could not get embedding window attributes: 0x%lx", parentwin); - x = 0; - y = topbar ? 0 : wa.height - mh; - mw = wa.width; + x = dmx; + y = topbar ? dmy : wa.height - mh - dmy; + mw = (dmw>0 ? dmw : wa.width); } promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; inputw = MIN(inputw, mw/3); @@ -888,6 +893,12 @@ main(int argc, char *argv[]) lineheight = atoi(argv[++i]); lineheight = MAX(lineheight, min_lineheight); } + else if (!strcmp(argv[i], "-x")) /* window x offset */ + dmx = atoi(argv[++i]); + else if (!strcmp(argv[i], "-y")) /* window y offset (from bottom up if -b) */ + dmy = atoi(argv[++i]); + else if (!strcmp(argv[i], "-z")) /* make dmenu this wide */ + dmw = atoi(argv[++i]); else if (!strcmp(argv[i], "-m")) mon = atoi(argv[++i]); else if (!strcmp(argv[i], "-p")) /* adds prompt to left of input field */ diff --git a/patches/dmenu-xyw-5.0.diff b/patches/dmenu-xyw-5.0.diff @@ -0,0 +1,116 @@ +From 7dc7cb96cdda9ad66e33109223c4cc297a7721d1 Mon Sep 17 00:00:00 2001 +From: Alex Cole <ajzcole@airmail.cc> +Date: Tue, 6 Oct 2020 10:42:07 +1300 +Subject: [PATCH] Updated xyw for 5.0 properly + +--- + dmenu.1 | 24 ++++++++++++++++++++++++ + dmenu.c | 22 ++++++++++++++++------ + 2 files changed, 40 insertions(+), 6 deletions(-) + +diff --git a/dmenu.1 b/dmenu.1 +index 323f93c..a4ecbbb 100644 +--- a/dmenu.1 ++++ b/dmenu.1 +@@ -8,6 +8,12 @@ dmenu \- dynamic menu + .IR lines ] + .RB [ \-m + .IR monitor ] ++.RB [ \-x ++.IR xoffset ] ++.RB [ \-y ++.IR yoffset ] ++.RB [ \-z ++.IR width ] + .RB [ \-p + .IR prompt ] + .RB [ \-fn +@@ -54,6 +60,24 @@ dmenu lists items vertically, with the given number of lines. + dmenu is displayed on the monitor number supplied. Monitor numbers are starting + from 0. + .TP ++.BI \-x " xoffset" ++dmenu is placed at this offset measured from the left side of the monitor. ++Can be negative. ++If option ++.B \-m ++is present, the measurement will use the given monitor. ++.TP ++.BI \-y " yoffset" ++dmenu is placed at this offset measured from the top of the monitor. If the ++.B \-b ++option is used, the offset is measured from the bottom. Can be negative. ++If option ++.B \-m ++is present, the measurement will use the given monitor. ++.TP ++.BI \-z " width" ++sets the width of the dmenu window. ++.TP + .BI \-p " prompt" + defines the prompt to be displayed to the left of the input field. + .TP +diff --git a/dmenu.c b/dmenu.c +index 65f25ce..7be19ae 100644 +--- a/dmenu.c ++++ b/dmenu.c +@@ -37,6 +37,9 @@ struct item { + static char text[BUFSIZ] = ""; + static char *embed; + static int bh, mw, mh; ++static int dmx = 0; /* put dmenu at this x offset */ ++static int dmy = 0; /* put dmenu at this y offset (measured from the bottom if topbar is 0) */ ++static unsigned int dmw = 0; /* make dmenu this wide */ + static int inputw = 0, promptw; + static int lrpad; /* sum of left and right padding */ + static size_t cursor; +@@ -637,9 +640,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; ++ x = info[i].x_org + dmx; ++ y = info[i].y_org + (topbar ? dmy : info[i].height - mh - dmy); ++ mw = (dmw>0 ? dmw : info[i].width); + XFree(info); + } else + #endif +@@ -647,9 +650,9 @@ setup(void) + if (!XGetWindowAttributes(dpy, parentwin, &wa)) + die("could not get embedding window attributes: 0x%lx", + parentwin); +- x = 0; +- y = topbar ? 0 : wa.height - mh; +- mw = wa.width; ++ x = dmx; ++ y = topbar ? dmy : wa.height - mh - dmy; ++ mw = (dmw>0 ? dmw : wa.width); + } + promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; + inputw = MIN(inputw, mw/3); +@@ -690,6 +693,7 @@ static void + usage(void) + { + fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" ++ " [-x xoffset] [-y yoffset] [-z width]\n" + " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); + exit(1); + } +@@ -717,6 +721,12 @@ main(int argc, char *argv[]) + /* these options take one argument */ + else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */ + lines = atoi(argv[++i]); ++ else if (!strcmp(argv[i], "-x")) /* window x offset */ ++ dmx = atoi(argv[++i]); ++ else if (!strcmp(argv[i], "-y")) /* window y offset (from bottom up if -b) */ ++ dmy = atoi(argv[++i]); ++ else if (!strcmp(argv[i], "-z")) /* make dmenu this wide */ ++ dmw = atoi(argv[++i]); + else if (!strcmp(argv[i], "-m")) + mon = atoi(argv[++i]); + else if (!strcmp(argv[i], "-p")) /* adds prompt to left of input field */ +-- +2.28.0 +