diff options
author | Jari Vetoniemi <mailroxas@gmail.com> | 2014-04-12 23:58:01 +0300 |
---|---|---|
committer | Jari Vetoniemi <mailroxas@gmail.com> | 2014-04-12 23:58:01 +0300 |
commit | 7da3ebe4239675b18560ab642abd1a100801da66 (patch) | |
tree | ca04dab25e5239a308bc4872b3eb53b44c5359af /lib/draw | |
parent | d22612899a74005fd442d54710c86e677742c7f4 (diff) | |
download | bemenu-7da3ebe4239675b18560ab642abd1a100801da66.tar.gz bemenu-7da3ebe4239675b18560ab642abd1a100801da66.tar.bz2 bemenu-7da3ebe4239675b18560ab642abd1a100801da66.zip |
Scrollable curses input \o/
Diffstat (limited to 'lib/draw')
-rw-r--r-- | lib/draw/curses.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/lib/draw/curses.c b/lib/draw/curses.c index 17089af..9e8502b 100644 --- a/lib/draw/curses.c +++ b/lib/draw/curses.c @@ -181,8 +181,18 @@ static void _bmDrawCursesRender(const bmMenu *menu) const unsigned int lines = curses.getmaxy(curses.stdscr); curses.erase(); - int titleLen = (menu->title ? strlen(menu->title) + 1 : 0); - _bmDrawCursesDrawLine(0, 0, "%*s%s", titleLen, "", (menu->filter ? menu->filter : "")); + unsigned int titleLen = (menu->title ? strlen(menu->title) + 1 : 0); + unsigned int ncols = curses.getmaxx(curses.stdscr); + unsigned int ccols = ncols - titleLen - 1; + unsigned int doffset = (menu->cursesCursor < ccols ? 0 : menu->cursesCursor - ccols); + + if (doffset > 0) { + /* find offset where we won't break the UTF8 string */ + doffset += _bmUtf8RuneNext(menu->filter, doffset); + doffset -= _bmUtf8RunePrev(menu->filter, doffset); + } + + _bmDrawCursesDrawLine(0, 0, "%*s%s", titleLen, "", (menu->filter ? menu->filter + doffset : "")); if (menu->title) { curses.attron(COLOR_PAIR(1)); @@ -199,8 +209,7 @@ static void _bmDrawCursesRender(const bmMenu *menu) _bmDrawCursesDrawLine(color, cl++, "%s%s", (highlighted ? ">> " : " "), (items[i]->text ? items[i]->text : "")); } - unsigned int ncols = curses.getmaxx(curses.stdscr) - titleLen - 1; - curses.move(0, titleLen + (ncols < menu->cursesCursor ? ncols : menu->cursesCursor)); + curses.move(0, titleLen + (menu->cursesCursor < ccols ? menu->cursesCursor : ccols)); curses.refresh(); } |