mouse support (bloat) added
This commit is contained in:
		
							parent
							
								
									2d9878f5ba
								
							
						
					
					
						commit
						ef9e3d2439
					
				
							
								
								
									
										119
									
								
								dmenu.c
									
									
									
									
									
								
							
							
						
						
									
										119
									
								
								dmenu.c
									
									
									
									
									
								
							| @ -554,6 +554,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) | ||||
| { | ||||
| @ -615,6 +728,9 @@ run(void) | ||||
| 		if (XFilterEvent(&ev, None)) | ||||
| 			continue; | ||||
| 		switch(ev.type) { | ||||
| 		case ButtonPress: | ||||
| 			buttonpress(&ev); | ||||
| 			break; | ||||
| 		case Expose: | ||||
| 			if (ev.xexpose.count == 0) | ||||
| 				drw_map(drw, win, 0, 0, mw, mh); | ||||
| @ -714,7 +830,8 @@ setup(void) | ||||
| 	swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; | ||||
| 	swa.border_pixel = 0; | ||||
| 	swa.colormap = cmap; | ||||
| 	swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; | ||||
| 	swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask | | ||||
| 		ButtonPressMask; | ||||
| 	win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0, | ||||
| 	                    depth, InputOutput, visual, | ||||
| 	                    CWOverrideRedirect | CWBackPixel | CWColormap |  CWEventMask | CWBorderPixel, &swa); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Luke Smith
						Luke Smith