summaryrefslogtreecommitdiff
path: root/Source/Kernel/VTManager/VirtualTerminal.proto.h
blob: 9c138ec486fff2390388eb887cee84673ac2ea04 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#ifndef DEF_VIRTUALTERMINAL_CLASS_H
#define DEF_VIRTUALTERMINAL_CLASS_H

#include <common.h>
#include <String.class.h>
#include <Mutex.class.h>
#include <DeviceManager/Kbd.ns.h>
#include <Vector.class.h>

#include <SyscallManager/Ressource.class.h>

struct vtchr {
	u8int color;
	WChar c;
};

class VirtualTerminal : public Ressource {
	protected:
	Mutex m_kbdMutex, m_kbdbuffMutex;
	Vector<Kbd::keypress_t> 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);
	u32int setColorSC(u32int);
	u32int setCursorLineSC(u32int);
	u32int setCursorColSC(u32int);
	u32int isBoxedSC();
	bool accessible() { return true; }

	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