diff options
Diffstat (limited to 'tools/perf/ui/util.c')
| -rw-r--r-- | tools/perf/ui/util.c | 275 | 
1 files changed, 55 insertions, 220 deletions
diff --git a/tools/perf/ui/util.c b/tools/perf/ui/util.c index ad4374a16bb0..4f989774c8c6 100644 --- a/tools/perf/ui/util.c +++ b/tools/perf/ui/util.c @@ -1,250 +1,85 @@ -#include "../util.h" -#include <signal.h> -#include <stdbool.h> -#include <string.h> -#include <sys/ttydefaults.h> - -#include "../cache.h" -#include "../debug.h" -#include "browser.h" -#include "keysyms.h" -#include "helpline.h" -#include "ui.h"  #include "util.h" -#include "libslang.h" - -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); +#include "../debug.h" -	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) +/* + * Default error logging functions + */ +static int perf_stdio__error(const char *format, va_list args)  { -	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; +	fprintf(stderr, "Error:\n"); +	vfprintf(stderr, format, args); +	return 0;  } -int ui__popup_menu(int argc, char * const argv[]) +static int perf_stdio__warning(const char *format, va_list args)  { -	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 popup_menu__run(&menu); +	fprintf(stderr, "Warning:\n"); +	vfprintf(stderr, format, args); +	return 0;  } -int ui_browser__input_window(const char *title, const char *text, char *input, -			     const char *exit_msg, int delay_secs) +static struct perf_error_ops default_eops =  { -	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; -	len = 5; -	while (len--) { -		SLsmg_gotorc(y + len - 1, x); -		SLsmg_write_nstring((char *)" ", max_len); -	} -	SLsmg_draw_box(y++, x + 1, 3, max_len - 2); - -	SLsmg_gotorc(y + 3, x); -	SLsmg_write_nstring((char *)exit_msg, max_len); -	SLsmg_refresh(); +	.error		= perf_stdio__error, +	.warning	= perf_stdio__warning, +}; -	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(); +static struct perf_error_ops *perf_eops = &default_eops; -		/* 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; -} - -int ui__question_window(const char *title, const char *text, -			const char *exit_msg, int delay_secs) +int ui__error(const char *format, ...)  { -	int x, y; -	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; -	} - -	max_len += 2; -	nr_lines += 4; -	y = SLtt_Screen_Rows / 2 - nr_lines / 2, -	x = SLtt_Screen_Cols / 2 - max_len / 2; +	int ret; +	va_list args; -	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); -} +	va_start(args, format); +	ret = perf_eops->error(format, args); +	va_end(args); -int ui__help_window(const char *text) -{ -	return ui__question_window("Help", text, "Press any key...", 0); +	return ret;  } -int ui__dialog_yesno(const char *msg) -{ -	return ui__question_window(NULL, msg, "Enter: Yes, ESC: No", 0); -} - -int __ui__warning(const char *title, const char *format, va_list args) +int ui__warning(const char *format, ...)  { -	char *s; - -	if (use_browser > 0 && vasprintf(&s, format, args) > 0) { -		int key; +	int ret; +	va_list args; -		pthread_mutex_lock(&ui__lock); -		key = ui__question_window(title, s, "Press any key...", 0); -		pthread_mutex_unlock(&ui__lock); -		free(s); -		return key; -	} +	va_start(args, format); +	ret = perf_eops->warning(format, args); +	va_end(args); -	fprintf(stderr, "%s:\n", title); -	vfprintf(stderr, format, args); -	return K_ESC; +	return ret;  } -int ui__warning(const char *format, ...) + +/** + * perf_error__register - Register error logging functions + * @eops: The pointer to error logging function struct + * + * Register UI-specific error logging functions. Before calling this, + * other logging functions should be unregistered, if any. + */ +int perf_error__register(struct perf_error_ops *eops)  { -	int key; -	va_list args; +	if (perf_eops != &default_eops) +		return -1; -	va_start(args, format); -	key = __ui__warning("Warning", format, args); -	va_end(args); -	return key; +	perf_eops = eops; +	return 0;  } -int ui__error(const char *format, ...) +/** + * perf_error__unregister - Unregister error logging functions + * @eops: The pointer to error logging function struct + * + * Unregister already registered error logging functions. + */ +int perf_error__unregister(struct perf_error_ops *eops)  { -	int key; -	va_list args; +	if (perf_eops != eops) +		return -1; -	va_start(args, format); -	key = __ui__warning("Error", format, args); -	va_end(args); -	return key; +	perf_eops = &default_eops; +	return 0;  }  | 
