From: NeilBrown Date: Thu, 3 Dec 2015 22:21:29 +0000 (+1100) Subject: pane_refresh: allow post-order "Refresh" calls, by request. X-Git-Tag: lca2016~125 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=e3d72d63eb021af01f42f54731dfab4a7fb3b8e7;p=edlib.git pane_refresh: allow post-order "Refresh" calls, by request. This allows the display to flush out updates at the end, without needing the '0-timeout' hack. Signed-off-by: NeilBrown --- diff --git a/core-pane.c b/core-pane.c index 27c5a85d..b03f5264 100644 --- a/core-pane.c +++ b/core-pane.c @@ -103,6 +103,7 @@ static void __pane_refresh(struct cmd_info *ci) 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( @@ -123,7 +124,8 @@ static void __pane_refresh(struct cmd_info *ci) 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; @@ -133,6 +135,12 @@ static void __pane_refresh(struct cmd_info *ci) 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) diff --git a/display-ncurses.c b/display-ncurses.c index 07446ab9..438427ac 100644 --- a/display-ncurses.c +++ b/display-ncurses.c @@ -62,13 +62,6 @@ static void move_cursor(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; @@ -129,10 +122,7 @@ static int cvt_attrs(char *attrs) 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); @@ -152,18 +142,18 @@ DEF_CMD(ncurses_handle) 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; }