input: move control-modifier handling into clients

Moving the handling into the input-session clients enables more
sophisticated implementations (like Qt5) to apply key-symbol based
handling of those modifiers like correct CTRL-A with QWERTY and AZERTY
layouts and distinction of CTRL-J and Return.

Issue #3483
This commit is contained in:
Christian Helmuth 2019-09-10 16:47:24 +02:00
parent cc611834c9
commit edc9545229
7 changed files with 17 additions and 229 deletions

View File

@ -90,6 +90,8 @@ struct Terminal::Main : Character_consumer
bool _shift_pressed = false;
unsigned _ctrl_pressed = 0; /* number of control keys pressed */
bool _selecting = false;
struct Paste_buffer { char buffer[READ_BUFFER_SIZE]; } _paste_buffer { };
@ -320,11 +322,26 @@ void Terminal::Main::_handle_input()
}
}
if (event.key_press(Input::KEY_LEFTCTRL)
|| event.key_press(Input::KEY_RIGHTCTRL))
++_ctrl_pressed;
if (event.key_release(Input::KEY_LEFTCTRL)
|| event.key_release(Input::KEY_RIGHTCTRL))
--_ctrl_pressed;
if (event.key_press(Input::BTN_MIDDLE))
_paste_clipboard_content();
event.handle_press([&] (Input::Keycode, Codepoint codepoint) {
/* control-key combinations */
if (_ctrl_pressed
&& codepoint.value >= 'a' && codepoint.value <= 'z') {
_read_buffer.add(Codepoint { codepoint.value - 'a' + 1 } );
return;
}
/* function-key unicodes */
enum {
CODEPOINT_UP = 0xf700, CODEPOINT_DOWN = 0xf701,

View File

@ -129,46 +129,6 @@
<key name="KEY_102ND" code="0x003e"/> <!-- > -->
</map>
<!-- CONTROL -->
<map mod2="true">
<key name="KEY_3" code="0x001b"/> <!-- ESC (escape) CTRL-3 -->
<key name="KEY_4" code="0x001c"/> <!-- FS (file separator) CTRL-4 -->
<key name="KEY_5" code="0x001d"/> <!-- GS (group separator) CTRL-5 -->
<key name="KEY_6" code="0x001e"/> <!-- RS (record separator) CTRL-6 -->
<key name="KEY_7" code="0x001f"/> <!-- US (unit separator) CTRL-7 -->
<key name="KEY_Q" code="0x0011"/> <!-- DC1 (device control 1) CTRL-q -->
<key name="KEY_W" code="0x0017"/> <!-- ETB (end of trans. blk) CTRL-w -->
<key name="KEY_E" code="0x0005"/> <!-- ENQ (enquiry) CTRL-e -->
<key name="KEY_R" code="0x0012"/> <!-- DC2 (device control 2) CTRL-r -->
<key name="KEY_T" code="0x0014"/> <!-- DC4 (device control 4) CTRL-t -->
<key name="KEY_Y" code="0x001a"/> <!-- SUB (substitute) CTRL-z -->
<key name="KEY_U" code="0x0015"/> <!-- NAK (negative ack.) CTRL-u -->
<key name="KEY_I" code="0x0009"/> <!-- HT '\t' (horizontal tab) CTRL-i -->
<key name="KEY_O" code="0x000f"/> <!-- SI (shift in) CTRL-o -->
<key name="KEY_P" code="0x0010"/> <!-- DLE (data link escape) CTRL-p -->
<key name="KEY_A" code="0x0001"/> <!-- SOH (start of heading) CTRL-a -->
<key name="KEY_S" code="0x0013"/> <!-- DC3 (device control 3) CTRL-s -->
<key name="KEY_D" code="0x0004"/> <!-- EOT (end of transmission) CTRL-d -->
<key name="KEY_F" code="0x0006"/> <!-- ACK (acknowledge) CTRL-f -->
<key name="KEY_G" code="0x0007"/> <!-- BEL '\a' (bell) CTRL-g -->
<key name="KEY_H" code="0x0008"/> <!-- BS '\b' (backspace) CTRL-h -->
<key name="KEY_J" code="0x000a"/> <!-- LF '\n' (new line) CTRL-j -->
<key name="KEY_K" code="0x000b"/> <!-- VT '\v' (vertical tab) CTRL-k -->
<key name="KEY_L" code="0x000c"/> <!-- FF '\f' (form feed) CTRL-l -->
<key name="KEY_Z" code="0x0019"/> <!-- EM (end of medium) CTRL-y -->
<key name="KEY_X" code="0x0018"/> <!-- CAN (cancel) CTRL-x -->
<key name="KEY_C" code="0x0003"/> <!-- ETX (end of text) CTRL-c -->
<key name="KEY_V" code="0x0016"/> <!-- SYN (synchronous idle) CTRL-v -->
<key name="KEY_B" code="0x0002"/> <!-- STX (start of text) CTRL-b -->
<key name="KEY_N" code="0x000e"/> <!-- SO (shift out) CTRL-n -->
<key name="KEY_M" code="0x000d"/> <!-- CR '\r' (carriage ret) CTRL-m -->
<key name="KEY_KP7" code="0x001f"/> <!-- US (unit separator) CTRL-KP_7 -->
<key name="KEY_KP4" code="0x001c"/> <!-- FS (file separator) CTRL-KP_4 -->
<key name="KEY_KP5" code="0x001d"/> <!-- GS (group separator) CTRL-KP_5 -->
<key name="KEY_KP6" code="0x001e"/> <!-- RS (record separator) CTRL-KP_6 -->
<key name="KEY_KP3" code="0x001b"/> <!-- ESC (escape) CTRL-KP_3 -->
</map>
<!-- ALTGR -->
<map mod1="false" mod2="false" mod3="true" mod4="false">
<key name="KEY_1" code="0x00a6"/> <!-- ¦ (*) -->

View File

@ -129,47 +129,6 @@
<key name="KEY_102ND" code="0x003e"/> <!-- > -->
</map>
<!-- CONTROL -->
<map mod2="true">
<key name="KEY_3" code="0x001b"/> <!-- ESC (escape) CTRL-3 -->
<key name="KEY_4" code="0x001c"/> <!-- FS (file separator) CTRL-4 -->
<key name="KEY_5" code="0x001d"/> <!-- GS (group separator) CTRL-5 -->
<key name="KEY_6" code="0x001e"/> <!-- RS (record separator) CTRL-6 -->
<key name="KEY_7" code="0x001f"/> <!-- US (unit separator) CTRL-7 -->
<key name="KEY_Q" code="0x0011"/> <!-- DC1 (device control 1) CTRL-q -->
<key name="KEY_W" code="0x0017"/> <!-- ETB (end of trans. blk) CTRL-w -->
<key name="KEY_E" code="0x0005"/> <!-- ENQ (enquiry) CTRL-e -->
<key name="KEY_R" code="0x0012"/> <!-- DC2 (device control 2) CTRL-r -->
<key name="KEY_T" code="0x0014"/> <!-- DC4 (device control 4) CTRL-t -->
<key name="KEY_Y" code="0x001a"/> <!-- SUB (substitute) CTRL-z -->
<key name="KEY_U" code="0x0015"/> <!-- NAK (negative ack.) CTRL-u -->
<key name="KEY_I" code="0x0009"/> <!-- HT '\t' (horizontal tab) CTRL-i -->
<key name="KEY_O" code="0x000f"/> <!-- SI (shift in) CTRL-o -->
<key name="KEY_P" code="0x0010"/> <!-- DLE (data link escape) CTRL-p -->
<key name="KEY_A" code="0x0001"/> <!-- SOH (start of heading) CTRL-a -->
<key name="KEY_S" code="0x0013"/> <!-- DC3 (device control 3) CTRL-s -->
<key name="KEY_D" code="0x0004"/> <!-- EOT (end of transmission) CTRL-d -->
<key name="KEY_F" code="0x0006"/> <!-- ACK (acknowledge) CTRL-f -->
<key name="KEY_G" code="0x0007"/> <!-- BEL '\a' (bell) CTRL-g -->
<key name="KEY_H" code="0x0008"/> <!-- BS '\b' (backspace) CTRL-h -->
<key name="KEY_J" code="0x000a"/> <!-- LF '\n' (new line) CTRL-j -->
<key name="KEY_K" code="0x000b"/> <!-- VT '\v' (vertical tab) CTRL-k -->
<key name="KEY_L" code="0x000c"/> <!-- FF '\f' (form feed) CTRL-l -->
<key name="KEY_GRAVE" code="0x001e"/> <!-- RS (record separator) CTRL-asciicircum -->
<key name="KEY_Z" code="0x0019"/> <!-- EM (end of medium) CTRL-y -->
<key name="KEY_X" code="0x0018"/> <!-- CAN (cancel) CTRL-x -->
<key name="KEY_C" code="0x0003"/> <!-- ETX (end of text) CTRL-c -->
<key name="KEY_V" code="0x0016"/> <!-- SYN (synchronous idle) CTRL-v -->
<key name="KEY_B" code="0x0002"/> <!-- STX (start of text) CTRL-b -->
<key name="KEY_N" code="0x000e"/> <!-- SO (shift out) CTRL-n -->
<key name="KEY_M" code="0x000d"/> <!-- CR '\r' (carriage ret) CTRL-m -->
<key name="KEY_KP7" code="0x001f"/> <!-- US (unit separator) CTRL-KP_7 -->
<key name="KEY_KP4" code="0x001c"/> <!-- FS (file separator) CTRL-KP_4 -->
<key name="KEY_KP5" code="0x001d"/> <!-- GS (group separator) CTRL-KP_5 -->
<key name="KEY_KP6" code="0x001e"/> <!-- RS (record separator) CTRL-KP_6 -->
<key name="KEY_KP3" code="0x001b"/> <!-- ESC (escape) CTRL-KP_3 -->
</map>
<!-- ALTGR -->
<map mod1="false" mod2="false" mod3="true" mod4="false">
<key name="KEY_1" code="0x00b9"/> <!-- ¹ -->

View File

@ -133,50 +133,6 @@
<key name="KEY_KPSLASH" code="0x002f"/> <!-- / -->
</map>
<!-- CONTROL -->
<map mod2="true">
<key name="KEY_3" code="0x001b"/> <!-- ESC (escape) CTRL-3 -->
<key name="KEY_4" code="0x001c"/> <!-- FS (file separator) CTRL-4 -->
<key name="KEY_5" code="0x001d"/> <!-- GS (group separator) CTRL-5 -->
<key name="KEY_6" code="0x001e"/> <!-- RS (record separator) CTRL-6 -->
<key name="KEY_7" code="0x001f"/> <!-- US (unit separator) CTRL-7 -->
<key name="KEY_Q" code="0x0011"/> <!-- DC1 (device control 1) CTRL-q -->
<key name="KEY_W" code="0x0017"/> <!-- ETB (end of trans. blk) CTRL-w -->
<key name="KEY_E" code="0x0005"/> <!-- ENQ (enquiry) CTRL-e -->
<key name="KEY_R" code="0x0012"/> <!-- DC2 (device control 2) CTRL-r -->
<key name="KEY_T" code="0x0014"/> <!-- DC4 (device control 4) CTRL-t -->
<key name="KEY_Y" code="0x0019"/> <!-- EM (end of medium) CTRL-y -->
<key name="KEY_U" code="0x0015"/> <!-- NAK (negative ack.) CTRL-u -->
<key name="KEY_I" code="0x0009"/> <!-- HT '\t' (horizontal tab) CTRL-i -->
<key name="KEY_O" code="0x000f"/> <!-- SI (shift in) CTRL-o -->
<key name="KEY_P" code="0x0010"/> <!-- DLE (data link escape) CTRL-p -->
<key name="KEY_LEFTBRACE" code="0x001b"/> <!-- ESC (escape) CTRL-bracketleft -->
<key name="KEY_RIGHTBRACE" code="0x001d"/> <!-- GS (group separator) CTRL-bracketright -->
<key name="KEY_A" code="0x0001"/> <!-- SOH (start of heading) CTRL-a -->
<key name="KEY_S" code="0x0013"/> <!-- DC3 (device control 3) CTRL-s -->
<key name="KEY_D" code="0x0004"/> <!-- EOT (end of transmission) CTRL-d -->
<key name="KEY_F" code="0x0006"/> <!-- ACK (acknowledge) CTRL-f -->
<key name="KEY_G" code="0x0007"/> <!-- BEL '\a' (bell) CTRL-g -->
<key name="KEY_H" code="0x0008"/> <!-- BS '\b' (backspace) CTRL-h -->
<key name="KEY_J" code="0x000a"/> <!-- LF '\n' (new line) CTRL-j -->
<key name="KEY_K" code="0x000b"/> <!-- VT '\v' (vertical tab) CTRL-k -->
<key name="KEY_L" code="0x000c"/> <!-- FF '\f' (form feed) CTRL-l -->
<key name="KEY_BACKSLASH" code="0x001c"/> <!-- FS (file separator) CTRL-backslash -->
<key name="KEY_Z" code="0x001a"/> <!-- SUB (substitute) CTRL-z -->
<key name="KEY_X" code="0x0018"/> <!-- CAN (cancel) CTRL-x -->
<key name="KEY_C" code="0x0003"/> <!-- ETX (end of text) CTRL-c -->
<key name="KEY_V" code="0x0016"/> <!-- SYN (synchronous idle) CTRL-v -->
<key name="KEY_B" code="0x0002"/> <!-- STX (start of text) CTRL-b -->
<key name="KEY_N" code="0x000e"/> <!-- SO (shift out) CTRL-n -->
<key name="KEY_M" code="0x000d"/> <!-- CR '\r' (carriage ret) CTRL-m -->
<key name="KEY_SLASH" code="0x001f"/> <!-- US (unit separator) CTRL-slash -->
<key name="KEY_KP7" code="0x001f"/> <!-- US (unit separator) CTRL-KP_7 -->
<key name="KEY_KP4" code="0x001c"/> <!-- FS (file separator) CTRL-KP_4 -->
<key name="KEY_KP5" code="0x001d"/> <!-- GS (group separator) CTRL-KP_5 -->
<key name="KEY_KP6" code="0x001e"/> <!-- RS (record separator) CTRL-KP_6 -->
<key name="KEY_KP3" code="0x001b"/> <!-- ESC (escape) CTRL-KP_3 -->
</map>
<!-- ALTGR -->
<map mod1="false" mod2="false" mod3="true" mod4="false">
<key name="KEY_5" code="0x20ac"/> <!-- € -->

View File

@ -118,32 +118,4 @@
<key name="KEY_DOT" ascii="62"/> <!-- '>' -->
<key name="KEY_SLASH" char="?"/>
</map>
<map mod2="yes">
<key name="KEY_A" ascii="01" />
<key name="KEY_B" ascii="22" />
<key name="KEY_C" ascii="13" />
<key name="KEY_D" ascii="08" />
<key name="KEY_E" ascii="18" />
<key name="KEY_F" ascii="20" />
<key name="KEY_G" ascii="07" />
<key name="KEY_H" ascii="25" />
<key name="KEY_I" ascii="21" />
<key name="KEY_J" ascii="14" />
<key name="KEY_K" ascii="05" />
<key name="KEY_L" ascii="15" />
<key name="KEY_M" ascii="12" />
<key name="KEY_N" ascii="11" />
<key name="KEY_O" ascii="16" />
<key name="KEY_P" ascii="09" />
<key name="KEY_Q" ascii="17" />
<key name="KEY_R" ascii="23" />
<key name="KEY_S" ascii="19" />
<key name="KEY_T" ascii="02" />
<key name="KEY_U" ascii="06" />
<key name="KEY_V" ascii="03" />
<key name="KEY_W" ascii="04" />
<key name="KEY_X" ascii="24" />
<key name="KEY_Y" ascii="10" />
<key name="KEY_Z" ascii="26" />
</map>
</chargen>

View File

@ -129,46 +129,6 @@
<key name="KEY_102ND" code="0x003e"/> <!-- > -->
</map>
<!-- CONTROL -->
<map mod2="true">
<key name="KEY_3" code="0x001b"/> <!-- ESC (escape) CTRL-3 -->
<key name="KEY_4" code="0x001c"/> <!-- FS (file separator) CTRL-4 -->
<key name="KEY_5" code="0x001d"/> <!-- GS (group separator) CTRL-5 -->
<key name="KEY_6" code="0x001e"/> <!-- RS (record separator) CTRL-6 -->
<key name="KEY_7" code="0x001f"/> <!-- US (unit separator) CTRL-7 -->
<key name="KEY_Q" code="0x0011"/> <!-- DC1 (device control 1) CTRL-q -->
<key name="KEY_W" code="0x0017"/> <!-- ETB (end of trans. blk) CTRL-w -->
<key name="KEY_E" code="0x0005"/> <!-- ENQ (enquiry) CTRL-e -->
<key name="KEY_R" code="0x0012"/> <!-- DC2 (device control 2) CTRL-r -->
<key name="KEY_T" code="0x0014"/> <!-- DC4 (device control 4) CTRL-t -->
<key name="KEY_Y" code="0x001a"/> <!-- SUB (substitute) CTRL-z -->
<key name="KEY_U" code="0x0015"/> <!-- NAK (negative ack.) CTRL-u -->
<key name="KEY_I" code="0x0009"/> <!-- HT '\t' (horizontal tab) CTRL-i -->
<key name="KEY_O" code="0x000f"/> <!-- SI (shift in) CTRL-o -->
<key name="KEY_P" code="0x0010"/> <!-- DLE (data link escape) CTRL-p -->
<key name="KEY_A" code="0x0001"/> <!-- SOH (start of heading) CTRL-a -->
<key name="KEY_S" code="0x0013"/> <!-- DC3 (device control 3) CTRL-s -->
<key name="KEY_D" code="0x0004"/> <!-- EOT (end of transmission) CTRL-d -->
<key name="KEY_F" code="0x0006"/> <!-- ACK (acknowledge) CTRL-f -->
<key name="KEY_G" code="0x0007"/> <!-- BEL '\a' (bell) CTRL-g -->
<key name="KEY_H" code="0x0008"/> <!-- BS '\b' (backspace) CTRL-h -->
<key name="KEY_J" code="0x000a"/> <!-- LF '\n' (new line) CTRL-j -->
<key name="KEY_K" code="0x000b"/> <!-- VT '\v' (vertical tab) CTRL-k -->
<key name="KEY_L" code="0x000c"/> <!-- FF '\f' (form feed) CTRL-l -->
<key name="KEY_Z" code="0x0019"/> <!-- EM (end of medium) CTRL-y -->
<key name="KEY_X" code="0x0018"/> <!-- CAN (cancel) CTRL-x -->
<key name="KEY_C" code="0x0003"/> <!-- ETX (end of text) CTRL-c -->
<key name="KEY_V" code="0x0016"/> <!-- SYN (synchronous idle) CTRL-v -->
<key name="KEY_B" code="0x0002"/> <!-- STX (start of text) CTRL-b -->
<key name="KEY_N" code="0x000e"/> <!-- SO (shift out) CTRL-n -->
<key name="KEY_M" code="0x000d"/> <!-- CR '\r' (carriage ret) CTRL-m -->
<key name="KEY_KP7" code="0x001f"/> <!-- US (unit separator) CTRL-KP_7 -->
<key name="KEY_KP4" code="0x001c"/> <!-- FS (file separator) CTRL-KP_4 -->
<key name="KEY_KP5" code="0x001d"/> <!-- GS (group separator) CTRL-KP_5 -->
<key name="KEY_KP6" code="0x001e"/> <!-- RS (record separator) CTRL-KP_6 -->
<key name="KEY_KP3" code="0x001b"/> <!-- ESC (escape) CTRL-KP_3 -->
</map>
<!-- ALTGR -->
<map mod1="false" mod2="false" mod3="true" mod4="false">
<key name="KEY_1" code="0x00a6"/> <!-- ¦ (*) -->

View File

@ -129,42 +129,6 @@
<key name="KEY_102ND" code="0x003e"/> <!-- > -->
</map>
<!-- CONTROL -->
<map mod2="true">
<key name="KEY_8" code="0x001f"/> <!-- US (unit separator) CTRL-underscore -->
<key name="KEY_Q" code="0x0001"/> <!-- SOH (start of heading) CTRL-a -->
<key name="KEY_W" code="0x001a"/> <!-- SUB (substitute) CTRL-z -->
<key name="KEY_E" code="0x0005"/> <!-- ENQ (enquiry) CTRL-e -->
<key name="KEY_R" code="0x0012"/> <!-- DC2 (device control 2) CTRL-r -->
<key name="KEY_T" code="0x0014"/> <!-- DC4 (device control 4) CTRL-t -->
<key name="KEY_Y" code="0x0019"/> <!-- EM (end of medium) CTRL-y -->
<key name="KEY_U" code="0x0015"/> <!-- NAK (negative ack.) CTRL-u -->
<key name="KEY_I" code="0x0009"/> <!-- HT '\t' (horizontal tab) CTRL-i -->
<key name="KEY_O" code="0x000f"/> <!-- SI (shift in) CTRL-o -->
<key name="KEY_P" code="0x0010"/> <!-- DLE (data link escape) CTRL-p -->
<key name="KEY_A" code="0x0011"/> <!-- DC1 (device control 1) CTRL-q -->
<key name="KEY_S" code="0x0013"/> <!-- DC3 (device control 3) CTRL-s -->
<key name="KEY_D" code="0x0004"/> <!-- EOT (end of transmission) CTRL-d -->
<key name="KEY_F" code="0x0006"/> <!-- ACK (acknowledge) CTRL-f -->
<key name="KEY_G" code="0x0007"/> <!-- BEL '\a' (bell) CTRL-g -->
<key name="KEY_H" code="0x0008"/> <!-- BS '\b' (backspace) CTRL-h -->
<key name="KEY_J" code="0x000a"/> <!-- LF '\n' (new line) CTRL-j -->
<key name="KEY_K" code="0x000b"/> <!-- VT '\v' (vertical tab) CTRL-k -->
<key name="KEY_L" code="0x000c"/> <!-- FF '\f' (form feed) CTRL-l -->
<key name="KEY_SEMICOLON" code="0x000d"/> <!-- CR '\r' (carriage ret) CTRL-m -->
<key name="KEY_Z" code="0x0017"/> <!-- ETB (end of trans. blk) CTRL-w -->
<key name="KEY_X" code="0x0018"/> <!-- CAN (cancel) CTRL-x -->
<key name="KEY_C" code="0x0003"/> <!-- ETX (end of text) CTRL-c -->
<key name="KEY_V" code="0x0016"/> <!-- SYN (synchronous idle) CTRL-v -->
<key name="KEY_B" code="0x0002"/> <!-- STX (start of text) CTRL-b -->
<key name="KEY_N" code="0x000e"/> <!-- SO (shift out) CTRL-n -->
<key name="KEY_KP7" code="0x001f"/> <!-- US (unit separator) CTRL-KP_7 -->
<key name="KEY_KP4" code="0x001c"/> <!-- FS (file separator) CTRL-KP_4 -->
<key name="KEY_KP5" code="0x001d"/> <!-- GS (group separator) CTRL-KP_5 -->
<key name="KEY_KP6" code="0x001e"/> <!-- RS (record separator) CTRL-KP_6 -->
<key name="KEY_KP3" code="0x001b"/> <!-- ESC (escape) CTRL-KP_3 -->
</map>
<!-- ALTGR -->
<map mod1="false" mod2="false" mod3="true" mod4="false">
<key name="KEY_1" code="0x00b9"/> <!-- ¹ -->