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
12
libs/event.c
12
libs/event.c
|
@ -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,7 +15,12 @@ eventloop(void)
|
||||||
exit(1);
|
exit(1);
|
||||||
case ButtonPress:
|
case ButtonPress:
|
||||||
buttonpress(&ev);
|
buttonpress(&ev);
|
||||||
|
noimg = 0;
|
||||||
break;
|
break;
|
||||||
|
case MotionNotify:
|
||||||
|
motionevent(&ev.xbutton);
|
||||||
|
noimg = 1;
|
||||||
|
break;
|
||||||
case Expose:
|
case Expose:
|
||||||
if (ev.xexpose.count == 0)
|
if (ev.xexpose.count == 0)
|
||||||
drw_map(drw, win, 0, 0, mw, mh);
|
drw_map(drw, win, 0, 0, mw, mh);
|
||||||
|
@ -39,7 +45,11 @@ eventloop(void)
|
||||||
|
|
||||||
// redraw image on X11 event
|
// redraw image on X11 event
|
||||||
#if USEIMAGE
|
#if USEIMAGE
|
||||||
drawimage();
|
if (!noimg) {
|
||||||
|
drawimage();
|
||||||
|
} else {
|
||||||
|
noimg = 0; // draw it next time
|
||||||
|
}
|
||||||
#endif
|
#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
|
void
|
||||||
buttonpress(XEvent *e)
|
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);
|
static void buttonpress(XEvent *e);
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue