sites

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

dmenu-managed-4.9.diff (2917B)


      1 From 5aee7d1488354322462e243416e27e026d73e0eb Mon Sep 17 00:00:00 2001
      2 From: Miles Alan <m@milesalan.com>
      3 Date: Tue, 16 Jun 2020 21:40:30 -0500
      4 Subject: [PATCH] Add -wm flag to run dmenu as managed WM window (e.g. no
      5  override_redirect)
      6 
      7 ---
      8  dmenu.1 |  4 ++++
      9  dmenu.c | 20 +++++++++++++++++---
     10  2 files changed, 21 insertions(+), 3 deletions(-)
     11 
     12 diff --git a/dmenu.1 b/dmenu.1
     13 index 323f93c..89a9493 100644
     14 --- a/dmenu.1
     15 +++ b/dmenu.1
     16 @@ -22,6 +22,7 @@ dmenu \- dynamic menu
     17  .IR color ]
     18  .RB [ \-w
     19  .IR windowid ]
     20 +.RB [ \-wm ]
     21  .P
     22  .BR dmenu_run " ..."
     23  .SH DESCRIPTION
     24 @@ -80,6 +81,9 @@ prints version information to stdout, then exits.
     25  .TP
     26  .BI \-w " windowid"
     27  embed into windowid.
     28 +.TP
     29 +.BI \-wm
     30 +Display as a managed WM window (e.g. don't set overide_redirect flag)
     31  .SH USAGE
     32  dmenu is completely controlled by the keyboard.  Items are selected using the
     33  arrow keys, page up, page down, home, and end.
     34 diff --git a/dmenu.c b/dmenu.c
     35 index 6b8f51b..4632eb4 100644
     36 --- a/dmenu.c
     37 +++ b/dmenu.c
     38 @@ -44,6 +44,7 @@ static struct item *items = NULL;
     39  static struct item *matches, *matchend;
     40  static struct item *prev, *curr, *next, *sel;
     41  static int mon = -1, screen;
     42 +static int managed = 0;
     43  
     44  static Atom clip, utf8;
     45  static Display *dpy;
     46 @@ -198,7 +199,7 @@ grabkeyboard(void)
     47  	struct timespec ts = { .tv_sec = 0, .tv_nsec = 1000000  };
     48  	int i;
     49  
     50 -	if (embed)
     51 +	if (embed || managed)
     52  		return;
     53  	/* try to grab keyboard, we may have to wait for another process to ungrab */
     54  	for (i = 0; i < 1000; i++) {
     55 @@ -651,7 +652,7 @@ setup(void)
     56  	match();
     57  
     58  	/* create menu window */
     59 -	swa.override_redirect = True;
     60 +	swa.override_redirect = managed ? False : True;
     61  	swa.background_pixel = scheme[SchemeNorm][ColBg].pixel;
     62  	swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask;
     63  	win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0,
     64 @@ -665,7 +666,18 @@ setup(void)
     65  	                XNClientWindow, win, XNFocusWindow, win, NULL);
     66  
     67  	XMapRaised(dpy, win);
     68 -	XSetInputFocus(dpy, win, RevertToParent, CurrentTime);
     69 +
     70 +	if (managed) {
     71 +		XTextProperty prop;
     72 +		char *windowtitle = prompt != NULL ? prompt : "dmenu";
     73 +		Xutf8TextListToTextProperty(dpy, &windowtitle, 1, XUTF8StringStyle, &prop);
     74 +		XSetWMName(dpy, win, &prop);
     75 +		XSetTextProperty(dpy, win, &prop, XInternAtom(dpy, "_NET_WM_NAME", False));
     76 +		XFree(prop.value);
     77 +	} else {
     78 +		XSetInputFocus(dpy, win, RevertToParent, CurrentTime);
     79 +	}
     80 +
     81  	if (embed) {
     82  		XSelectInput(dpy, parentwin, FocusChangeMask);
     83  		if (XQueryTree(dpy, parentwin, &dw, &w, &dws, &du) && dws) {
     84 @@ -705,6 +717,8 @@ main(int argc, char *argv[])
     85  		else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */
     86  			fstrncmp = strncasecmp;
     87  			fstrstr = cistrstr;
     88 +		} else if (!strcmp(argv[i], "-wm")) { /* display as managed wm window */
     89 +			managed = 1;
     90  		} else if (i + 1 == argc)
     91  			usage();
     92  		/* these options take one argument */
     93 -- 
     94 2.27.0
     95