From f1df24d78a0fa780df3f30d4ed1da72380ade7cd Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Sat, 2 Jul 2016 17:19:14 +0200 Subject: [PATCH] Preliminary support for Ctrl+C --- kernel/include/keyboard.hpp | 2 ++ kernel/src/terminal.cpp | 15 ++++++++++++--- programs/tsh/src/main.cpp | 10 +++++++--- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/kernel/include/keyboard.hpp b/kernel/include/keyboard.hpp index 409479ed..0184bc3e 100644 --- a/kernel/include/keyboard.hpp +++ b/kernel/include/keyboard.hpp @@ -19,6 +19,8 @@ const char KEY_DOWN = 0x50; const char KEY_LEFT_SHIFT = 0x2A; const char KEY_RIGHT_SHIFT = 0x36; +const char KEY_LEFT_CTRL = 0x1D; + void install_driver(); char get_char(); char key_to_ascii(uint8_t key); diff --git a/kernel/src/terminal.cpp b/kernel/src/terminal.cpp index 329027d9..00b61ac0 100644 --- a/kernel/src/terminal.cpp +++ b/kernel/src/terminal.cpp @@ -18,6 +18,7 @@ constexpr const size_t MAX_TERMINALS = 2; size_t active_terminal; bool shift = false; +bool ctrl = false; std::array terminals; @@ -35,12 +36,16 @@ void stdio::virtual_terminal::send_input(char key){ key &= ~(0x80); if(key == keyboard::KEY_LEFT_SHIFT || key == keyboard::KEY_RIGHT_SHIFT){ shift = false; + } else if(key == keyboard::KEY_LEFT_CTRL){ + ctrl = false; } } //Key pressed else { if(key == keyboard::KEY_LEFT_SHIFT || key == keyboard::KEY_RIGHT_SHIFT){ shift = true; + } else if(key == keyboard::KEY_LEFT_CTRL){ + ctrl = true; } else if(key == keyboard::KEY_BACKSPACE){ if(!input_buffer.empty() || !canonical_buffer.empty()){ print('\b'); @@ -54,9 +59,13 @@ void stdio::virtual_terminal::send_input(char key){ : keyboard::key_to_ascii(key); if(qwertz_key){ - input_buffer.push(qwertz_key); + if(ctrl && qwertz_key == 'c'){ + input_buffer.push(200); + } else { + input_buffer.push(qwertz_key); - print(qwertz_key); + print(qwertz_key); + } if(!input_queue.empty()){ input_queue.wake_up(); @@ -92,7 +101,7 @@ size_t stdio::virtual_terminal::read_input(char* buffer, size_t max){ } } - if(read > 0 && (c == '\n' || read == max)){ + if(read > 0 && (c == '\n' || c == 200 || read == max)){ read = 0; while(!canonical_buffer.empty()){ auto value = canonical_buffer.pop(); diff --git a/programs/tsh/src/main.cpp b/programs/tsh/src/main.cpp index 5f34979b..1ca04e57 100644 --- a/programs/tsh/src/main.cpp +++ b/programs/tsh/src/main.cpp @@ -121,12 +121,16 @@ int main(){ char input_buffer[128]; std::string current_input; - + print("thor> "); while(true){ auto c = read_input(input_buffer, 127); + if(input_buffer[c-1] == 200){ + input_buffer[c-1] = '\n'; + } + if(input_buffer[c-1] == '\n'){ if(c > 1){ input_buffer[c-1] = '\0'; @@ -174,7 +178,7 @@ int main(){ } current_input.clear(); - + print("thor> "); } else { input_buffer[c] = '\0'; @@ -184,4 +188,4 @@ int main(){ } __builtin_unreachable(); -} \ No newline at end of file +}