diff --git a/repos/gems/src/server/terminal/main.cc b/repos/gems/src/server/terminal/main.cc
index 870a2a182d..d0d8c0e947 100644
--- a/repos/gems/src/server/terminal/main.cc
+++ b/repos/gems/src/server/terminal/main.cc
@@ -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,
diff --git a/repos/os/src/server/input_filter/de_ch.chargen b/repos/os/src/server/input_filter/de_ch.chargen
index fbc0e2ea4d..898a434f90 100644
--- a/repos/os/src/server/input_filter/de_ch.chargen
+++ b/repos/os/src/server/input_filter/de_ch.chargen
@@ -129,46 +129,6 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/repos/os/src/server/input_filter/fr_ch.chargen b/repos/os/src/server/input_filter/fr_ch.chargen
index 094549897c..a415289b0a 100644
--- a/repos/os/src/server/input_filter/fr_ch.chargen
+++ b/repos/os/src/server/input_filter/fr_ch.chargen
@@ -129,46 +129,6 @@
-
-
-
-
-
-