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 /dmenu.c | |
| parent | 2b5883bff1a7c952d0685098bb813adc3e48ef88 (diff) | |
add mousesupport patch
Diffstat (limited to 'dmenu.c')
| -rw-r--r-- | dmenu.c | 119 | 
1 files changed, 118 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);  | 
