1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-09 03:03:12 +02:00

core: force ctrl keys to lower case when they are added (closes #1875)

This commit is contained in:
Sébastien Helleu
2023-01-29 11:17:15 +01:00
parent be0c04f498
commit fd746a04d6
51 changed files with 2089 additions and 859 deletions
+1 -1
View File
@@ -8406,7 +8406,7 @@ command_init ()
" restore default binding for key alt-r:\n"
" /key reset meta-r\n"
" key \"tab\" to stop search in buffer:\n"
" /key bindctxt search ctrl-I /input search_stop\n"
" /key bindctxt search ctrl-i /input search_stop\n"
" middle button of mouse on a nick to retrieve info on nick:\n"
" /key bindctxt mouse @item(buffer_nicklist):button3 "
"/msg nickserv info ${nick}"),
+2 -2
View File
@@ -60,7 +60,7 @@ secure_config_get_passphrase_from_user (const char *error)
"by WeeChat:");
prompt[1] = _("(enter just one space to skip the passphrase, but this "
"will DISABLE all secured data!)");
prompt[2] = _("(press ctrl-C to exit WeeChat now)");
prompt[2] = _("(press ctrl-c to exit WeeChat now)");
prompt[3] = error;
prompt[4] = NULL;
@@ -83,7 +83,7 @@ secure_config_get_passphrase_from_user (const char *error)
}
else if (strcmp (passphrase, "\x03") == 0)
{
/* ctrl-C pressed, just exit now */
/* ctrl-c pressed, just exit now */
exit (1);
}
else
+1 -1
View File
@@ -391,7 +391,7 @@ weechat_startup_message ()
{
string_fprintf (stdout,
_("WeeChat is running in headless mode "
"(Ctrl-C to quit)."));
"(ctrl-c to quit)."));
string_fprintf (stdout, "\n");
}
+102 -101
View File
@@ -81,42 +81,42 @@ gui_key_default_bindings (int context)
if (context == GUI_KEY_CONTEXT_DEFAULT)
{
BIND(/* <enter> */ "ctrl-M", "/input return");
BIND(/* <enter> */ "ctrl-J", "/input return");
BIND(/* m-<enter> */ "meta-ctrl-M", "/input insert \\n");
BIND(/* <tab> */ "ctrl-I", "/input complete_next");
BIND(/* <enter> */ "ctrl-m", "/input return");
BIND(/* <enter> */ "ctrl-j", "/input return");
BIND(/* m-<enter> */ "meta-ctrl-m", "/input insert \\n");
BIND(/* <tab> */ "ctrl-i", "/input complete_next");
BIND(/* s-<tab> */ "meta2-Z", "/input complete_previous");
BIND(/* ^R */ "ctrl-R", "/input search_text_here");
BIND(/* <backspace> */ "ctrl-H", "/input delete_previous_char");
BIND(/* ^r */ "ctrl-r", "/input search_text_here");
BIND(/* <backspace> */ "ctrl-h", "/input delete_previous_char");
BIND(/* <backspace> */ "ctrl-?", "/input delete_previous_char");
BIND(/* ^_ */ "ctrl-_", "/input undo");
BIND(/* m-_ */ "meta-_", "/input redo");
BIND(/* <del> */ "meta2-3~", "/input delete_next_char");
BIND(/* ^D */ "ctrl-D", "/input delete_next_char");
BIND(/* ^W */ "ctrl-W", "/input delete_previous_word_whitespace");
BIND(/* ^d */ "ctrl-d", "/input delete_next_char");
BIND(/* ^w */ "ctrl-w", "/input delete_previous_word_whitespace");
BIND(/* m-<backspace> */ "meta-ctrl-?", "/input delete_previous_word");
BIND(/* ^X */ "ctrl-X", "/buffer switch");
BIND(/* ^x */ "ctrl-x", "/buffer switch");
BIND(/* m-x */ "meta-x", "/buffer zoom");
BIND(/* m-d */ "meta-d", "/input delete_next_word");
BIND(/* ^K */ "ctrl-K", "/input delete_end_of_line");
BIND(/* ^k */ "ctrl-k", "/input delete_end_of_line");
BIND(/* m-r */ "meta-r", "/input delete_line");
BIND(/* ^T */ "ctrl-T", "/input transpose_chars");
BIND(/* ^U */ "ctrl-U", "/input delete_beginning_of_line");
BIND(/* ^Y */ "ctrl-Y", "/input clipboard_paste");
BIND(/* ^t */ "ctrl-t", "/input transpose_chars");
BIND(/* ^u */ "ctrl-u", "/input delete_beginning_of_line");
BIND(/* ^y */ "ctrl-y", "/input clipboard_paste");
BIND(/* <home> */ "meta2-1~", "/input move_beginning_of_line");
BIND(/* <home> */ "meta2-H", "/input move_beginning_of_line");
BIND(/* <home> */ "meta2-7~", "/input move_beginning_of_line");
BIND(/* <home> */ "meta-OH", "/input move_beginning_of_line");
BIND(/* ^A */ "ctrl-A", "/input move_beginning_of_line");
BIND(/* ^a */ "ctrl-a", "/input move_beginning_of_line");
BIND(/* <end> */ "meta2-4~", "/input move_end_of_line");
BIND(/* <end> */ "meta2-F", "/input move_end_of_line");
BIND(/* <end> */ "meta2-8~", "/input move_end_of_line");
BIND(/* <end> */ "meta-OF", "/input move_end_of_line");
BIND(/* ^E */ "ctrl-E", "/input move_end_of_line");
BIND(/* ^e */ "ctrl-e", "/input move_end_of_line");
BIND(/* <left> */ "meta2-D", "/input move_previous_char");
BIND(/* ^B */ "ctrl-B", "/input move_previous_char");
BIND(/* ^b */ "ctrl-b", "/input move_previous_char");
BIND(/* <right> */ "meta2-C", "/input move_next_char");
BIND(/* ^F */ "ctrl-F", "/input move_next_char");
BIND(/* ^f */ "ctrl-f", "/input move_next_char");
BIND(/* m-b */ "meta-b", "/input move_previous_word");
BIND(/* ^<left> */ "meta-Od", "/input move_previous_word");
BIND(/* ^<left> */ "meta-OD", "/input move_previous_word");
@@ -145,26 +145,26 @@ gui_key_default_bindings (int context)
BIND(/* m-k */ "meta-k", "/input grab_key_command");
BIND(/* m-s */ "meta-s", "/mute spell toggle");
BIND(/* m-u */ "meta-u", "/window scroll_unread");
BIND(/* ^S^U */ "ctrl-Sctrl-U", "/allbuf /buffer set unread");
BIND(/* ^Cb */ "ctrl-Cb", "/input insert \\x02");
BIND(/* ^Cc */ "ctrl-Cc", "/input insert \\x03");
BIND(/* ^Ci */ "ctrl-Ci", "/input insert \\x1D");
BIND(/* ^Co */ "ctrl-Co", "/input insert \\x0F");
BIND(/* ^Cv */ "ctrl-Cv", "/input insert \\x16");
BIND(/* ^C_ */ "ctrl-C_", "/input insert \\x1F");
BIND(/* ^s^u */ "ctrl-sctrl-u", "/allbuf /buffer set unread");
BIND(/* ^cb */ "ctrl-cb", "/input insert \\x02");
BIND(/* ^cc */ "ctrl-cc", "/input insert \\x03");
BIND(/* ^ci */ "ctrl-ci", "/input insert \\x1D");
BIND(/* ^co */ "ctrl-co", "/input insert \\x0F");
BIND(/* ^cv */ "ctrl-cv", "/input insert \\x16");
BIND(/* ^c_ */ "ctrl-c_", "/input insert \\x1F");
BIND(/* m-<right> */ "meta-meta2-C", "/buffer +1");
BIND(/* m-<right> */ "meta2-1;3C", "/buffer +1");
BIND(/* m-<down> */ "meta-meta2-B", "/buffer +1");
BIND(/* m-<down> */ "meta2-1;3B", "/buffer +1");
BIND(/* <f6> */ "meta2-17~", "/buffer +1");
BIND(/* ^N */ "ctrl-N", "/buffer +1");
BIND(/* ^n */ "ctrl-n", "/buffer +1");
BIND(/* m-<left> */ "meta-meta2-D", "/buffer -1");
BIND(/* m-<left> */ "meta2-1;3D", "/buffer -1");
BIND(/* m-<up> */ "meta-meta2-A", "/buffer -1");
BIND(/* m-<up> */ "meta2-1;3A", "/buffer -1");
BIND(/* <f5> */ "meta2-15~", "/buffer -1");
BIND(/* <f5> */ "meta2-[E", "/buffer -1");
BIND(/* ^P */ "ctrl-P", "/buffer -1");
BIND(/* ^p */ "ctrl-p", "/buffer -1");
BIND(/* <pgup> */ "meta2-5~", "/window page_up");
BIND(/* <pgup> */ "meta2-I", "/window page_up");
BIND(/* <pgdn> */ "meta2-6~", "/window page_down");
@@ -194,7 +194,7 @@ gui_key_default_bindings (int context)
BIND(/* m-<f11> */ "meta-meta2-23~", "/bar scroll nicklist * b");
BIND(/* m-<f12> */ "meta2-24;3~", "/bar scroll nicklist * e");
BIND(/* m-<f12> */ "meta-meta2-24~", "/bar scroll nicklist * e");
BIND(/* ^L */ "ctrl-L", "/window refresh");
BIND(/* ^l */ "ctrl-l", "/window refresh");
BIND(/* <f7> */ "meta2-18~", "/window -1");
BIND(/* <f8> */ "meta2-19~", "/window +1");
BIND(/* m-w,m-<up> */ "meta-wmeta-meta2-A", "/window up");
@@ -238,20 +238,20 @@ gui_key_default_bindings (int context)
}
else if (context == GUI_KEY_CONTEXT_SEARCH)
{
BIND(/* <enter> */ "ctrl-M", "/input search_stop_here");
BIND(/* <enter> */ "ctrl-J", "/input search_stop_here");
BIND(/* ^Q */ "ctrl-Q", "/input search_stop");
BIND(/* <enter> */ "ctrl-m", "/input search_stop_here");
BIND(/* <enter> */ "ctrl-j", "/input search_stop_here");
BIND(/* ^q */ "ctrl-q", "/input search_stop");
BIND(/* m-c */ "meta-c", "/input search_switch_case");
BIND(/* ^R */ "ctrl-R", "/input search_switch_regex");
BIND(/* <tab> */ "ctrl-I", "/input search_switch_where");
BIND(/* ^r */ "ctrl-r", "/input search_switch_regex");
BIND(/* <tab> */ "ctrl-i", "/input search_switch_where");
BIND(/* <up> */ "meta2-A", "/input search_previous");
BIND(/* <down> */ "meta2-B", "/input search_next");
}
else if (context == GUI_KEY_CONTEXT_CURSOR)
{
/* general & move */
BIND(/* <enter> */ "ctrl-M", "/cursor stop");
BIND(/* <enter> */ "ctrl-J", "/cursor stop");
BIND(/* <enter> */ "ctrl-m", "/cursor stop");
BIND(/* <enter> */ "ctrl-j", "/cursor stop");
BIND(/* <up> */ "meta2-A", "/cursor move up");
BIND(/* <down> */ "meta2-B", "/cursor move down");
BIND(/* <left> */ "meta2-D", "/cursor move left");
@@ -343,77 +343,78 @@ gui_key_flush (int paste)
insert_ok = 1;
utf_partial_char[0] = '\0';
if (gui_mouse_event_pending || (key < 32) || (key == 127))
if (gui_mouse_event_pending)
{
if (gui_mouse_event_pending)
insert_ok = 0;
key_str[0] = (char)key;
key_str[1] = '\0';
length_key_str = 1;
}
else if (key < 32)
{
insert_ok = 0;
key_str[0] = '\x01';
key_str[1] = (char)key + '@';
/*
* note: the terminal makes no difference between ctrl-x and
* ctrl-shift-x, so for now WeeChat uses lower case letters for
* ctrl keys
*/
if ((key_str[1] >= 'A') && (key_str[1] <= 'Z'))
key_str[1] += 'a' - 'A';
key_str[2] = '\0';
length_key_str = 2;
}
else if (key == 127)
{
key_str[0] = '\x01';
key_str[1] = '?';
key_str[2] = '\0';
length_key_str = 2;
}
else if (local_utf8)
{
key_str[length_key_str] = (char)key;
key_str[length_key_str + 1] = '\0';
length_key_str++;
/*
* replace invalid chars by "?", but NOT last char of
* string, if it is incomplete UTF-8 char (another char
* will be added to the string on next iteration)
*/
ptr_char = key_str;
while (ptr_char && ptr_char[0])
{
insert_ok = 0;
key_str[0] = (char)key;
key_str[1] = '\0';
length_key_str = 1;
}
else if (key < 32)
{
insert_ok = 0;
key_str[0] = '\x01';
key_str[1] = (char)key + '@';
key_str[2] = '\0';
length_key_str = 2;
}
else if (key == 127)
{
key_str[0] = '\x01';
key_str[1] = '?';
key_str[2] = '\0';
length_key_str = 2;
(void) utf8_is_valid (ptr_char, -1, &ptr_error);
if (!ptr_error)
break;
next_char = (char *)utf8_next_char (ptr_error);
if (next_char && next_char[0])
{
ptr_char = ptr_error;
while (ptr_char < next_char)
{
ptr_char[0] = '?';
ptr_char++;
}
}
else
{
strcpy (utf_partial_char, ptr_char);
ptr_char[0] = '\0';
break;
}
ptr_char = next_char;
}
}
else
{
if (local_utf8)
{
key_str[length_key_str] = (char)key;
key_str[length_key_str + 1] = '\0';
length_key_str++;
/*
* replace invalid chars by "?", but NOT last char of
* string, if it is incomplete UTF-8 char (another char
* will be added to the string on next iteration)
*/
ptr_char = key_str;
while (ptr_char && ptr_char[0])
{
(void) utf8_is_valid (ptr_char, -1, &ptr_error);
if (!ptr_error)
break;
next_char = (char *)utf8_next_char (ptr_error);
if (next_char && next_char[0])
{
ptr_char = ptr_error;
while (ptr_char < next_char)
{
ptr_char[0] = '?';
ptr_char++;
}
}
else
{
strcpy (utf_partial_char, ptr_char);
ptr_char[0] = '\0';
break;
}
ptr_char = next_char;
}
}
else
{
/* convert input to UTF-8 */
key_temp[0] = (char)key;
key_temp[1] = '\0';
key_utf = string_iconv_to_internal (NULL, key_temp);
strcat (key_str, key_utf);
}
/* convert input to UTF-8 */
key_temp[0] = (char)key;
key_temp[1] = '\0';
key_utf = string_iconv_to_internal (NULL, key_temp);
strcat (key_str, key_utf);
}
if (key_str[0])
@@ -553,12 +554,12 @@ gui_key_read_cb (const void *pointer, void *data, int fd)
{
if (gui_key_paste_pending && (buffer[i] == 25))
{
/* ctrl-Y: accept paste */
/* ctrl-y: accept paste */
accept_paste = 1;
}
else if (gui_key_paste_pending && (buffer[i] == 14))
{
/* ctrl-N: cancel paste */
/* ctrl-n: cancel paste */
cancel_paste = 1;
}
else
+2 -2
View File
@@ -111,7 +111,7 @@ gui_main_get_password (const char **prompt, char *password, int size)
/* enter */
if (ch == '\n')
break;
/* terminal lost or ctrl-C */
/* terminal lost or ctrl-c */
if ((ch == ERR) || (ch == 3))
{
password[0] = 3;
@@ -164,7 +164,7 @@ gui_main_init ()
struct t_gui_bar_window *ptr_bar_win;
char title[256];
/* allow Ctrl-C to quit WeeChat in headless mode */
/* allow ctrl-c to quit WeeChat in headless mode */
if (weechat_headless)
signal_catch (SIGINT, &gui_main_signal_sigint);
+2 -1
View File
@@ -2461,7 +2461,8 @@ gui_window_swap (struct t_gui_window *window, int direction)
/*
* Called when terminal size is modified.
*
* Argument full_refresh == 1 when Ctrl+L is pressed, or if terminal is resized.
* Argument full_refresh == 1 when ctrl-l is pressed, or if terminal is
* resized.
*/
void
+2 -2
View File
@@ -759,8 +759,8 @@ gui_bar_item_input_paste_cb (const void *pointer, void *data,
lines = gui_key_get_paste_lines ();
snprintf (str_paste, sizeof (str_paste),
NG_("%sPaste %d line? [ctrl-Y] Yes [ctrl-N] No",
"%sPaste %d lines? [ctrl-Y] Yes [ctrl-N] No",
NG_("%sPaste %d line? [ctrl-y] Yes [ctrl-n] No",
"%sPaste %d lines? [ctrl-y] Yes [ctrl-n] No",
lines),
gui_color_get_custom (gui_color_get_name (CONFIG_COLOR(config_color_input_actions))),
lines);
+8 -8
View File
@@ -300,7 +300,7 @@ gui_input_clipboard_copy (const char *buffer, int size)
/*
* Pastes the internal clipboard at cursor pos in input line
* (default key: ctrl-Y).
* (default key: ctrl-y).
*/
void
@@ -490,7 +490,7 @@ gui_input_complete_previous (struct t_gui_buffer *buffer)
}
/*
* Searches for text in buffer at current position (default key: ctrl-R).
* Searches for text in buffer at current position (default key: ctrl-r).
*/
void
@@ -578,7 +578,7 @@ gui_input_search_switch_case (struct t_gui_buffer *buffer)
}
/*
* Switches string/regex for search in buffer (default key: ctrl-R during
* Switches string/regex for search in buffer (default key: ctrl-r during
* search).
*/
@@ -675,7 +675,7 @@ gui_input_search_stop_here (struct t_gui_buffer *buffer)
}
/*
* Stops text search (default key: ctrl-Q during search).
* Stops text search (default key: ctrl-q during search).
*/
void
@@ -828,7 +828,7 @@ gui_input_delete_previous_word (struct t_gui_buffer *buffer)
}
/*
* Deletes previous word until whitespace (default key: ctrl-W).
* Deletes previous word until whitespace (default key: ctrl-w).
*/
void
@@ -914,7 +914,7 @@ gui_input_delete_next_word (struct t_gui_buffer *buffer)
}
/*
* Deletes all from cursor pos to beginning of line (default key: ctrl-U).
* Deletes all from cursor pos to beginning of line (default key: ctrl-u).
*/
void
@@ -950,7 +950,7 @@ gui_input_delete_beginning_of_line (struct t_gui_buffer *buffer)
}
/*
* Deletes all from cursor pos to end of line (default key: ctrl-K).
* Deletes all from cursor pos to end of line (default key: ctrl-k).
*/
void
@@ -998,7 +998,7 @@ gui_input_delete_line (struct t_gui_buffer *buffer)
}
/*
* Transposes chars at cursor pos (default key: ctrl-T).
* Transposes chars at cursor pos (default key: ctrl-t).
*/
void
+22 -3
View File
@@ -268,7 +268,11 @@ gui_key_grab_end_timer_cb (const void *pointer, void *data,
/*
* Gets internal code from user key name.
*
* For example: returns '\x01'+'R' for "ctrl-R"
* Examples:
* "meta-a" => "\x01[a"
* "meta-A" => "\x01[A"
* "ctrl-R" => "\x01" + "r" (lower case enforced for ctrl keys)
* "ctrl-r" => "\x01" + "r"
*
* Note: result must be freed after use.
*/
@@ -276,7 +280,7 @@ gui_key_grab_end_timer_cb (const void *pointer, void *data,
char *
gui_key_get_internal_code (const char *key)
{
char **result;
char **result, str_key[2];
if (!key)
return NULL;
@@ -307,6 +311,21 @@ gui_key_get_internal_code (const char *key)
if (key[5])
string_dyn_concat (result, "\x01", -1);
key += 5;
if (key[0])
{
/*
* note: the terminal makes no difference between ctrl-x and
* ctrl-shift-x, so for now WeeChat automatically converts any
* ctrl-letter key to lower case: when the user tries to bind
* "ctrl-A", the key "ctrl-a" is actually added
* (lower case is forced for ctrl keys)
*/
str_key[0] = ((key[0] >= 'A') && (key[0] <= 'Z')) ?
key[0] + ('a' - 'A') : key[0];
str_key[1] = '\0';
string_dyn_concat (result, str_key, -1);
key++;
}
}
else if (strncmp (key, "space", 5) == 0)
{
@@ -1760,7 +1779,7 @@ gui_key_get_paste_lines ()
/*
* Checks pasted lines: if more than N lines, then enables paste mode and ask
* confirmation to user (ctrl-Y=paste, ctrl-N=cancel) (N is option
* confirmation to user (ctrl-y=paste, ctrl-n=cancel) (N is option
* weechat.look.paste_max_lines).
*
* Returns:
+1 -1
View File
@@ -141,7 +141,7 @@ buflist_buffer_get_irc_pointers (struct t_gui_buffer *buffer,
* Buffers are sorted so that the active buffer and buffers immediately after
* this one are first in list, followed by the buffers before the active one.
* This sort respects the order of next active buffers that can be selected
* with ctrl-X.
* with ctrl-x.
*
* For example with such list of merged buffers:
*
+5 -5
View File
@@ -83,7 +83,7 @@ fset_buffer_set_title ()
"(u)=unmark matching options, "
"alt+p(p)=toggle plugins desc, "
"alt+v(v)=toggle help bar, "
"ctrl+X(x)=switch format, "
"ctrl+x(x)=switch format, "
"(q)=close buffer"),
weechat_color (weechat_config_string (fset_config_color_title_current_option)),
(num_options > 0) ? fset_buffer_selected_line + 1 : 0,
@@ -1363,17 +1363,17 @@ fset_buffer_set_keys ()
{ "meta-+", "/fset -add 1" },
{ "meta-fmeta-r", "/fset -reset" },
{ "meta-fmeta-u", "/fset -unset" },
{ "meta-ctrl-J", "/fset -set" },
{ "meta-ctrl-M", "/fset -set" },
{ "meta-ctrl-j", "/fset -set" },
{ "meta-ctrl-m", "/fset -set" },
{ "meta-fmeta-n", "/fset -setnew" },
{ "meta-fmeta-a", "/fset -append" },
{ "meta-,", "/fset -mark" },
{ "meta2-a", "/fset -up; /fset -mark" },
{ "meta2-b", "/fset -mark; /fset -down" },
{ "ctrl-L", "/fset -refresh" },
{ "ctrl-l", "/fset -refresh" },
{ "meta-p", "/mute /set fset.look.show_plugins_desc toggle" },
{ "meta-v", "/bar toggle " FSET_BAR_NAME },
{ "ctrl-X", "/fset -format" },
{ "ctrl-x", "/fset -format" },
{ NULL, NULL },
};
char str_key[64];
+2 -2
View File
@@ -745,7 +745,7 @@ fset_command_init ()
"see filters above)\n"
"\n"
"Other keys and input on fset buffer:\n"
" ctrl+L refresh options and whole screen "
" ctrl+l refresh options and whole screen "
"(command: /fset -refresh)\n"
" $ refresh options (keep marked options)\n"
" $$ refresh options (unmark all options)\n"
@@ -759,7 +759,7 @@ fset_command_init ()
" w:xxx export options in file \"xxx\"\n"
" w-:xxx export options in file \"xxx\" without help\n"
" w+:xxx export options in file \"xxx\" with help\n"
" ctrl+X x switch the format used to display options\n"
" ctrl+x x switch the format used to display options\n"
" q close fset buffer\n"
"\n"
"Mouse actions on fset buffer:\n"
+3 -3
View File
@@ -433,7 +433,7 @@ fset_config_init ()
fset_config_file, ptr_section,
"format_number", "integer",
N_("number of format used to display options; this is dynamically "
"changed by the key ctrl-X on the fset buffer"),
"changed by the key ctrl-x on the fset buffer"),
NULL, 1, 2, "1", NULL, 0,
NULL, NULL, NULL,
&fset_config_change_format_number_cb, NULL, NULL,
@@ -566,7 +566,7 @@ fset_config_init ()
"an empty string uses the default format "
"(\"${marked} ${name} ${type} ${value2}\"), which is without "
"evaluation of string and then much faster; "
"formats can be switched with key ctrl+X"),
"formats can be switched with key ctrl-x"),
NULL, 0, 0,
"",
NULL, 0,
@@ -582,7 +582,7 @@ fset_config_init ()
"an empty string uses the default format "
"(\"${marked} ${name} ${type} ${value2}\"), which is without "
"evaluation of string and then much faster; "
"formats can be switched with key ctrl+X"),
"formats can be switched with key ctrl-x"),
NULL, 0, 0,
"${marked} ${name} ${type} ${value2}${newline}"
" ${empty_name} ${_default_value}${color:darkgray} -- "