#ifndef _TTY_H #define _TTY_H #include #include #include #include #define TTY_BUFFER_SIZE 4096 #define TTY_RAW_BUFFER_SIZE 16 #define MAX_TTYS 8 /* to make things easy, might change later */ #define TTY_ECHO 0x10 /* 0b00010000 */ #define TTY_PASSWORD 0x20 /* 0b00100000 */ #define TTY_ACTIVE 0x01 /* 0b00000001 */ #define TTY_CANONICAL 0x40 /* 0b01000000 */ #define TTY_RAW 0x04 /* 0b00000100 */ #define TTY_ADDCHAR_ALWAYS 0x02 /* 0b00000010 */ #define TTY_NULL 0x80 /* 0b10000000 --- used to end the list of tty_t structs in the ttys array */ #define TTY_NORMAL TTY_ECHO | TTY_ACTIVE | TTY_CANONICAL #define MODIFIER_CAPS 0x01 /* 0b00000001 */ #define MODIFIER_CAPS_DESTROY 0b11111110 #define MODIFIER_SHIFT 0x02 /* 0b00000010 */ #define MODIFIER_SHIFT_DESTROY 0b11111101 #define MODIFIER_ALT 0x04 /* 0b00000100 */ #define MODIFIER_ALT_DESTROY 0b11111011 #define MODIFIER_LCTRL 0x10 /* 0b00010000 */ #define MODIFIER_LCTRL_DESTROY 0b11101111 #define MODIFIER_RCTRL 0x0 /* 0b00100000*/ #define MODIFIER_RCTRL_DESTROY 0b11011111 typedef struct tty_t { char input_buffer[TTY_BUFFER_SIZE]; size_t head; size_t tail; uint32_t flags; bool canonical; bool line_ready; /* for raw mode */ char raw_buf[TTY_RAW_BUFFER_SIZE]; size_t raw_head; size_t raw_tail; spinlock_t lock; size_t user_input_start; size_t user_input_end; struct file_ops f_ops; pid_t foreground_pgid; /* not used yet */ } tty_t; /* essentially, key is non-zero if a key like the up arrow is pressed, otherwise c is the char that was entered */ struct keyevent { uint8_t key; char c; }; int init_tty(void); ssize_t tty_read(tty_t* tty, char* buf, size_t count); ssize_t tty_read_active(char* buf, size_t count); char tty_get_char(void); tty_t* get_active_tty(void); tty_t* tty_get_active(void); void tty_and_flags(tty_t* tty, uint32_t flags); uint32_t tty_get_flags(tty_t* tty); tty_t* make_tty(uint32_t flags); void tty_receive_char(char c, uint32_t kbd_mod); char tty_translate_char(char c, uint32_t modifiers); void tty_input_char(tty_t* tty, char c); #endif