mouse events
This commit is contained in:
@@ -13,6 +13,7 @@ App::App( const DisplayProperties& props )
|
||||
, mInput()
|
||||
{
|
||||
RegisterAsSink( "ENGINE_DISPLAY_CORE", 0 );
|
||||
RegisterAsSink( "ENGINE_INPUT_MOUSE", 0 );
|
||||
|
||||
mDisplay.Create( props );
|
||||
|
||||
@@ -33,7 +34,10 @@ const Display& App::GetDisplay()
|
||||
|
||||
bool App::EventRecieved( GenericEvent& e )
|
||||
{
|
||||
std::cout << e.Type << std::endl;
|
||||
if ( e.Type == "DISPLAY_CLOSED" )
|
||||
{
|
||||
mSIGTERM = true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -80,5 +80,19 @@ void Display::Destroy()
|
||||
|
||||
bool Display::EventRecieved( GenericEvent& e )
|
||||
{
|
||||
if ( e.Type == "DISPLAY_RESIZE" )
|
||||
{
|
||||
mWidth = e.x;
|
||||
mHeight = e.y;
|
||||
return true;
|
||||
}
|
||||
|
||||
if ( e.Type == "DISPLAY_MOVE" )
|
||||
{
|
||||
mX = e.x;
|
||||
mY = e.y;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -45,6 +45,7 @@ private:
|
||||
SDL_GLContext mContext;
|
||||
|
||||
unsigned int mWidth, mHeight;
|
||||
unsigned int mX, mY;
|
||||
|
||||
private:
|
||||
Display( Display const& ) = delete;
|
||||
|
||||
@@ -53,6 +53,7 @@ void EventDispatcher::RegisterAsSource( std::string system )
|
||||
{
|
||||
mDispatcherID = EventManager::GetInstance().RegisterSource( this, system );
|
||||
AEON_ASSERT( mDispatcherID != -1, "Cannot register event source" );
|
||||
mSystem = system;
|
||||
}
|
||||
|
||||
void EventDispatcher::DeRegisterAsSource( std::string system )
|
||||
@@ -62,6 +63,7 @@ void EventDispatcher::DeRegisterAsSource( std::string system )
|
||||
|
||||
void EventDispatcher::Dispatch( GenericEvent e )
|
||||
{
|
||||
e.System = mSystem;
|
||||
EventManager::GetInstance().Dispatch( mDispatcherID, e );
|
||||
}
|
||||
|
||||
@@ -69,6 +71,7 @@ void EventDispatcher::Dispatch( std::string type )
|
||||
{
|
||||
GenericEvent e;
|
||||
e.Type = type;
|
||||
e.System = mSystem;
|
||||
EventManager::GetInstance().Dispatch( mDispatcherID, e );
|
||||
}
|
||||
|
||||
@@ -122,6 +125,8 @@ void EventManager::RemoveSink( int listenerID, std::string system )
|
||||
|
||||
void EventManager::Dispatch( int dispatcherID, GenericEvent e )
|
||||
{
|
||||
// TODO: if there's no sinks, discard the event because it would be
|
||||
// unneccesary effort to keep going with it
|
||||
std::string targetSink = mSources[dispatcherID];
|
||||
auto sinks = mSinks[targetSink];
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
- Event listeners are layered, 0 is front, larger is back so
|
||||
events propogate from the front to the back, not going
|
||||
further once handled
|
||||
- Event sources can only dispatch events to a single system
|
||||
- Systems can request to only receive events from a certain
|
||||
"system" category, or multiple
|
||||
- Events are blocking for now
|
||||
@@ -37,6 +38,16 @@ namespace Aeon::Core {
|
||||
* DISPLAY_MOUSE_LEAVE - no data
|
||||
* DISPLAY_FOCUS - no data
|
||||
* DISPLAY_OUT_OF_FOCUS - no data
|
||||
* ENGINE_INPUT_MOUSE
|
||||
* MOUSE_LEFT_DOWN - no data
|
||||
* MOUSE_LEFT_UP - no data
|
||||
* MOUSE_RIGHT_DOWN - no data
|
||||
* MOUSE_RIGHT_UP - no data
|
||||
* MOUSE_MIDDLE_DOWN - no data
|
||||
* MOUSE_MIDDLE_UP - no data
|
||||
* MOUSE_SCROLL - y+-
|
||||
* MOUSE_MOVE - move to x, y relative dx, dy
|
||||
* ENGINE_INPUT_KEYBOARD
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -49,8 +60,10 @@ struct GenericEvent
|
||||
// the rest can be empty
|
||||
std::string Data;
|
||||
|
||||
// DISPLAY_RESIZE DISPLAY_MOVE
|
||||
// DISPLAY_RESIZE DISPLAY_MOVE MOUSE_MOVE
|
||||
int x, y;
|
||||
// MOUSE_MOVE
|
||||
int dx, dy;
|
||||
|
||||
bool Handled = false;
|
||||
};
|
||||
@@ -90,6 +103,7 @@ public:
|
||||
void Dispatch( std::string type );
|
||||
|
||||
private:
|
||||
std::string mSystem;
|
||||
int mDispatcherID = -1;
|
||||
|
||||
friend class EventManager;
|
||||
|
||||
@@ -13,11 +13,15 @@ Input::Input()
|
||||
, mMouseEventDispatcher()
|
||||
{
|
||||
mDisplayEventDispatcher.RegisterAsSource( "ENGINE_DISPLAY_CORE" );
|
||||
mMouseEventDispatcher.RegisterAsSource( "ENGINE_INPUT_MOUSE" );
|
||||
mKeyboardEventDispatcher.RegisterAsSource( "ENGINE_INPUT_KEYBOARD" );
|
||||
}
|
||||
|
||||
Input::~Input()
|
||||
{
|
||||
|
||||
mDisplayEventDispatcher.DeRegisterAsSource( "ENGINE_DISPLAY_CORE" );
|
||||
mMouseEventDispatcher.DeRegisterAsSource( "ENGINE_INPUT_MOUSE" );
|
||||
mKeyboardEventDispatcher.DeRegisterAsSource( "ENGINE_INPUT_KEYBOARD" );
|
||||
}
|
||||
|
||||
void Input::PollInput()
|
||||
@@ -26,74 +30,26 @@ void Input::PollInput()
|
||||
{
|
||||
switch ( mEvent.type )
|
||||
{
|
||||
case SDL_WINDOWEVENT:
|
||||
case SDL_WINDOWEVENT:
|
||||
{
|
||||
mPollDisplay();
|
||||
break;
|
||||
}
|
||||
case SDL_MOUSEWHEEL:
|
||||
{
|
||||
switch ( mEvent.window.event )
|
||||
{
|
||||
case SDL_WINDOWEVENT_SHOWN:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "DISPLAY_SHOW" );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_HIDDEN:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "DISPLAY_HIDE" );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_MOVED:
|
||||
{
|
||||
Aeon::Core::GenericEvent e;
|
||||
e.x = mEvent.window.data1;
|
||||
e.y = mEvent.window.data2;
|
||||
e.Type = "DISPLAY_MOVE";
|
||||
mDisplayEventDispatcher.Dispatch( e );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_RESIZED:
|
||||
{
|
||||
Aeon::Core::GenericEvent e;
|
||||
e.x = mEvent.window.data1;
|
||||
e.y = mEvent.window.data2;
|
||||
e.Type = "DISPLAY_RESIZE";
|
||||
mDisplayEventDispatcher.Dispatch( e );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_MINIMIZED:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "DISPLAY_MINIMISED" );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_MAXIMIZED:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "DISPLAY_MAXIMISED" );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_ENTER:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "DISPLAY_MOUSE_ENTER" );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_LEAVE:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "DISPLAY_MOUSE_LEAVE" );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_FOCUS_GAINED:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "DISPLAY_FOCUS" );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_FOCUS_LOST:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "DISPLAY_OUT_OF_FOCUS" );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_CLOSE:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "DISPLAY_CLOSED" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
mPollScroll();
|
||||
break;
|
||||
}
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
{
|
||||
mPollClick();
|
||||
break;
|
||||
}
|
||||
case SDL_MOUSEMOTION:
|
||||
{
|
||||
mPollMouse();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -103,3 +59,142 @@ void Input::PollInput()
|
||||
//std::cout << std::endl;
|
||||
}
|
||||
|
||||
void Input::mPollDisplay()
|
||||
{
|
||||
switch ( mEvent.window.event )
|
||||
{
|
||||
case SDL_WINDOWEVENT_SHOWN:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "DISPLAY_SHOW" );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_HIDDEN:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "DISPLAY_HIDE" );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_MOVED:
|
||||
{
|
||||
Aeon::Core::GenericEvent e;
|
||||
e.x = mEvent.window.data1;
|
||||
e.y = mEvent.window.data2;
|
||||
e.Type = "DISPLAY_MOVE";
|
||||
mDisplayEventDispatcher.Dispatch( e );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_RESIZED:
|
||||
{
|
||||
Aeon::Core::GenericEvent e;
|
||||
e.x = mEvent.window.data1;
|
||||
e.y = mEvent.window.data2;
|
||||
e.Type = "DISPLAY_RESIZE";
|
||||
mDisplayEventDispatcher.Dispatch( e );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_MINIMIZED:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "DISPLAY_MINIMISED" );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_MAXIMIZED:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "DISPLAY_MAXIMISED" );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_ENTER:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "DISPLAY_MOUSE_ENTER" );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_LEAVE:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "DISPLAY_MOUSE_LEAVE" );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_FOCUS_GAINED:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "DISPLAY_FOCUS" );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_FOCUS_LOST:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "DISPLAY_OUT_OF_FOCUS" );
|
||||
break;
|
||||
}
|
||||
case SDL_WINDOWEVENT_CLOSE:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "DISPLAY_CLOSED" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Input::mPollMouse()
|
||||
{
|
||||
Aeon::Core::GenericEvent e;
|
||||
e.x = mEvent.motion.x;
|
||||
e.y = mEvent.motion.y;
|
||||
e.dx = mEvent.motion.xrel;
|
||||
e.dy = mEvent.motion.yrel;
|
||||
e.Type = "MOUSE_MOVE";
|
||||
mMouseEventDispatcher.Dispatch( e );
|
||||
}
|
||||
|
||||
void Input::mPollScroll()
|
||||
{
|
||||
Aeon::Core::GenericEvent e;
|
||||
e.y = mEvent.wheel.y;
|
||||
e.Type = "MOUSE_SCROLL";
|
||||
mMouseEventDispatcher.Dispatch( e );
|
||||
}
|
||||
|
||||
void Input::mPollClick()
|
||||
{
|
||||
if ( mEvent.button.state == SDL_PRESSED )
|
||||
{
|
||||
switch ( mEvent.button.button )
|
||||
{
|
||||
case SDL_BUTTON_LEFT:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "MOUSE_LEFT_DOWN" );
|
||||
break;
|
||||
}
|
||||
case SDL_BUTTON_RIGHT:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "MOUSE_RIGHT_DOWN" );
|
||||
break;
|
||||
}
|
||||
case SDL_BUTTON_MIDDLE:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "MOUSE_MIDDLE_DOWN" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( mEvent.button.state == SDL_RELEASED )
|
||||
{
|
||||
switch ( mEvent.button.button )
|
||||
{
|
||||
case SDL_BUTTON_LEFT:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "MOUSE_LEFT_UP" );
|
||||
break;
|
||||
}
|
||||
case SDL_BUTTON_RIGHT:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "MOUSE_RIGHT_UP" );
|
||||
break;
|
||||
}
|
||||
case SDL_BUTTON_MIDDLE:
|
||||
{
|
||||
mDisplayEventDispatcher.Dispatch( "MOUSE_MIDDLE_UP" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Input::mPollKeyboard()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@@ -16,6 +16,15 @@ public:
|
||||
|
||||
void PollInput();
|
||||
private:
|
||||
|
||||
void mPollDisplay();
|
||||
void mPollMouse();
|
||||
void mPollScroll();
|
||||
void mPollClick();
|
||||
void mPollKeyboard();
|
||||
|
||||
private:
|
||||
|
||||
SDL_Event mEvent;
|
||||
|
||||
Aeon::Core::EventDispatcher mDisplayEventDispatcher;
|
||||
|
||||
Reference in New Issue
Block a user