From b6f37bef8787323ea73e60c5bd55a69c3afa8635 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Mon, 24 Jan 2022 18:56:05 +0800 Subject: [PATCH] added files of io/event --- inc/hgl/io/event/InputEvent.h | 104 +++++++++++ inc/hgl/io/event/InputEventSource.h | 24 +++ inc/hgl/io/event/JoystickEvent.h | 61 ++++++ inc/hgl/io/event/KeyboardEvent.h | 277 ++++++++++++++++++++++++++++ inc/hgl/io/event/MouseEvent.h | 99 ++++++++++ inc/hgl/io/event/WindowEvent.h | 64 +++++++ src/CMakeLists.txt | 10 +- 7 files changed, 638 insertions(+), 1 deletion(-) create mode 100644 inc/hgl/io/event/InputEvent.h create mode 100644 inc/hgl/io/event/InputEventSource.h create mode 100644 inc/hgl/io/event/JoystickEvent.h create mode 100644 inc/hgl/io/event/KeyboardEvent.h create mode 100644 inc/hgl/io/event/MouseEvent.h create mode 100644 inc/hgl/io/event/WindowEvent.h diff --git a/inc/hgl/io/event/InputEvent.h b/inc/hgl/io/event/InputEvent.h new file mode 100644 index 0000000..378667d --- /dev/null +++ b/inc/hgl/io/event/InputEvent.h @@ -0,0 +1,104 @@ +#ifndef HGL_IO_INPUT_EVENT_INCLUDE +#define HGL_IO_INPUT_EVENT_INCLUDE + +#include +#include +namespace hgl +{ + namespace io + { + struct EventHeader + { + uint8 type; ///<输入源类型 + uint8 index; ///<输入源索引(比如同一设备有多个) + uint16 id; ///<事件id + }; + + constexpr size_t EventHeaderBytes=sizeof(EventHeader); + + /** + * 事件处理结果 + */ + enum class EventProcResult + { + Continue, + Break, + }; + + class InputEvent + { + protected: + + InputEventSource source_type; + + Sets sub_event_proc[size_t(InputEventSource::RANGE_SIZE)]; + + public: + + const InputEventSource GetInputEventSource()const{return source_type;} + + virtual EventProcResult OnEvent(const EventHeader &header,const uint64 data) + { + if(!RangeCheck((InputEventSource)header.type)) + return(EventProcResult::Break); + + if(sub_event_proc[header.type].GetCount()>0) + { + for(InputEvent *ie:sub_event_proc[header.type]) + if(ie->OnEvent(header,data)==EventProcResult::Break) + return EventProcResult::Break; + + if(sub_event_proc[size_t(InputEventSource::Root)].GetCount()>0 + &&InputEventSource(header.type)!=InputEventSource::Root) + { + for(InputEvent *ie:sub_event_proc[size_t(InputEventSource::Root)]) + if(ie->OnEvent(header,data)==EventProcResult::Break) + return EventProcResult::Break; + } + } + + return(EventProcResult::Continue); + } + + public: + + InputEvent() + { + source_type=InputEventSource::Root; + } + + InputEvent(InputEventSource ies) + { + source_type=ies; + } + + virtual ~InputEvent()=default; + + virtual bool Join(InputEvent *ie) + { + if(!ie) + return(false); + + const InputEventSource ies=ie->GetInputEventSource(); + + if(!RangeCheck(ies)) + return(false); + + return(sub_event_proc[size_t(ies)].Add(ie)!=-1); + } + + bool Unjoin(InputEvent *ie) + { + if(!ie)return(false); + + const InputEventSource ies=ie->GetInputEventSource(); + + if(!RangeCheck(ies)) + return(false); + + return sub_event_proc[size_t(ies)].Delete(ie); + } + };//class InputEvent + }//namespace io +}//namespace hgl +#endif//HGL_IO_INPUT_EVENT_INCLUDE \ No newline at end of file diff --git a/inc/hgl/io/event/InputEventSource.h b/inc/hgl/io/event/InputEventSource.h new file mode 100644 index 0000000..62480fe --- /dev/null +++ b/inc/hgl/io/event/InputEventSource.h @@ -0,0 +1,24 @@ +#ifndef HGL_IO_INPUT_DEVICE_SOURCE_INCLUDE +#define HGL_IO_INPUT_DEVICE_SOURCE_INCLUDE + +#include +namespace hgl +{ + namespace io + { + enum class InputEventSource + { + Root=0, + + OS, + Window, + + Keyboard, + Mouse, + Joystick, + + ENUM_CLASS_RANGE(Root,Joystick) + }; + }//namespace io +}//namespace hgl +#endif//HGL_IO_INPUT_DEVICE_SOURCE_INCLUDE \ No newline at end of file diff --git a/inc/hgl/io/event/JoystickEvent.h b/inc/hgl/io/event/JoystickEvent.h new file mode 100644 index 0000000..2181a6b --- /dev/null +++ b/inc/hgl/io/event/JoystickEvent.h @@ -0,0 +1,61 @@ +#ifndef HGL_IO_DEVICE_MOUSE_EVENT_INCLUDE +#define HGL_IO_DEVICE_MOUSE_EVENT_INCLUDE + +#include +namespace hgl +{ + namespace io + { + /** + * 手柄按键枚举 + */ + enum class JoystickButton + { + NONE=0, + + Up, + Down, + Left, + Right, + + _0, _1, _2, _3, _4, _5, _6, _7, + _8, _9, _10, _11, _12, _13, _14, _15, + _16, _17, _18, _19, _20, _21, _22, _23, + _24, _25, _26, _27, _28, _29, _30, _31, + + ENUM_CLASS_RANGE(NONE,_31) + }; + + enum class PlayStationButton + { + Up =JoystickButton::Up, + Down =JoystickButton::Down, + Left =JoystickButton::Left, + Right =JoystickButton::Right, + + Fork =JoystickButton::_0, // 叉 + Circle =JoystickButton::_1, // 圆 + Square =JoystickButton::_2, // 方 + Triangle =JoystickButton::_3, // 三角 + + L1 =JoystickButton::_6, L2 =JoystickButton::_4, + R1 =JoystickButton::_7, R2 =JoystickButton::_5, + Select =JoystickButton::_8, Start =JoystickButton::_9, + }; + + //enum class XBoxButton + //{ + // //DreamCast/XBOX + // X=JoystickButton::_2, + // Y=JoystickButton::_3, + // A=JoystickButton::_0, + // B=JoystickButton::_1, + // L=JoystickButton::_4, + // R=JoystickButton::_5, + + // //XBOX/XBOX360 + // //XBOX, //西瓜键 + //}; + }//namespace io +}//namespace hgl +#endif//HGL_IO_DEVICE_MOUSE_EVENT_INCLUDE diff --git a/inc/hgl/io/event/KeyboardEvent.h b/inc/hgl/io/event/KeyboardEvent.h new file mode 100644 index 0000000..fb0f8e8 --- /dev/null +++ b/inc/hgl/io/event/KeyboardEvent.h @@ -0,0 +1,277 @@ +#ifndef HGL_IO_KEYBOARD_EVENT_INCLUDE +#define HGL_IO_KEYBOARD_EVENT_INCLUDE + +#include +namespace hgl +{ + namespace io + { + /** + * 按键枚举定义 + */ + enum class KeyboardButton + { + NONE=0, + //主键盘区 + Esc, ///key)))return EventProcResult::Break;break; + case KeyboardEventID::Released: if(OnReleased (KeyboardButton(((KeyboardEventData *)&data)->key)))return EventProcResult::Break;break; + case KeyboardEventID::Char: if(OnChar ( ((KeyboardEventData *)&data)->ch ) )return EventProcResult::Break;break; + } + + return EventProcResult::Continue; + } + + virtual bool OnPressed(const KeyboardButton &kb){} + virtual bool OnReleased(const KeyboardButton &kb){} + virtual bool OnChar(const wchar_t &){} + };//class KeyboardEvent + + class KeyboardStateEvent:public KeyboardEvent + { + protected: + + double cur_time; + bool press_states[size_t(KeyboardButton::RANGE_SIZE)]; + double pressed_time[size_t(KeyboardButton::RANGE_SIZE)]; + + public: + + KeyboardStateEvent():KeyboardEvent() + { + cur_time=0; + hgl_zero(press_states); + hgl_zero(pressed_time); + } + + virtual ~KeyboardStateEvent()=default; + + virtual bool OnPressed(const KeyboardButton &kb) override + { + if(!RangeCheck(kb))return(false); + + press_states[(size_t)kb]=true; + pressed_time[(size_t)kb]=cur_time; + + return(true); + } + + virtual bool OnReleased(const KeyboardButton &kb) override + { + if(!RangeCheck(kb))return(false); + + press_states[(size_t)kb]=false; + pressed_time[(size_t)kb]=0; + + return(true); + } + + public: + + /** + * 某按键是否按下状态 + */ + const bool HasPressed(const KeyboardButton &kb)const + { + if(!RangeCheck(kb))return(false); + + return press_states[size_t(kb)]; + } + + /** + * 设定当前时间 + */ + void SetCurTime(const double &ct) + { + cur_time=ct; + } + + /** + * 获取按键按下的时间 + */ + const double GetPressedTime(const KeyboardButton &kb)const + { + if(!RangeCheck(kb))return(0); + + return pressed_time[size_t(kb)]; + } + + const bool ShiftPressed()const + { + return press_states[size_t(KeyboardButton::LeftShift)] + ||press_states[size_t(KeyboardButton::RightShift)]; + } + + const bool CtrlPressed()const + { + return press_states[size_t(KeyboardButton::LeftCtrl)] + ||press_states[size_t(KeyboardButton::RightCtrl)]; + } + + const bool AltPressed()const + { + return press_states[size_t(KeyboardButton::LeftAlt)] + ||press_states[size_t(KeyboardButton::RightAlt)]; + } + };//class KeyboardStateEvent + }//namespace io +}//namespace hgl +#endif//HGL_IO_KEYBOARD_EVENT_INCLUDE diff --git a/inc/hgl/io/event/MouseEvent.h b/inc/hgl/io/event/MouseEvent.h new file mode 100644 index 0000000..469f086 --- /dev/null +++ b/inc/hgl/io/event/MouseEvent.h @@ -0,0 +1,99 @@ +#ifndef HGL_IO_MOUSE_EVENT_INCLUDE +#define HGL_IO_MOUSE_EVENT_INCLUDE + +#include +namespace hgl +{ + namespace io + { + /** + * 鼠标按钮枚举 + */ + enum class MouseButton + { + None=0, + + Left, + Mid, + Right, + + X1,X2, + + ENUM_CLASS_RANGE(Left,X2) + }; + + enum class MouseEventID + { + Move =0, + Pressed, + Released, + DblClicked, + Wheel + }; + + union MouseEventData + { + uint64 data; + + struct + { + int16 x,y; + uint8 button; + }; + }; + + constexpr size_t MouseEventDataBytes=sizeof(MouseEventData); + + class MouseEvent:public InputEvent + { + MouseEventData *med; + + int x,y; + + public: + + MouseEvent():InputEvent(InputEventSource::Mouse){} + virtual ~MouseEvent()=default; + + EventProcResult OnEvent(const EventHeader &header,const uint64 data) override + { + if(InputEvent::OnEvent(header,data)==EventProcResult::Break) + return EventProcResult::Break; + + med=(MouseEventData *)&data; + + if(MouseEventID(header.id)==MouseEventID::Wheel) + { + if(OnWheel (med->x,med->y) )return EventProcResult::Break; + } + else + { + x=med->x;y=med->y; + + switch(MouseEventID(header.id)) + { + case MouseEventID::Move: if(OnMove (med->x,med->y) )return EventProcResult::Break;break; + case MouseEventID::Pressed: if(OnPressed (med->x,med->y,MouseButton(med->button)))return EventProcResult::Break;break; + case MouseEventID::Released: if(OnReleased (med->x,med->y,MouseButton(med->button)))return EventProcResult::Break;break; + case MouseEventID::DblClicked: if(OnDblClicked (med->x,med->y,MouseButton(med->button)))return EventProcResult::Break;break; + } + } + + return EventProcResult::Continue; + } + + virtual bool OnMove (int,int){return false;} + virtual bool OnWheel (int,int){return false;} + + virtual bool OnPressed (int,int,MouseButton){return false;} + virtual bool OnReleased (int,int,MouseButton){return false;} + virtual bool OnDblClicked(int,int,MouseButton){return false;} + + public: + + const int GetX()const{return x;} + const int GetY()const{return y;} + };//class MouseEvent + }//namespace io +}//namespace hgl +#endif//HGL_IO_MOUSE_EVENT_INCLUDE diff --git a/inc/hgl/io/event/WindowEvent.h b/inc/hgl/io/event/WindowEvent.h new file mode 100644 index 0000000..05a2107 --- /dev/null +++ b/inc/hgl/io/event/WindowEvent.h @@ -0,0 +1,64 @@ +#ifndef HGL_IO_WINDOW_EVENT_INCLUDE +#define HGL_IO_WINDOW_EVENT_INCLUDE + +#include +namespace hgl +{ + namespace io + { + enum class WindowEventID + { + Active, + Resize, + Close + };//enum class WindowEventID + + union WindowEventData + { + uint64 data; + + struct + { + int16 width,height; + }; + + bool active; + }; + + constexpr size_t WindowEventDataBytes=sizeof(WindowEventData); + + class WindowEvent:public InputEvent + { + WindowEventData *wed; + + public: + + WindowEvent():InputEvent(InputEventSource::Window){} + virtual ~WindowEvent()=default; + + EventProcResult OnEvent(const EventHeader &header,const uint64 data) override + { + wed=(WindowEventData *)&data; + + switch(WindowEventID(header.id)) + { + case WindowEventID::Active:OnActive (wed->active) ;break; + case WindowEventID::Resize:OnResize (wed->width,wed->height);break; + case WindowEventID::Close: OnClose () ;break; + } + + if(InputEvent::OnEvent(header,data)==EventProcResult::Break) + return EventProcResult::Break; + + return EventProcResult::Continue; + } + + public: + + virtual void OnResize(uint,uint){} + virtual void OnActive(bool){} + virtual void OnClose (){} + };//class WindowEvent:public InputEvent + }//namespace io +}//namespace hgl +#endif//HGL_IO_WINDOW_EVENT_INCLUDE \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a953290..cb4a37e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -119,6 +119,13 @@ SET(IO_JAVA_FILES ${IO_INCLUDE_PATH}/JavaInputStream.h SET(IO_TEXT_FILES IO/TextOutputStream.cpp) +SET(INPUT_EVENT_FILES ${IO_INCLUDE_PATH}/event/KeyboardEvent.h + ${IO_INCLUDE_PATH}/event/MouseEvent.h + ${IO_INCLUDE_PATH}/event/JoystickEvent.h + ${IO_INCLUDE_PATH}/event/InputEvent.h) + +SOURCE_GROUP("IO\\Event" FILES ${INPUT_EVENT_FILES}) + SOURCE_GROUP("IO\\Base" FILES ${IO_BASE_FILES}) SOURCE_GROUP("IO\\Data" FILES ${IO_DATA_FILES}) SOURCE_GROUP("IO\\Memory" FILES ${IO_MEMORY_FILES}) @@ -131,7 +138,8 @@ SET(IO_SOURCE_FILES ${IO_BASE_FILES} ${IO_MEMORY_FILES} ${IO_FILE_FILES} ${IO_JAVA_FILES} - ${IO_TEXT_FILES}) + ${IO_TEXT_FILES} + ${INPUT_EVENT_FILES}) SET(FILESYSTEM_INCLUDE_PATH ${CMCORE_ROOT_INCLUDE_PATH}/hgl/filesystem)