library/src/internal.cpp

116 lines
3.6 KiB
C++

#include "internal.hpp"
#include "SharedMemoryAccess.hpp"
#include "vkvm.hpp"
#include <csignal>
namespace vkvm {
Impl impl;
auto setDefaultValues() -> void {
impl.localMemoryWarn = false;
if (getSharedMemory() != nullptr) {
setMode(GraphicMode::RGB);
setCharactersPerRow(60);
setCharactersPerColumn(20);
setHeight(600);
setWidth(800);
setMousePosition(42, 42);
setBackgroundColor(black);
setForegroundColor(white);
setRedrawInterval(500);
setTimerInterruptInterval(1000);
setFont(FontType::ProFontIIX);
}
impl.localMemoryWarn = true;
}
auto sendSignal(pid_t pid, int signalNumber) -> void {
kill(pid, signalNumber);
}
auto onSignal(int signalNumber, void(*callback)(int)) -> void {
signal(signalNumber, callback);
}
auto getInterruptTable() -> InterruptEntry * {
return reinterpret_cast<InterruptEntry *>(getSharedMemory() + sizeof(Registers) + impl.reservedSize);
}
auto getRegisters() -> Registers * {
return reinterpret_cast<Registers *>(getSharedMemory());
}
auto getTextArea() -> char * {
return ((getSharedMemory() + sizeof(Registers) + impl.reservedSize) +
sizeof(InterruptEntry) * impl.interruptEntyCount);
}
auto getPixelArea() -> char * {
return (((getSharedMemory() + sizeof(Registers) + impl.reservedSize) +
sizeof(InterruptEntry) * impl.interruptEntyCount) +
getCharactersPerRow() * getCharactersPerColumn());
}
auto callEvent(EventType type) -> bool {
auto ivt = getInterruptTable();
for(int i = 0; i < impl.interruptEntrysPerEventType;i++){
auto &entry= ivt[type * impl.interruptEntrysPerEventType + i];
if (entry.pid != 0) {
sendSignal(entry.pid, entry.signum);
}
}
return true;
}
auto setLayoutVersion(LayoutVersion newValue) -> void {
lockSharedMemory();
getRegisters()->layout_version = newValue;
unlockSharedMemory();
callEvent(EventType::UpdateControlRegisters);
}
auto setCharactersPerColumn(int newValue) -> void {
lockSharedMemory();
getRegisters()->characters_per_column = newValue;
unlockSharedMemory();
callEvent(EventType::UpdateControlRegisters);
}
auto setCharactersPerRow(int newValue) -> void {
lockSharedMemory();
getRegisters()->characters_per_row = newValue;
unlockSharedMemory();
callEvent(EventType::UpdateControlRegisters);
}
auto setMousePosition(int x, int y) -> void {
lockSharedMemory();
getRegisters()->mouse_pos_x = x;
getRegisters()->mouse_pos_y = y;
unlockSharedMemory();
callEvent(EventType::UpdateControlRegisters);
}
auto buttonPressed(KeyCode keyCode) -> void {
lockSharedMemory();
auto reg = getRegisters();
reg->keyboardBuffer[(reg->keyboardBuffer_index_write) % keyboardBufferSize] = keyCode;
unlockSharedMemory();
}
auto getRegisteredProcesses(EventType eventType) -> std::vector<int> {
std::vector<int> result;
auto ivt = getInterruptTable();
for(int i = 0; i < impl.interruptEntrysPerEventType;i++){
auto &entry= ivt[eventType * impl.interruptEntrysPerEventType + i];
if (entry.pid != 0) {
result.push_back(entry.pid);
}
}
return result;
}
}