Handling of keys that are substrings of other keys
This commit is contained in:
parent
d4a163065d
commit
8c575e0aad
|
@ -1,5 +1,6 @@
|
||||||
2017-07-29 Markus Gans <guru.mail@muenster.de>
|
2017-07-29 Markus Gans <guru.mail@muenster.de>
|
||||||
* Added numeric Keypad [/], [*], [-], [+] support
|
* Added numeric Keypad [/], [*], [-], [+] support
|
||||||
|
* Handling of keys that are substrings of other keys
|
||||||
* More tests in FKeyboard unit test
|
* More tests in FKeyboard unit test
|
||||||
|
|
||||||
2017-07-27 Markus Gans <guru.mail@muenster.de>
|
2017-07-27 Markus Gans <guru.mail@muenster.de>
|
||||||
|
|
|
@ -151,33 +151,34 @@ class FKeyboard
|
||||||
void parseKeyBuffer();
|
void parseKeyBuffer();
|
||||||
int parseKeyString();
|
int parseKeyString();
|
||||||
int keyCorrection (const int&);
|
int keyCorrection (const int&);
|
||||||
|
void substringKeyHandling();
|
||||||
void keyPressed();
|
void keyPressed();
|
||||||
void keyReleased();
|
void keyReleased();
|
||||||
void escapeKeyPressed();
|
void escapeKeyPressed();
|
||||||
|
|
||||||
// Data Members
|
// Data Members
|
||||||
int key;
|
int key;
|
||||||
char k_buf[1024];
|
char k_buf[1024];
|
||||||
char fifo_buf[512];
|
char fifo_buf[512];
|
||||||
int fifo_offset;
|
int fifo_offset;
|
||||||
bool fifo_in_use;
|
bool fifo_in_use;
|
||||||
int fifo_buf_size;
|
int fifo_buf_size;
|
||||||
int stdin_status_flags;
|
int stdin_status_flags;
|
||||||
static long key_timeout;
|
static long key_timeout;
|
||||||
bool input_data_pending;
|
bool input_data_pending;
|
||||||
bool utf8_input;
|
bool utf8_input;
|
||||||
bool mouse_support;
|
bool mouse_support;
|
||||||
bool non_blocking_stdin;
|
bool non_blocking_stdin;
|
||||||
FKeyboardCommand keypressed_cmd;
|
FKeyboardCommand keypressed_cmd;
|
||||||
FKeyboardCommand keyreleased_cmd;
|
FKeyboardCommand keyreleased_cmd;
|
||||||
FKeyboardCommand escape_key_cmd;
|
FKeyboardCommand escape_key_cmd;
|
||||||
|
|
||||||
static timeval time_keypressed;
|
static timeval time_keypressed;
|
||||||
fc::fkeymap* termcap_map;
|
fc::fkeymap* termcap_map;
|
||||||
|
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
#undef linux
|
#undef linux
|
||||||
static FTermLinux* linux;
|
static FTermLinux* linux;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
|
@ -368,32 +368,32 @@ fmetakeymap Fmetakey[] =
|
||||||
{ fc::Fmkey_greater_than , "\033>" }, // M->
|
{ fc::Fmkey_greater_than , "\033>" }, // M->
|
||||||
{ fc::Fmkey_question_mark , "\033?" }, // M-?
|
{ fc::Fmkey_question_mark , "\033?" }, // M-?
|
||||||
{ fc::Fmkey_at , "\033@" }, // M-@
|
{ fc::Fmkey_at , "\033@" }, // M-@
|
||||||
{ fc::Fmkey_A , "\033A" }, // M-A
|
{ fc::Fmkey_A , "\033A" }, // shift-M-A
|
||||||
{ fc::Fmkey_B , "\033B" }, // M-B
|
{ fc::Fmkey_B , "\033B" }, // shift-M-B
|
||||||
{ fc::Fmkey_C , "\033C" }, // M-C
|
{ fc::Fmkey_C , "\033C" }, // shift-M-C
|
||||||
{ fc::Fmkey_D , "\033D" }, // M-D
|
{ fc::Fmkey_D , "\033D" }, // shift-M-D
|
||||||
{ fc::Fmkey_E , "\033E" }, // M-E
|
{ fc::Fmkey_E , "\033E" }, // shift-M-E
|
||||||
{ fc::Fmkey_F , "\033F" }, // M-F
|
{ fc::Fmkey_F , "\033F" }, // shift-M-F
|
||||||
{ fc::Fmkey_G , "\033G" }, // M-G
|
{ fc::Fmkey_G , "\033G" }, // shift-M-G
|
||||||
{ fc::Fmkey_H , "\033H" }, // M-H
|
{ fc::Fmkey_H , "\033H" }, // shift-M-H
|
||||||
{ fc::Fmkey_I , "\033I" }, // M-I
|
{ fc::Fmkey_I , "\033I" }, // shift-M-I
|
||||||
{ fc::Fmkey_J , "\033J" }, // M-J
|
{ fc::Fmkey_J , "\033J" }, // shift-M-J
|
||||||
{ fc::Fmkey_K , "\033K" }, // M-K
|
{ fc::Fmkey_K , "\033K" }, // shift-M-K
|
||||||
{ fc::Fmkey_L , "\033L" }, // M-L
|
{ fc::Fmkey_L , "\033L" }, // shift-M-L
|
||||||
{ fc::Fmkey_M , "\033M" }, // M-M
|
{ fc::Fmkey_M , "\033M" }, // shift-M-M
|
||||||
{ fc::Fmkey_N , "\033N" }, // M-N
|
{ fc::Fmkey_N , "\033N" }, // shift-M-N
|
||||||
{ fc::Fmkey_O , "\033O" }, // M-O
|
{ fc::Fmkey_O , "\033O" }, // shift-M-O
|
||||||
{ fc::Fmkey_P , "\033P" }, // M-P
|
{ fc::Fmkey_P , "\033P" }, // shift-M-P
|
||||||
{ fc::Fmkey_Q , "\033Q" }, // M-Q
|
{ fc::Fmkey_Q , "\033Q" }, // shift-M-Q
|
||||||
{ fc::Fmkey_R , "\033R" }, // M-R
|
{ fc::Fmkey_R , "\033R" }, // shift-M-R
|
||||||
{ fc::Fmkey_S , "\033S" }, // M-S
|
{ fc::Fmkey_S , "\033S" }, // shift-M-S
|
||||||
{ fc::Fmkey_T , "\033T" }, // M-T
|
{ fc::Fmkey_T , "\033T" }, // shift-M-T
|
||||||
{ fc::Fmkey_U , "\033U" }, // M-U
|
{ fc::Fmkey_U , "\033U" }, // shift-M-U
|
||||||
{ fc::Fmkey_V , "\033V" }, // M-V
|
{ fc::Fmkey_V , "\033V" }, // shift-M-V
|
||||||
{ fc::Fmkey_W , "\033W" }, // M-W
|
{ fc::Fmkey_W , "\033W" }, // shift-M-W
|
||||||
{ fc::Fmkey_X , "\033X" }, // M-X
|
{ fc::Fmkey_X , "\033X" }, // shift-M-X
|
||||||
{ fc::Fmkey_Y , "\033Y" }, // M-Y
|
{ fc::Fmkey_Y , "\033Y" }, // shift-M-Y
|
||||||
{ fc::Fmkey_Z , "\033Z" }, // M-Z
|
{ fc::Fmkey_Z , "\033Z" }, // shift-M-Z
|
||||||
{ fc::Fmkey_left_square_bracket , "\033[" }, // M-[
|
{ fc::Fmkey_left_square_bracket , "\033[" }, // M-[
|
||||||
{ fc::Fmkey_backslash , "\033\\"}, // M-'\'
|
{ fc::Fmkey_backslash , "\033\\"}, // M-'\'
|
||||||
{ fc::Fmkey_right_square_bracket , "\033]" }, // M-]
|
{ fc::Fmkey_right_square_bracket , "\033]" }, // M-]
|
||||||
|
|
|
@ -187,6 +187,9 @@ void FKeyboard::escapeKeyHandling()
|
||||||
input_data_pending = false;
|
input_data_pending = false;
|
||||||
escapeKeyPressed();
|
escapeKeyPressed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handling of keys that are substrings of other keys
|
||||||
|
substringKeyHandling();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -242,8 +245,8 @@ inline int FKeyboard::getTermcapKey()
|
||||||
for (n = len; n < fifo_buf_size; n++) // Remove founded entry
|
for (n = len; n < fifo_buf_size; n++) // Remove founded entry
|
||||||
fifo_buf[n - len] = fifo_buf[n];
|
fifo_buf[n - len] = fifo_buf[n];
|
||||||
|
|
||||||
for (; n - len < len; n++) // Fill rest with '\0'
|
for (n = n - len; n < fifo_buf_size; n++) // Fill rest with '\0'
|
||||||
fifo_buf[n - len] = '\0';
|
fifo_buf[n] = '\0';
|
||||||
|
|
||||||
input_data_pending = bool(fifo_buf[0] != '\0');
|
input_data_pending = bool(fifo_buf[0] != '\0');
|
||||||
return fc::Fkey[i].num;
|
return fc::Fkey[i].num;
|
||||||
|
@ -280,8 +283,8 @@ inline int FKeyboard::getMetaKey()
|
||||||
for (n = len; n < fifo_buf_size; n++) // Remove founded entry
|
for (n = len; n < fifo_buf_size; n++) // Remove founded entry
|
||||||
fifo_buf[n - len] = fifo_buf[n];
|
fifo_buf[n - len] = fifo_buf[n];
|
||||||
|
|
||||||
for (; n - len < len; n++) // Fill rest with '\0'
|
for (n = n - len; n < fifo_buf_size; n++) // Fill rest with '\0'
|
||||||
fifo_buf[n - len] = '\0';
|
fifo_buf[n] = '\0';
|
||||||
|
|
||||||
input_data_pending = bool(fifo_buf[0] != '\0');
|
input_data_pending = bool(fifo_buf[0] != '\0');
|
||||||
return fc::Fmetakey[i].num;
|
return fc::Fmetakey[i].num;
|
||||||
|
@ -513,6 +516,36 @@ int FKeyboard::keyCorrection (const int& keycode)
|
||||||
return key_correction;
|
return key_correction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
void FKeyboard::substringKeyHandling()
|
||||||
|
{
|
||||||
|
// Some keys (Meta-O, Meta-[, Meta-]) used substrings
|
||||||
|
// of other keys and are only processed after a timeout
|
||||||
|
|
||||||
|
if ( fifo_in_use
|
||||||
|
&& fifo_offset == 2
|
||||||
|
&& fifo_buf[0] == 0x1b
|
||||||
|
&& (fifo_buf[1] == 'O' || fifo_buf[1] == '[' || fifo_buf[1] == ']')
|
||||||
|
&& fifo_buf[2] == '\0'
|
||||||
|
&& isKeypressTimeout() )
|
||||||
|
{
|
||||||
|
fifo_offset = 0;
|
||||||
|
fifo_buf[0] = 0x00;
|
||||||
|
fifo_in_use = false;
|
||||||
|
input_data_pending = false;
|
||||||
|
|
||||||
|
if ( fifo_buf[1] == 'O' )
|
||||||
|
key = fc::Fmkey_O;
|
||||||
|
else if ( fifo_buf[1] == '[' )
|
||||||
|
key = fc::Fmkey_left_square_bracket;
|
||||||
|
else
|
||||||
|
key = fc::Fmkey_right_square_bracket;
|
||||||
|
|
||||||
|
keyPressed();
|
||||||
|
keyReleased();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void FKeyboard::keyPressed()
|
void FKeyboard::keyPressed()
|
||||||
{
|
{
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue