1

implement initial event manager

This commit is contained in:
2022-07-11 22:50:53 +02:00
parent 898a44f7ff
commit 60bb0cea78
4 changed files with 69 additions and 0 deletions

View File

@ -0,0 +1,11 @@
#include "user/KeyEventListener.h"
#include "kernel/Globals.h"
void KeyEventListener::trigger(char c) {
this->lastChar = c;
}
char KeyEventListener::waitForKeyEvent() const {
scheduler.block();
return this->lastChar;
}

View File

@ -0,0 +1,21 @@
#ifndef __KeyEventListener_Include_H_
#define __KeyEventListener_Include_H_
#include "kernel/threads/Thread.h"
class KeyEventListener {
private:
KeyEventListener(const KeyEventListener& copy) = delete;
char lastChar;
public:
Thread& thread; // Thread which contains this listener, so the listener can block the thread
KeyEventListener(Thread& thread) : thread(thread) {}
char waitForKeyEvent() const; // Blocks the thread until woken up by manager
void trigger(char c); // Gets called from KeyEventManager
};
#endif

View File

@ -0,0 +1,14 @@
#include "user/KeyEventManager.h"
#include "kernel/Globals.h"
void KeyEventManager::subscribe(KeyEventListener& listener) {
this->listeners[this->num_subscribed] = &listener;
this->num_subscribed = this->num_subscribed + 1;
}
void KeyEventManager::broadcast(char c) {
for (unsigned int i = 0; i < this->num_subscribed; ++i) {
this->listeners[i]->trigger(c); // Sets lastChar
scheduler.deblock(&this->listeners[i]->thread);
}
}

View File

@ -0,0 +1,23 @@
#ifndef __KeyEventManager_Include_H_
#define __KeyEventManager_Include_H_
#include "user/KeyEventListener.h"
// NOTE: Could do this more generally but we only have key events
class KeyEventManager {
private:
KeyEventManager(const KeyEventManager& copy) = delete;
// TODO: Implement some sort of set structure
KeyEventListener* listeners[16]; // This is pretty limited but should be enough
unsigned int num_subscribed = 0;
public:
KeyEventManager() {}
void subscribe(KeyEventListener& listener);
void broadcast(char c); // Unblocks all input waiting threads, I don't have a method to direct input
};
#endif