Browse Source

AbstractXContext: ability to exit from main loop, added Esc key.

pull/279/head
Vladimír Vondruš 14 years ago
parent
commit
c83de594c2
  1. 12
      src/Contexts/AbstractXContext.cpp
  2. 18
      src/Contexts/AbstractXContext.h

12
src/Contexts/AbstractXContext.cpp

@ -26,7 +26,7 @@ using namespace std;
namespace Magnum { namespace Contexts { namespace Magnum { namespace Contexts {
AbstractXContext::AbstractXContext(AbstractGlInterface<Display*, VisualID, Window>* glInterface, int&, char**, const string& title, const Math::Vector2<GLsizei>& size): glInterface(glInterface), viewportSize(size), _redraw(true) { AbstractXContext::AbstractXContext(AbstractGlInterface<Display*, VisualID, Window>* glInterface, int&, char**, const string& title, const Math::Vector2<GLsizei>& size): glInterface(glInterface), viewportSize(size), flags(Flag::Redraw) {
/* Get default X display */ /* Get default X display */
display = XOpenDisplay(0); display = XOpenDisplay(0);
@ -40,7 +40,7 @@ AbstractXContext::AbstractXContext(AbstractGlInterface<Display*, VisualID, Windo
visInfo = XGetVisualInfo(display, VisualIDMask, &visTemplate, &visualCount); visInfo = XGetVisualInfo(display, VisualIDMask, &visTemplate, &visualCount);
if(!visInfo) { if(!visInfo) {
Error() << "Cannot get X visual"; Error() << "Cannot get X visual";
exit(1); ::exit(1);
} }
/* Create X Window */ /* Create X Window */
@ -88,7 +88,7 @@ int AbstractXContext::exec() {
/* Call viewportEvent for the first time */ /* Call viewportEvent for the first time */
viewportEvent(viewportSize); viewportEvent(viewportSize);
while(true) { while(!(flags & Flag::Exit)) {
XEvent event; XEvent event;
/* Closed window */ /* Closed window */
@ -105,7 +105,7 @@ int AbstractXContext::exec() {
if(size != viewportSize) { if(size != viewportSize) {
viewportSize = size; viewportSize = size;
viewportEvent(size); viewportEvent(size);
_redraw = true; flags |= Flag::Redraw;
} }
} break; } break;
@ -125,8 +125,8 @@ int AbstractXContext::exec() {
} }
} }
if(_redraw) { if(flags & Flag::Redraw) {
_redraw = false; flags &= ~Flag::Redraw;
drawEvent(); drawEvent();
} else Corrade::Utility::sleep(5); } else Corrade::Utility::sleep(5);
} }

18
src/Contexts/AbstractXContext.h

@ -64,6 +64,9 @@ class AbstractXContext: public AbstractContext {
int exec(); int exec();
/** @brief Exit application main loop */
inline void exit() { flags |= Flag::Exit; }
/** @{ @name Drawing functions */ /** @{ @name Drawing functions */
protected: protected:
@ -77,7 +80,7 @@ class AbstractXContext: public AbstractContext {
inline void swapBuffers() { glInterface->swapBuffers(); } inline void swapBuffers() { glInterface->swapBuffers(); }
/** @copydoc GlutContext::redraw() */ /** @copydoc GlutContext::redraw() */
inline void redraw() { _redraw = true; } inline void redraw() { flags |= Flag::Redraw; }
/*@}*/ /*@}*/
@ -111,6 +114,8 @@ class AbstractXContext: public AbstractContext {
* @see keyPressEvent(), keyReleaseEvent() * @see keyPressEvent(), keyReleaseEvent()
*/ */
enum class Key: KeySym { enum class Key: KeySym {
Esc = XK_Escape, /**< Escape */
Up = XK_Up, /**< Up arrow */ Up = XK_Up, /**< Up arrow */
Down = XK_Down, /**< Down arrow */ Down = XK_Down, /**< Down arrow */
Left = XK_Left, /**< Left arrow */ Left = XK_Left, /**< Left arrow */
@ -245,6 +250,14 @@ class AbstractXContext: public AbstractContext {
/*@}*/ /*@}*/
private: private:
enum class Flag: unsigned int {
Redraw = 1 << 0,
Exit = 1 << 1
};
typedef Corrade::Containers::EnumSet<Flag, unsigned int> Flags;
CORRADE_ENUMSET_FRIEND_OPERATORS(Flags)
Display* display; Display* display;
Window window; Window window;
Atom deleteWindow; Atom deleteWindow;
@ -254,10 +267,11 @@ class AbstractXContext: public AbstractContext {
/** @todo Get this from the created window */ /** @todo Get this from the created window */
Math::Vector2<GLsizei> viewportSize; Math::Vector2<GLsizei> viewportSize;
bool _redraw; Flags flags;
}; };
CORRADE_ENUMSET_OPERATORS(AbstractXContext::Modifiers) CORRADE_ENUMSET_OPERATORS(AbstractXContext::Modifiers)
CORRADE_ENUMSET_OPERATORS(AbstractXContext::Flags)
/* Implementations for inline functions with unused parameters */ /* Implementations for inline functions with unused parameters */
inline void AbstractXContext::keyPressEvent(Key, Modifiers, const Math::Vector2<int>&) {} inline void AbstractXContext::keyPressEvent(Key, Modifiers, const Math::Vector2<int>&) {}

Loading…
Cancel
Save