summaryrefslogtreecommitdiff
path: root/Source/Kernel/VTManager
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Kernel/VTManager')
-rw-r--r--Source/Kernel/VTManager/VirtualTerminal-kbd.class.cpp69
-rw-r--r--Source/Kernel/VTManager/VirtualTerminal.class.cpp6
-rw-r--r--Source/Kernel/VTManager/VirtualTerminal.class.h11
3 files changed, 83 insertions, 3 deletions
diff --git a/Source/Kernel/VTManager/VirtualTerminal-kbd.class.cpp b/Source/Kernel/VTManager/VirtualTerminal-kbd.class.cpp
new file mode 100644
index 0000000..a5b5ea6
--- /dev/null
+++ b/Source/Kernel/VTManager/VirtualTerminal-kbd.class.cpp
@@ -0,0 +1,69 @@
+#include "VirtualTerminal.class.h"
+#include <TaskManager/Task.ns.h>
+
+using namespace Kbd;
+
+void VirtualTerminal::keyPress(keypress_t kp) {
+ m_kbdbuff.push(kp);
+ if (!m_kbdMutex.locked()) {
+ if (kp.haschar && !kp.hascmd) {
+ put(kp.character);
+ } else if (kp.hascmd && kp.command == KBDC_ENTER) {
+ put("\n");
+ } else if (kp.hascmd && kp.command == KBDC_TAB) {
+ put("\t");
+ } else if (kp.hascmd && kp.command == KBDC_BACKSPACE) {
+ put("\b");
+ }
+ }
+}
+
+keypress_t VirtualTerminal::getKeypress(bool show, bool block) {
+ m_kbdMutex.waitLock();
+
+ if (m_kbdbuff.empty() && !block) {
+ m_kbdMutex.unlock();
+ return keypress_t();
+ }
+
+ while (m_kbdbuff.empty())
+ Task::currentThread->sleep(10);
+
+ keypress_t ret = m_kbdbuff[0];
+
+ for (u32int i = 1; i < m_kbdbuff.size(); i++) {
+ m_kbdbuff[i - 1] = m_kbdbuff[i];
+ }
+ m_kbdbuff.pop();
+
+ if (show) {
+ if (ret.haschar && !ret.hascmd) {
+ put(ret.character);
+ } else if (ret.hascmd && ret.command == KBDC_ENTER) {
+ put("\n");
+ } else if (ret.hascmd && ret.command == KBDC_TAB) {
+ put("\t");
+ } else if (ret.hascmd && ret.command == KBDC_BACKSPACE) {
+ put("\b");
+ }
+ }
+
+ m_kbdMutex.unlock();
+ return ret;
+}
+
+String VirtualTerminal::readLine(bool show) {
+ String ret = "";
+ keypress_t tmp = getKeypress(show);
+ while (!(tmp.hascmd and tmp.command == KBDC_ENTER)) {
+ if (tmp.hascmd and tmp.command == KBDC_BACKSPACE) {
+ if (!ret.empty()) ret = ret.substr(0, ret.size() - 1);
+ else put(" "); //Put a space so that cursor stays at same place
+ } else if (tmp.haschar) {
+ ret += tmp.character;
+ }
+ tmp = getKeypress(show);
+ }
+ if (!show) put("\n"); //Put a return if it hasn't been shown on getChar();
+ return ret;
+}
diff --git a/Source/Kernel/VTManager/VirtualTerminal.class.cpp b/Source/Kernel/VTManager/VirtualTerminal.class.cpp
index 41c3e8d..7864afd 100644
--- a/Source/Kernel/VTManager/VirtualTerminal.class.cpp
+++ b/Source/Kernel/VTManager/VirtualTerminal.class.cpp
@@ -4,7 +4,7 @@
#define BUFCHR(l, c) m_buff[((l) * m_cols) + (c)]
-VirtualTerminal::VirtualTerminal(u32int rows, u32int cols, u8int fgcolor, u8int bgcolor) {
+VirtualTerminal::VirtualTerminal(u32int rows, u32int cols, u8int fgcolor, u8int bgcolor) : m_kbdMutex(false) {
m_buff = new chr[rows * cols];
m_rows = rows;
m_cols = cols;
@@ -104,10 +104,10 @@ void VirtualTerminal::setCursorCol(u32int col) {
// Display functionn
void VirtualTerminal::put(wchar c, bool updatecsr) {
- if (c.value == 0x08) { //Ascii backspace
+ if (c.value == '\b') {
if (m_csrcol > 0) m_csrcol--;
putChar(m_csrlin, m_csrcol, ' ');
- } else if (c.value == 0x09) { //Ascii tab
+ } else if (c.value == '\t') {
m_csrcol = (m_csrcol + 8) &~(8 - 1);
} else if (c.value == '\r') {
m_csrcol = 0;
diff --git a/Source/Kernel/VTManager/VirtualTerminal.class.h b/Source/Kernel/VTManager/VirtualTerminal.class.h
index 6d081ee..6a14080 100644
--- a/Source/Kernel/VTManager/VirtualTerminal.class.h
+++ b/Source/Kernel/VTManager/VirtualTerminal.class.h
@@ -3,6 +3,9 @@
#include <Core/common.wtf.h>
#include <Library/String.class.h>
+#include <TaskManager/Mutex.class.h>
+#include <DeviceManager/Kbd.ns.h>
+#include <Library/Vector.class.h>
struct chr {
u8int color;
@@ -20,6 +23,9 @@ class VirtualTerminal {
u32int m_csrlin, m_csrcol;
+ Mutex m_kbdMutex;
+ Vector<Kbd::keypress_t> m_kbdbuff; //Key press events buffer
+
public:
VirtualTerminal(u32int rows, u32int cols, u8int fgcolor = 7, u8int bgcolor = 0);
~VirtualTerminal();
@@ -48,6 +54,11 @@ class VirtualTerminal {
//inline VirtualTerminal& operator<<(wchar c) { put(c); return *this; }
inline VirtualTerminal& operator<<(s32int i) { writeDec(i); return *this; }
inline VirtualTerminal& operator<<(u32int i) { writeHex(i); return *this; }
+
+ //Keyboard functions
+ void keyPress(Kbd::keypress_t kp); //Called by Kbd:: when a key is pressed
+ 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