1#include "../util.h" 2#include <signal.h> 3#include <stdbool.h> 4#include <string.h> 5#include <sys/ttydefaults.h> 6 7#include "../cache.h" 8#include "../debug.h" 9#include "browser.h" 10#include "keysyms.h" 11#include "helpline.h" 12#include "ui.h" 13#include "util.h" 14#include "libslang.h" 15 16static void ui_browser__argv_write(struct ui_browser *browser, 17 void *entry, int row) 18{ 19 char **arg = entry; 20 bool current_entry = ui_browser__is_current_entry(browser, row); 21 22 ui_browser__set_color(browser, current_entry ? HE_COLORSET_SELECTED : 23 HE_COLORSET_NORMAL); 24 slsmg_write_nstring(*arg, browser->width); 25} 26 27static int popup_menu__run(struct ui_browser *menu) 28{ 29 int key; 30 31 if (ui_browser__show(menu, " ", "ESC: exit, ENTER|->: Select option") < 0) 32 return -1; 33 34 while (1) { 35 key = ui_browser__run(menu, 0); 36 37 switch (key) { 38 case K_RIGHT: 39 case K_ENTER: 40 key = menu->index; 41 break; 42 case K_LEFT: 43 case K_ESC: 44 case 'q': 45 case CTRL('c'): 46 key = -1; 47 break; 48 default: 49 continue; 50 } 51 52 break; 53 } 54 55 ui_browser__hide(menu); 56 return key; 57} 58 59int ui__popup_menu(int argc, char * const argv[]) 60{ 61 struct ui_browser menu = { 62 .entries = (void *)argv, 63 .refresh = ui_browser__argv_refresh, 64 .seek = ui_browser__argv_seek, 65 .write = ui_browser__argv_write, 66 .nr_entries = argc, 67 }; 68 69 return popup_menu__run(&menu); 70} 71 72int ui__question_window(const char *title, const char *text, 73 const char *exit_msg, int delay_secs) 74{ 75 int x, y; 76 int max_len = 0, nr_lines = 0; 77 const char *t; 78 79 t = text; 80 while (1) { 81 const char *sep = strchr(t, '\n'); 82 int len; 83 84 if (sep == NULL) 85 sep = strchr(t, '\0'); 86 len = sep - t; 87 if (max_len < len) 88 max_len = len; 89 ++nr_lines; 90 if (*sep == '\0') 91 break; 92 t = sep + 1; 93 } 94 95 max_len += 2; 96 nr_lines += 4; 97 y = SLtt_Screen_Rows / 2 - nr_lines / 2, 98 x = SLtt_Screen_Cols / 2 - max_len / 2; 99 100 SLsmg_set_color(0); 101 SLsmg_draw_box(y, x++, nr_lines, max_len); 102 if (title) { 103 SLsmg_gotorc(y, x + 1); 104 SLsmg_write_string((char *)title); 105 } 106 SLsmg_gotorc(++y, x); 107 nr_lines -= 2; 108 max_len -= 2; 109 SLsmg_write_wrapped_string((unsigned char *)text, y, x, 110 nr_lines, max_len, 1); 111 SLsmg_gotorc(y + nr_lines - 2, x); 112 SLsmg_write_nstring((char *)" ", max_len); 113 SLsmg_gotorc(y + nr_lines - 1, x); 114 SLsmg_write_nstring((char *)exit_msg, max_len); 115 SLsmg_refresh(); 116 return ui__getch(delay_secs); 117} 118 119int ui__help_window(const char *text) 120{ 121 return ui__question_window("Help", text, "Press any key...", 0); 122} 123 124int ui__dialog_yesno(const char *msg) 125{ 126 return ui__question_window(NULL, msg, "Enter: Yes, ESC: No", 0); 127} 128 129int __ui__warning(const char *title, const char *format, va_list args) 130{ 131 char *s; 132 133 if (use_browser > 0 && vasprintf(&s, format, args) > 0) { 134 int key; 135 136 pthread_mutex_lock(&ui__lock); 137 key = ui__question_window(title, s, "Press any key...", 0); 138 pthread_mutex_unlock(&ui__lock); 139 free(s); 140 return key; 141 } 142 143 fprintf(stderr, "%s:\n", title); 144 vfprintf(stderr, format, args); 145 return K_ESC; 146} 147 148int ui__warning(const char *format, ...) 149{ 150 int key; 151 va_list args; 152 153 va_start(args, format); 154 key = __ui__warning("Warning", format, args); 155 va_end(args); 156 return key; 157} 158 159int ui__error(const char *format, ...) 160{ 161 int key; 162 va_list args; 163 164 va_start(args, format); 165 key = __ui__warning("Error", format, args); 166 va_end(args); 167 return key; 168} 169