From 02328ed6c832ce36dd3843c1bf2a99f007e7c2cb Mon Sep 17 00:00:00 2001 From: Sadrul Habib Chowdhury Date: Thu, 4 Mar 2010 18:10:50 -0500 Subject: Handle mouse events in a generic list. Scroll wheels to scroll, left click to select. --- src/list_generic.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file 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 */ -- cgit v1.2.1