128 lines
		
	
	
	
		
			2.5 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			128 lines
		
	
	
	
		
			2.5 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								#include "util/cache.h"
							 | 
						||
| 
								 | 
							
								#include "util/debug.h"
							 | 
						||
| 
								 | 
							
								#include "ui/browser.h"
							 | 
						||
| 
								 | 
							
								#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;
							 | 
						||
| 
								 | 
							
								}
							 |