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