sites

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

dmenu-mousesupporthoverbgcol-20210123-1a13d04.diff (4581B)


      1 From 51331aed8a535323702b73681c5ce2af6f8f5868 Mon Sep 17 00:00:00 2001
      2 From: Karol Kosek <krkk@krkk.ct8.pl>
      3 Date: Sat, 23 Jan 2021 20:16:19 +0100
      4 Subject: [PATCH] fix mouse hover on vertical lists with prompt text
      5 
      6 ---
      7  dmenu.c | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
      8  1 file changed, 158 insertions(+), 1 deletion(-)
      9 
     10 diff --git a/dmenu.c b/dmenu.c
     11 index 65f25ce..aff2768 100644
     12 --- a/dmenu.c
     13 +++ b/dmenu.c
     14 @@ -500,6 +500,156 @@ draw:
     15  	drawmenu();
     16  }
     17  
     18 +static void
     19 +buttonpress(XEvent *e)
     20 +{
     21 +	struct item *item;
     22 +	XButtonPressedEvent *ev = &e->xbutton;
     23 +	int x = 0, y = 0, h = bh, w;
     24 +
     25 +	if (ev->window != win)
     26 +		return;
     27 +
     28 +	/* right-click: exit */
     29 +	if (ev->button == Button3)
     30 +		exit(1);
     31 +
     32 +	if (prompt && *prompt)
     33 +		x += promptw;
     34 +
     35 +	/* input field */
     36 +	w = (lines > 0 || !matches) ? mw - x : inputw;
     37 +
     38 +	/* left-click on input: clear input,
     39 +	 * NOTE: if there is no left-arrow the space for < is reserved so
     40 +	 *       add that to the input width */
     41 +	if (ev->button == Button1 &&
     42 +	   ((lines <= 0 && ev->x >= 0 && ev->x <= x + w +
     43 +	   ((!prev || !curr->left) ? TEXTW("<") : 0)) ||
     44 +	   (lines > 0 && ev->y >= y && ev->y <= y + h))) {
     45 +		insert(NULL, -cursor);
     46 +		drawmenu();
     47 +		return;
     48 +	}
     49 +	/* middle-mouse click: paste selection */
     50 +	if (ev->button == Button2) {
     51 +		XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY,
     52 +		                  utf8, utf8, win, CurrentTime);
     53 +		drawmenu();
     54 +		return;
     55 +	}
     56 +	/* scroll up */
     57 +	if (ev->button == Button4 && prev) {
     58 +		sel = curr = prev;
     59 +		calcoffsets();
     60 +		drawmenu();
     61 +		return;
     62 +	}
     63 +	/* scroll down */
     64 +	if (ev->button == Button5 && next) {
     65 +		sel = curr = next;
     66 +		calcoffsets();
     67 +		drawmenu();
     68 +		return;
     69 +	}
     70 +	if (ev->button != Button1)
     71 +		return;
     72 +	/* disabled below, needs to be fixed */
     73 +	/*
     74 +	if (ev->state & ~ControlMask)
     75 +		return;
     76 +	*/
     77 +	if (lines > 0) {
     78 +		/* vertical list: (ctrl)left-click on item */
     79 +		w = mw - x;
     80 +		for (item = curr; item != next; item = item->right) {
     81 +			y += h;
     82 +			if (ev->y >= y && ev->y <= (y + h)) {
     83 +				puts(item->text);
     84 +				if (!(ev->state & ControlMask))
     85 +					exit(0);
     86 +				sel = item;
     87 +				if (sel) {
     88 +					sel->out = 1;
     89 +					drawmenu();
     90 +				}
     91 +				return;
     92 +			}
     93 +		}
     94 +	} else if (matches) {
     95 +		/* left-click on left arrow */
     96 +		x += inputw;
     97 +		w = TEXTW("<");
     98 +		if (prev && curr->left) {
     99 +			if (ev->x >= x && ev->x <= x + w) {
    100 +				sel = curr = prev;
    101 +				calcoffsets();
    102 +				drawmenu();
    103 +				return;
    104 +			}
    105 +		}
    106 +		/* horizontal list: (ctrl)left-click on item */
    107 +		for (item = curr; item != next; item = item->right) {
    108 +			x += w;
    109 +			w = MIN(TEXTW(item->text), mw - x - TEXTW(">"));
    110 +			if (ev->x >= x && ev->x <= x + w) {
    111 +				puts(item->text);
    112 +				if (!(ev->state & ControlMask))
    113 +					exit(0);
    114 +				sel = item;
    115 +				if (sel) {
    116 +					sel->out = 1;
    117 +					drawmenu();
    118 +				}
    119 +				return;
    120 +			}
    121 +		}
    122 +		/* left-click on right arrow */
    123 +		w = TEXTW(">");
    124 +		x = mw - w;
    125 +		if (next && ev->x >= x && ev->x <= x + w) {
    126 +			sel = curr = next;
    127 +			calcoffsets();
    128 +			drawmenu();
    129 +			return;
    130 +		}
    131 +	}
    132 +}
    133 +
    134 +static void
    135 +mousemove(XEvent *e)
    136 +{
    137 +	struct item *item;
    138 +	XPointerMovedEvent *ev = &e->xmotion;
    139 +	int x = 0, y = 0, h = bh, w;
    140 +
    141 +	if (lines > 0) {
    142 +		w = mw - x;
    143 +		for (item = curr; item != next; item = item->right) {
    144 +			y += h;
    145 +			if (ev->y >= y && ev->y <= (y + h)) {
    146 +				sel = item;
    147 +				calcoffsets();
    148 +				drawmenu();
    149 +				return;
    150 +			}
    151 +		}
    152 +	} else if (matches) {
    153 +		x += inputw + promptw;
    154 +		w = TEXTW("<");
    155 +		for (item = curr; item != next; item = item->right) {
    156 +			x += w;
    157 +			w = MIN(TEXTW(item->text), mw - x - TEXTW(">"));
    158 +			if (ev->x >= x && ev->x <= x + w) {
    159 +				sel = item;
    160 +				calcoffsets();
    161 +				drawmenu();
    162 +				return;
    163 +			}
    164 +		}
    165 +	}
    166 +}
    167 +
    168  static void
    169  paste(void)
    170  {
    171 @@ -561,6 +711,12 @@ run(void)
    172  				break;
    173  			cleanup();
    174  			exit(1);
    175 +		case ButtonPress:
    176 +			buttonpress(&ev);
    177 +			break;
    178 +		case MotionNotify:
    179 +			mousemove(&ev);
    180 +			break;
    181  		case Expose:
    182  			if (ev.xexpose.count == 0)
    183  				drw_map(drw, win, 0, 0, mw, mh);
    184 @@ -658,7 +814,8 @@ setup(void)
    185  	/* create menu window */
    186  	swa.override_redirect = True;
    187  	swa.background_pixel = scheme[SchemeNorm][ColBg].pixel;
    188 -	swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask;
    189 +	swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask |
    190 +	                 ButtonPressMask | PointerMotionMask;
    191  	win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0,
    192  	                    CopyFromParent, CopyFromParent, CopyFromParent,
    193  	                    CWOverrideRedirect | CWBackPixel | CWEventMask, &swa);
    194 -- 
    195 2.30.0
    196