Some window interface cleaning

This commit is contained in:
James Grogan 2022-11-11 10:35:41 +00:00
parent 1180e576fa
commit 02ebb9a54b
12 changed files with 169 additions and 141 deletions

View file

@ -20,8 +20,9 @@
#include "FileLogger.h"
XcbInterface::XcbInterface()
: mConnection(nullptr),
XcbInterface::XcbInterface(DesktopManager* desktopManager)
: mDesktopManager(desktopManager),
mConnection(nullptr),
mX11Display(),
mGlxInterface(),
mXcbEventInterface(XcbEventInterface::Create()),
@ -35,18 +36,20 @@ XcbInterface::~XcbInterface()
}
void XcbInterface::initialize(DesktopManager* desktopManager)
void XcbInterface::initialize()
{
Connect();
UpdateScreen(desktopManager);
CreateGraphicsContext(desktopManager);
connect();
updateScreen();
createGraphicsContext();
if (mUseHardwareRendering)
{
InitializeOpenGl();
initializeOpenGl();
}
mDesktopManager->SetKeyboard(XcbKeyboard::Create());
}
void XcbInterface::Connect()
void XcbInterface::connect()
{
if (mUseHardwareRendering)
{
@ -71,7 +74,7 @@ void XcbInterface::Connect()
}
}
void XcbInterface::UpdateScreen(DesktopManager* desktopManager)
void XcbInterface::updateScreen()
{
if (!mConnection)
{
@ -91,40 +94,43 @@ void XcbInterface::UpdateScreen(DesktopManager* desktopManager)
auto xcb_screen = XcbScreen::Create(screen_iter.data);
auto screen = mt::Screen::Create();
screen->SetPlatformScreen(std::move(xcb_screen));
desktopManager->AddScreen(std::move(screen));
mDesktopManager->AddScreen(std::move(screen));
}
void XcbInterface::InitializeOpenGl()
void XcbInterface::initializeOpenGl()
{
mGlxInterface = GlxInterface::Create();
const auto default_screen = DefaultScreen(mX11Display);
mGlxInterface->SetupContext(mX11Display, default_screen);
}
void XcbInterface::CreateOpenGlDrawable(mt::Window* window)
void XcbInterface::createOpenGlDrawable(mt::Window* window)
{
if (!mUseHardwareRendering or !window or !window->GetPlatformWindow())
{
return;
}
auto xcb_window = dynamic_cast<XcbWindow*>(window->GetPlatformWindow());
if (!xcb_window)
{
return;
}
if (!mGlxInterface->SetupWindow(mX11Display, xcb_window->GetHandle()))
{
MLOG_ERROR("Failed to set up OpenGL Drawable");
xcb_destroy_window(mConnection, xcb_window->GetHandle());
}
}
void XcbInterface::CreateGraphicsContext(DesktopManager* desktopManager)
void XcbInterface::createGraphicsContext()
{
if (!mConnection || desktopManager->GetDefaultScreen())
if (!mConnection || mDesktopManager->GetDefaultScreen())
{
return;
}
auto xcb_screen = dynamic_cast<XcbScreen*>(desktopManager->GetDefaultScreen()->GetPlatformScreen());
auto xcb_screen = dynamic_cast<XcbScreen*>(mDesktopManager->GetDefaultScreen()->GetPlatformScreen());
if (!xcb_screen)
{
return;
@ -138,7 +144,7 @@ void XcbInterface::CreateGraphicsContext(DesktopManager* desktopManager)
xcb_screen->SetGraphicsContext(gc);
}
void XcbInterface::MapWindow(mt::Window* window)
void XcbInterface::mapWindow(mt::Window* window)
{
mXcbWindowInterface->Map(window, mConnection);
}
@ -146,9 +152,14 @@ void XcbInterface::MapWindow(mt::Window* window)
void XcbInterface::showWindow(mt::Window* window)
{
mXcbWindowInterface->Show(window, mConnection);
if (mUseHardwareRendering)
{
createOpenGlDrawable(window);
}
}
uint32_t XcbInterface::GetEventMask()
uint32_t XcbInterface::getEventMask()
{
return XCB_EVENT_MASK_KEY_RELEASE |
XCB_EVENT_MASK_BUTTON_PRESS |
@ -156,23 +167,24 @@ uint32_t XcbInterface::GetEventMask()
XCB_EVENT_MASK_EXPOSURE;
}
void XcbInterface::addWindow(mt::Window* window, DesktopManager* desktopManager)
void XcbInterface::addWindow(mt::Window* window)
{
auto screen = desktopManager->GetDefaultScreen();
mXcbWindowInterface->Add(window, mConnection, screen, GetEventMask());
auto screen = mDesktopManager->GetDefaultScreen();
mXcbWindowInterface->Add(window, mConnection, screen, getEventMask());
}
void XcbInterface::onPaint(DesktopManager* desktopManager)
void XcbInterface::onPaint()
{
desktopManager->OnUiEvent(PaintEvent::Create());
auto mainWindow = desktopManager->GetWindowManager()->GetMainWindow();
auto defaultScreen = desktopManager->GetDefaultScreen();
mDesktopManager->OnUiEvent(PaintEvent::Create());
auto mainWindow = mDesktopManager->GetWindowManager()->GetMainWindow();
auto defaultScreen = mDesktopManager->GetDefaultScreen();
auto xcb_screen = dynamic_cast<XcbScreen*>(defaultScreen->GetPlatformScreen());
mXcbWindowInterface->Paint(mainWindow, mConnection,
xcb_screen->GetNativeScreen(), xcb_screen->GetGraphicsContext());
}
void XcbInterface::OnExposeEvent(xcb_expose_event_t* event, DesktopManager* desktopManager)
void XcbInterface::onExposeEvent(xcb_expose_event_t* event)
{
// Update the window
if (mUseHardwareRendering)
@ -184,12 +196,12 @@ void XcbInterface::OnExposeEvent(xcb_expose_event_t* event, DesktopManager* desk
{
//auto window = mWindows[event->window];
//window->SetSize(event->width, event->height);
onPaint(desktopManager);
onPaint();
xcb_flush(mConnection);
}
}
void XcbInterface::loop(DesktopManager* desktopManager)
void XcbInterface::loop()
{
if (!mConnection)
{
@ -202,44 +214,44 @@ void XcbInterface::loop(DesktopManager* desktopManager)
{
case XCB_EXPOSE:{
auto expose_event = reinterpret_cast<xcb_expose_event_t*>(event);
OnExposeEvent(expose_event, desktopManager);
onExposeEvent(expose_event);
break;
}
case XCB_KEY_PRESS: {
auto kp = reinterpret_cast<xcb_key_press_event_t*>(event);
auto ui_event = mXcbEventInterface->ConvertKeyPress(kp, desktopManager->GetKeyboard());
desktopManager->OnUiEvent(std::move(ui_event));
auto ui_event = mXcbEventInterface->ConvertKeyPress(kp, mDesktopManager->GetKeyboard());
mDesktopManager->OnUiEvent(std::move(ui_event));
break;
}
case XCB_KEY_RELEASE: {
auto kr = reinterpret_cast<xcb_key_release_event_t*>(event);
auto ui_event = mXcbEventInterface->ConvertKeyRelease(kr, desktopManager->GetKeyboard());
desktopManager->OnUiEvent(std::move(ui_event));
auto ui_event = mXcbEventInterface->ConvertKeyRelease(kr, mDesktopManager->GetKeyboard());
mDesktopManager->OnUiEvent(std::move(ui_event));
break;
}
case XCB_BUTTON_PRESS: {
auto press = reinterpret_cast<xcb_button_press_event_t*>(event);
auto ui_event = mXcbEventInterface->ConvertButtonPress(press);
desktopManager->OnUiEvent(std::move(ui_event));
mDesktopManager->OnUiEvent(std::move(ui_event));
break;
}
case XCB_BUTTON_RELEASE: {
auto release = reinterpret_cast<xcb_button_release_event_t*>(event);
auto ui_event = mXcbEventInterface->ConvertButtonRelease(release);
desktopManager->OnUiEvent(std::move(ui_event));
mDesktopManager->OnUiEvent(std::move(ui_event));
break;
}
default:
/* Unknown event type, ignore it */
break;
}
onEventsDispatched(desktopManager);
onEventsDispatched();
free(event);
}
OnLoopCompleted(desktopManager);
onLoopCompleted();
}
void XcbInterface::OnLoopCompleted(DesktopManager* desktopManagers)
void XcbInterface::onLoopCompleted()
{
if (mUseHardwareRendering)
{
@ -248,12 +260,12 @@ void XcbInterface::OnLoopCompleted(DesktopManager* desktopManagers)
}
}
void XcbInterface::onEventsDispatched(DesktopManager* desktopManager)
void XcbInterface::onEventsDispatched()
{
if (desktopManager->IsModified())
if (mDesktopManager->IsModified())
{
desktopManager->SetIsModified(false);
auto mainWindow = desktopManager->GetWindowManager()->GetMainWindow();
mDesktopManager->SetIsModified(false);
auto mainWindow = mDesktopManager->GetWindowManager()->GetMainWindow();
mXcbWindowInterface->Clear(mainWindow, mConnection);
}
}