diff options
| author | zachir <zachir@librem.one> | 2023-02-21 14:01:46 -0600 | 
|---|---|---|
| committer | zachir <zachir@librem.one> | 2023-02-21 14:01:46 -0600 | 
| commit | 47cc6ebdd6e9f7d4a653b0f2812e656fd9d3eb9a (patch) | |
| tree | 7b91c342b643ab94b75284c35a3ad3a04fcafd86 | |
| parent | 2b5883bff1a7c952d0685098bb813adc3e48ef88 (diff) | |
add mousesupport patch
| -rw-r--r-- | dmenu.c | 119 | ||||
| -rw-r--r-- | patches/dmenu-mousesupport-5.2.diff | 144 | 
2 files changed, 262 insertions, 1 deletions
@@ -670,6 +670,119 @@ draw:  }  static void +buttonpress(XEvent *e) +{ +	struct item *item; +	XButtonPressedEvent *ev = &e->xbutton; +	int x = 0, y = 0, h = bh, w; + +	if (ev->window != win) +		return; + +	/* right-click: exit */ +	if (ev->button == Button3) +		exit(1); + +	if (prompt && *prompt) +		x += promptw; + +	/* input field */ +	w = (lines > 0 || !matches) ? mw - x : inputw; + +	/* left-click on input: clear input, +	 * NOTE: if there is no left-arrow the space for < is reserved so +	 *       add that to the input width */ +	if (ev->button == Button1 && +	   ((lines <= 0 && ev->x >= 0 && ev->x <= x + w + +	   ((!prev || !curr->left) ? TEXTW("<") : 0)) || +	   (lines > 0 && ev->y >= y && ev->y <= y + h))) { +		insert(NULL, -cursor); +		drawmenu(); +		return; +	} +	/* middle-mouse click: paste selection */ +	if (ev->button == Button2) { +		XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY, +		                  utf8, utf8, win, CurrentTime); +		drawmenu(); +		return; +	} +	/* scroll up */ +	if (ev->button == Button4 && prev) { +		sel = curr = prev; +		calcoffsets(); +		drawmenu(); +		return; +	} +	/* scroll down */ +	if (ev->button == Button5 && next) { +		sel = curr = next; +		calcoffsets(); +		drawmenu(); +		return; +	} +	if (ev->button != Button1) +		return; +	if (ev->state & ~ControlMask) +		return; +	if (lines > 0) { +		/* vertical list: (ctrl)left-click on item */ +		w = mw - x; +		for (item = curr; item != next; item = item->right) { +			y += h; +			if (ev->y >= y && ev->y <= (y + h)) { +				puts(item->text); +				if (!(ev->state & ControlMask)) +					exit(0); +				sel = item; +				if (sel) { +					sel->out = 1; +					drawmenu(); +				} +				return; +			} +		} +	} else if (matches) { +		/* left-click on left arrow */ +		x += inputw; +		w = TEXTW("<"); +		if (prev && curr->left) { +			if (ev->x >= x && ev->x <= x + w) { +				sel = curr = prev; +				calcoffsets(); +				drawmenu(); +				return; +			} +		} +		/* horizontal list: (ctrl)left-click on item */ +		for (item = curr; item != next; item = item->right) { +			x += w; +			w = MIN(TEXTW(item->text), mw - x - TEXTW(">")); +			if (ev->x >= x && ev->x <= x + w) { +				puts(item->text); +				if (!(ev->state & ControlMask)) +					exit(0); +				sel = item; +				if (sel) { +					sel->out = 1; +					drawmenu(); +				} +				return; +			} +		} +		/* left-click on right arrow */ +		w = TEXTW(">"); +		x = mw - w; +		if (next && ev->x >= x && ev->x <= x + w) { +			sel = curr = next; +			calcoffsets(); +			drawmenu(); +			return; +		} +	} +} + +static void  paste(void)  {  	char *p, *q; @@ -736,6 +849,9 @@ run(void)  				break;  			cleanup();  			exit(1); +		case ButtonPress: +			buttonpress(&ev); +			break;  		case Expose:  			if (ev.xexpose.count == 0)  				drw_map(drw, win, 0, 0, mw, mh); @@ -849,7 +965,8 @@ setup(void)  	/* create menu window */  	swa.override_redirect = True;  	swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; -	swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; +	swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask | +                         ButtonPressMask;  	win = XCreateWindow(dpy, parentwin, x, y, mw, mh, border_width,  	                    CopyFromParent, CopyFromParent, CopyFromParent,  	                    CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); diff --git a/patches/dmenu-mousesupport-5.2.diff b/patches/dmenu-mousesupport-5.2.diff new file mode 100644 index 0000000..eaacea4 --- /dev/null +++ b/patches/dmenu-mousesupport-5.2.diff @@ -0,0 +1,144 @@ +diff --git a/dmenu.c b/dmenu.c +index 7cf253b..d276a94 100644 +--- a/dmenu.c ++++ b/dmenu.c +@@ -528,6 +528,119 @@ draw: + 	drawmenu(); + } +  ++static void ++buttonpress(XEvent *e) ++{ ++	struct item *item; ++	XButtonPressedEvent *ev = &e->xbutton; ++	int x = 0, y = 0, h = bh, w; ++ ++	if (ev->window != win) ++		return; ++ ++	/* right-click: exit */ ++	if (ev->button == Button3) ++		exit(1); ++ ++	if (prompt && *prompt) ++		x += promptw; ++ ++	/* input field */ ++	w = (lines > 0 || !matches) ? mw - x : inputw; ++ ++	/* left-click on input: clear input, ++	 * NOTE: if there is no left-arrow the space for < is reserved so ++	 *       add that to the input width */ ++	if (ev->button == Button1 && ++	   ((lines <= 0 && ev->x >= 0 && ev->x <= x + w + ++	   ((!prev || !curr->left) ? TEXTW("<") : 0)) || ++	   (lines > 0 && ev->y >= y && ev->y <= y + h))) { ++		insert(NULL, -cursor); ++		drawmenu(); ++		return; ++	} ++	/* middle-mouse click: paste selection */ ++	if (ev->button == Button2) { ++		XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY, ++		                  utf8, utf8, win, CurrentTime); ++		drawmenu(); ++		return; ++	} ++	/* scroll up */ ++	if (ev->button == Button4 && prev) { ++		sel = curr = prev; ++		calcoffsets(); ++		drawmenu(); ++		return; ++	} ++	/* scroll down */ ++	if (ev->button == Button5 && next) { ++		sel = curr = next; ++		calcoffsets(); ++		drawmenu(); ++		return; ++	} ++	if (ev->button != Button1) ++		return; ++	if (ev->state & ~ControlMask) ++		return; ++	if (lines > 0) { ++		/* vertical list: (ctrl)left-click on item */ ++		w = mw - x; ++		for (item = curr; item != next; item = item->right) { ++			y += h; ++			if (ev->y >= y && ev->y <= (y + h)) { ++				puts(item->text); ++				if (!(ev->state & ControlMask)) ++					exit(0); ++				sel = item; ++				if (sel) { ++					sel->out = 1; ++					drawmenu(); ++				} ++				return; ++			} ++		} ++	} else if (matches) { ++		/* left-click on left arrow */ ++		x += inputw; ++		w = TEXTW("<"); ++		if (prev && curr->left) { ++			if (ev->x >= x && ev->x <= x + w) { ++				sel = curr = prev; ++				calcoffsets(); ++				drawmenu(); ++				return; ++			} ++		} ++		/* horizontal list: (ctrl)left-click on item */ ++		for (item = curr; item != next; item = item->right) { ++			x += w; ++			w = MIN(TEXTW(item->text), mw - x - TEXTW(">")); ++			if (ev->x >= x && ev->x <= x + w) { ++				puts(item->text); ++				if (!(ev->state & ControlMask)) ++					exit(0); ++				sel = item; ++				if (sel) { ++					sel->out = 1; ++					drawmenu(); ++				} ++				return; ++			} ++		} ++		/* left-click on right arrow */ ++		w = TEXTW(">"); ++		x = mw - w; ++		if (next && ev->x >= x && ev->x <= x + w) { ++			sel = curr = next; ++			calcoffsets(); ++			drawmenu(); ++			return; ++		} ++	} ++} ++ + static void + paste(void) + { +@@ -582,6 +695,9 @@ run(void) + 				break; + 			cleanup(); + 			exit(1); ++		case ButtonPress: ++			buttonpress(&ev); ++			break; + 		case Expose: + 			if (ev.xexpose.count == 0) + 				drw_map(drw, win, 0, 0, mw, mh); +@@ -679,7 +795,8 @@ setup(void) + 	/* create menu window */ + 	swa.override_redirect = True; + 	swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; +-	swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; ++	swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask | ++	                 ButtonPressMask; + 	win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0, + 	                    CopyFromParent, CopyFromParent, CopyFromParent, + 	                    CWOverrideRedirect | CWBackPixel | CWEventMask, &swa);  | 
