| 
									
										
										
										
											2011-10-26 08:00:55 -02:00
										 |  |  | #include "../util.h"
 | 
					
						
							| 
									
										
										
										
											2010-08-10 15:49:07 -03:00
										 |  |  | #include <signal.h>
 | 
					
						
							|  |  |  | #include <stdbool.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							| 
									
										
										
										
											2010-03-12 10:48:12 -03:00
										 |  |  | #include <sys/ttydefaults.h>
 | 
					
						
							| 
									
										
										
										
											2010-03-11 20:12:44 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-10 15:58:50 -03:00
										 |  |  | #include "../cache.h"
 | 
					
						
							|  |  |  | #include "../debug.h"
 | 
					
						
							|  |  |  | #include "browser.h"
 | 
					
						
							| 
									
										
										
										
											2011-10-26 07:11:03 -02:00
										 |  |  | #include "keysyms.h"
 | 
					
						
							| 
									
										
										
										
											2010-08-10 15:58:50 -03:00
										 |  |  | #include "helpline.h"
 | 
					
						
							| 
									
										
										
										
											2011-03-01 10:24:43 -03:00
										 |  |  | #include "ui.h"
 | 
					
						
							| 
									
										
										
										
											2010-08-10 15:58:50 -03:00
										 |  |  | #include "util.h"
 | 
					
						
							| 
									
										
										
										
											2011-10-26 08:00:55 -02:00
										 |  |  | #include "libslang.h"
 | 
					
						
							| 
									
										
										
										
											2010-03-11 20:12:44 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-26 07:11:03 -02:00
										 |  |  | static void ui_browser__argv_write(struct ui_browser *browser, | 
					
						
							|  |  |  | 				   void *entry, int row) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	char **arg = entry; | 
					
						
							|  |  |  | 	bool current_entry = ui_browser__is_current_entry(browser, row); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ui_browser__set_color(browser, current_entry ? HE_COLORSET_SELECTED : | 
					
						
							|  |  |  | 						       HE_COLORSET_NORMAL); | 
					
						
							|  |  |  | 	slsmg_write_nstring(*arg, browser->width); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int popup_menu__run(struct ui_browser *menu) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int key; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (ui_browser__show(menu, " ", "ESC: exit, ENTER|->: Select option") < 0) | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	while (1) { | 
					
						
							|  |  |  | 		key = ui_browser__run(menu, 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		switch (key) { | 
					
						
							|  |  |  | 		case K_RIGHT: | 
					
						
							|  |  |  | 		case K_ENTER: | 
					
						
							|  |  |  | 			key = menu->index; | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		case K_LEFT: | 
					
						
							|  |  |  | 		case K_ESC: | 
					
						
							|  |  |  | 		case 'q': | 
					
						
							|  |  |  | 		case CTRL('c'): | 
					
						
							|  |  |  | 			key = -1; | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		default: | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ui_browser__hide(menu); | 
					
						
							|  |  |  | 	return key; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-10 15:58:50 -03:00
										 |  |  | int ui__popup_menu(int argc, char * const argv[]) | 
					
						
							| 
									
										
										
										
											2010-03-24 16:40:14 -03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-10-26 07:11:03 -02:00
										 |  |  | 	struct ui_browser menu = { | 
					
						
							|  |  |  | 		.entries    = (void *)argv, | 
					
						
							|  |  |  | 		.refresh    = ui_browser__argv_refresh, | 
					
						
							|  |  |  | 		.seek	    = ui_browser__argv_seek, | 
					
						
							|  |  |  | 		.write	    = ui_browser__argv_write, | 
					
						
							|  |  |  | 		.nr_entries = argc, | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2010-03-24 16:40:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-26 07:11:03 -02:00
										 |  |  | 	return popup_menu__run(&menu); | 
					
						
							| 
									
										
										
										
											2010-03-24 16:40:14 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-16 17:50:52 +09:00
										 |  |  | int ui_browser__input_window(const char *title, const char *text, char *input, | 
					
						
							|  |  |  | 			     const char *exit_msg, int delay_secs) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int x, y, len, key; | 
					
						
							|  |  |  | 	int max_len = 60, nr_lines = 0; | 
					
						
							|  |  |  | 	static char buf[50]; | 
					
						
							|  |  |  | 	const char *t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t = text; | 
					
						
							|  |  |  | 	while (1) { | 
					
						
							|  |  |  | 		const char *sep = strchr(t, '\n'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		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; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	max_len += 2; | 
					
						
							|  |  |  | 	nr_lines += 8; | 
					
						
							|  |  |  | 	y = SLtt_Screen_Rows / 2 - nr_lines / 2; | 
					
						
							|  |  |  | 	x = SLtt_Screen_Cols / 2 - max_len / 2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SLsmg_set_color(0); | 
					
						
							|  |  |  | 	SLsmg_draw_box(y, x++, nr_lines, max_len); | 
					
						
							|  |  |  | 	if (title) { | 
					
						
							|  |  |  | 		SLsmg_gotorc(y, x + 1); | 
					
						
							|  |  |  | 		SLsmg_write_string((char *)title); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	SLsmg_gotorc(++y, x); | 
					
						
							|  |  |  | 	nr_lines -= 7; | 
					
						
							|  |  |  | 	max_len -= 2; | 
					
						
							|  |  |  | 	SLsmg_write_wrapped_string((unsigned char *)text, y, x, | 
					
						
							|  |  |  | 				   nr_lines, max_len, 1); | 
					
						
							|  |  |  | 	y += nr_lines + 1; | 
					
						
							|  |  |  | 	SLsmg_set_color(0); | 
					
						
							|  |  |  | 	SLsmg_draw_box(y - 1, x + 1, 3, max_len - 2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SLsmg_gotorc(y + 3, x); | 
					
						
							|  |  |  | 	SLsmg_write_nstring((char *)exit_msg, max_len); | 
					
						
							|  |  |  | 	SLsmg_refresh(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	x += 2; | 
					
						
							|  |  |  | 	len = 0; | 
					
						
							|  |  |  | 	key = ui__getch(delay_secs); | 
					
						
							|  |  |  | 	while (key != K_TIMER && key != K_ENTER && key != K_ESC) { | 
					
						
							|  |  |  | 		if (key == K_BKSPC) { | 
					
						
							|  |  |  | 			if (len == 0) | 
					
						
							|  |  |  | 				goto next_key; | 
					
						
							|  |  |  | 			SLsmg_gotorc(y, x + --len); | 
					
						
							|  |  |  | 			SLsmg_write_char(' '); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			buf[len] = key; | 
					
						
							|  |  |  | 			SLsmg_gotorc(y, x + len++); | 
					
						
							|  |  |  | 			SLsmg_write_char(key); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		SLsmg_refresh(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/* XXX more graceful overflow handling needed */ | 
					
						
							|  |  |  | 		if (len == sizeof(buf) - 1) { | 
					
						
							|  |  |  | 			ui_helpline__push("maximum size of symbol name reached!"); | 
					
						
							|  |  |  | 			key = K_ENTER; | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | next_key: | 
					
						
							|  |  |  | 		key = ui__getch(delay_secs); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	buf[len] = '\0'; | 
					
						
							|  |  |  | 	strncpy(input, buf, len+1); | 
					
						
							|  |  |  | 	return key; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-26 08:00:55 -02:00
										 |  |  | int ui__question_window(const char *title, const char *text, | 
					
						
							|  |  |  | 			const char *exit_msg, int delay_secs) | 
					
						
							| 
									
										
										
										
											2010-05-16 21:04:27 -03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-10-26 08:00:55 -02:00
										 |  |  | 	int x, y; | 
					
						
							| 
									
										
										
										
											2010-05-16 21:04:27 -03:00
										 |  |  | 	int max_len = 0, nr_lines = 0; | 
					
						
							|  |  |  | 	const char *t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	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; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-26 08:00:55 -02:00
										 |  |  | 	max_len += 2; | 
					
						
							|  |  |  | 	nr_lines += 4; | 
					
						
							|  |  |  | 	y = SLtt_Screen_Rows / 2 - nr_lines / 2, | 
					
						
							|  |  |  | 	x = SLtt_Screen_Cols / 2 - max_len / 2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SLsmg_set_color(0); | 
					
						
							|  |  |  | 	SLsmg_draw_box(y, x++, nr_lines, max_len); | 
					
						
							|  |  |  | 	if (title) { | 
					
						
							|  |  |  | 		SLsmg_gotorc(y, x + 1); | 
					
						
							|  |  |  | 		SLsmg_write_string((char *)title); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	SLsmg_gotorc(++y, x); | 
					
						
							|  |  |  | 	nr_lines -= 2; | 
					
						
							|  |  |  | 	max_len -= 2; | 
					
						
							|  |  |  | 	SLsmg_write_wrapped_string((unsigned char *)text, y, x, | 
					
						
							|  |  |  | 				   nr_lines, max_len, 1); | 
					
						
							|  |  |  | 	SLsmg_gotorc(y + nr_lines - 2, x); | 
					
						
							|  |  |  | 	SLsmg_write_nstring((char *)" ", max_len); | 
					
						
							|  |  |  | 	SLsmg_gotorc(y + nr_lines - 1, x); | 
					
						
							|  |  |  | 	SLsmg_write_nstring((char *)exit_msg, max_len); | 
					
						
							|  |  |  | 	SLsmg_refresh(); | 
					
						
							|  |  |  | 	return ui__getch(delay_secs); | 
					
						
							| 
									
										
										
										
											2010-05-16 21:04:27 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-26 08:00:55 -02:00
										 |  |  | int ui__help_window(const char *text) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return ui__question_window("Help", text, "Press any key...", 0); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2010-11-06 11:47:24 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-26 12:04:37 -02:00
										 |  |  | int ui__dialog_yesno(const char *msg) | 
					
						
							| 
									
										
										
										
											2010-03-24 16:40:14 -03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-10-26 12:04:37 -02:00
										 |  |  | 	return ui__question_window(NULL, msg, "Enter: Yes, ESC: No", 0); | 
					
						
							| 
									
										
										
										
											2011-10-26 08:00:55 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-26 12:04:37 -02:00
										 |  |  | int __ui__warning(const char *title, const char *format, va_list args) | 
					
						
							| 
									
										
										
										
											2011-10-26 08:00:55 -02:00
										 |  |  | { | 
					
						
							|  |  |  | 	char *s; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (use_browser > 0 && vasprintf(&s, format, args) > 0) { | 
					
						
							| 
									
										
										
										
											2011-10-26 12:04:37 -02:00
										 |  |  | 		int key; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-26 08:00:55 -02:00
										 |  |  | 		pthread_mutex_lock(&ui__lock); | 
					
						
							| 
									
										
										
										
											2011-10-26 12:04:37 -02:00
										 |  |  | 		key = ui__question_window(title, s, "Press any key...", 0); | 
					
						
							| 
									
										
										
										
											2011-10-26 08:00:55 -02:00
										 |  |  | 		pthread_mutex_unlock(&ui__lock); | 
					
						
							|  |  |  | 		free(s); | 
					
						
							| 
									
										
										
										
											2011-10-26 12:04:37 -02:00
										 |  |  | 		return key; | 
					
						
							| 
									
										
										
										
											2011-10-26 08:00:55 -02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	fprintf(stderr, "%s:\n", title); | 
					
						
							|  |  |  | 	vfprintf(stderr, format, args); | 
					
						
							| 
									
										
										
										
											2011-10-26 12:04:37 -02:00
										 |  |  | 	return K_ESC; | 
					
						
							| 
									
										
										
										
											2010-03-24 16:40:14 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2010-11-27 02:41:01 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-26 12:04:37 -02:00
										 |  |  | int ui__warning(const char *format, ...) | 
					
						
							| 
									
										
										
										
											2010-11-27 02:41:01 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-10-26 12:04:37 -02:00
										 |  |  | 	int key; | 
					
						
							| 
									
										
										
										
											2010-11-27 02:41:01 -02:00
										 |  |  | 	va_list args; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	va_start(args, format); | 
					
						
							| 
									
										
										
										
											2011-10-26 12:04:37 -02:00
										 |  |  | 	key = __ui__warning("Warning", format, args); | 
					
						
							| 
									
										
										
										
											2011-10-26 08:00:55 -02:00
										 |  |  | 	va_end(args); | 
					
						
							| 
									
										
										
										
											2011-10-26 12:04:37 -02:00
										 |  |  | 	return key; | 
					
						
							| 
									
										
										
										
											2011-10-26 08:00:55 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-26 12:04:37 -02:00
										 |  |  | int ui__error(const char *format, ...) | 
					
						
							| 
									
										
										
										
											2011-10-26 08:00:55 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-10-26 12:04:37 -02:00
										 |  |  | 	int key; | 
					
						
							| 
									
										
										
										
											2011-10-26 08:00:55 -02:00
										 |  |  | 	va_list args; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	va_start(args, format); | 
					
						
							| 
									
										
										
										
											2011-10-26 12:04:37 -02:00
										 |  |  | 	key = __ui__warning("Error", format, args); | 
					
						
							| 
									
										
										
										
											2010-11-27 02:41:01 -02:00
										 |  |  | 	va_end(args); | 
					
						
							| 
									
										
										
										
											2011-10-26 12:04:37 -02:00
										 |  |  | 	return key; | 
					
						
							| 
									
										
										
										
											2010-11-27 02:41:01 -02:00
										 |  |  | } |