Some window interface cleaning
This commit is contained in:
parent
1180e576fa
commit
02ebb9a54b
12 changed files with 169 additions and 141 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue