Utility/Window: Add new event system, based on signals
Old pooling-based system remains for now but is now deprecated Former-commit-id: 803c6f51e8287613610ede8433bef8112bc70352 [formerly 9f60f0fabea7fa0d0d62feba217e28c421522e36] [formerly f05d3dededee17402669ec9e4060c95d77c74bb4 [formerly 5b96073b92c3a10a5c485abcc7c33ecedb819fca]] Former-commit-id: 4280c668fb5ec67c0b765a80516b9b4fe466135d [formerly c8ce15aa230bf2f1040b00153ec81aa1f39ef48d] Former-commit-id: 71893d639b5e1628776d8a4577b0309437865c16
This commit is contained in:
parent
6b155f7e14
commit
618449c13a
|
|
@ -26,6 +26,8 @@ namespace Ndk
|
|||
{
|
||||
Nz::Window& window = **it;
|
||||
|
||||
window.ProcessEvents();
|
||||
|
||||
if (!window.IsOpen(true))
|
||||
{
|
||||
it = m_windows.erase(it);
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ int main()
|
|||
Nz::RenderWindow& mainWindow = application.AddWindow<Nz::RenderWindow>();
|
||||
mainWindow.Create(Nz::VideoMode(800, 600, 32), "Test");
|
||||
|
||||
|
||||
Ndk::World& world = application.AddWorld();
|
||||
world.GetSystem<Ndk::RenderSystem>().SetGlobalUp(Nz::Vector3f::Down());
|
||||
world.GetSystem<Ndk::RenderSystem>().SetDefaultBackground(Nz::ColorBackground::New(Nz::Color(192, 100, 100)));
|
||||
|
|
@ -43,13 +44,6 @@ int main()
|
|||
|
||||
while (application.Run())
|
||||
{
|
||||
Nz::WindowEvent event;
|
||||
while (mainWindow.PollEvent(&event))
|
||||
{
|
||||
if (event.type == Nz::WindowEventType_Quit)
|
||||
application.Quit();
|
||||
}
|
||||
|
||||
mainWindow.Display();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,47 @@
|
|||
// Copyright (C) 2015 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Utility module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef NAZARA_EVENTHANDLER_HPP
|
||||
#define NAZARA_EVENTHANDLER_HPP
|
||||
|
||||
#include <Nazara/Prerequesites.hpp>
|
||||
#include <Nazara/Core/Signal.hpp>
|
||||
#include <Nazara/Utility/Config.hpp>
|
||||
#include <Nazara/Utility/Event.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
class EventHandler
|
||||
{
|
||||
public:
|
||||
EventHandler() = default;
|
||||
EventHandler(const EventHandler&);
|
||||
EventHandler(EventHandler&&) = default;
|
||||
~EventHandler() = default;
|
||||
|
||||
inline void Dispatch(const WindowEvent& event);
|
||||
|
||||
NazaraSignal(OnGainedFocus, const EventHandler* /*eventHandler*/);
|
||||
NazaraSignal(OnLostFocus, const EventHandler* /*eventHandler*/);
|
||||
NazaraSignal(OnKeyPressed, const EventHandler* /*eventHandler*/, const WindowEvent::KeyEvent& /*event*/);
|
||||
NazaraSignal(OnKeyReleased, const EventHandler* /*eventHandler*/, const WindowEvent::KeyEvent& /*event*/);
|
||||
NazaraSignal(OnMouseButtonDoubleClicked, const EventHandler* /*eventHandler*/, const WindowEvent::MouseButtonEvent& /*event*/);
|
||||
NazaraSignal(OnMouseButtonPressed, const EventHandler* /*eventHandler*/, const WindowEvent::MouseButtonEvent& /*event*/);
|
||||
NazaraSignal(OnMouseButtonReleased, const EventHandler* /*eventHandler*/, const WindowEvent::MouseButtonEvent& /*event*/);
|
||||
NazaraSignal(OnMouseEntered, const EventHandler* /*eventHandler*/);
|
||||
NazaraSignal(OnMouseLeft, const EventHandler* /*eventHandler*/);
|
||||
NazaraSignal(OnMouseMoved, const EventHandler* /*eventHandler*/, const WindowEvent::MouseMoveEvent& /*event*/);
|
||||
NazaraSignal(OnMouseWheelMoved, const EventHandler* /*eventHandler*/, const WindowEvent::MouseWheelEvent& /*event*/);
|
||||
NazaraSignal(OnMoved, const EventHandler* /*eventHandler*/, const WindowEvent::PositionEvent& /*event*/);
|
||||
NazaraSignal(OnQuit, const EventHandler* /*eventHandler*/);
|
||||
NazaraSignal(OnResized, const EventHandler* /*eventHandler*/, const WindowEvent::SizeEvent& /*event*/);
|
||||
NazaraSignal(OnTextEntered, const EventHandler* /*eventHandler*/, const WindowEvent::TextEvent& /*event*/);
|
||||
};
|
||||
}
|
||||
|
||||
#include <Nazara/Utility/EventHandler.inl>
|
||||
|
||||
#endif // NAZARA_EVENTHANDLER_HPP
|
||||
|
|
@ -0,0 +1,82 @@
|
|||
// Copyright (C) 2015 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Utility module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <Nazara/Utility/EventHandler.hpp>
|
||||
#include <memory>
|
||||
#include <Nazara/Utility/Debug.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
inline EventHandler::EventHandler(const EventHandler&)
|
||||
{
|
||||
}
|
||||
|
||||
inline void EventHandler::Dispatch(const WindowEvent& event)
|
||||
{
|
||||
switch (event.type)
|
||||
{
|
||||
case WindowEventType_GainedFocus:
|
||||
OnGainedFocus(this);
|
||||
break;
|
||||
|
||||
case WindowEventType_KeyPressed:
|
||||
OnKeyPressed(this, event.key);
|
||||
break;
|
||||
|
||||
case WindowEventType_KeyReleased:
|
||||
OnKeyReleased(this, event.key);
|
||||
break;
|
||||
|
||||
case WindowEventType_LostFocus:
|
||||
OnLostFocus(this);
|
||||
break;
|
||||
|
||||
case WindowEventType_MouseButtonDoubleClicked:
|
||||
OnMouseButtonDoubleClicked(this, event.mouseButton);
|
||||
break;
|
||||
|
||||
case WindowEventType_MouseButtonPressed:
|
||||
OnMouseButtonPressed(this, event.mouseButton);
|
||||
break;
|
||||
|
||||
case WindowEventType_MouseButtonReleased:
|
||||
OnMouseButtonPressed(this, event.mouseButton);
|
||||
break;
|
||||
|
||||
case WindowEventType_MouseEntered:
|
||||
OnMouseEntered(this);
|
||||
break;
|
||||
|
||||
case WindowEventType_MouseLeft:
|
||||
OnMouseLeft(this);
|
||||
break;
|
||||
|
||||
case WindowEventType_MouseMoved:
|
||||
OnMouseMoved(this, event.mouseMove);
|
||||
break;
|
||||
|
||||
case WindowEventType_MouseWheelMoved:
|
||||
OnMouseWheelMoved(this, event.mouseWheel);
|
||||
break;
|
||||
|
||||
case WindowEventType_Moved:
|
||||
OnMoved(this, event.position);
|
||||
break;
|
||||
|
||||
case WindowEventType_Quit:
|
||||
OnQuit(this);
|
||||
break;
|
||||
|
||||
case WindowEventType_Resized:
|
||||
OnResized(this, event.size);
|
||||
break;
|
||||
|
||||
case WindowEventType_TextEntered:
|
||||
OnTextEntered(this, event.text);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#include <Nazara/Utility/DebugOff.hpp>
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
#include <Nazara/Math/Vector2.hpp>
|
||||
#include <Nazara/Utility/Config.hpp>
|
||||
#include <Nazara/Utility/Enums.hpp>
|
||||
#include <Nazara/Utility/Event.hpp>
|
||||
#include <Nazara/Utility/EventHandler.hpp>
|
||||
#include <Nazara/Utility/VideoMode.hpp>
|
||||
#include <Nazara/Utility/WindowHandle.hpp>
|
||||
#include <queue>
|
||||
|
|
@ -52,9 +52,11 @@ namespace Nz
|
|||
|
||||
void Destroy();
|
||||
|
||||
NAZARA_DEPRECATED("Event pooling/waiting is deprecated, please use the EventHandler system") inline void EnableEventPolling(bool enable);
|
||||
void EnableKeyRepeat(bool enable);
|
||||
void EnableSmoothScrolling(bool enable);
|
||||
|
||||
EventHandler& GetEventHandler();
|
||||
WindowHandle GetHandle() const;
|
||||
unsigned int GetHeight() const;
|
||||
Vector2i GetPosition() const;
|
||||
|
|
@ -71,7 +73,9 @@ namespace Nz
|
|||
inline bool IsValid() const;
|
||||
bool IsVisible() const;
|
||||
|
||||
bool PollEvent(WindowEvent* event);
|
||||
NAZARA_DEPRECATED("Event pooling/waiting is deprecated, please use the EventHandler system") bool PollEvent(WindowEvent* event);
|
||||
|
||||
void ProcessEvents(bool block = false);
|
||||
|
||||
void SetCursor(WindowCursor cursor);
|
||||
void SetCursor(const Cursor& cursor);
|
||||
|
|
@ -90,7 +94,7 @@ namespace Nz
|
|||
void SetTitle(const String& title);
|
||||
void SetVisible(bool visible);
|
||||
|
||||
bool WaitEvent(WindowEvent* event);
|
||||
NAZARA_DEPRECATED("Event pooling/waiting is deprecated, please use the EventHandler system")bool WaitEvent(WindowEvent* event);
|
||||
|
||||
Window& operator=(const Window&) = delete;
|
||||
inline Window& operator=(Window&& window);
|
||||
|
|
@ -114,10 +118,11 @@ namespace Nz
|
|||
ConditionVariable m_eventCondition;
|
||||
Mutex m_eventMutex;
|
||||
Mutex m_eventConditionMutex;
|
||||
bool m_eventListener;
|
||||
bool m_waitForEvent;
|
||||
#endif
|
||||
EventHandler m_eventHandler;
|
||||
bool m_closed;
|
||||
bool m_eventPolling;
|
||||
bool m_ownsWindow;
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,39 +11,24 @@ namespace Nz
|
|||
/*!
|
||||
* \class Nz::Window
|
||||
*/
|
||||
|
||||
inline Window::Window() :
|
||||
#if NAZARA_UTILITY_THREADED_WINDOW
|
||||
m_impl(nullptr),
|
||||
m_eventListener(true),
|
||||
m_waitForEvent(false)
|
||||
#else
|
||||
m_impl(nullptr)
|
||||
#if NAZARA_UTILITY_THREADED_WINDOW
|
||||
m_waitForEvent(false),
|
||||
#endif
|
||||
m_eventPolling(false)
|
||||
{
|
||||
}
|
||||
|
||||
inline Window::Window(VideoMode mode, const String& title, UInt32 style) :
|
||||
#if NAZARA_UTILITY_THREADED_WINDOW
|
||||
m_impl(nullptr),
|
||||
m_eventListener(true),
|
||||
m_waitForEvent(false)
|
||||
#else
|
||||
m_impl(nullptr)
|
||||
#endif
|
||||
Window()
|
||||
{
|
||||
ErrorFlags flags(ErrorFlag_ThrowException, true);
|
||||
Create(mode, title, style);
|
||||
}
|
||||
|
||||
inline Window::Window(WindowHandle handle) :
|
||||
#if NAZARA_UTILITY_THREADED_WINDOW
|
||||
m_impl(nullptr),
|
||||
m_eventListener(true),
|
||||
m_waitForEvent(false)
|
||||
#else
|
||||
m_impl(nullptr)
|
||||
#endif
|
||||
Window()
|
||||
{
|
||||
ErrorFlags flags(ErrorFlag_ThrowException, true);
|
||||
Create(handle);
|
||||
|
|
@ -59,7 +44,7 @@ namespace Nz
|
|||
m_eventCondition(std::move(window.m_eventCondition)),
|
||||
m_eventMutex(std::move(window.m_eventMutex)),
|
||||
m_eventConditionMutex(std::move(window.m_eventConditionMutex)),
|
||||
m_eventListener(window.m_eventListener),
|
||||
m_eventPolling(window.m_eventPolling),
|
||||
m_waitForEvent(window.m_waitForEvent),
|
||||
#endif
|
||||
m_closed(window.m_closed),
|
||||
|
|
@ -78,6 +63,21 @@ namespace Nz
|
|||
m_closed = true; // The window will be closed at the next non-const IsOpen() call
|
||||
}
|
||||
|
||||
inline void Window::EnableEventPolling(bool enable)
|
||||
{
|
||||
m_eventPolling = enable;
|
||||
if (!m_eventPolling)
|
||||
{
|
||||
while (!m_events.empty())
|
||||
m_events.pop();
|
||||
}
|
||||
}
|
||||
|
||||
inline EventHandler& Nz::Window::GetEventHandler()
|
||||
{
|
||||
return m_eventHandler;
|
||||
}
|
||||
|
||||
inline bool Window::IsOpen(bool checkClosed)
|
||||
{
|
||||
if (!m_impl)
|
||||
|
|
@ -108,7 +108,11 @@ namespace Nz
|
|||
m_eventMutex.Lock();
|
||||
#endif
|
||||
|
||||
m_events.push(event);
|
||||
if (m_eventPolling)
|
||||
m_events.push(event);
|
||||
|
||||
m_eventHandler.Dispatch(event);
|
||||
|
||||
if (event.type == WindowEventType_Resized)
|
||||
OnWindowResized();
|
||||
|
||||
|
|
@ -132,10 +136,11 @@ namespace Nz
|
|||
{
|
||||
Destroy();
|
||||
|
||||
m_closed = window.m_closed;
|
||||
m_impl = window.m_impl;
|
||||
m_events = std::move(window.m_events);
|
||||
m_ownsWindow = window.m_ownsWindow;
|
||||
m_closed = window.m_closed;
|
||||
m_eventPolling = window.m_eventPolling;
|
||||
m_impl = window.m_impl;
|
||||
m_events = std::move(window.m_events);
|
||||
m_ownsWindow = window.m_ownsWindow;
|
||||
|
||||
window.m_impl = nullptr;
|
||||
|
||||
|
|
@ -143,7 +148,6 @@ namespace Nz
|
|||
m_eventCondition = std::move(window.m_eventCondition);
|
||||
m_eventMutex = std::move(window.m_eventMutex);
|
||||
m_eventConditionMutex = std::move(window.m_eventConditionMutex);
|
||||
m_eventListener = window.m_eventListener;
|
||||
m_waitForEvent = window.m_waitForEvent;
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -325,6 +325,15 @@ namespace Nz
|
|||
return false;
|
||||
}
|
||||
|
||||
void Window::ProcessEvents(bool block)
|
||||
{
|
||||
NazaraAssert(m_impl, "Window not created");
|
||||
|
||||
#if !NAZARA_UTILITY_THREADED_WINDOW
|
||||
m_impl->ProcessEvents(block);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Window::SetCursor(WindowCursor cursor)
|
||||
{
|
||||
#if NAZARA_UTILITY_SAFE
|
||||
|
|
|
|||
Loading…
Reference in New Issue