summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xdmenubin43080 -> 43080 bytes
-rw-r--r--dmenu-grid-4.9.diff107
-rw-r--r--dmenu.c44
-rw-r--r--dmenu.c.orig27
-rw-r--r--dmenu.obin36776 -> 37344 bytes
5 files changed, 63 insertions, 115 deletions
diff --git a/dmenu b/dmenu
index b1a59d9..81b861e 100755
--- a/dmenu
+++ b/dmenu
Binary files differ
diff --git a/dmenu-grid-4.9.diff b/dmenu-grid-4.9.diff
deleted file mode 100644
index c27689b..0000000
--- a/dmenu-grid-4.9.diff
+++ /dev/null
@@ -1,107 +0,0 @@
-From 39ab9676914bd0d8105d0f96bbd7611a53077438 Mon Sep 17 00:00:00 2001
-From: Miles Alan <m@milesalan.com>
-Date: Sat, 4 Jul 2020 11:19:04 -0500
-Subject: [PATCH] Add -g option to display entries in the given number of grid
- columns
-
-This option can be used in conjunction with -l to format dmenu's options in
-arbitrary size grids. For example, to create a 4 column by 6 line grid, you
-could use: dmenu -g 4 -l 6
----
- config.def.h | 3 ++-
- dmenu.1 | 7 ++++++-
- dmenu.c | 22 ++++++++++++++++------
- 3 files changed, 24 insertions(+), 8 deletions(-)
-
-diff --git a/config.def.h b/config.def.h
-index 1edb647..96cf3c9 100644
---- a/config.def.h
-+++ b/config.def.h
-@@ -13,8 +13,9 @@ static const char *colors[SchemeLast][2] = {
- [SchemeSel] = { "#eeeeee", "#005577" },
- [SchemeOut] = { "#000000", "#00ffff" },
- };
--/* -l option; if nonzero, dmenu uses vertical list with given number of lines */
-+/* -l and -g options; controls number of lines and columns in grid if > 0 */
- static unsigned int lines = 0;
-+static unsigned int columns = 0;
-
- /*
- * Characters not considered part of a word while deleting words
-diff --git a/dmenu.1 b/dmenu.1
-index 323f93c..d0a734a 100644
---- a/dmenu.1
-+++ b/dmenu.1
-@@ -4,6 +4,8 @@ dmenu \- dynamic menu
- .SH SYNOPSIS
- .B dmenu
- .RB [ \-bfiv ]
-+.RB [ \-g
-+.IR columns ]
- .RB [ \-l
- .IR lines ]
- .RB [ \-m
-@@ -47,8 +49,11 @@ is faster, but will lock up X until stdin reaches end\-of\-file.
- .B \-i
- dmenu matches menu items case insensitively.
- .TP
-+.BI \-g " columns"
-+dmenu lists items in a grid with the given number of columns.
-+.TP
- .BI \-l " lines"
--dmenu lists items vertically, with the given number of lines.
-+dmenu lists items in a grid with the given number of lines.
- .TP
- .BI \-m " monitor"
- dmenu is displayed on the monitor number supplied. Monitor numbers are starting
-diff --git a/dmenu.c b/dmenu.c
-index 6b8f51b..d79b6bb 100644
---- a/dmenu.c
-+++ b/dmenu.c
-@@ -77,7 +77,7 @@ calcoffsets(void)
- int i, n;
-
- if (lines > 0)
-- n = lines * bh;
-+ n = lines * columns * bh;
- else
- n = mw - (promptw + inputw + TEXTW("<") + TEXTW(">"));
- /* calculate which items will begin the next page and previous page */
-@@ -152,9 +152,15 @@ drawmenu(void)
- }
-
- if (lines > 0) {
-- /* draw vertical list */
-- for (item = curr; item != next; item = item->right)
-- drawitem(item, x, y += bh, mw - x);
-+ /* draw grid */
-+ int i = 0;
-+ for (item = curr; item != next; item = item->right, i++)
-+ drawitem(
-+ item,
-+ x + ((i / lines) * ((mw - x) / columns)),
-+ y + (((i % lines) + 1) * bh),
-+ (mw - x) / columns
-+ );
- } else if (matches) {
- /* draw horizontal list */
- x += inputw;
-@@ -708,9 +714,13 @@ main(int argc, char *argv[])
- } else if (i + 1 == argc)
- usage();
- /* these options take one argument */
-- else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */
-+ else if (!strcmp(argv[i], "-g")) { /* number of columns in grid */
-+ columns = atoi(argv[++i]);
-+ if (lines == 0) lines = 1;
-+ } else if (!strcmp(argv[i], "-l")) { /* number of lines in grid */
- lines = atoi(argv[++i]);
-- else if (!strcmp(argv[i], "-m"))
-+ if (columns == 0) columns = 1;
-+ } 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];
---
-2.23.1
-
diff --git a/dmenu.c b/dmenu.c
index 69a5e07..0757615 100644
--- a/dmenu.c
+++ b/dmenu.c
@@ -377,6 +377,8 @@ keypress(XKeyEvent *ev)
int len;
KeySym ksym;
Status status;
+ int i, offscreen = 0;
+ struct item *tmpsel;
len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status);
switch (status) {
@@ -503,6 +505,27 @@ insert:
calcoffsets();
break;
case XK_Left:
+ if (columns > 1) {
+ if (!sel)
+ return;
+ tmpsel = sel;
+ for (i = 0; i < lines; i++) {
+ if (!tmpsel->left || tmpsel->left->right != tmpsel) {
+ if (offscreen)
+ break;
+ return;
+ }
+ if (tmpsel == curr)
+ offscreen = 1;
+ tmpsel = tmpsel->left;
+ }
+ sel = tmpsel;
+ if (offscreen) {
+ curr = prev;
+ calcoffsets();
+ }
+ break;
+ }
if (cursor > 0 && (!sel || !sel->left || lines > 0)) {
cursor = nextrune(-1);
break;
@@ -539,6 +562,27 @@ insert:
sel->out = 1;
break;
case XK_Right:
+ if (columns > 1) {
+ if (!sel)
+ return;
+ tmpsel = sel;
+ for (i = 0; i < lines; i++) {
+ if (!tmpsel->right || tmpsel->right->left != tmpsel) {
+ if (offscreen)
+ break;
+ return;
+ }
+ tmpsel = tmpsel->right;
+ if (tmpsel == next)
+ offscreen = 1;
+ }
+ sel = tmpsel;
+ if (offscreen) {
+ curr = next;
+ calcoffsets();
+ }
+ break;
+ }
if (text[cursor] != '\0') {
cursor = nextrune(+1);
break;
diff --git a/dmenu.c.orig b/dmenu.c.orig
index 9f17c7d..69a5e07 100644
--- a/dmenu.c.orig
+++ b/dmenu.c.orig
@@ -84,7 +84,7 @@ calcoffsets(void)
int i, n;
if (lines > 0)
- n = lines * bh;
+ n = lines * columns * bh;
else
n = mw - (promptw + inputw + TEXTW("<") + TEXTW(">"));
/* calculate which items will begin the next page and previous page */
@@ -212,9 +212,15 @@ drawmenu(void)
}
if (lines > 0) {
- /* draw vertical list */
- for (item = curr; item != next; item = item->right)
- drawitem(item, x, y += bh, mw - x);
+ /* draw grid */
+ int i = 0;
+ for (item = curr; item != next; item = item->right, i++)
+ drawitem(
+ item,
+ x + ((i / lines) * ((mw - x) / columns)),
+ y + (((i % lines) + 1) * bh),
+ (mw - x) / columns
+ );
} else if (matches) {
/* draw horizontal list */
x += inputw;
@@ -799,14 +805,19 @@ main(int argc, char *argv[])
} else if (i + 1 == argc)
usage();
/* these options take one argument */
- else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */
+ else if (!strcmp(argv[i], "-g")) { /* number of columns in grid */
+ columns = atoi(argv[++i]);
+ if (lines == 0) lines = 1;
+ } else if (!strcmp(argv[i], "-l")) { /* number of lines in grid */
lines = atoi(argv[++i]);
+ }
else if (!strcmp(argv[i], "-h")) { /* minimum height of one menu line */
- lineheight = atoi(argv[++i]);
+ //lineheight = atoi(argv[++i]);
lineheight = MAX(lineheight, min_lineheight);
- }
- else if (!strcmp(argv[i], "-m"))
+ } else if (!strcmp(argv[i], "-m")) {
+ if (columns == 0) columns = 1;
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 */
diff --git a/dmenu.o b/dmenu.o
index b71dea8..ab14d6b 100644
--- a/dmenu.o
+++ b/dmenu.o
Binary files differ