commit - b360ebb3b4c0cb3db501b4b54bcaf948c4584be7
commit + 9cb0f9cef6c927f737c60f8a425d69c91f9f5906
blob - 7f405380f8fcad31c256e12146ab6c0984e7855b
blob + bdb831cb9969207e5d0e63cf68d443427f27c88b
--- ui.c
+++ ui.c
static int in_minibuffer;
static struct {
+ char *curmesg;
+
char buf[1024];
size_t off, len;
char prompt[16];
handle_clear_minibuf(int fd, short ev, void *d)
{
clminibufev_set = 0;
- werase(minibuf);
- wrefresh(minibuf);
- wrefresh(body);
+
+ free(ministate.curmesg);
+ ministate.curmesg = NULL;
+
+ redraw_minibuffer();
+ if (in_minibuffer) {
+ wrefresh(body);
+ wrefresh(minibuf);
+ } else {
+ wrefresh(minibuf);
+ wrefresh(body);
+ }
}
static void
static void
redraw_minibuffer(void)
{
- size_t off;
+ size_t skip = 0, off = 0;
wclear(minibuf);
if (!in_minibuffer)
- return;
+ goto message;
off = strlen(ministate.prompt);
+
+ while (ministate.off - skip > COLS / 2) {
+ skip += MIN(ministate.off/4, 1);
+ }
+
mvwprintw(minibuf, 0, 0, "%s%s", ministate.prompt,
- ministate.buf);
- wmove(minibuf, 0, off + ministate.off);
+ ministate.buf + skip);
+
+message:
+ if (ministate.curmesg != NULL) {
+ if (in_minibuffer)
+ wprintw(minibuf, " [%s]", ministate.curmesg);
+ else
+ wprintw(minibuf, "%s", ministate.curmesg);
+ }
+
+ wmove(minibuf, 0, off + ministate.off - skip);
}
static void
{
va_list ap;
- if (in_minibuffer)
- return;
-
- va_start(ap, fmt);
-
if (clminibufev_set)
evtimer_del(&clminibufev);
evtimer_set(&clminibufev, handle_clear_minibuf, NULL);
evtimer_add(&clminibufev, &clminibufev_timer);
clminibufev_set = 1;
- werase(minibuf);
- vw_printw(minibuf, fmt, ap);
-
- wrefresh(minibuf);
- wrefresh(body);
-
+ va_start(ap, fmt);
+ /* TODO: what to do if the allocation fails here? */
+ if (vasprintf(&ministate.curmesg, fmt, ap) == -1)
+ ministate.curmesg = NULL;
va_end(ap);
+
+ redraw_minibuffer();
+
+ if (in_minibuffer) {
+ wrefresh(body);
+ wrefresh(minibuf);
+ } else {
+ wrefresh(minibuf);
+ wrefresh(body);
+ }
}
static void
enter_minibuffer(void (*self_insert_fn)(void), void (*donefn)(void),
void (*abortfn)(void))
{
- if (clminibufev_set) {
- clminibufev_set = 0;
- evtimer_del(&clminibufev);
- }
-
in_minibuffer = 1;
base_map = &minibuffer_map;
current_map = &minibuffer_map;