NCursesUI: Add support for shifted function keys

Shifted function keys are not well standardized around terminals,
Shift F(N) usually returns F(X) + N, with X=12 on xterm, X=10 on
rxvt-unicode... Default to X=12 and make it configuable through
the ncurses_shift_function_key ui_option.

This fixes what #1898 tried to.
This commit is contained in:
Maxime Coste 2018-04-11 20:29:35 +10:00
parent 50e422659b
commit 5fa19f4d7f
4 changed files with 21 additions and 2 deletions

View File

@ -278,3 +278,7 @@ are exclusively available to built-in options.
*ncurses_wheel_down_button*, *ncurses_wheel_up_button*::: *ncurses_wheel_down_button*, *ncurses_wheel_up_button*:::
specify which button send for wheel down/up events specify which button send for wheel down/up events
*ncurses_shift_function_key*:::
Function key from which shifted function key start, if th
terminal sends F13 for <s-F1>, this should be set to 12.

View File

@ -360,7 +360,8 @@ void register_options()
" ncurses_enable_mouse bool\n" " ncurses_enable_mouse bool\n"
" ncurses_change_colors bool\n" " ncurses_change_colors bool\n"
" ncurses_wheel_up_button int\n" " ncurses_wheel_up_button int\n"
" ncurses_wheel_down_button int\n", " ncurses_wheel_down_button int\n"
" ncurses_shift_function_key int\n",
UserInterface::Options{}); UserInterface::Options{});
reg.declare_option("modelinefmt", "format string used to generate the modeline", reg.declare_option("modelinefmt", "format string used to generate the modeline",
"%val{bufname} %val{cursor_line}:%val{cursor_char_column} {{context_info}} {{mode_info}} - %val{client}@[%val{session}]"_str); "%val{bufname} %val{cursor_line}:%val{cursor_char_column} {{context_info}} {{mode_info}} - %val{client}@[%val{session}]"_str);

View File

@ -29,6 +29,8 @@ using std::max;
struct NCursesWin : WINDOW {}; struct NCursesWin : WINDOW {};
constexpr int NCursesUI::default_shift_function_key;
static constexpr StringView assistant_cat[] = static constexpr StringView assistant_cat[] =
{ R"( ___ )", { R"( ___ )",
R"( (__ \ )", R"( (__ \ )",
@ -615,8 +617,10 @@ Optional<Key> NCursesUI::get_next_key()
for (int i = 0; i < 12; ++i) for (int i = 0; i < 12; ++i)
{ {
if (c == KEY_F(i+1)) if (c == KEY_F(i + 1))
return {Key::F1 + i}; return {Key::F1 + i};
if (c == KEY_F(m_shift_function_key + i + 1))
return shift(Key::F1 + i);
} }
if (c >= 0 and c < 256) if (c >= 0 and c < 256)
@ -1082,6 +1086,13 @@ void NCursesUI::set_ui_options(const Options& options)
(it->value == "yes" or it->value == "true"); (it->value == "yes" or it->value == "true");
} }
{
auto it = options.find("ncurses_shift_function_key"_sv);
m_shift_function_key = it != options.end() ?
str_to_int_ifp(it->value).value_or(default_shift_function_key)
: default_shift_function_key;
}
{ {
auto it = options.find("ncurses_change_colors"_sv); auto it = options.find("ncurses_change_colors"_sv);
auto value = it == options.end() or auto value = it == options.end() or

View File

@ -140,6 +140,9 @@ private:
int m_wheel_up_button = 4; int m_wheel_up_button = 4;
int m_wheel_down_button = 5; int m_wheel_down_button = 5;
static constexpr int default_shift_function_key = 12;
int m_shift_function_key = default_shift_function_key;
bool m_set_title = true; bool m_set_title = true;
bool m_change_colors = true; bool m_change_colors = true;