From adcce6e61349acb3d573d0d6981cce99ddce442b Mon Sep 17 00:00:00 2001 From: Nomango Date: Wed, 14 Oct 2020 16:01:43 +0800 Subject: [PATCH] [deploy] add MouseEventListener & KeyEventListener --- projects/kiwano/kiwano.vcxproj | 8 +- projects/kiwano/kiwano.vcxproj.filters | 27 +++- src/kiwano/event/Event.h | 24 +-- src/kiwano/event/EventDispatcher.h | 2 +- src/kiwano/event/EventType.h | 2 +- src/kiwano/event/KeyEvent.h | 2 +- src/kiwano/event/MouseEvent.h | 2 +- src/kiwano/event/WindowEvent.h | 2 +- .../event/{ => listener}/EventListener.cpp | 2 +- .../event/{ => listener}/EventListener.h | 12 ++ .../event/listener/KeyEventListener.cpp | 39 +++++ src/kiwano/event/listener/KeyEventListener.h | 60 ++++++++ .../event/listener/MouseEventListener.cpp | 137 ++++++++++++++++++ .../event/listener/MouseEventListener.h | 137 ++++++++++++++++++ src/kiwano/kiwano.h | 5 +- src/kiwano/platform/Keys.h | 26 ++++ src/kiwano/render/DirectX/RendererImpl.cpp | 4 +- src/kiwano/render/Renderer.cpp | 4 +- src/kiwano/utils/ConfigIni.cpp | 2 +- src/kiwano/utils/EventTicker.h | 2 +- 20 files changed, 465 insertions(+), 34 deletions(-) rename src/kiwano/event/{ => listener}/EventListener.cpp (98%) rename src/kiwano/event/{ => listener}/EventListener.h (97%) create mode 100644 src/kiwano/event/listener/KeyEventListener.cpp create mode 100644 src/kiwano/event/listener/KeyEventListener.h create mode 100644 src/kiwano/event/listener/MouseEventListener.cpp create mode 100644 src/kiwano/event/listener/MouseEventListener.h diff --git a/projects/kiwano/kiwano.vcxproj b/projects/kiwano/kiwano.vcxproj index 4bd46c9f..aee8098b 100644 --- a/projects/kiwano/kiwano.vcxproj +++ b/projects/kiwano/kiwano.vcxproj @@ -48,10 +48,12 @@ - + + + @@ -165,8 +167,10 @@ - + + + diff --git a/projects/kiwano/kiwano.vcxproj.filters b/projects/kiwano/kiwano.vcxproj.filters index ff452122..f22d5eea 100644 --- a/projects/kiwano/kiwano.vcxproj.filters +++ b/projects/kiwano/kiwano.vcxproj.filters @@ -40,6 +40,9 @@ {f70cecd8-6d5b-405d-8466-d3ca2db9b806} + + {554a3b32-ec18-4123-a12e-b176ec10fbdc} + @@ -279,9 +282,6 @@ event - - event - event @@ -396,6 +396,15 @@ base\component + + event\listener + + + event\listener + + + event\listener + @@ -560,9 +569,6 @@ event - - event - event @@ -653,6 +659,15 @@ base\component + + event\listener + + + event\listener + + + event\listener + diff --git a/src/kiwano/event/Event.h b/src/kiwano/event/Event.h index 172bf8a9..7bb54891 100644 --- a/src/kiwano/event/Event.h +++ b/src/kiwano/event/Event.h @@ -30,11 +30,11 @@ KGE_DECLARE_SMART_PTR(Event); /** * \~chinese - * \defgroup Events 事件 + * \defgroup Event 事件 */ /** - * \addtogroup Events + * \addtogroup Event * @{ */ @@ -60,16 +60,16 @@ public: bool IsType() const; /// \~chinese - /// @brief 安全转换为其他类型事件 - /// @throw std::bad_cast 类型无法转换时抛出 + /// @brief 转换为其他类型事件 + /// @return 其他类型事件指针,如果事件类型无法转换,返回空指针 template - const _Ty* SafeCast() const; + const _Ty* Cast() const; /// \~chinese - /// @brief 安全转换为其他类型事件 - /// @throw std::bad_cast 类型无法转换时抛出 + /// @brief 转换为其他类型事件 + /// @return 其他类型事件指针,如果事件类型无法转换,返回空指针 template - _Ty* SafeCast(); + _Ty* Cast(); private: const EventType type_; @@ -102,16 +102,16 @@ inline bool Event::IsType() const } template -inline const _Ty* Event::SafeCast() const +inline const _Ty* Event::Cast() const { - return const_cast(this)->SafeCast<_Ty>(); + return const_cast(this)->Cast<_Ty>(); } template -inline _Ty* Event::SafeCast() +inline _Ty* Event::Cast() { if (!this->IsType<_Ty>()) - throw std::bad_cast(); + return nullptr; return dynamic_cast<_Ty*>(this); } diff --git a/src/kiwano/event/EventDispatcher.h b/src/kiwano/event/EventDispatcher.h index 5c5e2952..a3260efd 100644 --- a/src/kiwano/event/EventDispatcher.h +++ b/src/kiwano/event/EventDispatcher.h @@ -19,7 +19,7 @@ // THE SOFTWARE. #pragma once -#include +#include namespace kiwano { diff --git a/src/kiwano/event/EventType.h b/src/kiwano/event/EventType.h index ae104bc0..0aba6cc0 100644 --- a/src/kiwano/event/EventType.h +++ b/src/kiwano/event/EventType.h @@ -26,7 +26,7 @@ namespace kiwano { /** - * \addtogroup Events + * \addtogroup Event * @{ */ diff --git a/src/kiwano/event/KeyEvent.h b/src/kiwano/event/KeyEvent.h index b97b4d11..2925ccbb 100644 --- a/src/kiwano/event/KeyEvent.h +++ b/src/kiwano/event/KeyEvent.h @@ -30,7 +30,7 @@ KGE_DECLARE_SMART_PTR(KeyUpEvent); KGE_DECLARE_SMART_PTR(KeyCharEvent); /** - * \addtogroup Events + * \addtogroup Event * @{ */ diff --git a/src/kiwano/event/MouseEvent.h b/src/kiwano/event/MouseEvent.h index 013ea032..06f7f002 100644 --- a/src/kiwano/event/MouseEvent.h +++ b/src/kiwano/event/MouseEvent.h @@ -35,7 +35,7 @@ KGE_DECLARE_SMART_PTR(MouseOutEvent); KGE_DECLARE_SMART_PTR(MouseWheelEvent); /** - * \addtogroup Events + * \addtogroup Event * @{ */ diff --git a/src/kiwano/event/WindowEvent.h b/src/kiwano/event/WindowEvent.h index 40d59754..a76bba70 100644 --- a/src/kiwano/event/WindowEvent.h +++ b/src/kiwano/event/WindowEvent.h @@ -33,7 +33,7 @@ KGE_DECLARE_SMART_PTR(WindowClosedEvent); class Window; /** - * \addtogroup Events + * \addtogroup Event * @{ */ diff --git a/src/kiwano/event/EventListener.cpp b/src/kiwano/event/listener/EventListener.cpp similarity index 98% rename from src/kiwano/event/EventListener.cpp rename to src/kiwano/event/listener/EventListener.cpp index 5821ebef..2497d498 100644 --- a/src/kiwano/event/EventListener.cpp +++ b/src/kiwano/event/listener/EventListener.cpp @@ -19,7 +19,7 @@ // THE SOFTWARE. #pragma once -#include +#include namespace kiwano { diff --git a/src/kiwano/event/EventListener.h b/src/kiwano/event/listener/EventListener.h similarity index 97% rename from src/kiwano/event/EventListener.h rename to src/kiwano/event/listener/EventListener.h index 621619cd..facc2874 100644 --- a/src/kiwano/event/EventListener.h +++ b/src/kiwano/event/listener/EventListener.h @@ -30,6 +30,16 @@ class EventDispatcher; KGE_DECLARE_SMART_PTR(EventListener); +/** + * \~chinese + * \defgroup EventListener 事件监听器 + */ + +/** + * \addtogroup EventListener + * @{ + */ + /** * \~chinese * @brief 事件监听器 @@ -114,6 +124,8 @@ private: bool swallow_; }; +/** @} */ + inline void EventListener::Start() { running_ = true; diff --git a/src/kiwano/event/listener/KeyEventListener.cpp b/src/kiwano/event/listener/KeyEventListener.cpp new file mode 100644 index 00000000..4edae4b6 --- /dev/null +++ b/src/kiwano/event/listener/KeyEventListener.cpp @@ -0,0 +1,39 @@ +// Copyright (c) 2016-2018 Kiwano - Nomango +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#pragma once +#include + +namespace kiwano +{ + +void KeyEventListener::Handle(Event* evt) +{ + if (auto key_evt = evt->Cast()) + { + OnKeyDown(key_evt->code); + } + else if (auto key_evt = evt->Cast()) + { + OnKeyUp(key_evt->code); + } +} + +} // namespace kiwano diff --git a/src/kiwano/event/listener/KeyEventListener.h b/src/kiwano/event/listener/KeyEventListener.h new file mode 100644 index 00000000..916c2427 --- /dev/null +++ b/src/kiwano/event/listener/KeyEventListener.h @@ -0,0 +1,60 @@ +// Copyright (c) 2016-2018 Kiwano - Nomango +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#pragma once +#include +#include + +namespace kiwano +{ + +KGE_DECLARE_SMART_PTR(KeyEventListener); + +/** + * \addtogroup EventListener + * @{ + */ + +/** + * \~chinese + * @brief 按键事件监听器 + */ +class KGE_API KeyEventListener + : public EventListener +{ +public: + /// \~chinese + /// @brief 按键按下时 + /// @param key 按键键值 + virtual void OnKeyDown(KeyCode key) {} + + /// \~chinese + /// @brief 按键抬起时 + /// @param key 按键键值 + virtual void OnKeyUp(KeyCode key) {} + + /// \~chinese + /// @brief 处理消息 + void Handle(Event* evt) override; +}; + +/** @} */ + +} // namespace kiwano diff --git a/src/kiwano/event/listener/MouseEventListener.cpp b/src/kiwano/event/listener/MouseEventListener.cpp new file mode 100644 index 00000000..526833fd --- /dev/null +++ b/src/kiwano/event/listener/MouseEventListener.cpp @@ -0,0 +1,137 @@ +// Copyright (c) 2016-2018 Kiwano - Nomango +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#pragma once +#include + +namespace kiwano +{ + +void MouseEventListener::Handle(Event* evt) +{ + if (auto mouse_evt = evt->Cast()) + { + OnMouseMoving(mouse_evt->pos); + } + else if (auto mouse_evt = evt->Cast()) + { + OnMouseDown(mouse_evt->pos, mouse_evt->button); + } + else if (auto mouse_evt = evt->Cast()) + { + OnMouseUp(mouse_evt->pos, mouse_evt->button); + } + else if (auto mouse_evt = evt->Cast()) + { + OnMouseWheelScrolling(mouse_evt->pos, mouse_evt->wheel); + } +} + +MouseDragEventListener::MouseDragEventListener() + : is_dragging_{ false, false, false } + , drag_point_{} +{ +} + +void MouseDragEventListener::Handle(Event* evt) +{ + if (auto mouse_evt = evt->Cast()) + { + const auto button = mouse_evt->button; + if (OnDragStart(mouse_evt->pos, button)) + { + SetDragging(button, true); + SetDragPoint(button, mouse_evt->pos); + SetDragPrevPoint(button, mouse_evt->pos); + } + } + + if (auto mouse_evt = evt->Cast()) + { + for (int i = 0; i < MouseButtonNum; i++) + { + const auto button = MouseButton(i); + if (IsDragging(button)) + { + auto new_pos = mouse_evt->pos; + auto offset = new_pos - GetDragPrevPoint(button); + OnDragging(offset, button); + SetDragPrevPoint(button, new_pos); + } + } + } + + if (auto mouse_evt = evt->Cast()) + { + const auto button = mouse_evt->button; + if (IsDragging(button)) + { + OnDragEnd(mouse_evt->pos, button); + + SetDragging(button, false); + SetDragPoint(button, Point()); + SetDragPrevPoint(button, Point()); + } + } +} + +bool MouseDragEventListener::IsDragging(MouseButton button) +{ + int index = int(button); + KGE_ASSERT(index >= 0 && index < MouseButtonNum); + return is_dragging_[index]; +} + +void MouseDragEventListener::SetDragging(MouseButton button, bool dragging) +{ + int index = int(button); + KGE_ASSERT(index >= 0 && index < MouseButtonNum); + is_dragging_[index] = dragging; +} + +Point MouseDragEventListener::GetDragPoint(MouseButton button) +{ + int index = int(button); + KGE_ASSERT(index >= 0 && index < MouseButtonNum); + return drag_point_[index]; +} + +void MouseDragEventListener::SetDragPoint(MouseButton button, Point pos) +{ + int index = int(button); + KGE_ASSERT(index >= 0 && index < MouseButtonNum); + drag_point_[index] = pos; +} + +Point MouseDragEventListener::GetDragPrevPoint(MouseButton button) +{ + int index = int(button); + KGE_ASSERT(index >= 0 && index < MouseButtonNum); + return drag_prev_point_[index]; +} + +void MouseDragEventListener::SetDragPrevPoint(MouseButton button, Point pos) +{ + int index = int(button); + KGE_ASSERT(index >= 0 && index < MouseButtonNum); + drag_prev_point_[index] = pos; +} + +} // namespace kiwano diff --git a/src/kiwano/event/listener/MouseEventListener.h b/src/kiwano/event/listener/MouseEventListener.h new file mode 100644 index 00000000..8628431a --- /dev/null +++ b/src/kiwano/event/listener/MouseEventListener.h @@ -0,0 +1,137 @@ +// Copyright (c) 2016-2018 Kiwano - Nomango +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#pragma once +#include +#include + +namespace kiwano +{ + +KGE_DECLARE_SMART_PTR(MouseEventListener); +KGE_DECLARE_SMART_PTR(MouseDragEventListener); + +/** + * \addtogroup EventListener + * @{ + */ + +/** + * \~chinese + * @brief 鼠标事件监听器 + */ +class KGE_API MouseEventListener + : public EventListener +{ +public: + /// \~chinese + /// @brief 鼠标移动时 + /// @param pos 鼠标位置 + virtual void OnMouseMoving(const Point& pos) {} + + /// \~chinese + /// @brief 鼠标按下时 + /// @param pos 鼠标位置 + /// @param button 鼠标键值 + virtual void OnMouseDown(const Point& pos, MouseButton button) {} + + /// \~chinese + /// @brief 鼠标抬起时 + /// @param pos 鼠标位置 + /// @param button 鼠标键值 + virtual void OnMouseUp(const Point& pos, MouseButton button) {} + + /// \~chinese + /// @brief 鼠标滚轮滚动时 + /// @param pos 鼠标位置 + /// @param wheel 鼠标滚轮滚动值 + virtual void OnMouseWheelScrolling(const Point& pos, float wheel) {} + + /// \~chinese + /// @brief 处理消息 + void Handle(Event* evt) override; +}; + +/** + * \~chinese + * @brief 鼠标拖动事件监听器 + */ +class KGE_API MouseDragEventListener : public EventListener +{ +public: + MouseDragEventListener(); + + /// \~chinese + /// @brief 鼠标拖动开始 + /// @param pos 鼠标位置 + /// @param button 鼠标键值 + /// @return 是否响应这次拖动 + virtual bool OnDragStart(const Point& pos, MouseButton button) + { + return true; + } + + /// \~chinese + /// @brief 鼠标拖动时 + /// @param offset 鼠标位置偏移量 + /// @param button 鼠标键值 + virtual void OnDragging(const Point& offset, MouseButton button) {} + + /// \~chinese + /// @brief 鼠标拖动结束 + /// @param pos 鼠标位置 + /// @param button 鼠标键值 + virtual void OnDragEnd(const Point& pos, MouseButton button) {} + + /// \~chinese + /// @brief 获取鼠标按键的拖动状态 + bool IsDragging(MouseButton button); + + /// \~chinese + /// @brief 获取鼠标按键的起始拖动位置 + Point GetDragPoint(MouseButton button); + + /// \~chinese + /// @brief 处理消息 + void Handle(Event* evt) override; + +private: + void SetDragging(MouseButton button, bool dragging); + + void SetDragPoint(MouseButton button, Point pos); + + Point GetDragPrevPoint(MouseButton button); + + void SetDragPrevPoint(MouseButton button, Point pos); + +private: + enum : int + { + MouseButtonNum = 3 + }; + + bool is_dragging_[MouseButtonNum]; + Point drag_point_[MouseButtonNum]; + Point drag_prev_point_[MouseButtonNum]; +}; + +/** @} */ + +} // namespace kiwano diff --git a/src/kiwano/kiwano.h b/src/kiwano/kiwano.h index 111fbecd..9af44c4c 100644 --- a/src/kiwano/kiwano.h +++ b/src/kiwano/kiwano.h @@ -49,7 +49,6 @@ #include #include - // // event // @@ -58,7 +57,9 @@ #include #include #include -#include +#include +#include +#include #include // diff --git a/src/kiwano/platform/Keys.h b/src/kiwano/platform/Keys.h index 76d13785..635090f8 100644 --- a/src/kiwano/platform/Keys.h +++ b/src/kiwano/platform/Keys.h @@ -118,4 +118,30 @@ enum class KeyCode Last }; + +inline KeyCode operator+(KeyCode lhs, int rhs) noexcept +{ + return KeyCode(int(lhs) + rhs); +} + +inline KeyCode operator-(KeyCode lhs, int rhs) noexcept +{ + return KeyCode(int(lhs) - rhs); +} + +inline KeyCode operator+(int lhs, KeyCode rhs) noexcept +{ + return KeyCode(lhs + int(rhs)); +} + +inline KeyCode operator-(int lhs, KeyCode rhs) noexcept +{ + return KeyCode(lhs - int(rhs)); +} + +inline int operator-(KeyCode lhs, KeyCode rhs) noexcept +{ + return int(lhs) - int(rhs); +} + } // namespace kiwano diff --git a/src/kiwano/render/DirectX/RendererImpl.cpp b/src/kiwano/render/DirectX/RendererImpl.cpp index d8040307..8683a4c1 100644 --- a/src/kiwano/render/DirectX/RendererImpl.cpp +++ b/src/kiwano/render/DirectX/RendererImpl.cpp @@ -161,9 +161,9 @@ void RendererImpl::HandleEvent(EventModuleContext& ctx) { Renderer::HandleEvent(ctx); - if (ctx.evt->IsType()) + auto evt = ctx.evt->Cast(); + if (evt) { - auto evt = ctx.evt->SafeCast(); HMONITOR monitor = ::MonitorFromWindow(evt->window->GetHandle(), MONITOR_DEFAULTTONULL); if (monitor_ != monitor) { diff --git a/src/kiwano/render/Renderer.cpp b/src/kiwano/render/Renderer.cpp index d1610a7e..07713af7 100644 --- a/src/kiwano/render/Renderer.cpp +++ b/src/kiwano/render/Renderer.cpp @@ -57,9 +57,9 @@ void Renderer::HandleEvent(EventModuleContext& ctx) { if (auto_reset_resolution_) { - if (ctx.evt->IsType()) + auto evt = ctx.evt->Cast(); + if (evt) { - auto evt = ctx.evt->SafeCast(); Resize(evt->width, evt->height); } } diff --git a/src/kiwano/utils/ConfigIni.cpp b/src/kiwano/utils/ConfigIni.cpp index da728718..118cca95 100644 --- a/src/kiwano/utils/ConfigIni.cpp +++ b/src/kiwano/utils/ConfigIni.cpp @@ -281,7 +281,7 @@ bool ConfigIni::HasKey(const String& section, const String& key) const { if (HasSection(section)) { - return !!sections_.at(section).count(section); + return !!sections_.at(section).count(key); } return false; } diff --git a/src/kiwano/utils/EventTicker.h b/src/kiwano/utils/EventTicker.h index c71b49d3..a5a11e5f 100644 --- a/src/kiwano/utils/EventTicker.h +++ b/src/kiwano/utils/EventTicker.h @@ -30,7 +30,7 @@ KGE_DECLARE_SMART_PTR(TickEvent); KGE_DECLARE_SMART_PTR(EventTicker); /** - * \addtogroup Events + * \addtogroup Event * @{ */