diff options
author | Sadrul Habib Chowdhury <sadrul@users.sourceforge.net> | 2010-03-04 18:10:50 -0500 |
---|---|---|
committer | Sadrul Habib Chowdhury <sadrul@users.sourceforge.net> | 2010-03-04 18:10:50 -0500 |
commit | 02328ed6c832ce36dd3843c1bf2a99f007e7c2cb (patch) | |
tree | 10a1799b2b56159d17a77053c3b796a852b2ddef | |
parent | 5a540e47c2eed7a84c09f2d4dcf93a808f3e005e (diff) | |
download | screen-02328ed6c832ce36dd3843c1bf2a99f007e7c2cb.tar.gz |
Handle mouse events in a generic list.
Scroll wheels to scroll, left click to select.
-rw-r--r-- | src/list_generic.c | 58 |
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 */ |