Preliminary support for Ctrl+C

This commit is contained in:
Baptiste Wicht 2016-07-02 17:19:14 +02:00
parent 34161e5ac3
commit f1df24d78a
3 changed files with 21 additions and 6 deletions

View File

@ -19,6 +19,8 @@ const char KEY_DOWN = 0x50;
const char KEY_LEFT_SHIFT = 0x2A; const char KEY_LEFT_SHIFT = 0x2A;
const char KEY_RIGHT_SHIFT = 0x36; const char KEY_RIGHT_SHIFT = 0x36;
const char KEY_LEFT_CTRL = 0x1D;
void install_driver(); void install_driver();
char get_char(); char get_char();
char key_to_ascii(uint8_t key); char key_to_ascii(uint8_t key);

View File

@ -18,6 +18,7 @@ constexpr const size_t MAX_TERMINALS = 2;
size_t active_terminal; size_t active_terminal;
bool shift = false; bool shift = false;
bool ctrl = false;
std::array<stdio::virtual_terminal, MAX_TERMINALS> terminals; std::array<stdio::virtual_terminal, MAX_TERMINALS> terminals;
@ -35,12 +36,16 @@ void stdio::virtual_terminal::send_input(char key){
key &= ~(0x80); key &= ~(0x80);
if(key == keyboard::KEY_LEFT_SHIFT || key == keyboard::KEY_RIGHT_SHIFT){ if(key == keyboard::KEY_LEFT_SHIFT || key == keyboard::KEY_RIGHT_SHIFT){
shift = false; shift = false;
} else if(key == keyboard::KEY_LEFT_CTRL){
ctrl = false;
} }
} }
//Key pressed //Key pressed
else { else {
if(key == keyboard::KEY_LEFT_SHIFT || key == keyboard::KEY_RIGHT_SHIFT){ if(key == keyboard::KEY_LEFT_SHIFT || key == keyboard::KEY_RIGHT_SHIFT){
shift = true; shift = true;
} else if(key == keyboard::KEY_LEFT_CTRL){
ctrl = true;
} else if(key == keyboard::KEY_BACKSPACE){ } else if(key == keyboard::KEY_BACKSPACE){
if(!input_buffer.empty() || !canonical_buffer.empty()){ if(!input_buffer.empty() || !canonical_buffer.empty()){
print('\b'); print('\b');
@ -54,9 +59,13 @@ void stdio::virtual_terminal::send_input(char key){
: keyboard::key_to_ascii(key); : keyboard::key_to_ascii(key);
if(qwertz_key){ if(qwertz_key){
if(ctrl && qwertz_key == 'c'){
input_buffer.push(200);
} else {
input_buffer.push(qwertz_key); input_buffer.push(qwertz_key);
print(qwertz_key); print(qwertz_key);
}
if(!input_queue.empty()){ if(!input_queue.empty()){
input_queue.wake_up(); 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; read = 0;
while(!canonical_buffer.empty()){ while(!canonical_buffer.empty()){
auto value = canonical_buffer.pop(); auto value = canonical_buffer.pop();

View File

@ -127,6 +127,10 @@ int main(){
while(true){ while(true){
auto c = read_input(input_buffer, 127); 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(input_buffer[c-1] == '\n'){
if(c > 1){ if(c > 1){
input_buffer[c-1] = '\0'; input_buffer[c-1] = '\0';