mirror of
https://github.com/wichtounet/thor-os.git
synced 2025-09-16 16:11:42 -04:00
Continue working on terminal (not in good shape ;) )
This commit is contained in:
parent
50c1acee27
commit
7cc6c9dc5a
@ -11,6 +11,8 @@
|
||||
#include "stl/types.hpp"
|
||||
#include "stl/circular_buffer.hpp"
|
||||
|
||||
#include "sleep_queue.hpp"
|
||||
|
||||
namespace stdio {
|
||||
|
||||
constexpr const size_t INPUT_BUFFER_SIZE = 128;
|
||||
@ -22,8 +24,19 @@ struct virtual_terminal {
|
||||
|
||||
circular_buffer<char, INPUT_BUFFER_SIZE> input_buffer;
|
||||
|
||||
sleep_queue input_queue;
|
||||
|
||||
void print(char c);
|
||||
void send_input(char c);
|
||||
size_t read_input(char* buffer, size_t max);
|
||||
|
||||
virtual_terminal() : id(65535) {}
|
||||
|
||||
/* virtual_terminal(const virtual_terminal& rhs) = delete;
|
||||
virtual_terminal& operator=(const virtual_terminal& rhs) = delete;
|
||||
|
||||
virtual_terminal(virtual_terminal&& rhs) = default;
|
||||
virtual_terminal& operator=(virtual_terminal&& rhs) = default;*/
|
||||
};
|
||||
|
||||
void init_terminals();
|
||||
|
@ -109,7 +109,7 @@ void give_char(scheduler::pid_t pid, char t){
|
||||
void keyboard_handler(const interrupt::syscall_regs&){
|
||||
auto key = static_cast<char>(in_byte(0x60));
|
||||
|
||||
stdio::get_active_terminal().send_input(key);
|
||||
//TODO stdio::get_active_terminal().send_input(key);
|
||||
|
||||
if(count == BUFFER_SIZE){
|
||||
//The buffer is full, we loose the characters
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include "console.hpp"
|
||||
#include "scheduler.hpp"
|
||||
#include "keyboard.hpp"
|
||||
#include "terminal.hpp"
|
||||
|
||||
namespace {
|
||||
|
||||
@ -25,7 +26,10 @@ void sc_print_digit(const interrupt::syscall_regs& regs){
|
||||
}
|
||||
|
||||
void sc_get_input(const interrupt::syscall_regs& regs){
|
||||
//TODO
|
||||
auto ttyid = scheduler::get_process(scheduler::get_pid()).tty;
|
||||
auto& tty = stdio::get_terminal(ttyid);
|
||||
|
||||
tty.read_input(reinterpret_cast<char*>(regs.rbx), regs.rcx);
|
||||
}
|
||||
|
||||
} //End of anonymous namespace
|
||||
|
@ -9,6 +9,7 @@
|
||||
|
||||
#include "terminal.hpp"
|
||||
#include "keyboard.hpp"
|
||||
#include "console.hpp"
|
||||
|
||||
namespace {
|
||||
|
||||
@ -21,6 +22,11 @@ std::vector<stdio::virtual_terminal> terminals;
|
||||
|
||||
} //end of anonymous namespace
|
||||
|
||||
void stdio::virtual_terminal::print(char key){
|
||||
//TODO If it is not the active terminal, buffer it
|
||||
k_print(key);
|
||||
}
|
||||
|
||||
void stdio::virtual_terminal::send_input(char key){
|
||||
if(canonical){
|
||||
//Key released
|
||||
@ -46,16 +52,42 @@ void stdio::virtual_terminal::send_input(char key){
|
||||
: keyboard::key_to_ascii(key);
|
||||
|
||||
if(qwertz_key){
|
||||
input_buffer.push(qwertz_key);
|
||||
if(input_queue.empty()){
|
||||
input_buffer.push(qwertz_key);
|
||||
} else {
|
||||
//TODO
|
||||
}
|
||||
|
||||
print(qwertz_key);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
//TODO
|
||||
}
|
||||
//TODO
|
||||
}
|
||||
|
||||
size_t stdio::virtual_terminal::read_input(char* buffer, size_t max){
|
||||
size_t read = 0;
|
||||
|
||||
while(read < max && !input_buffer.empty()){
|
||||
buffer[read] = input_buffer.pop();
|
||||
|
||||
if(buffer[read] == '\n'){
|
||||
++read;
|
||||
break;
|
||||
}
|
||||
|
||||
++read;
|
||||
}
|
||||
|
||||
if(read == max || buffer[read] == '\n'){
|
||||
scheduler::get_process(scheduler::get_pid()).regs.rax = read;
|
||||
} else {
|
||||
input_queue.sleep();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void stdio::init_terminals(){
|
||||
@ -74,3 +106,7 @@ void stdio::init_terminals(){
|
||||
stdio::virtual_terminal& stdio::get_active_terminal(){
|
||||
return terminals[active_terminal];
|
||||
}
|
||||
|
||||
stdio::virtual_terminal& stdio::get_terminal(size_t id){
|
||||
return terminals[id];
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user