1e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <newt.h> 2e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <signal.h> 3e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <stdio.h> 4e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <stdbool.h> 5e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <string.h> 6e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <sys/ttydefaults.h> 7e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 8e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "../cache.h" 9e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "../debug.h" 10e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "browser.h" 11e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "helpline.h" 12e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "ui.h" 13e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "util.h" 14e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 15e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void newt_form__set_exit_keys(newtComponent self) 16e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 17e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtFormAddHotKey(self, NEWT_KEY_LEFT); 18e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtFormAddHotKey(self, NEWT_KEY_ESCAPE); 19e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtFormAddHotKey(self, 'Q'); 20e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtFormAddHotKey(self, 'q'); 21e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtFormAddHotKey(self, CTRL('c')); 22e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 23e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 24e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic newtComponent newt_form__new(void) 25e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 26e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtComponent self = newtForm(NULL, NULL, 0); 27e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (self) 28e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newt_form__set_exit_keys(self); 29e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return self; 30e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 31e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 32e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint ui__popup_menu(int argc, char * const argv[]) 33e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 34e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct newtExitStruct es; 35e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int i, rc = -1, max_len = 5; 36e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtComponent listbox, form = newt_form__new(); 37e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 38e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (form == NULL) 39e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return -1; 40e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 41e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng listbox = newtListbox(0, 0, argc, NEWT_FLAG_RETURNEXIT); 42e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (listbox == NULL) 43e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto out_destroy_form; 44e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 45e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtFormAddComponent(form, listbox); 46e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 47e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng for (i = 0; i < argc; ++i) { 48e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int len = strlen(argv[i]); 49e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (len > max_len) 50e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng max_len = len; 51e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (newtListboxAddEntry(listbox, argv[i], (void *)(long)i)) 52e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto out_destroy_form; 53e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 54e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 55e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtCenteredWindow(max_len, argc, NULL); 56e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtFormRun(form, &es); 57e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng rc = newtListboxGetCurrent(listbox) - NULL; 58e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (es.reason == NEWT_EXIT_HOTKEY) 59e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng rc = -1; 60e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtPopWindow(); 61e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengout_destroy_form: 62e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtFormDestroy(form); 63e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return rc; 64e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 65e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 66e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint ui__help_window(const char *text) 67e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 68e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct newtExitStruct es; 69e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtComponent tb, form = newt_form__new(); 70e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int rc = -1; 71e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int max_len = 0, nr_lines = 0; 72e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng const char *t; 73e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 74e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (form == NULL) 75e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return -1; 76e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 77e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng t = text; 78e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng while (1) { 79e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng const char *sep = strchr(t, '\n'); 80e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int len; 81e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 82e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (sep == NULL) 83e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng sep = strchr(t, '\0'); 84e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng len = sep - t; 85e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (max_len < len) 86e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng max_len = len; 87e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ++nr_lines; 88e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (*sep == '\0') 89e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng break; 90e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng t = sep + 1; 91e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 92e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 93e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng tb = newtTextbox(0, 0, max_len, nr_lines, 0); 94e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (tb == NULL) 95e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto out_destroy_form; 96e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 97e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtTextboxSetText(tb, text); 98e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtFormAddComponent(form, tb); 99e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtCenteredWindow(max_len, nr_lines, NULL); 100e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtFormRun(form, &es); 101e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtPopWindow(); 102e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng rc = 0; 103e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengout_destroy_form: 104e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtFormDestroy(form); 105e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return rc; 106e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 107e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 108e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic const char yes[] = "Yes", no[] = "No", 109e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng warning_str[] = "Warning!", ok[] = "Ok"; 110e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 111e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengbool ui__dialog_yesno(const char *msg) 112e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 113e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* newtWinChoice should really be accepting const char pointers... */ 114e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return newtWinChoice(NULL, (char *)yes, (char *)no, (char *)msg) == 1; 115e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 116e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 117e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid ui__warning(const char *format, ...) 118e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 119e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng va_list args; 120e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 121e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng va_start(args, format); 122e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (use_browser > 0) { 123e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng pthread_mutex_lock(&ui__lock); 124e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng newtWinMessagev((char *)warning_str, (char *)ok, 125e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng (char *)format, args); 126e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng pthread_mutex_unlock(&ui__lock); 127e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } else 128e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng vfprintf(stderr, format, args); 129e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng va_end(args); 130e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 131