Skip to content

Commit

Permalink
tools ui popup: Allow returning hotkeys
Browse files Browse the repository at this point in the history
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: Jiri 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: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Arnaldo Carvalho de Melo committed Jan 6, 2020
1 parent d10ec00 commit d071265
Show file tree
Hide file tree
Showing 5 changed files with 13 additions and 9 deletions.
4 changes: 2 additions & 2 deletions tools/perf/ui/browsers/hists.c
Original file line number Diff line number Diff line change
Expand Up @@ -2393,7 +2393,7 @@ static int switch_data_file(void)
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) {
Expand Down Expand Up @@ -3279,7 +3279,7 @@ static int perf_evsel__hists_browse(struct evsel *evsel, int nr_events,
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;

Expand Down
2 changes: 1 addition & 1 deletion tools/perf/ui/browsers/res_sample.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion tools/perf/ui/browsers/scripts.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
12 changes: 8 additions & 4 deletions tools/perf/ui/tui/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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;
}

Expand All @@ -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,
Expand All @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion tools/perf/ui/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit d071265

Please sign in to comment.