| #define _GNU_SOURCE |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <newt.h> |
| |
| #include "../debug.h" |
| #include "helpline.h" |
| #include "ui.h" |
| |
| void ui_helpline__pop(void) |
| { |
| newtPopHelpLine(); |
| } |
| |
| void ui_helpline__push(const char *msg) |
| { |
| newtPushHelpLine(msg); |
| } |
| |
| void ui_helpline__vpush(const char *fmt, va_list ap) |
| { |
| char *s; |
| |
| if (vasprintf(&s, fmt, ap) < 0) |
| vfprintf(stderr, fmt, ap); |
| else { |
| ui_helpline__push(s); |
| free(s); |
| } |
| } |
| |
| void ui_helpline__fpush(const char *fmt, ...) |
| { |
| va_list ap; |
| |
| va_start(ap, fmt); |
| ui_helpline__vpush(fmt, ap); |
| va_end(ap); |
| } |
| |
| void ui_helpline__puts(const char *msg) |
| { |
| ui_helpline__pop(); |
| ui_helpline__push(msg); |
| } |
| |
| void ui_helpline__init(void) |
| { |
| ui_helpline__puts(" "); |
| } |
| |
| char ui_helpline__last_msg[1024]; |
| |
| int ui_helpline__show_help(const char *format, va_list ap) |
| { |
| int ret; |
| static int backlog; |
| |
| pthread_mutex_lock(&ui__lock); |
| ret = vsnprintf(ui_helpline__last_msg + backlog, |
| sizeof(ui_helpline__last_msg) - backlog, format, ap); |
| backlog += ret; |
| |
| if (ui_helpline__last_msg[backlog - 1] == '\n') { |
| ui_helpline__puts(ui_helpline__last_msg); |
| newtRefresh(); |
| backlog = 0; |
| } |
| pthread_mutex_unlock(&ui__lock); |
| |
| return ret; |
| } |