From 90d762b079bc526f7e4f8fe2cfb63e223c8938b3 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sat, 15 Oct 2022 17:36:42 -0300 Subject: [PATCH] console: improvements --- src/include/termios.h | 5 +++++ src/video/consoledev.c | 25 ++++++++++++++++++++----- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/include/termios.h b/src/include/termios.h index a08c8ebb..d81507d5 100644 --- a/src/include/termios.h +++ b/src/include/termios.h @@ -11,6 +11,11 @@ typedef unsigned int tcflag_t; #define ECHO 0000010 #define ICANON 0000002 #define VMIN 6 +#define INLCR 0000100 +#define IGNCR 0000200 +#define ICRNL 0000400 +#define OCRNL 0000010 + typedef struct{ tcflag_t c_iflag; diff --git a/src/video/consoledev.c b/src/video/consoledev.c index ffc31bca..57eb2dfd 100644 --- a/src/video/consoledev.c +++ b/src/video/consoledev.c @@ -65,11 +65,25 @@ __attribute__((noreturn)) static void console_thread(){ char* strbufptr; size_t strbuflen; - - + char thingy[2]; + if(packet.ascii){ + + if(packet.ascii == '\n'){ + if(IGNCR & tty.c_iflag) + continue; + + if((ICRNL & tty.c_iflag) == 0) + packet.ascii = '\r'; + } + strbufptr = &packet.ascii; strbuflen = 1; + if(packet.flags & (KBPACKET_FLAGS_LEFTCTRL | KBPACKET_FLAGS_RIGHTCTRL)){ + if(!((packet.ascii > 'a' && packet.ascii < 'z') || (packet.ascii > 'A' && packet.ascii < 'Z'))) + continue; + strbufptr[0] = packet.ascii > 'a' ? packet.ascii - 0x60 : packet.ascii - 0x40; + } } else{ switch(packet.keycode){ @@ -128,8 +142,9 @@ __attribute__((noreturn)) static void console_thread(){ break; } - if(packet.ascii && tty.c_lflag & ECHO) + if(packet.ascii && tty.c_lflag & ECHO){ console_write(strbufptr, strbuflen); + } for(size_t i = 0; i < strbuflen; ++i){ @@ -184,9 +199,9 @@ static int read(int *error, int dev, void* buff, size_t count, size_t offset){ arch_interrupt_disable(); readc += ringbuffer_read(&input, buff+readc, count-readc); - + arch_interrupt_enable(); - + if(readc < count && readc < tty.c_cc[VMIN]) *error = event_wait(&inputevent, true);