stuff-from-scratch/src/ui/windows/ui_interfaces/x11/XcbEventInterface.cpp
2023-01-23 11:06:30 +00:00

75 lines
2.4 KiB
C++

#include "XcbEventInterface.h"
#include "KeyboardEvent.h"
#include "DiscretePoint.h"
#include "MouseEvent.h"
#include "PaintEvent.h"
#include "Keyboard.h"
#include <xcb/xcb.h>
std::unique_ptr<XcbEventInterface> XcbEventInterface::Create()
{
return std::make_unique<XcbEventInterface>();
}
std::unique_ptr<KeyboardEvent> XcbEventInterface::convertKeyPress(xcb_key_press_event_t* event, Keyboard* keyboard) const
{
auto ui_event = KeyboardEvent::Create();
ui_event->setAction(KeyboardEvent::Action::Pressed);
if (auto function = keyboard->getFunction(event->detail); function != Keyboard::Function::UNSET)
{
ui_event->setFunction(function);
}
else
{
ui_event->setKeyString(keyboard->getKeyString(event->detail));
}
return ui_event;
}
std::unique_ptr<KeyboardEvent> XcbEventInterface::convertKeyRelease(xcb_key_press_event_t* event, Keyboard* keyboard) const
{
auto ui_event = KeyboardEvent::Create();
ui_event->setAction(KeyboardEvent::Action::Released);
if (auto function = keyboard->getFunction(event->detail); function != Keyboard::Function::UNSET)
{
ui_event->setFunction(function);
}
else
{
ui_event->setKeyString(keyboard->getKeyString(event->detail));
}
return ui_event;
}
std::unique_ptr<MouseEvent> XcbEventInterface::convertButtonPress(xcb_button_press_event_t* event) const
{
auto ui_event = MouseEvent::Create();
auto x = static_cast<unsigned>(event->event_x);
auto y = static_cast<unsigned>(event->event_y);
ui_event->setClientLocation(DiscretePoint(x, y));
auto screen_x = static_cast<unsigned>(event->root_x);
auto screen_y = static_cast<unsigned>(event->root_y);
ui_event->setScreenLocation(DiscretePoint(screen_x, screen_y));
ui_event->setAction(MouseEvent::Action::Pressed);
return ui_event;
}
std::unique_ptr<MouseEvent> XcbEventInterface::convertButtonRelease(xcb_button_press_event_t* event) const
{
auto ui_event = MouseEvent::Create();
auto x = static_cast<unsigned>(event->event_x);
auto y = static_cast<unsigned>(event->event_y);
ui_event->setClientLocation(DiscretePoint(x, y));
auto screen_x = static_cast<unsigned>(event->root_x);
auto screen_y = static_cast<unsigned>(event->root_y);
ui_event->setScreenLocation(DiscretePoint(screen_x, screen_y));
ui_event->setAction(MouseEvent::Action::Released);
return ui_event;
}