summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-01-11 04:40:05 +0100
committerAndreas Kling <awesomekling@gmail.com>2019-01-11 04:40:05 +0100
commitb95aa1831529d7cbd9cdfa05797836bf5fce21be (patch)
tree77f9dc503258188597b6ed161453ccf8d4686027
parenta3c39ea9d6782b69196eb623cdc2d30276e0f1fa (diff)
downloadserenity-b95aa1831529d7cbd9cdfa05797836bf5fce21be.zip
Hook up the Keyboard device to the AbstractScreen.
Basic text editing in a TextBox works. How very cool :^)
-rw-r--r--Kernel/VirtualConsole.cpp2
-rw-r--r--Widgets/AbstractScreen.cpp55
-rw-r--r--Widgets/AbstractScreen.h6
-rw-r--r--Widgets/Event.h1
4 files changed, 63 insertions, 1 deletions
diff --git a/Kernel/VirtualConsole.cpp b/Kernel/VirtualConsole.cpp
index 86adc96d70..aac0ba4129 100644
--- a/Kernel/VirtualConsole.cpp
+++ b/Kernel/VirtualConsole.cpp
@@ -108,7 +108,9 @@ void VirtualConsole::set_active(bool b)
set_vga_start_row(0);
flush_vga_cursor();
+#if 0
Keyboard::the().set_client(this);
+#endif
}
inline bool is_valid_parameter_character(byte ch)
diff --git a/Widgets/AbstractScreen.cpp b/Widgets/AbstractScreen.cpp
index d77318ef14..f3da849f50 100644
--- a/Widgets/AbstractScreen.cpp
+++ b/Widgets/AbstractScreen.cpp
@@ -29,6 +29,7 @@ AbstractScreen::AbstractScreen(unsigned width, unsigned height)
m_cursor_location = rect().center();
PS2MouseDevice::the().set_client(this);
+ Keyboard::the().set_client(this);
}
AbstractScreen::~AbstractScreen()
@@ -62,3 +63,57 @@ void AbstractScreen::did_receive_mouse_data(int dx, int dy, bool left_button, bo
if (m_cursor_location != prev_location)
WindowManager::the().redraw_cursor();
}
+
+void AbstractScreen::on_key_pressed(Keyboard::Key key)
+{
+ auto event = make<KeyEvent>(Event::KeyDown, 0);
+ int key_code = 0;
+
+ switch (key.character) {
+ case 8: key_code = KeyboardKey::Backspace; break;
+ case 10: key_code = KeyboardKey::Return; break;
+ }
+ event->m_key = key_code;
+
+ if (key.character) {
+ char buf[] = { 0, 0 };
+ char& ch = buf[0];
+ ch = key.character;
+ if (key.shift()) {
+ if (ch >= 'a' && ch <= 'z') {
+ ch &= ~0x20;
+ } else {
+ switch (ch) {
+ case '1': ch = '!'; break;
+ case '2': ch = '@'; break;
+ case '3': ch = '#'; break;
+ case '4': ch = '$'; break;
+ case '5': ch = '%'; break;
+ case '6': ch = '^'; break;
+ case '7': ch = '&'; break;
+ case '8': ch = '*'; break;
+ case '9': ch = '('; break;
+ case '0': ch = ')'; break;
+ case '-': ch = '_'; break;
+ case '=': ch = '+'; break;
+ case '`': ch = '~'; break;
+ case ',': ch = '<'; break;
+ case '.': ch = '>'; break;
+ case '/': ch = '?'; break;
+ case '[': ch = '{'; break;
+ case ']': ch = '}'; break;
+ case '\\': ch = '|'; break;
+ case '\'': ch = '"'; break;
+ case ';': ch = ':'; break;
+ }
+ }
+ }
+ event->m_text = buf;
+ }
+
+ event->m_shift = key.shift();
+ event->m_ctrl = key.ctrl();
+ event->m_alt = key.alt();
+
+ EventLoop::main().postEvent(&WindowManager::the(), move(event));
+}
diff --git a/Widgets/AbstractScreen.h b/Widgets/AbstractScreen.h
index 752a5d34ae..cfbe456000 100644
--- a/Widgets/AbstractScreen.h
+++ b/Widgets/AbstractScreen.h
@@ -3,9 +3,10 @@
#include "Object.h"
#include "Rect.h"
#include "Size.h"
+#include "Keyboard.h"
#include "PS2MouseDevice.h"
-class AbstractScreen : public Object, public MouseClient {
+class AbstractScreen : public Object, public KeyboardClient, public MouseClient {
public:
virtual ~AbstractScreen();
@@ -30,6 +31,9 @@ private:
// ^MouseClient
virtual void did_receive_mouse_data(int dx, int dy, bool left_button, bool right_button) final;
+ // ^KeyboardClient
+ virtual void on_key_pressed(Keyboard::Key) final;
+
int m_width { 0 };
int m_height { 0 };
diff --git a/Widgets/Event.h b/Widgets/Event.h
index 7178753e9b..a1ebb45c88 100644
--- a/Widgets/Event.h
+++ b/Widgets/Event.h
@@ -136,6 +136,7 @@ public:
private:
friend class EventLoop;
+ friend class AbstractScreen;
int m_key { 0 };
bool m_ctrl { false };
bool m_alt { false };