sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

dmenu-grid-4.9.diff (3353B)


      1 From 39ab9676914bd0d8105d0f96bbd7611a53077438 Mon Sep 17 00:00:00 2001
      2 From: Miles Alan <m@milesalan.com>
      3 Date: Sat, 4 Jul 2020 11:19:04 -0500
      4 Subject: [PATCH] Add -g option to display entries in the given number of grid
      5  columns
      6 
      7 This option can be used in conjunction with -l to format dmenu's options in
      8 arbitrary size grids. For example, to create a 4 column by 6 line grid, you
      9 could use: dmenu -g 4 -l 6
     10 ---
     11  config.def.h |  3 ++-
     12  dmenu.1      |  7 ++++++-
     13  dmenu.c      | 22 ++++++++++++++++------
     14  3 files changed, 24 insertions(+), 8 deletions(-)
     15 
     16 diff --git a/config.def.h b/config.def.h
     17 index 1edb647..96cf3c9 100644
     18 --- a/config.def.h
     19 +++ b/config.def.h
     20 @@ -13,8 +13,9 @@ static const char *colors[SchemeLast][2] = {
     21  	[SchemeSel] = { "#eeeeee", "#005577" },
     22  	[SchemeOut] = { "#000000", "#00ffff" },
     23  };
     24 -/* -l option; if nonzero, dmenu uses vertical list with given number of lines */
     25 +/* -l and -g options; controls number of lines and columns in grid if > 0 */
     26  static unsigned int lines      = 0;
     27 +static unsigned int columns    = 0;
     28  
     29  /*
     30   * Characters not considered part of a word while deleting words
     31 diff --git a/dmenu.1 b/dmenu.1
     32 index 323f93c..d0a734a 100644
     33 --- a/dmenu.1
     34 +++ b/dmenu.1
     35 @@ -4,6 +4,8 @@ dmenu \- dynamic menu
     36  .SH SYNOPSIS
     37  .B dmenu
     38  .RB [ \-bfiv ]
     39 +.RB [ \-g
     40 +.IR columns ]
     41  .RB [ \-l
     42  .IR lines ]
     43  .RB [ \-m
     44 @@ -47,8 +49,11 @@ is faster, but will lock up X until stdin reaches end\-of\-file.
     45  .B \-i
     46  dmenu matches menu items case insensitively.
     47  .TP
     48 +.BI \-g " columns"
     49 +dmenu lists items in a grid with the given number of columns.
     50 +.TP
     51  .BI \-l " lines"
     52 -dmenu lists items vertically, with the given number of lines.
     53 +dmenu lists items in a grid with the given number of lines.
     54  .TP
     55  .BI \-m " monitor"
     56  dmenu is displayed on the monitor number supplied. Monitor numbers are starting
     57 diff --git a/dmenu.c b/dmenu.c
     58 index 6b8f51b..d79b6bb 100644
     59 --- a/dmenu.c
     60 +++ b/dmenu.c
     61 @@ -77,7 +77,7 @@ calcoffsets(void)
     62  	int i, n;
     63  
     64  	if (lines > 0)
     65 -		n = lines * bh;
     66 +		n = lines * columns * bh;
     67  	else
     68  		n = mw - (promptw + inputw + TEXTW("<") + TEXTW(">"));
     69  	/* calculate which items will begin the next page and previous page */
     70 @@ -152,9 +152,15 @@ drawmenu(void)
     71  	}
     72  
     73  	if (lines > 0) {
     74 -		/* draw vertical list */
     75 -		for (item = curr; item != next; item = item->right)
     76 -			drawitem(item, x, y += bh, mw - x);
     77 +		/* draw grid */
     78 +		int i = 0;
     79 +		for (item = curr; item != next; item = item->right, i++)
     80 +			drawitem(
     81 +				item,
     82 +				x + ((i / lines) *  ((mw - x) / columns)),
     83 +				y + (((i % lines) + 1) * bh),
     84 +				(mw - x) / columns
     85 +			);
     86  	} else if (matches) {
     87  		/* draw horizontal list */
     88  		x += inputw;
     89 @@ -708,9 +714,13 @@ main(int argc, char *argv[])
     90  		} else if (i + 1 == argc)
     91  			usage();
     92  		/* these options take one argument */
     93 -		else if (!strcmp(argv[i], "-l"))   /* number of lines in vertical list */
     94 +		else if (!strcmp(argv[i], "-g")) {   /* number of columns in grid */
     95 +			columns = atoi(argv[++i]);
     96 +			if (lines == 0) lines = 1;
     97 +		} else if (!strcmp(argv[i], "-l")) { /* number of lines in grid */
     98  			lines = atoi(argv[++i]);
     99 -		else if (!strcmp(argv[i], "-m"))
    100 +			if (columns == 0) columns = 1;
    101 +		} else if (!strcmp(argv[i], "-m"))
    102  			mon = atoi(argv[++i]);
    103  		else if (!strcmp(argv[i], "-p"))   /* adds prompt to left of input field */
    104  			prompt = argv[++i];
    105 -- 
    106 2.23.1
    107