Commit d0712656 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo
Browse files

tools ui popup: Allow returning hotkeys



With this patch if an optional pointer is passed to ui__popup_menu()
then when any key that is not being handled (ENTER, ESC, etc) is typed,
it'll record that key in the pointer and return, allowing for hotkey
processing on the caller.

If NULL is passed, no change in logic, unhandled keys continue to be
ignored.

Reviewed-by: default avatarJiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lkml.kernel.org/n/tip-6ojn19mqzgmrdm8kdoigic0m@git.kernel.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent d10ec006
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -2393,7 +2393,7 @@ close_file_and_continue:
	closedir(pwd_dir);

	if (nr_options) {
		choice = ui__popup_menu(nr_options, options);
		choice = ui__popup_menu(nr_options, options, NULL);
		if (choice < nr_options && choice >= 0) {
			tmp = strdup(abs_path[choice]);
			if (tmp) {
@@ -3279,7 +3279,7 @@ skip_scripting:
		do {
			struct popup_action *act;

			choice = ui__popup_menu(nr_options, options);
			choice = ui__popup_menu(nr_options, options, NULL);
			if (choice == -1 || choice >= nr_options)
				break;

+1 −1
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ int res_sample_browse(struct res_sample *res_samples, int num_res,
			return -1;
		}
	}
	choice = ui__popup_menu(num_res, names);
	choice = ui__popup_menu(num_res, names, NULL);
	for (i = 0; i < num_res; i++)
		zfree(&names[i]);
	free(names);
+1 −1
Original line number Diff line number Diff line
@@ -126,7 +126,7 @@ static int list_scripts(char *script_name, bool *custom,
			SCRIPT_FULLPATH_LEN);
	if (num < 0)
		num = 0;
	choice = ui__popup_menu(num + max_std, (char * const *)names);
	choice = ui__popup_menu(num + max_std, (char * const *)names, NULL);
	if (choice < 0) {
		ret = -1;
		goto out;
+8 −4
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ static void ui_browser__argv_write(struct ui_browser *browser,
	ui_browser__write_nstring(browser, *arg, browser->width);
}

static int popup_menu__run(struct ui_browser *menu)
static int popup_menu__run(struct ui_browser *menu, int *keyp)
{
	int key;

@@ -45,6 +45,11 @@ static int popup_menu__run(struct ui_browser *menu)
			key = -1;
			break;
		default:
			if (keyp) {
				*keyp = key;
				key = menu->nr_entries;
				break;
			}
			continue;
		}

@@ -55,7 +60,7 @@ static int popup_menu__run(struct ui_browser *menu)
	return key;
}

int ui__popup_menu(int argc, char * const argv[])
int ui__popup_menu(int argc, char * const argv[], int *keyp)
{
	struct ui_browser menu = {
		.entries    = (void *)argv,
@@ -64,8 +69,7 @@ int ui__popup_menu(int argc, char * const argv[])
		.write	    = ui_browser__argv_write,
		.nr_entries = argc,
	};

	return popup_menu__run(&menu);
	return popup_menu__run(&menu, keyp);
}

int ui_browser__input_window(const char *title, const char *text, char *input,
+1 −1
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@
#include <stdarg.h>

int ui__getch(int delay_secs);
int ui__popup_menu(int argc, char * const argv[]);
int ui__popup_menu(int argc, char * const argv[], int *keyp);
int ui__help_window(const char *text);
int ui__dialog_yesno(const char *msg);
void __ui__info_window(const char *title, const char *text, const char *exit_msg);