| 
									
										
										
										
											2012-04-30 13:55:08 +09:00
										 |  |  | #include <signal.h>
 | 
					
						
							|  |  |  | #include <stdbool.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "../../util/cache.h"
 | 
					
						
							|  |  |  | #include "../../util/debug.h"
 | 
					
						
							|  |  |  | #include "../browser.h"
 | 
					
						
							|  |  |  | #include "../helpline.h"
 | 
					
						
							|  |  |  | #include "../ui.h"
 | 
					
						
							|  |  |  | #include "../util.h"
 | 
					
						
							|  |  |  | #include "../libslang.h"
 | 
					
						
							|  |  |  | #include "../keysyms.h"
 | 
					
						
							| 
									
										
										
										
											2013-10-23 14:08:48 -03:00
										 |  |  | #include "tui.h"
 | 
					
						
							| 
									
										
										
										
											2012-04-30 13:55:08 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | static volatile int ui__need_resize; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-29 13:22:58 +09:00
										 |  |  | extern struct perf_error_ops perf_tui_eops; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-03 11:53:09 +09:00
										 |  |  | extern void hist_browser__init_hpp(void); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-30 13:55:08 +09:00
										 |  |  | void ui__refresh_dimensions(bool force) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (force || ui__need_resize) { | 
					
						
							|  |  |  | 		ui__need_resize = 0; | 
					
						
							|  |  |  | 		pthread_mutex_lock(&ui__lock); | 
					
						
							|  |  |  | 		SLtt_get_screen_size(); | 
					
						
							|  |  |  | 		SLsmg_reinit_smg(); | 
					
						
							|  |  |  | 		pthread_mutex_unlock(&ui__lock); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-11 01:15:03 +03:00
										 |  |  | static void ui__sigwinch(int sig __maybe_unused) | 
					
						
							| 
									
										
										
										
											2012-04-30 13:55:08 +09:00
										 |  |  | { | 
					
						
							|  |  |  | 	ui__need_resize = 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void ui__setup_sigwinch(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	static bool done; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (done) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	done = true; | 
					
						
							|  |  |  | 	pthread__unblock_sigwinch(); | 
					
						
							|  |  |  | 	signal(SIGWINCH, ui__sigwinch); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int ui__getch(int delay_secs) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct timeval timeout, *ptimeout = delay_secs ? &timeout : NULL; | 
					
						
							|  |  |  | 	fd_set read_set; | 
					
						
							|  |  |  | 	int err, key; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ui__setup_sigwinch(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	FD_ZERO(&read_set); | 
					
						
							|  |  |  | 	FD_SET(0, &read_set); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (delay_secs) { | 
					
						
							|  |  |  | 		timeout.tv_sec = delay_secs; | 
					
						
							|  |  |  | 		timeout.tv_usec = 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         err = select(1, &read_set, NULL, NULL, ptimeout); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (err == 0) | 
					
						
							|  |  |  | 		return K_TIMER; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (err == -1) { | 
					
						
							|  |  |  | 		if (errno == EINTR) | 
					
						
							|  |  |  | 			return K_RESIZE; | 
					
						
							|  |  |  | 		return K_ERROR; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	key = SLang_getkey(); | 
					
						
							|  |  |  | 	if (key != K_ESC) | 
					
						
							|  |  |  | 		return key; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	FD_ZERO(&read_set); | 
					
						
							|  |  |  | 	FD_SET(0, &read_set); | 
					
						
							|  |  |  | 	timeout.tv_sec = 0; | 
					
						
							|  |  |  | 	timeout.tv_usec = 20; | 
					
						
							|  |  |  |         err = select(1, &read_set, NULL, NULL, &timeout); | 
					
						
							|  |  |  | 	if (err == 0) | 
					
						
							|  |  |  | 		return K_ESC; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SLang_ungetkey(key); | 
					
						
							|  |  |  | 	return SLkp_getkey(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void ui__signal(int sig) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	ui__exit(false); | 
					
						
							|  |  |  | 	psignal(sig, "perf"); | 
					
						
							|  |  |  | 	exit(0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-30 13:55:09 +09:00
										 |  |  | int ui__init(void) | 
					
						
							| 
									
										
										
										
											2012-04-30 13:55:08 +09:00
										 |  |  | { | 
					
						
							|  |  |  | 	int err; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-28 11:34:10 -03:00
										 |  |  | 	SLutf8_enable(-1); | 
					
						
							|  |  |  | 	SLtt_get_terminfo(); | 
					
						
							|  |  |  | 	SLtt_get_screen_size(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = SLsmg_init_smg(); | 
					
						
							|  |  |  | 	if (err < 0) | 
					
						
							|  |  |  | 		goto out; | 
					
						
							|  |  |  | 	err = SLang_init_tty(0, 0, 0); | 
					
						
							|  |  |  | 	if (err < 0) | 
					
						
							|  |  |  | 		goto out; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-30 13:55:08 +09:00
										 |  |  | 	err = SLkp_init(); | 
					
						
							|  |  |  | 	if (err < 0) { | 
					
						
							|  |  |  | 		pr_err("TUI initialization failed.\n"); | 
					
						
							|  |  |  | 		goto out; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SLkp_define_keysym((char *)"^(kB)", SL_KEY_UNTAB); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ui_helpline__init(); | 
					
						
							|  |  |  | 	ui_browser__init(); | 
					
						
							| 
									
										
										
										
											2013-10-23 14:08:48 -03:00
										 |  |  | 	tui_progress__init(); | 
					
						
							| 
									
										
										
										
											2012-04-30 13:55:08 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	signal(SIGSEGV, ui__signal); | 
					
						
							|  |  |  | 	signal(SIGFPE, ui__signal); | 
					
						
							|  |  |  | 	signal(SIGINT, ui__signal); | 
					
						
							|  |  |  | 	signal(SIGQUIT, ui__signal); | 
					
						
							|  |  |  | 	signal(SIGTERM, ui__signal); | 
					
						
							| 
									
										
										
										
											2012-05-29 13:22:58 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	perf_error__register(&perf_tui_eops); | 
					
						
							| 
									
										
										
										
											2012-09-03 11:53:09 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	hist_browser__init_hpp(); | 
					
						
							| 
									
										
										
										
											2012-04-30 13:55:08 +09:00
										 |  |  | out: | 
					
						
							|  |  |  | 	return err; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ui__exit(bool wait_for_ok) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (wait_for_ok) | 
					
						
							|  |  |  | 		ui__question_window("Fatal Error", | 
					
						
							|  |  |  | 				    ui_helpline__last_msg, | 
					
						
							|  |  |  | 				    "Press any key...", 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SLtt_set_cursor_visibility(1); | 
					
						
							|  |  |  | 	SLsmg_refresh(); | 
					
						
							|  |  |  | 	SLsmg_reset_smg(); | 
					
						
							|  |  |  | 	SLang_reset_tty(); | 
					
						
							| 
									
										
										
										
											2012-05-29 13:22:58 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	perf_error__unregister(&perf_tui_eops); | 
					
						
							| 
									
										
										
										
											2012-04-30 13:55:08 +09:00
										 |  |  | } |