summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSadrul Habib Chowdhury <sadrul@users.sourceforge.net>2010-03-04 18:10:50 -0500
committerSadrul Habib Chowdhury <sadrul@users.sourceforge.net>2010-03-04 18:10:50 -0500
commit02328ed6c832ce36dd3843c1bf2a99f007e7c2cb (patch)
tree10a1799b2b56159d17a77053c3b796a852b2ddef
parent5a540e47c2eed7a84c09f2d4dcf93a808f3e005e (diff)
downloadscreen-02328ed6c832ce36dd3843c1bf2a99f007e7c2cb.tar.gz
Handle mouse events in a generic list.
Scroll wheels to scroll, left click to select.
-rw-r--r--src/list_generic.c58
1 files changed, 53 insertions, 5 deletions
diff --git a/src/list_generic.c b/src/list_generic.c
index d2c1742..2b3be4c 100644
--- a/src/list_generic.c
+++ b/src/list_generic.c
@@ -149,21 +149,40 @@ static void ListProcess(char **ppbuf, int *plen)
struct ListRow *old;
unsigned char ch;
- if (ldata->list_fn->gl_pinput &&
+ if (!flayer->l_mouseevent.start && ldata->list_fn->gl_pinput &&
ldata->list_fn->gl_pinput(ldata, ppbuf, plen))
continue;
+ ch = **ppbuf;
+ ++*ppbuf;
+ --*plen;
+
+ if (flayer->l_mouseevent.start)
+ {
+ int r = LayProcessMouse(flayer, ch);
+ if (r == -1)
+ {
+ LayProcessMouseSwitch(flayer, 0);
+ continue;
+ }
+ else
+ {
+ if (r)
+ ch = 0222;
+ else
+ continue;
+ }
+ }
+
if (!ldata->selected)
{
*plen = 0;
break;
}
- ch = **ppbuf;
- ++*ppbuf;
- --*plen;
-
old = ldata->selected;
+
+processchar:
switch (ch)
{
case ' ':
@@ -255,6 +274,35 @@ static void ListProcess(char **ppbuf, int *plen)
if (ldata->list_fn->gl_matchrow && ldata->search)
ldata->selected = glist_search_dir(ldata, ldata->selected, -1);
break;
+
+ /* Now, mouse events. */
+ case 0222:
+ if (flayer->l_mouseevent.start)
+ {
+ int button = flayer->l_mouseevent.buffer[0];
+ if (button == 'a') /* Scroll down */
+ ch = 'j';
+ else if (button == '`') /* Scroll up */
+ ch = 'k';
+ else if (button == ' ') /* Left click */
+ {
+ int y = flayer->l_mouseevent.buffer[2];
+ struct ListRow *r = ldata->top;
+ for (r = ldata->top; r && r->y != -1 && r->y != y; r = r->next)
+ ;
+ if (r && r->y == y)
+ ldata->selected = r;
+ ch = 0;
+ }
+ else
+ ch = 0;
+ LayProcessMouseSwitch(flayer, 0);
+ if (ch)
+ goto processchar;
+ }
+ else
+ LayProcessMouseSwitch(flayer, 1);
+ break;
}
if (old == ldata->selected) /* The selection didn't change */