mouse hovering now selects again
TODO: make this a lot faster, will require rewriting drawmenu significantly
This commit is contained in:
parent
73685ee480
commit
eb70a49512
10
libs/event.c
10
libs/event.c
|
@ -2,6 +2,7 @@ void
|
|||
eventloop(void)
|
||||
{
|
||||
XEvent ev;
|
||||
int noimg = 0;
|
||||
|
||||
while (!XNextEvent(dpy, &ev)) {
|
||||
if (XFilterEvent(&ev, win))
|
||||
|
@ -14,6 +15,11 @@ 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)
|
||||
|
@ -39,7 +45,11 @@ eventloop(void)
|
|||
|
||||
// redraw image on X11 event
|
||||
#if USEIMAGE
|
||||
if (!noimg) {
|
||||
drawimage();
|
||||
} else {
|
||||
noimg = 0; // draw it next time
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
|
52
libs/mouse.c
52
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)
|
||||
{
|
||||
|
|
|
@ -1 +1,3 @@
|
|||
static unsigned int textw_clamp(const char *str, unsigned int n);
|
||||
static void motionevent(XButtonEvent *ev);
|
||||
static void buttonpress(XEvent *e);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in a new issue