| #include <newt.h> | |
| #include <signal.h> | |
| #include <stdio.h> | |
| #include <stdbool.h> | |
| #include <string.h> | |
| #include <sys/ttydefaults.h> | |
| #include "../cache.h" | |
| #include "../debug.h" | |
| #include "browser.h" | |
| #include "helpline.h" | |
| #include "ui.h" | |
| #include "util.h" | |
| static void newt_form__set_exit_keys(newtComponent self) | |
| { | |
| newtFormAddHotKey(self, NEWT_KEY_LEFT); | |
| newtFormAddHotKey(self, NEWT_KEY_ESCAPE); | |
| newtFormAddHotKey(self, 'Q'); | |
| newtFormAddHotKey(self, 'q'); | |
| newtFormAddHotKey(self, CTRL('c')); | |
| } | |
| static newtComponent newt_form__new(void) | |
| { | |
| newtComponent self = newtForm(NULL, NULL, 0); | |
| if (self) | |
| newt_form__set_exit_keys(self); | |
| return self; | |
| } | |
| int ui__popup_menu(int argc, char * const argv[]) | |
| { | |
| struct newtExitStruct es; | |
| int i, rc = -1, max_len = 5; | |
| newtComponent listbox, form = newt_form__new(); | |
| if (form == NULL) | |
| return -1; | |
| listbox = newtListbox(0, 0, argc, NEWT_FLAG_RETURNEXIT); | |
| if (listbox == NULL) | |
| goto out_destroy_form; | |
| newtFormAddComponent(form, listbox); | |
| for (i = 0; i < argc; ++i) { | |
| int len = strlen(argv[i]); | |
| if (len > max_len) | |
| max_len = len; | |
| if (newtListboxAddEntry(listbox, argv[i], (void *)(long)i)) | |
| goto out_destroy_form; | |
| } | |
| newtCenteredWindow(max_len, argc, NULL); | |
| newtFormRun(form, &es); | |
| rc = newtListboxGetCurrent(listbox) - NULL; | |
| if (es.reason == NEWT_EXIT_HOTKEY) | |
| rc = -1; | |
| newtPopWindow(); | |
| out_destroy_form: | |
| newtFormDestroy(form); | |
| return rc; | |
| } | |
| int ui__help_window(const char *text) | |
| { | |
| struct newtExitStruct es; | |
| newtComponent tb, form = newt_form__new(); | |
| int rc = -1; | |
| int max_len = 0, nr_lines = 0; | |
| const char *t; | |
| if (form == NULL) | |
| return -1; | |
| t = text; | |
| while (1) { | |
| const char *sep = strchr(t, '\n'); | |
| int len; | |
| if (sep == NULL) | |
| sep = strchr(t, '\0'); | |
| len = sep - t; | |
| if (max_len < len) | |
| max_len = len; | |
| ++nr_lines; | |
| if (*sep == '\0') | |
| break; | |
| t = sep + 1; | |
| } | |
| tb = newtTextbox(0, 0, max_len, nr_lines, 0); | |
| if (tb == NULL) | |
| goto out_destroy_form; | |
| newtTextboxSetText(tb, text); | |
| newtFormAddComponent(form, tb); | |
| newtCenteredWindow(max_len, nr_lines, NULL); | |
| newtFormRun(form, &es); | |
| newtPopWindow(); | |
| rc = 0; | |
| out_destroy_form: | |
| newtFormDestroy(form); | |
| return rc; | |
| } | |
| static const char yes[] = "Yes", no[] = "No", | |
| warning_str[] = "Warning!", ok[] = "Ok"; | |
| bool ui__dialog_yesno(const char *msg) | |
| { | |
| /* newtWinChoice should really be accepting const char pointers... */ | |
| return newtWinChoice(NULL, (char *)yes, (char *)no, (char *)msg) == 1; | |
| } | |
| void ui__warning(const char *format, ...) | |
| { | |
| va_list args; | |
| va_start(args, format); | |
| if (use_browser > 0) { | |
| pthread_mutex_lock(&ui__lock); | |
| newtWinMessagev((char *)warning_str, (char *)ok, | |
| (char *)format, args); | |
| pthread_mutex_unlock(&ui__lock); | |
| } else | |
| vfprintf(stderr, format, args); | |
| va_end(args); | |
| } |