| 
									
										
										
										
											2013-12-26 14:37:59 +09:00
										 |  |  | #include "util/cache.h"
 | 
					
						
							|  |  |  | #include "util/debug.h"
 | 
					
						
							|  |  |  | #include "ui/browser.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-10 15:39:02 -03:00
										 |  |  | #include "ui/keysyms.h"
 | 
					
						
							| 
									
										
										
										
											2013-12-26 14:37:59 +09:00
										 |  |  | #include "ui/ui.h"
 | 
					
						
							|  |  |  | #include "ui/util.h"
 | 
					
						
							|  |  |  | #include "ui/libslang.h"
 | 
					
						
							|  |  |  | #include "util/header.h"
 | 
					
						
							|  |  |  | #include "util/session.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void ui_browser__argv_write(struct ui_browser *browser, | 
					
						
							|  |  |  | 				   void *entry, int row) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	char **arg = entry; | 
					
						
							|  |  |  | 	char *str = *arg; | 
					
						
							|  |  |  | 	char empty[] = " "; | 
					
						
							|  |  |  | 	bool current_entry = ui_browser__is_current_entry(browser, row); | 
					
						
							|  |  |  | 	unsigned long offset = (unsigned long)browser->priv; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (offset >= strlen(str)) | 
					
						
							|  |  |  | 		str = empty; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		str = str + offset; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ui_browser__set_color(browser, current_entry ? HE_COLORSET_SELECTED : | 
					
						
							|  |  |  | 						       HE_COLORSET_NORMAL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	slsmg_write_nstring(str, browser->width); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int list_menu__run(struct ui_browser *menu) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int key; | 
					
						
							|  |  |  | 	unsigned long offset; | 
					
						
							|  |  |  | 	const char help[] = | 
					
						
							|  |  |  | 	"h/?/F1        Show this window\n" | 
					
						
							|  |  |  | 	"UP/DOWN/PGUP\n" | 
					
						
							|  |  |  | 	"PGDN/SPACE\n" | 
					
						
							|  |  |  | 	"LEFT/RIGHT    Navigate\n" | 
					
						
							|  |  |  | 	"q/ESC/CTRL+C  Exit browser"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (ui_browser__show(menu, "Header information", "Press 'q' to exit") < 0) | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	while (1) { | 
					
						
							|  |  |  | 		key = ui_browser__run(menu, 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		switch (key) { | 
					
						
							|  |  |  | 		case K_RIGHT: | 
					
						
							|  |  |  | 			offset = (unsigned long)menu->priv; | 
					
						
							|  |  |  | 			offset += 10; | 
					
						
							|  |  |  | 			menu->priv = (void *)offset; | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 		case K_LEFT: | 
					
						
							|  |  |  | 			offset = (unsigned long)menu->priv; | 
					
						
							|  |  |  | 			if (offset >= 10) | 
					
						
							|  |  |  | 				offset -= 10; | 
					
						
							|  |  |  | 			menu->priv = (void *)offset; | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 		case K_F1: | 
					
						
							|  |  |  | 		case 'h': | 
					
						
							|  |  |  | 		case '?': | 
					
						
							|  |  |  | 			ui_browser__help_window(menu, help); | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 		case K_ESC: | 
					
						
							|  |  |  | 		case 'q': | 
					
						
							|  |  |  | 		case CTRL('c'): | 
					
						
							|  |  |  | 			key = -1; | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		default: | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ui_browser__hide(menu); | 
					
						
							|  |  |  | 	return key; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int ui__list_menu(int argc, char * const argv[]) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	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, | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return list_menu__run(&menu); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int tui__header_window(struct perf_session_env *env) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int i, argc = 0; | 
					
						
							|  |  |  | 	char **argv; | 
					
						
							|  |  |  | 	struct perf_session *session; | 
					
						
							|  |  |  | 	char *ptr, *pos; | 
					
						
							|  |  |  | 	size_t size; | 
					
						
							|  |  |  | 	FILE *fp = open_memstream(&ptr, &size); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	session = container_of(env, struct perf_session, header.env); | 
					
						
							|  |  |  | 	perf_header__fprintf_info(session, fp, true); | 
					
						
							|  |  |  | 	fclose(fp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (pos = ptr, argc = 0; (pos = strchr(pos, '\n')) != NULL; pos++) | 
					
						
							|  |  |  | 		argc++; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	argv = calloc(argc + 1, sizeof(*argv)); | 
					
						
							|  |  |  | 	if (argv == NULL) | 
					
						
							|  |  |  | 		goto out; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	argv[0] = pos = ptr; | 
					
						
							|  |  |  | 	for (i = 1; (pos = strchr(pos, '\n')) != NULL; i++) { | 
					
						
							|  |  |  | 		*pos++ = '\0'; | 
					
						
							|  |  |  | 		argv[i] = pos; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	BUG_ON(i != argc + 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ui__list_menu(argc, argv); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | out: | 
					
						
							|  |  |  | 	free(argv); | 
					
						
							|  |  |  | 	free(ptr); | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } |