#ifndef DEF_VIRTUALTERMINAL_CLASS_H #define DEF_VIRTUALTERMINAL_CLASS_H #include #include #include #include #include #include struct vtchr { u8int color; WChar c; }; class VirtualTerminal : public Ressource { protected: Mutex m_kbdMutex, m_kbdbuffMutex; Vector m_kbdbuff; //Key press events buffer //SYSCALLS : static call_t m_callTable[]; u32int writeHexSC(u32int); u32int writeDecSC(u32int, u32int); u32int writeSC(u32int); u32int putSC(u32int); u32int readLineSC(); u32int setColorSC(u32int); u32int setCursorLineSC(u32int); u32int setCursorColSC(u32int); u32int isBoxedSC(); public: static u32int scall(u8int, u32int, u32int, u32int, u32int); VirtualTerminal(); virtual ~VirtualTerminal(); virtual void setColor(u8int fgcolor, u8int bgcolor = 0xFF) {} //For a pipe/file VT, this will do nothing. virtual bool isBoxed() = 0; virtual void updateCursor() {} virtual void moveCursor(u32int row, u32int col) {} //These are not implemented for pipe/file VTs virtual void setCursorLine(u32int line) {} virtual void setCursorCol(u32int col) {} //This one could be, and should be. It's used a lot for tabulating, etc. //Display functions virtual void put(WChar c, bool updatecsr = true) = 0; void write(const String& s, bool updatecsr = true); void writeDec(s64int num, bool updatecsr = true); void writeHex(u32int i, bool updatecsr = true); virtual void hexDump(u8int* ptr, u32int sz, bool addnl = true); //Always ignore parameter addnl inline VirtualTerminal& operator<<(const String& s) { write(s); return *this; } inline VirtualTerminal& operator<<(s32int i) { writeDec(i); return *this; } inline VirtualTerminal& operator<<(s64int i) { writeDec(i); return *this; } inline VirtualTerminal& operator<<(u32int i) { writeHex(i); return *this; } //Keyboard functions virtual void keyPress(Kbd::keypress_t kp); //Called by Kbd:: when a key is pressed, overloaded by ScrollableVT virtual Kbd::keypress_t getKeypress(bool show = true, bool block = true); //Block : must we wait for a key to be pressed ? String readLine(bool show = true); }; #endif