diff --git a/libs/event.c b/libs/event.c index 34d4890..4b81a7c 100644 --- a/libs/event.c +++ b/libs/event.c @@ -2,6 +2,7 @@ void eventloop(void) { XEvent ev; + int noimg = 0; while (!XNextEvent(dpy, &ev)) { if (XFilterEvent(&ev, win)) @@ -14,7 +15,12 @@ eventloop(void) exit(1); case ButtonPress: buttonpress(&ev); + noimg = 0; break; + case MotionNotify: + motionevent(&ev.xbutton); + noimg = 1; + break; case Expose: if (ev.xexpose.count == 0) drw_map(drw, win, 0, 0, mw, mh); @@ -39,7 +45,11 @@ eventloop(void) // redraw image on X11 event #if USEIMAGE - drawimage(); + if (!noimg) { + drawimage(); + } else { + noimg = 0; // draw it next time + } #endif } } diff --git a/libs/mouse.c b/libs/mouse.c index dd3f160..9559d2e 100644 --- a/libs/mouse.c +++ b/libs/mouse.c @@ -1,3 +1,55 @@ +unsigned int +textw_clamp(const char *str, unsigned int n) +{ + unsigned int w; + w = drw_fontset_getwidth_clamp(drw, str, n, True) + lrpad; + + return MIN(w, n); +} + +void +motionevent(XButtonEvent *ev) +{ + struct item *item; + int xy, ev_xy; + + if (ev->window != win || matches == 0) + return; + + #if USEIMAGE + if (image) return; + #endif + + int itemCount = 0; + + // walk through all items + for (item = items; item && item->text; item++) + itemCount++; + + // to prevent slowdown, arbritary limit of 50 items + if (itemCount > 50) + return; + + int larrowWidth = 0; + int rarrowWidth = 0; + + if (!hidelarrow) larrowWidth = pango_leftarrow ? TEXTWM(leftarrow) : TEXTW(leftarrow); + if (!hiderarrow) rarrowWidth = pango_rightarrow ? TEXTWM(rightarrow) : TEXTW(rightarrow); + + xy = lines > 0 ? bh : inputw + promptw + larrowWidth; + ev_xy = lines > 0 ? ev->y : ev->x; + for (item = curr; item && item != next; item = item->right) { + int wh = lines > 0 ? bh : textw_clamp(item->text, mw - xy - rarrowWidth); + if (ev_xy >= xy && ev_xy < (xy + wh)) { + sel = item; + calcoffsets(); + drawmenu(); + break; + } + xy += wh; + } +} + void buttonpress(XEvent *e) { diff --git a/libs/mouse.h b/libs/mouse.h index ff28229..b41736a 100644 --- a/libs/mouse.h +++ b/libs/mouse.h @@ -1 +1,3 @@ +static unsigned int textw_clamp(const char *str, unsigned int n); +static void motionevent(XButtonEvent *ev); static void buttonpress(XEvent *e); diff --git a/libs/sl/draw-pango.c b/libs/sl/draw-pango.c index 28566d2..8584419 100644 --- a/libs/sl/draw-pango.c +++ b/libs/sl/draw-pango.c @@ -325,3 +325,12 @@ drw_cur_free(Drw *drw, Cur *cursor) XFreeCursor(drw->dpy, cursor->cursor); free(cursor); } + +unsigned int +drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n, Bool markup) +{ + unsigned int tmp = 0; + if (drw && drw->font && text && n) + tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n, markup); + return MIN(n, tmp); +} diff --git a/libs/sl/draw-pango.h b/libs/sl/draw-pango.h index c4ea777..2c85a97 100644 --- a/libs/sl/draw-pango.h +++ b/libs/sl/draw-pango.h @@ -35,6 +35,7 @@ void drw_free(Drw *drw); /* Fnt abstraction */ Fnt *drw_font_create(Drw* drw, char *font[], size_t fontcount); void drw_font_free(Fnt* set); +unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n, Bool markup); unsigned int drw_font_getwidth(Drw *drw, const char *text, Bool markup); void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h, Bool markup); diff --git a/libs/sl/draw-xft.c b/libs/sl/draw-xft.c index 65ab020..4b6aca0 100644 --- a/libs/sl/draw-xft.c +++ b/libs/sl/draw-xft.c @@ -463,3 +463,11 @@ drw_cur_free(Drw *drw, Cur *cursor) free(cursor); } +unsigned int +drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n, Bool markup) +{ + unsigned int tmp = 0; + if (drw && drw->font && text && n) + tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n, markup); + return MIN(n, tmp); +} diff --git a/libs/sl/draw-xft.h b/libs/sl/draw-xft.h index 0ce0843..86feb2c 100644 --- a/libs/sl/draw-xft.h +++ b/libs/sl/draw-xft.h @@ -38,6 +38,7 @@ void drw_free(Drw *drw); Fnt *drw_font_create(Drw* drw, char *font[], size_t fontcount); void drw_font_free(Fnt* set); unsigned int drw_font_getwidth(Drw *drw, const char *text, Bool markup); +unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n, Bool markup); void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h, Bool markup); /* Colorscheme abstraction */