if (rdl->pager_buf != NULL) {
if (cmd == VT100_STD_CHAR && c == 'q') {
rdline_asyncpager_reset(rdl);
- // call cb()
+ if (rdl->pager_cb != NULL) {
+ rdl->pager_cb(rdl, rdl->pager_arg);
+ rdl->pager_cb = NULL;
+ }
if (rdl->pager_buf == NULL)
return RDLINE_RES_VALIDATED;
}
if (rdline_pager_next_page(rdl) == 0) {
rdline_asyncpager_reset(rdl);
- // call cb()
+ if (rdl->pager_cb != NULL) {
+ rdl->pager_cb(rdl, rdl->pager_arg);
+ rdl->pager_cb = NULL;
+ }
if (rdl->pager_buf == NULL)
return RDLINE_RES_VALIDATED;
}
cirbuf_align_left(&rdl->left);
rdl->left_buf[CIRBUF_GET_LEN(&rdl->left)] = '\0';
rdline_printf(rdl, "\r\n");
- rdl->help(rdl, rdl->left_buf, rdline_write, rdl);
#ifndef NO_PAGER
- if (rdl->pager_buf != NULL) {
- // XXX set cb
+ rdl->help(rdl, rdl->left_buf, rdline_asyncpager_write, rdl);
+ if (rdl->pager_buf != NULL)
return RDLINE_RES_SUCCESS;
- }
+ else
+ rdline_asyncpager_reset(rdl);
+#else
+ rdl->help(rdl, rdl->left_buf, rdline_write, rdl);
#endif
rdline_redisplay(rdl);
break;
case CMDLINE_KEY_TAB: {
char tmp_buf[CMDLINE_MAX_TOKEN_SIZE];
- int ret; //, curline = 0;
+ int ret;
unsigned int tmp_size;
if (rdl->complete == NULL)
cirbuf_align_left(&rdl->left);
rdl->left_buf[CIRBUF_GET_LEN(&rdl->left)] = '\0';
rdline_printf(rdl, "\r\n");
- rdl->help(rdl, rdl->left_buf, rdline_write, rdl);
#ifndef NO_PAGER
- if (rdl->pager_buf != NULL) {
- // XXX set cb
+ rdl->help(rdl, rdl->left_buf, rdline_asyncpager_write,
+ rdl);
+ if (rdl->pager_buf != NULL)
return RDLINE_RES_SUCCESS;
- }
+ else
+ rdline_asyncpager_reset(rdl);
+#else
+ rdl->help(rdl, rdl->left_buf, rdline_write, rdl);
#endif
rdline_redisplay(rdl);
break;
rdline_asyncpager_reset(rdl);
return RDLINE_RES_EXITED;
}
- if (rdl->pager_buf != NULL) {
- // XXX set cb
+ if (rdl->pager_buf != NULL)
return RDLINE_RES_SUCCESS;
- }
+ else
+ rdline_asyncpager_reset(rdl);
+
rdl->status = RDLINE_INIT;
#else
if (rdl->status == RDLINE_EXITED)
break;
#endif /* !NO_RDLINE_HISTORY */
-
default:
break;
}
}
/* push data in pager */
-static int
-rdline_pager_push(struct rdline *rdl, char *s, int len)
+ssize_t
+rdline_asyncpager_write(struct rdline *rdl, void *buf, size_t len)
{
+ char *s = buf;
+
/* display as many lines as we can */
if (rdl->pager_lines < RDLINE_MAX_LINES) {
int lines = RDLINE_MAX_LINES - rdl->pager_lines;
return 0;
}
-/* XXX we should have a specific return value when displaying will be
- * asynchronous, we may also have a callback */
+/* Print data asynchronously (using pager if needed) */
int
rdline_asyncpager_printf(struct rdline *rdl, const char *fmt, ...)
{
if (n >= BUFSIZ)
n = BUFSIZ-1;
if (n > 0)
- rdline_pager_push(rdl, buf, n);
+ rdline_asyncpager_write(rdl, buf, n);
free(buf);
return n;
}
+
+int rdline_asyncpager_set_cb(struct rdline *rdl, rdline_asyncpager_cb_t *cb,
+ void *arg)
+{
+ if (rdl->pager_buf == NULL)
+ return -1;
+
+ rdl->pager_cb = cb;
+ rdl->pager_arg = arg;
+ return 0;
+}
#endif /* !NO_PAGER */