mouse events

This commit is contained in:
Ben
2021-08-19 17:42:28 +01:00
parent bf89265947
commit a4cfaf6f23
7 changed files with 212 additions and 70 deletions

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -45,6 +45,7 @@ private:
SDL_GLContext mContext;
unsigned int mWidth, mHeight;
unsigned int mX, mY;
private:
Display( Display const& ) = delete;

View File

@@ -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];

View File

@@ -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;

View File

@@ -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()
{
}

View File

@@ -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;