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

18
src/Contexts/AbstractXContext.h

@ -64,6 +64,9 @@ class AbstractXContext: public AbstractContext {
int exec();
/** @brief Exit application main loop */
inline void exit() { flags |= Flag::Exit; }
/** @{ @name Drawing functions */
protected:
@ -77,7 +80,7 @@ class AbstractXContext: public AbstractContext {
inline void swapBuffers() { glInterface->swapBuffers(); }
/** @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()
*/
enum class Key: KeySym {
Esc = XK_Escape, /**< Escape */
Up = XK_Up, /**< Up arrow */
Down = XK_Down, /**< Down arrow */
Left = XK_Left, /**< Left arrow */
@ -245,6 +250,14 @@ class AbstractXContext: public AbstractContext {
/*@}*/
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;
Window window;
Atom deleteWindow;
@ -254,10 +267,11 @@ class AbstractXContext: public AbstractContext {
/** @todo Get this from the created window */
Math::Vector2<GLsizei> viewportSize;
bool _redraw;
Flags flags;
};
CORRADE_ENUMSET_OPERATORS(AbstractXContext::Modifiers)
CORRADE_ENUMSET_OPERATORS(AbstractXContext::Flags)
/* Implementations for inline functions with unused parameters */
inline void AbstractXContext::keyPressEvent(Key, Modifiers, const Math::Vector2<int>&) {}

Loading…
Cancel
Save