Browse Source

Platform: reworked *XApplication events to mimic other implementations.

pull/7/head
Vladimír Vondruš 14 years ago
parent
commit
d0def6a763
  1. 25
      src/Platform/AbstractXApplication.cpp
  2. 221
      src/Platform/AbstractXApplication.h

25
src/Platform/AbstractXApplication.cpp

@ -116,22 +116,21 @@ int AbstractXApplication::exec() {
/* Key/mouse events */ /* Key/mouse events */
case KeyPress: case KeyPress:
keyPressEvent(static_cast<Key>(XLookupKeysym(&event.xkey, 0)), static_cast<Modifier>(event.xkey.state), {event.xkey.x, event.xkey.y}); case KeyRelease: {
break; KeyEvent e(static_cast<KeyEvent::Key>(XLookupKeysym(&event.xkey, 0)), static_cast<InputEvent::Modifier>(event.xkey.state), {event.xkey.x, event.xkey.y});
case KeyRelease: event.type == KeyPress ? keyPressEvent(e) : keyReleaseEvent(e);
keyReleaseEvent(static_cast<Key>(XLookupKeysym(&event.xkey, 0)), static_cast<Modifier>(event.xkey.state), {event.xkey.x, event.xkey.y}); } break;
break;
case ButtonPress: case ButtonPress:
mousePressEvent(static_cast<MouseButton>(event.xbutton.button), static_cast<Modifier>(event.xkey.state), {event.xbutton.x, event.xbutton.y}); case ButtonRelease: {
break; MouseEvent e(static_cast<MouseEvent::Button>(event.xbutton.button), static_cast<InputEvent::Modifier>(event.xkey.state), {event.xbutton.x, event.xbutton.y});
case ButtonRelease: event.type == ButtonPress ? mousePressEvent(e) : mouseReleaseEvent(e);
mouseReleaseEvent(static_cast<MouseButton>(event.xbutton.button), static_cast<Modifier>(event.xkey.state), {event.xbutton.x, event.xbutton.y}); } break;
break;
/* Mouse move events */ /* Mouse move events */
case MotionNotify: case MotionNotify: {
mouseMotionEvent(static_cast<Modifier>(event.xmotion.state), {event.xmotion.x, event.xmotion.y}); MouseMoveEvent e(static_cast<InputEvent::Modifier>(event.xmotion.state), {event.xmotion.x, event.xmotion.y});
break; mouseMoveEvent(e);
} break;
} }
} }

221
src/Platform/AbstractXApplication.h

@ -47,6 +47,11 @@ Supports keyboard and mouse handling.
*/ */
class AbstractXApplication { class AbstractXApplication {
public: public:
class InputEvent;
class KeyEvent;
class MouseEvent;
class MouseMoveEvent;
/** /**
* @brief Constructor * @brief Constructor
* @param contextHandler OpenGL context handler * @param contextHandler OpenGL context handler
@ -94,12 +99,70 @@ class AbstractXApplication {
/** @{ @name Keyboard handling */ /** @{ @name Keyboard handling */
protected:
/** @copydoc Sdl2Application::keyPressEvent() */
virtual void keyPressEvent(KeyEvent& event);
/** @copydoc Sdl2Application::keyReleaseEvent() */
virtual void keyReleaseEvent(KeyEvent& event);
/*@}*/
/** @{ @name Mouse handling */
protected:
/** @copydoc Sdl2Application::mousePressEvent() */
virtual void mousePressEvent(MouseEvent& event);
/** @copydoc Sdl2Application::mouseReleaseEvent() */
virtual void mouseReleaseEvent(MouseEvent& event);
/** @copydoc Sdl2Application::mouseMoveEvent() */
virtual void mouseMoveEvent(MouseMoveEvent& event);
/*@}*/
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;
AbstractContextHandler<Display*, VisualID, Window>* contextHandler;
Context* c;
/** @todo Get this from the created window */
Vector2i viewportSize;
Flags flags;
};
/**
@brief Base for input events
@see KeyEvent, MouseEvent, MouseMoveEvent, keyPressEvent(), keyReleaseEvent(),
mousePressEvent(), mouseReleaseEvent(), mouseMoveEvent()
*/
class AbstractXApplication::InputEvent {
InputEvent(const InputEvent& other) = delete;
InputEvent(InputEvent&& other) = delete;
InputEvent& operator=(const InputEvent& other) = delete;
InputEvent& operator=(InputEvent&& other) = delete;
public:
public: public:
/** /**
* @brief %Modifier * @brief %Modifier
* *
* @see Modifiers, keyPressEvent(), keyReleaseEvent(), * @see Modifiers, modifiers()
* mousePressEvent(), mouseReleaseEvent(), mouseMotionEvent()
*/ */
enum class Modifier: unsigned int { enum class Modifier: unsigned int {
Shift = ShiftMask, /**< Shift */ Shift = ShiftMask, /**< Shift */
@ -118,14 +181,44 @@ class AbstractXApplication {
/** /**
* @brief Set of modifiers * @brief Set of modifiers
* *
* @see keyPressEvent(), keyReleaseEvent() * @see modifiers()
*/ */
typedef Corrade::Containers::EnumSet<Modifier, unsigned int> Modifiers; typedef Corrade::Containers::EnumSet<Modifier, unsigned int> Modifiers;
inline virtual ~InputEvent() {}
/** @copydoc GlutApplication::InputEvent::setAccepted() */
inline void setAccepted(bool accepted = true) { _accepted = accepted; }
/** @copydoc GlutApplication::InputEvent::isAccepted() */
inline bool isAccepted() { return _accepted; }
/** @brief Modifiers */
inline Modifiers modifiers() const { return _modifiers; }
#ifndef DOXYGEN_GENERATING_OUTPUT
protected:
inline InputEvent(Modifiers modifiers): _modifiers(modifiers), _accepted(false) {}
#endif
private:
Modifiers _modifiers;
bool _accepted;
};
/**
@brief Key event
@see keyPressEvent(), keyReleaseEvent()
*/
class AbstractXApplication::KeyEvent: public AbstractXApplication::InputEvent {
friend class AbstractXApplication;
public:
/** /**
* @brief Key * @brief Key
* *
* @see keyPressEvent(), keyReleaseEvent() * @see key()
*/ */
enum class Key: KeySym { enum class Key: KeySym {
Enter = XK_Return, /**< Enter */ Enter = XK_Return, /**< Enter */
@ -200,38 +293,34 @@ class AbstractXApplication {
Z = XK_z /**< Small letter Z */ Z = XK_z /**< Small letter Z */
}; };
protected: /** @brief Key */
/** inline Key key() const { return _key; }
* @brief Key press event
* @param key Key pressed
* @param modifiers Active modifiers
* @param position Cursor position
*
* Called when an key is pressed. Default implementation does nothing.
*/
virtual void keyPressEvent(Key key, Modifiers modifiers, const Vector2i& position);
/** /** @brief Position */
* @brief Key press event inline Vector2i position() const { return _position; }
* @param key Key released
* @param modifiers Active modifiers
* @param position Cursor position
*
* Called when an key is released. Default implementation does nothing.
*/
virtual void keyReleaseEvent(Key key, Modifiers modifiers, const Vector2i& position);
/*@}*/ private:
inline KeyEvent(Key key, Modifiers modifiers, const Vector2i& position): InputEvent(modifiers), _key(key), _position(position) {}
/** @{ @name Mouse handling */ const Key _key;
const Vector2i _position;
};
/**
@brief Mouse event
@see MouseMoveEvent, mousePressEvent(), mouseReleaseEvent()
*/
class AbstractXApplication::MouseEvent: public AbstractXApplication::InputEvent {
friend class AbstractXApplication;
public: public:
/** /**
* @brief Mouse button * @brief Mouse button
* *
* @see mousePressEvent(), mouseReleaseEvent() * @see button()
*/ */
enum class MouseButton: unsigned int { enum class Button: unsigned int {
Left = Button1, /**< Left button */ Left = Button1, /**< Left button */
Middle = Button2, /**< Middle button */ Middle = Button2, /**< Middle button */
Right = Button3, /**< Right button */ Right = Button3, /**< Right button */
@ -239,61 +328,35 @@ class AbstractXApplication {
WheelDown = Button5 /**< Wheel down */ WheelDown = Button5 /**< Wheel down */
}; };
protected: /** @brief Button */
/** inline Button button() const { return _button; }
* @brief Mouse press event
* @param button Button pressed
* @param modifiers Active modifiers
* @param position Cursor position
*
* Called when mouse button is pressed. Default implementation does
* nothing.
*/
virtual void mousePressEvent(MouseButton button, Modifiers modifiers, const Vector2i& position);
/** /** @brief Position */
* @brief Mouse release event inline Vector2i position() const { return _position; }
* @param button Button released
* @param modifiers Active modifiers
* @param position Cursor position
*
* Called when mouse button is released. Default implementation does
* nothing.
*/
virtual void mouseReleaseEvent(MouseButton button, Modifiers modifiers, const Vector2i& position);
/**
* @brief Mouse motion event
* @param modifiers Active modifiers
* @param position Cursor position
*
* Called when mouse is moved.
*/
virtual void mouseMotionEvent(Modifiers modifiers, const Vector2i& position);
/*@}*/
private: private:
enum class Flag: unsigned int { inline MouseEvent(Button button, Modifiers modifiers, const Vector2i& position): InputEvent(modifiers), _button(button), _position(position) {}
Redraw = 1 << 0,
Exit = 1 << 1
};
typedef Corrade::Containers::EnumSet<Flag, unsigned int> Flags; const Button _button;
CORRADE_ENUMSET_FRIEND_OPERATORS(Flags) const Vector2i _position;
};
Display* display; /**
Window window; @brief Mouse move event
Atom deleteWindow;
AbstractContextHandler<Display*, VisualID, Window>* contextHandler; @see MouseEvent, mouseMoveEvent()
*/
class AbstractXApplication::MouseMoveEvent: public AbstractXApplication::InputEvent {
friend class AbstractXApplication;
Context* c; public:
/** @brief Position */
inline Vector2i position() const { return _position; }
/** @todo Get this from the created window */ private:
Vector2i viewportSize; inline MouseMoveEvent(Modifiers modifiers, const Vector2i& position): InputEvent(modifiers), _position(position) {}
Flags flags; const Vector2i _position;
}; };
/** @hideinitializer /** @hideinitializer
@ -326,15 +389,15 @@ When no other application header is included this macro is also aliased to
#endif #endif
#endif #endif
CORRADE_ENUMSET_OPERATORS(AbstractXApplication::Modifiers) CORRADE_ENUMSET_OPERATORS(AbstractXApplication::InputEvent::Modifiers)
CORRADE_ENUMSET_OPERATORS(AbstractXApplication::Flags) CORRADE_ENUMSET_OPERATORS(AbstractXApplication::Flags)
/* Implementations for inline functions with unused parameters */ /* Implementations for inline functions with unused parameters */
inline void AbstractXApplication::keyPressEvent(Key, Modifiers, const Vector2i&) {} inline void AbstractXApplication::keyPressEvent(KeyEvent&) {}
inline void AbstractXApplication::keyReleaseEvent(Key, Modifiers, const Vector2i&) {} inline void AbstractXApplication::keyReleaseEvent(KeyEvent&) {}
inline void AbstractXApplication::mousePressEvent(MouseButton, Modifiers, const Vector2i&) {} inline void AbstractXApplication::mousePressEvent(MouseEvent&) {}
inline void AbstractXApplication::mouseReleaseEvent(MouseButton, Modifiers, const Vector2i&) {} inline void AbstractXApplication::mouseReleaseEvent(MouseEvent&) {}
inline void AbstractXApplication::mouseMotionEvent(Modifiers, const Vector2i&) {} inline void AbstractXApplication::mouseMoveEvent(MouseMoveEvent&) {}
}} }}

Loading…
Cancel
Save