ddnet/src/engine/client/input.h

148 lines
4.6 KiB
C
Raw Normal View History

2010-11-20 10:37:14 +00:00
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
/* If you are missing that file, acquire a complete release at teeworlds.com. */
2010-05-29 07:25:38 +00:00
#ifndef ENGINE_CLIENT_INPUT_H
#define ENGINE_CLIENT_INPUT_H
#include <SDL_events.h>
#include <SDL_joystick.h>
#include <engine/input.h>
#include <engine/keys.h>
2022-06-16 17:50:46 +00:00
class IEngineGraphics;
2010-05-29 07:25:38 +00:00
class CInput : public IEngineInput
{
2022-06-06 19:19:08 +00:00
public:
class CJoystick : public IJoystick
{
friend class CInput;
2022-06-06 19:19:08 +00:00
CInput *m_pInput;
int m_Index;
char m_aName[64];
char m_aGUID[34];
SDL_JoystickID m_InstanceID;
int m_NumAxes;
int m_NumButtons;
int m_NumBalls;
int m_NumHats;
SDL_Joystick *m_pDelegate;
CInput *Input() { return m_pInput; }
public:
CJoystick() {}
CJoystick(CInput *pInput, int Index, SDL_Joystick *pDelegate);
virtual ~CJoystick() = default;
int GetIndex() const override { return m_Index; }
const char *GetName() const override { return m_aName; }
const char *GetGUID() const { return m_aGUID; }
SDL_JoystickID GetInstanceID() const { return m_InstanceID; }
int GetNumAxes() const override { return m_NumAxes; }
int GetNumButtons() const override { return m_NumButtons; }
int GetNumBalls() const override { return m_NumBalls; }
int GetNumHats() const override { return m_NumHats; }
float GetAxisValue(int Axis) override;
void GetHatValue(int Hat, int (&HatKeys)[2]) override;
2022-06-06 19:19:08 +00:00
bool Relative(float *pX, float *pY) override;
bool Absolute(float *pX, float *pY) override;
static void GetJoystickHatKeys(int Hat, int HatValue, int (&HatKeys)[2]);
2022-06-06 19:19:08 +00:00
};
private:
2010-05-29 07:25:38 +00:00
IEngineGraphics *m_pGraphics;
2022-06-06 19:19:08 +00:00
IConsole *m_pConsole;
IEngineGraphics *Graphics() { return m_pGraphics; }
IConsole *Console() { return m_pConsole; }
// joystick
std::vector<CJoystick> m_vJoysticks;
CJoystick *m_pActiveJoystick = nullptr;
void InitJoysticks();
bool OpenJoystick(int JoystickIndex);
2022-06-06 19:19:08 +00:00
void CloseJoysticks();
void UpdateActiveJoystick();
static void ConchainJoystickGuidChanged(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
float GetJoystickDeadzone();
2010-05-29 07:25:38 +00:00
int m_InputGrabbed;
char *m_pClipboardText;
2010-05-29 07:25:38 +00:00
bool m_MouseFocus;
bool m_MouseDoubleClick;
2014-06-16 11:29:18 +00:00
int m_VideoRestartNeeded;
2016-04-30 02:02:32 +00:00
void AddEvent(char *pText, int Key, int Flags);
void Clear() override;
bool IsEventValid(CEvent *pEvent) const override { return pEvent->m_InputCount == m_InputCounter; }
// quick access to input
2020-09-22 16:02:03 +00:00
unsigned short m_aInputCount[g_MaxKeys]; // tw-KEY
unsigned char m_aInputState[g_MaxKeys]; // SDL_SCANCODE
int m_InputCounter;
2022-06-06 18:18:33 +00:00
void UpdateMouseState();
2022-06-06 19:19:08 +00:00
void UpdateJoystickState();
void HandleJoystickAxisMotionEvent(const SDL_JoyAxisEvent &Event);
void HandleJoystickButtonEvent(const SDL_JoyButtonEvent &Event);
void HandleJoystickHatMotionEvent(const SDL_JoyHatEvent &Event);
void HandleJoystickAddedEvent(const SDL_JoyDeviceEvent &Event);
void HandleJoystickRemovedEvent(const SDL_JoyDeviceEvent &Event);
2022-06-06 18:18:33 +00:00
char m_aDropFile[IO_MAX_PATH_LENGTH];
// IME support
int m_NumTextInputInstances;
char m_aEditingText[INPUT_TEXT_SIZE];
int m_EditingTextLen;
int m_EditingCursor;
bool KeyState(int Key) const;
2010-05-29 07:25:38 +00:00
public:
CInput();
void Init() override;
void Shutdown() override;
2010-05-29 07:25:38 +00:00
bool ModifierIsPressed() const override { return KeyState(KEY_LCTRL) || KeyState(KEY_RCTRL) || KeyState(KEY_LGUI) || KeyState(KEY_RGUI); }
bool ShiftIsPressed() const override { return KeyState(KEY_LSHIFT) || KeyState(KEY_RSHIFT); }
bool AltIsPressed() const override { return KeyState(KEY_LALT) || KeyState(KEY_RALT); }
bool KeyIsPressed(int Key) const override { return KeyState(Key); }
bool KeyPress(int Key, bool CheckCounter) const override { return CheckCounter ? (m_aInputCount[Key] == m_InputCounter) : m_aInputCount[Key]; }
2022-06-06 19:19:08 +00:00
size_t NumJoysticks() const override { return m_vJoysticks.size(); }
CJoystick *GetActiveJoystick() override { return m_pActiveJoystick; }
void SelectNextJoystick() override;
bool MouseRelative(float *pX, float *pY) override;
void MouseModeAbsolute() override;
void MouseModeRelative() override;
void NativeMousePos(int *pX, int *pY) const override;
bool NativeMousePressed(int Index) override;
bool MouseDoubleClick() override;
const char *GetClipboardText() override;
void SetClipboardText(const char *pText) override;
2010-05-29 07:25:38 +00:00
int Update() override;
2014-06-16 11:29:18 +00:00
int VideoRestartNeeded() override;
bool GetIMEState() override;
void SetIMEState(bool Activate) override;
int GetIMEEditingTextLength() const override { return m_EditingTextLen; }
const char *GetIMEEditingText() override;
int GetEditingCursor() override;
void SetEditingPosition(float X, float Y) override;
bool GetDropFile(char *aBuf, int Len) override;
2010-05-29 07:25:38 +00:00
};
#endif