int damage = ci->extra;
struct pane *p = ci->home;
struct cmd_info ci2 = *ci;
+ int ret = 0;
if (p->focus == NULL)
p->focus = list_first_entry_or_null(
ci2.extra |= DAMAGED_CURSOR;
damage &= DAMAGED_SIZE;
ci2.comm = p->handle;
- if (p->handle->func(&ci2) == 0)
+ ret = p->handle->func(&ci2);
+ if (ret == 0)
pane_check_size(p);
}
p->damaged = 0;
ci2.comm = NULL;
__pane_refresh(&ci2);
}
+ if (ret == 2) {
+ /* "Refresh" requested a post-order call */
+ ci2 = *ci;
+ ci2.numeric = 1;
+ p->handle->func(&ci2);
+ }
}
void pane_refresh(struct pane *p)
}
}
-static void ncurses_flush(int fd, short ev, void *P)
-{
- struct pane *p = P;
- move_cursor(p);
- refresh();
-}
-
DEF_CMD(nc_misc)
{
struct pane *p = ci->home;
DEF_CMD(ncurses_handle)
{
struct pane *p = ci->home;
- int damage = ci->extra;
struct display_data *dd = p->data;
- struct event *l;
- struct timeval tv;
if (strcmp(ci->key, "Misc") == 0)
return nc_misc.func(ci);
return 1;
}
if (strcmp(ci->key, "Refresh") == 0) {
- struct editor *ed = pane2ed(p);
set_screen(dd->scr);
- if (damage & DAMAGED_SIZE)
- getmaxyx(stdscr, p->h, p->w);
-
- l = event_new(ed->base, -1, EV_TIMEOUT, ncurses_flush, p);
- event_priority_set(l, 0);
- tv.tv_sec = 0;
- tv.tv_usec = 0;
- event_add(l, &tv);
- return 1;
+ if (ci->numeric > 0) {
+ /* post-order call */
+ move_cursor(p);
+ refresh();
+ } else {
+ int damage = ci->extra;
+ if (damage & DAMAGED_SIZE)
+ getmaxyx(stdscr, p->h, p->w);
+ }
+ return 2; /* request post-order call */
}
return 0;
}