Browse Source

Platform: AbstractXApplication cleanup.

Using std::unique_ptr instead of raw pointer, consistent private
variable naming.
pull/87/merge
Vladimír Vondruš 11 years ago
parent
commit
22d1a5c34e
  1. 64
      src/Magnum/Platform/AbstractXApplication.cpp
  2. 20
      src/Magnum/Platform/AbstractXApplication.h

64
src/Magnum/Platform/AbstractXApplication.cpp

@ -37,11 +37,11 @@
namespace Magnum { namespace Platform { namespace Magnum { namespace Platform {
AbstractXApplication::AbstractXApplication(Implementation::AbstractContextHandler<Configuration, Display*, VisualID, Window>* contextHandler, const Arguments& arguments, const Configuration& configuration): AbstractXApplication(contextHandler, arguments, nullptr) { AbstractXApplication::AbstractXApplication(Implementation::AbstractContextHandler<Configuration, Display*, VisualID, Window>* contextHandler, const Arguments& arguments, const Configuration& configuration): AbstractXApplication{contextHandler, arguments, nullptr} {
createContext(configuration); createContext(configuration);
} }
AbstractXApplication::AbstractXApplication(Implementation::AbstractContextHandler<Configuration, Display*, VisualID, Window>* contextHandler, const Arguments&, std::nullptr_t): contextHandler(contextHandler), c(nullptr), flags(Flag::Redraw) {} AbstractXApplication::AbstractXApplication(Implementation::AbstractContextHandler<Configuration, Display*, VisualID, Window>* contextHandler, const Arguments&, std::nullptr_t): _contextHandler{contextHandler}, _flags{Flag::Redraw} {}
void AbstractXApplication::createContext() { createContext({}); } void AbstractXApplication::createContext() { createContext({}); }
@ -50,92 +50,92 @@ void AbstractXApplication::createContext(const Configuration& configuration) {
} }
bool AbstractXApplication::tryCreateContext(const Configuration& configuration) { bool AbstractXApplication::tryCreateContext(const Configuration& configuration) {
CORRADE_ASSERT(!c, "AbstractXApplication::tryCreateContext(): context already created", false); CORRADE_ASSERT(!_context, "AbstractXApplication::tryCreateContext(): context already created", false);
viewportSize = configuration.size(); _viewportSize = configuration.size();
/* Get default X display */ /* Get default X display */
display = XOpenDisplay(nullptr); _display = XOpenDisplay(nullptr);
/* Get visual ID */ /* Get visual ID */
VisualID visualId = contextHandler->getVisualId(display); VisualID visualId = _contextHandler->getVisualId(_display);
/* Get visual info */ /* Get visual info */
XVisualInfo *visInfo, visTemplate; XVisualInfo *visInfo, visTemplate;
int visualCount; int visualCount;
visTemplate.visualid = visualId; visTemplate.visualid = visualId;
visInfo = XGetVisualInfo(display, VisualIDMask, &visTemplate, &visualCount); visInfo = XGetVisualInfo(_display, VisualIDMask, &visTemplate, &visualCount);
if(!visInfo) { if(!visInfo) {
Error() << "Platform::WindowlessGlxApplication::tryCreateContext(): cannot get X visual"; Error() << "Platform::WindowlessGlxApplication::tryCreateContext(): cannot get X visual";
return false; return false;
} }
/* Create X Window */ /* Create X Window */
Window root = RootWindow(display, DefaultScreen(display)); Window root = RootWindow(_display, DefaultScreen(_display));
XSetWindowAttributes attr; XSetWindowAttributes attr;
attr.background_pixel = 0; attr.background_pixel = 0;
attr.border_pixel = 0; attr.border_pixel = 0;
attr.colormap = XCreateColormap(display, root, visInfo->visual, AllocNone); attr.colormap = XCreateColormap(_display, root, visInfo->visual, AllocNone);
attr.event_mask = 0; attr.event_mask = 0;
unsigned long mask = CWBackPixel|CWBorderPixel|CWColormap|CWEventMask; unsigned long mask = CWBackPixel|CWBorderPixel|CWColormap|CWEventMask;
window = XCreateWindow(display, root, 20, 20, configuration.size().x(), configuration.size().y(), 0, visInfo->depth, InputOutput, visInfo->visual, mask, &attr); _window = XCreateWindow(_display, root, 20, 20, configuration.size().x(), configuration.size().y(), 0, visInfo->depth, InputOutput, visInfo->visual, mask, &attr);
XSetStandardProperties(display, window, configuration.title().data(), nullptr, 0, nullptr, 0, nullptr); XSetStandardProperties(_display, _window, configuration.title().data(), nullptr, 0, nullptr, 0, nullptr);
XFree(visInfo); XFree(visInfo);
/* Be notified about closing the window */ /* Be notified about closing the window */
deleteWindow = XInternAtom(display, "WM_DELETE_WINDOW", True); _deleteWindow = XInternAtom(_display, "WM_DELETE_WINDOW", True);
XSetWMProtocols(display, window, &deleteWindow, 1); XSetWMProtocols(_display, _window, &_deleteWindow, 1);
/* Create context */ /* Create context */
contextHandler->createContext(configuration, window); _contextHandler->createContext(configuration, _window);
/* Capture exposure, keyboard and mouse button events */ /* Capture exposure, keyboard and mouse button events */
XSelectInput(display, window, INPUT_MASK); XSelectInput(_display, _window, INPUT_MASK);
/* Set OpenGL context as current */ /* Set OpenGL context as current */
contextHandler->makeCurrent(); _contextHandler->makeCurrent();
c = new Platform::Context; _context.reset(new Platform::Context);
return true; return true;
} }
AbstractXApplication::~AbstractXApplication() { AbstractXApplication::~AbstractXApplication() {
delete c; _context.reset();
/* Shut down context handler */ /* Shut down context handler */
delete contextHandler; _contextHandler.reset();
/* Shut down X */ /* Shut down X */
XDestroyWindow(display, window); XDestroyWindow(_display, _window);
XCloseDisplay(display); XCloseDisplay(_display);
} }
void AbstractXApplication::swapBuffers() { void AbstractXApplication::swapBuffers() {
contextHandler->swapBuffers(); _contextHandler->swapBuffers();
} }
int AbstractXApplication::exec() { int AbstractXApplication::exec() {
/* Show window */ /* Show window */
XMapWindow(display, window); XMapWindow(_display, _window);
while(!(flags & Flag::Exit)) { while(!(_flags & Flag::Exit)) {
XEvent event; XEvent event;
/* Closed window */ /* Closed window */
if(XCheckTypedWindowEvent(display, window, ClientMessage, &event) && if(XCheckTypedWindowEvent(_display, _window, ClientMessage, &event) &&
Atom(event.xclient.data.l[0]) == deleteWindow) { Atom(event.xclient.data.l[0]) == _deleteWindow) {
return 0; return 0;
} }
while(XCheckWindowEvent(display, window, INPUT_MASK, &event)) { while(XCheckWindowEvent(_display, _window, INPUT_MASK, &event)) {
switch(event.type) { switch(event.type) {
/* Window resizing */ /* Window resizing */
case ConfigureNotify: { case ConfigureNotify: {
Vector2i size(event.xconfigure.width, event.xconfigure.height); Vector2i size(event.xconfigure.width, event.xconfigure.height);
if(size != viewportSize) { if(size != _viewportSize) {
viewportSize = size; _viewportSize = size;
viewportEvent(size); viewportEvent(size);
flags |= Flag::Redraw; _flags |= Flag::Redraw;
} }
} break; } break;
@ -159,8 +159,8 @@ int AbstractXApplication::exec() {
} }
} }
if(flags & Flag::Redraw) { if(_flags & Flag::Redraw) {
flags &= ~Flag::Redraw; _flags &= ~Flag::Redraw;
drawEvent(); drawEvent();
} else Utility::sleep(5); } else Utility::sleep(5);
} }

20
src/Magnum/Platform/AbstractXApplication.h

@ -29,6 +29,7 @@
* @brief Class @ref Magnum::Platform::AbstractXApplication * @brief Class @ref Magnum::Platform::AbstractXApplication
*/ */
#include <memory>
#include <Corrade/Containers/EnumSet.h> #include <Corrade/Containers/EnumSet.h>
#include <X11/Xlib.h> #include <X11/Xlib.h>
@ -93,7 +94,7 @@ class AbstractXApplication {
int exec(); int exec();
/** @brief Exit application main loop */ /** @brief Exit application main loop */
void exit() { flags |= Flag::Exit; } void exit() { _flags |= Flag::Exit; }
protected: protected:
/* Nobody will need to have (and delete) AbstractXApplication*, thus /* Nobody will need to have (and delete) AbstractXApplication*, thus
@ -118,7 +119,7 @@ class AbstractXApplication {
void swapBuffers(); void swapBuffers();
/** @copydoc Sdl2Application::redraw() */ /** @copydoc Sdl2Application::redraw() */
void redraw() { flags |= Flag::Redraw; } void redraw() { _flags |= Flag::Redraw; }
#ifdef DOXYGEN_GENERATING_OUTPUT #ifdef DOXYGEN_GENERATING_OUTPUT
protected: protected:
@ -174,18 +175,17 @@ class AbstractXApplication {
typedef Containers::EnumSet<Flag> Flags; typedef Containers::EnumSet<Flag> Flags;
CORRADE_ENUMSET_FRIEND_OPERATORS(Flags) CORRADE_ENUMSET_FRIEND_OPERATORS(Flags)
Display* display; Display* _display;
Window window; Window _window;
Atom deleteWindow; Atom _deleteWindow;
Implementation::AbstractContextHandler<Configuration, Display*, VisualID, Window>* contextHandler; std::unique_ptr<Implementation::AbstractContextHandler<Configuration, Display*, VisualID, Window>> _contextHandler;
std::unique_ptr<Platform::Context> _context;
Platform::Context* c;
/** @todo Get this from the created window */ /** @todo Get this from the created window */
Vector2i viewportSize; Vector2i _viewportSize;
Flags flags; Flags _flags;
}; };
CORRADE_ENUMSET_OPERATORS(AbstractXApplication::Flags) CORRADE_ENUMSET_OPERATORS(AbstractXApplication::Flags)

Loading…
Cancel
Save