mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 23:18:21 +00:00
made temporary tty act more normal
This commit is contained in:
+37
-10
@@ -29,27 +29,54 @@ void console_write(char* str, size_t count){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define THREAD_BUFF_MAX 2048
|
||||||
|
#define BACKSPACE_STR "\b \b"
|
||||||
__attribute__((noreturn)) static void console_thread(){
|
__attribute__((noreturn)) static void console_thread(){
|
||||||
|
|
||||||
|
char buff[THREAD_BUFF_MAX];
|
||||||
|
int buffpos = 0;
|
||||||
|
|
||||||
for(;;){
|
for(;;){
|
||||||
kbpacket_t packet;
|
kbpacket_t packet;
|
||||||
|
|
||||||
keyboard_getandwait(0, &packet);
|
keyboard_getandwait(0, &packet);
|
||||||
|
|
||||||
|
|
||||||
if(packet.ascii && (KBPACKET_FLAGS_RELEASED & packet.flags) == 0){
|
if(packet.ascii && (KBPACKET_FLAGS_RELEASED & packet.flags) == 0){
|
||||||
|
|
||||||
// echo
|
bool flush = false;
|
||||||
|
|
||||||
|
switch(packet.ascii){
|
||||||
|
|
||||||
|
case '\b':
|
||||||
|
if(buffpos){
|
||||||
|
--buffpos;
|
||||||
|
buff[buffpos] = '\0';
|
||||||
|
console_write(BACKSPACE_STR, strlen(BACKSPACE_STR));
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
case '\n':
|
||||||
|
flush = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
console_write(&packet.ascii, 1);
|
console_write(&packet.ascii, 1);
|
||||||
|
|
||||||
arch_interrupt_disable();
|
|
||||||
|
|
||||||
ringbuffer_write(&input, &packet.ascii, 1);
|
|
||||||
|
|
||||||
arch_interrupt_enable();
|
|
||||||
|
|
||||||
event_signal(&inputevent, true);
|
buff[buffpos++] = packet.ascii;
|
||||||
|
|
||||||
|
if(buffpos == THREAD_BUFF_MAX)
|
||||||
|
flush = true;
|
||||||
|
|
||||||
|
if(flush){
|
||||||
|
arch_interrupt_disable();
|
||||||
|
|
||||||
|
ringbuffer_write(&input, buff, buffpos);
|
||||||
|
|
||||||
|
arch_interrupt_enable();
|
||||||
|
|
||||||
|
buffpos = 0;
|
||||||
|
|
||||||
|
event_signal(&inputevent, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,7 +130,7 @@ void consoledev_init(){
|
|||||||
if(devman_newdevice("console", TYPE_CHARDEV, CONSOLE_MAJOR, 0, &calls))
|
if(devman_newdevice("console", TYPE_CHARDEV, CONSOLE_MAJOR, 0, &calls))
|
||||||
_panic("Failed to create console device", 0);
|
_panic("Failed to create console device", 0);
|
||||||
|
|
||||||
if(ringbuffer_init(&input, 4096))
|
if(ringbuffer_init(&input, THREAD_BUFF_MAX))
|
||||||
_panic("Failed to initialise console ringbuffer", 0);
|
_panic("Failed to initialise console ringbuffer", 0);
|
||||||
|
|
||||||
thread = sched_newkthread(console_thread, 4096*10, true, THREAD_PRIORITY_KERNEL);
|
thread = sched_newkthread(console_thread, 4096*10, true, THREAD_PRIORITY_KERNEL);
|
||||||
|
|||||||
Reference in New Issue
Block a user