]> git.neil.brown.name Git - edlib.git/commitdiff
pane_refresh: allow post-order "Refresh" calls, by request.
authorNeilBrown <neil@brown.name>
Thu, 3 Dec 2015 22:21:29 +0000 (09:21 +1100)
committerNeilBrown <neil@brown.name>
Wed, 9 Dec 2015 09:02:59 +0000 (20:02 +1100)
This allows the display to flush out updates at the end,
without needing the '0-timeout' hack.

Signed-off-by: NeilBrown <neil@brown.name>
core-pane.c
display-ncurses.c

index 27c5a85d99fa1b02eb8f309f8883774959aaf66a..b03f526467846deb324bb4955864a3aa5a613479 100644 (file)
@@ -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)
index 07446ab9795c412d19a17f29832e89cd922aaa80..438427ac3637dfebdc3b222c3b9f24de396afa66 100644 (file)
@@ -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;
 }