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