mouse hovering now selects again

TODO: make this a lot faster, will require rewriting drawmenu
significantly
This commit is contained in:
speedie 2023-03-21 20:52:12 +01:00
parent 73685ee480
commit eb70a49512
7 changed files with 84 additions and 1 deletions

View file

@ -2,6 +2,7 @@ void
eventloop(void) eventloop(void)
{ {
XEvent ev; XEvent ev;
int noimg = 0;
while (!XNextEvent(dpy, &ev)) { while (!XNextEvent(dpy, &ev)) {
if (XFilterEvent(&ev, win)) if (XFilterEvent(&ev, win))
@ -14,6 +15,11 @@ eventloop(void)
exit(1); exit(1);
case ButtonPress: case ButtonPress:
buttonpress(&ev); buttonpress(&ev);
noimg = 0;
break;
case MotionNotify:
motionevent(&ev.xbutton);
noimg = 1;
break; break;
case Expose: case Expose:
if (ev.xexpose.count == 0) if (ev.xexpose.count == 0)
@ -39,7 +45,11 @@ eventloop(void)
// redraw image on X11 event // redraw image on X11 event
#if USEIMAGE #if USEIMAGE
if (!noimg) {
drawimage(); drawimage();
} else {
noimg = 0; // draw it next time
}
#endif #endif
} }
} }

View file

@ -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 void
buttonpress(XEvent *e) buttonpress(XEvent *e)
{ {

View file

@ -1 +1,3 @@
static unsigned int textw_clamp(const char *str, unsigned int n);
static void motionevent(XButtonEvent *ev);
static void buttonpress(XEvent *e); static void buttonpress(XEvent *e);

View file

@ -325,3 +325,12 @@ drw_cur_free(Drw *drw, Cur *cursor)
XFreeCursor(drw->dpy, cursor->cursor); XFreeCursor(drw->dpy, cursor->cursor);
free(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);
}

View file

@ -35,6 +35,7 @@ void drw_free(Drw *drw);
/* Fnt abstraction */ /* Fnt abstraction */
Fnt *drw_font_create(Drw* drw, char *font[], size_t fontcount); Fnt *drw_font_create(Drw* drw, char *font[], size_t fontcount);
void drw_font_free(Fnt* set); 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); 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); void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h, Bool markup);

View file

@ -463,3 +463,11 @@ drw_cur_free(Drw *drw, Cur *cursor)
free(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);
}

View file

@ -38,6 +38,7 @@ void drw_free(Drw *drw);
Fnt *drw_font_create(Drw* drw, char *font[], size_t fontcount); Fnt *drw_font_create(Drw* drw, char *font[], size_t fontcount);
void drw_font_free(Fnt* set); void drw_font_free(Fnt* set);
unsigned int drw_font_getwidth(Drw *drw, const char *text, Bool markup); 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); void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h, Bool markup);
/* Colorscheme abstraction */ /* Colorscheme abstraction */