Browse Source

input: use scancodes instead of ASCII values when using SDL v2.

undefined
Sam Hocevar 10 years ago
parent
commit
0cc1dd69ba
7 changed files with 391 additions and 36 deletions
  1. +1
    -1
      src/Makefile.am
  2. +10
    -1
      src/input/input.cpp
  3. +86
    -24
      src/input/input.h
  4. +287
    -0
      src/input/scancodes.h
  5. +1
    -0
      src/lolcore.vcxproj
  6. +3
    -0
      src/lolcore.vcxproj.filters
  7. +3
    -10
      src/platform/sdl/sdlinput.cpp

+ 1
- 1
src/Makefile.am View File

@@ -93,7 +93,7 @@ liblolcore_sources = \
gpu/rendercontext.cpp \ gpu/rendercontext.cpp \
\ \
input/input.cpp input/input.h input/input_internal.h input/keys.h \ input/input.cpp input/input.h input/input_internal.h input/keys.h \
input/controller.cpp input/controller.h \
input/scancodes.h input/controller.cpp input/controller.h \
\ \
gpu/defaultmaterial.lolfx \ gpu/defaultmaterial.lolfx \
gpu/tile.lolfx gpu/palette.lolfx gpu/line.lolfx \ gpu/tile.lolfx gpu/palette.lolfx gpu/line.lolfx \


+ 10
- 1
src/input/input.cpp View File

@@ -49,11 +49,20 @@ void InputDeviceInternal::AddCursor(const char* name)
InputDeviceInternal* InputDeviceInternal::CreateStandardKeyboard() InputDeviceInternal* InputDeviceInternal::CreateStandardKeyboard()
{ {
InputDeviceInternal* keyboard = new InputDeviceInternal(g_name_keyboard.C()); InputDeviceInternal* keyboard = new InputDeviceInternal(g_name_keyboard.C());
/* "value" is unused, what matters is the index. */

#if USE_OLD_SDL
/* TODO: deprecate this */
# define KEY_FUNC(key, value) \ # define KEY_FUNC(key, value) \
keyboard->AddKey(#key); keyboard->AddKey(#key);
# include "input/keys.h" # include "input/keys.h"
# undef KEY_FUNC # undef KEY_FUNC
#else
/* "value" is unused, what matters is the index. */
# define _SC(value, str, name) \
keyboard->AddKey(#name);
# include "input/scancodes.h"
#endif

return keyboard; return keyboard;
} }




+ 86
- 24
src/input/input.h View File

@@ -20,43 +20,103 @@ class InputDevice
{ {
public: public:
/** Gets the name of this input device */ /** Gets the name of this input device */
const String& GetName() const { return m_name; }
const String& GetName() const
{
return m_name;
}


/** Gets the index of the corresponding key, needed to call GetKey */ /** Gets the index of the corresponding key, needed to call GetKey */
ptrdiff_t GetKeyIndex(const char* name) const { return GetItemIndex(name, m_keynames); }
ptrdiff_t GetKeyIndex(const char* name) const
{
return GetItemIndex(name, m_keynames);
}

/** Gets the index of the corresponding axis, needed to call GetAxis */ /** Gets the index of the corresponding axis, needed to call GetAxis */
ptrdiff_t GetAxisIndex(const char* name) const { return GetItemIndex(name, m_axisnames); }
ptrdiff_t GetAxisIndex(const char* name) const
{
return GetItemIndex(name, m_axisnames);
}

/** Gets the index of the corresponding cursor, needed to call GetCursor */ /** Gets the index of the corresponding cursor, needed to call GetCursor */
ptrdiff_t GetCursorIndex(const char* name) const { return GetItemIndex(name, m_cursornames); }
ptrdiff_t GetCursorIndex(const char* name) const
{
return GetItemIndex(name, m_cursornames);
}


/** Gets the current state of the given key, true being pressed and false being released */
bool GetKey(ptrdiff_t index) const { return m_keys[index]; }
/** Gets the current value of the given axis. Devices should cap this value between -1 and 1 as much as possible, through it is not guaranteed */
float GetAxis(ptrdiff_t index) const { return m_axis[index].m1 * m_axis[index].m2; }
/** Gets the current value of the given cursor, 0,0 being the bottom-left corner and 1,1 being the top-right corner */
vec2 GetCursor(ptrdiff_t index) const { return m_cursors[index].m1; }
/** Gets the coordinate of the pixel the cursor is currently over, 0,0 being the bottom-left corner. */
ivec2 GetCursorPixel(ptrdiff_t index) const { return m_cursors[index].m2; }
/** Gets the current state of the given key, true being pressed and
* false being released */
bool GetKey(ptrdiff_t index) const
{
return m_keys[index];
}

/** Gets the current value of the given axis. Devices should try to
* clamp this value between -1 and 1, though it is not guaranteed. */
float GetAxis(ptrdiff_t index) const
{
return m_axis[index].m1 * m_axis[index].m2;
}


/** Gets the current value of the given cursor, 0,0 being the bottom-left
* corner and 1,1 being the top-right corner */
vec2 GetCursor(ptrdiff_t index) const
{
return m_cursors[index].m1;
}


/** Sets a per-device-axis sensitivity factor. The value returned by the operating system will be multiplied by this value before being returned by GetAxis */
void SetAxisSensitivity(ptrdiff_t index, float sensitivity) { m_axis[index].m2 = sensitivity; }
/** Gets the per-device-axis sensitivity factor. The value returned by the operating system will be multiplied by this value before being returned by GetAxis */
float GetAxisSensitivity(ptrdiff_t index) const { return m_axis[index].m2; }
/** Gets the coordinate of the pixel the cursor is currently over,
* 0,0 being the bottom-left corner. */
ivec2 GetCursorPixel(ptrdiff_t index) const
{
return m_cursors[index].m2;
}

/** Sets a per-device-axis sensitivity factor. The value returned by
* the operating system will be multiplied by this value before being
* returned by GetAxis */
void SetAxisSensitivity(ptrdiff_t index, float sensitivity)
{
m_axis[index].m2 = sensitivity;
}

/** Gets the per-device-axis sensitivity factor. The value returned by
* the operating system will be multiplied by this value before being
* returned by GetAxis */
float GetAxisSensitivity(ptrdiff_t index) const
{
return m_axis[index].m2;
}


/** Gets a list of the name of all available keys in this device */ /** Gets a list of the name of all available keys in this device */
const array<String>& GetAllKeys() const { return m_keynames; }
const array<String>& GetAllKeys() const
{
return m_keynames;
}
/** Gets a list of the name of all available axis in this device */ /** Gets a list of the name of all available axis in this device */
const array<String>& GetAllAxis() const { return m_axisnames; }
const array<String>& GetAllAxis() const
{
return m_axisnames;
}
/** Gets a list of the name of all available cursors in this device */ /** Gets a list of the name of all available cursors in this device */
const array<String>& GetAllCursors() const { return m_cursornames; }
const array<String>& GetAllCursors() const
{
return m_cursornames;
}


/** Gets a list of the name of all available input devices */ /** Gets a list of the name of all available input devices */
static array<String> GetAvailableDevices(); static array<String> GetAvailableDevices();

/** Gets an input device by its name */ /** Gets an input device by its name */
static InputDevice* Get(const char* name) { return GetDevice(name); }
static InputDevice* Get(const char* name)
{
return GetDevice(name);
}

/** Sets whether the mouse cursor should be captured. */ /** Sets whether the mouse cursor should be captured. */
static void CaptureMouse(bool activated) { m_capturemouse = activated; }
static void CaptureMouse(bool activated)
{
m_capturemouse = activated;
}


protected: protected:
// TODO: hide all of this in a InputDeviceData? // TODO: hide all of this in a InputDeviceData?
@@ -69,8 +129,10 @@ protected:


/** key states (pressed/released) */ /** key states (pressed/released) */
array<bool> m_keys; array<bool> m_keys;

/** axis states (value and sensitivity) */ /** axis states (value and sensitivity) */
array<float, float> m_axis; array<float, float> m_axis;

/** cursor position */ /** cursor position */
array<vec2, ivec2> m_cursors; array<vec2, ivec2> m_cursors;


@@ -97,11 +159,11 @@ private:
static array<InputDevice*> devices; static array<InputDevice*> devices;


template <typename... T> template <typename... T>
ptrdiff_t GetItemIndex(const char* name, const array<String, T...>& array) const
ptrdiff_t GetItemIndex(const char* name, const array<String, T...>& a) const
{ {
for (ptrdiff_t i = 0; i < array.Count(); ++i)
for (ptrdiff_t i = 0; i < a.Count(); ++i)
{ {
if (array[i] == name)
if (a[i] == name)
return i; return i;
} }
return -1; return -1;


+ 287
- 0
src/input/scancodes.h View File

@@ -0,0 +1,287 @@
//
// Lol Engine
//
// Copyright: (c) 2010-2013 Benjamin Litzelmann
// (c) 2010-2014 Sam Hocevar <sam@hocevar.net>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the Do What The Fuck You Want To
// Public License) Version 2) as published by Sam Hocevar. See
// http://www.wtfpl.net/ for more details.
//

/* A list of typical keyboard scancodes, along with a user-friendly
* name and, if possible, a string representation. */

#if !defined _SC
# error scancode.h included without the _SC macro
#endif

_SC(0, "", Unknown)

/* Usage page 0x07 */

_SC(4, "A", A)
_SC(5, "B", B)
_SC(6, "C", C)
_SC(7, "D", D)
_SC(8, "E", E)
_SC(9, "F", F)
_SC(10, "G", G)
_SC(11, "H", H)
_SC(12, "I", I)
_SC(13, "J", J)
_SC(14, "K", K)
_SC(15, "L", L)
_SC(16, "M", M)
_SC(17, "N", N)
_SC(18, "O", O)
_SC(19, "P", P)
_SC(20, "Q", Q)
_SC(21, "R", R)
_SC(22, "S", S)
_SC(23, "T", T)
_SC(24, "U", U)
_SC(25, "V", V)
_SC(26, "W", W)
_SC(27, "X", X)
_SC(28, "Y", Y)
_SC(29, "Z", Z)

_SC(30, "1", 1)
_SC(31, "2", 2)
_SC(32, "3", 3)
_SC(33, "4", 4)
_SC(34, "5", 5)
_SC(35, "6", 6)
_SC(36, "7", 7)
_SC(37, "8", 8)
_SC(38, "9", 9)
_SC(39, "0", 0)

_SC(40, "", Return)
_SC(41, "", Escape)
_SC(42, "", Backspace)
_SC(43, "\t", Tab)
_SC(44, " ", Space)

_SC(45, "-", Minus)
_SC(46, "=", Equals)
_SC(47, "<", LeftBracket)
_SC(48, ">", RightBracket)
_SC(49, "\\", Backslash)

_SC(50, "", NonUSHash)
_SC(51, ";", Semicolon)
_SC(52, "\'", Apostrophe)
_SC(53, "`", Grave)
_SC(54, ",", Comma)
_SC(55, ".", Period)
_SC(56, "/", Slash)

_SC(57, "", CapsLock)

_SC(58, "", F1)
_SC(59, "", F2)
_SC(60, "", F3)
_SC(61, "", F4)
_SC(62, "", F5)
_SC(63, "", F6)
_SC(64, "", F7)
_SC(65, "", F8)
_SC(66, "", F9)
_SC(67, "", F10)
_SC(68, "", F11)
_SC(69, "", F12)

_SC(70, "", PrintScreen)
_SC(71, "", ScrollLock)
_SC(72, "", Pause)
_SC(73, "", Insert)
_SC(74, "", Home)
_SC(75, "", PageUp)
_SC(76, "", Delete)
_SC(77, "", End)
_SC(78, "", PageDown)
_SC(79, "", Right)
_SC(80, "", Left)
_SC(81, "", Down)
_SC(82, "", Up)

_SC(83, "", NumLockClear)
_SC(84, "/", KP_Divide)
_SC(85, "*", KP_Multiply)
_SC(86, "-", KP_Minus)
_SC(87, "+", KP_Plus)
_SC(88, "", KP_Enter)
_SC(89, "1", KP_1)
_SC(90, "2", KP_2)
_SC(91, "3", KP_3)
_SC(92, "4", KP_4)
_SC(93, "5", KP_5)
_SC(94, "6", KP_6)
_SC(95, "7", KP_7)
_SC(96, "8", KP_8)
_SC(97, "9", KP_9)
_SC(98, "0", KP_0)
_SC(99, ".", KP_Period)

_SC(100, "", NonUSBackslash)
_SC(101, "", Application)
_SC(102, "^", Power)
_SC(103, "=", KP_Equals)
_SC(104, "", F13)
_SC(105, "", F14)
_SC(106, "", F15)
_SC(107, "", F16)
_SC(108, "", F17)
_SC(109, "", F18)
_SC(110, "", F19)
_SC(111, "", F20)
_SC(112, "", F21)
_SC(113, "", F22)
_SC(114, "", F23)
_SC(115, "", F24)
_SC(116, "", Execute)
_SC(117, "", Help)
_SC(118, "", Menu)
_SC(119, "", Select)
_SC(120, "", Stop)
_SC(121, "", Again)
_SC(122, "", Undo)
_SC(123, "", Cut)
_SC(124, "", Copy)
_SC(125, "", Paste)
_SC(126, "", Find)
_SC(127, "", Mute)
_SC(128, "", VolumeUp)
_SC(129, "", VolumeDOwn)
_SC(133, "", KP_Comma)
_SC(134, "", KP_EqualsAS400)

_SC(135, "", International1)
_SC(136, "", International2)
_SC(137, "", International3)
_SC(138, "", International4)
_SC(139, "", International5)
_SC(140, "", International6)
_SC(141, "", International7)
_SC(142, "", International8)
_SC(143, "", International9)
_SC(144, "", Lang1)
_SC(145, "", Lang2)
_SC(146, "", Lang3)
_SC(147, "", Lang4)
_SC(148, "", Lang5)
_SC(149, "", Lang6)
_SC(150, "", Lang7)
_SC(151, "", Lang8)
_SC(152, "", Lang9)

_SC(153, "", AltErase)
_SC(154, "", SysReq)
_SC(155, "", Cancel)
_SC(156, "", Clear)
_SC(157, "", Prior)
_SC(158, "", Return2)
_SC(159, "", Separator)
_SC(160, "", Out)
_SC(161, "", Oper)
_SC(162, "", ClearAgain)
_SC(163, "", CrSel)
_SC(164, "", ExSel)

_SC(176, "", KP_00)
_SC(177, "", KP_000)
_SC(178, "", ThousandsSeparator)
_SC(179, "", DecimalSeparator)
_SC(180, "", CurrencyUnit)
_SC(181, "", CurrencySubunit)
_SC(182, "(", KP_LeftParen)
_SC(183, ")", KP_RightParen)
_SC(184, "{", KP_LeftBrace)
_SC(185, "}", KP_RightBrace)
_SC(186, "\t", KP_Tab)
_SC(187, "", KP_Backspace)
_SC(188, "A", KP_A)
_SC(189, "B", KP_B)
_SC(190, "C", KP_C)
_SC(191, "D", KP_D)
_SC(192, "E", KP_E)
_SC(193, "F", KP_F)
_SC(194, "", KP_Xor)
_SC(195, "^", KP_Power)
_SC(196, "%", KP_Percent)
_SC(197, "<", KP_Less)
_SC(198, ">", KP_Greater)
_SC(199, "&", KP_Ampersand)
_SC(200, "&&", KP_DblAmpersand)
_SC(201, "|", KP_VerticalBar)
_SC(202, "||", KP_DblVerticalBar)
_SC(203, ":", KP_Colon)
_SC(204, "#", KP_Hash)
_SC(205, " ", KP_Space)
_SC(206, "@", KP_At)
_SC(207, "!", KP_Exclam)
_SC(208, "", KP_MemStore)
_SC(209, "", KP_MemRecall)
_SC(210, "", KP_MemClear)
_SC(211, "", KP_MemAdd)
_SC(212, "", KP_MemSubtract)
_SC(213, "", KP_MemMultiply)
_SC(214, "", KP_MemDivide)
_SC(215, "", KP_PlusMinus)
_SC(216, "", KP_Clear)
_SC(217, "", KP_ClearEntry)
_SC(218, "", KP_Binary)
_SC(219, "", KP_Octal)
_SC(220, "", KP_Decimal)
_SC(221, "", KP_Hexadecimal)

_SC(224, "", LCtrl)
_SC(225, "", LShift)
_SC(226, "", LAlt)
_SC(227, "", LGui)
_SC(228, "", RCtrl)
_SC(229, "", RShift)
_SC(230, "", RAlt)
_SC(231, "", RGui)

_SC(257, "", Mode)

/* Usage page 0x0c */

_SC(258, "", AudioNext)
_SC(259, "", AudioPrev)
_SC(260, "", AudioStop)
_SC(261, "", AudioPlay)
_SC(262, "", AudioMute)
_SC(263, "", MediaSelect)
_SC(264, "", WWW)
_SC(265, "", Mail)
_SC(266, "", Calculator)
_SC(267, "", Computer)
_SC(268, "", AC_Search)
_SC(269, "", AC_Home)
_SC(270, "", AC_Back)
_SC(271, "", AC_Forward)
_SC(272, "", AC_Stop)
_SC(273, "", AC_Refresh)
_SC(274, "", AC_Bookmarks)

/* Extra SDL scancodes */

_SC(275, "", BrightnessDown)
_SC(276, "", BrightnessUp)
_SC(277, "", DisplaySwitch)
_SC(278, "", KbdIllumToggle)
_SC(279, "", KbdIllumDown)
_SC(280, "", KbdIllumUp)
_SC(281, "", Eject)
_SC(282, "", Sleep)

_SC(283, "", App1)
_SC(284, "", App2)

#undef _SC


+ 1
- 0
src/lolcore.vcxproj View File

@@ -285,6 +285,7 @@
<ClInclude Include="input\input.h" /> <ClInclude Include="input\input.h" />
<ClInclude Include="input\input_internal.h" /> <ClInclude Include="input\input_internal.h" />
<ClInclude Include="input\keys.h" /> <ClInclude Include="input\keys.h" />
<ClInclude Include="input\scancodes.h" />
<ClInclude Include="light.h" /> <ClInclude Include="light.h" />
<ClInclude Include="loldebug.h" /> <ClInclude Include="loldebug.h" />
<ClInclude Include="lolgl.h" /> <ClInclude Include="lolgl.h" />


+ 3
- 0
src/lolcore.vcxproj.filters View File

@@ -738,6 +738,9 @@
<ClInclude Include="input\keys.h"> <ClInclude Include="input\keys.h">
<Filter>input</Filter> <Filter>input</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="input\scancodes.h">
<Filter>input</Filter>
</ClInclude>
<ClInclude Include="input\controller.h"> <ClInclude Include="input\controller.h">
<Filter>input</Filter> <Filter>input</Filter>
</ClInclude> </ClInclude>


+ 3
- 10
src/platform/sdl/sdlinput.cpp View File

@@ -281,21 +281,14 @@ void SdlInputData::Tick(float seconds)
m_prevmouse = mouse; m_prevmouse = mouse;


# if USE_SDL # if USE_SDL
/* FIXME: the keyboard state now has scancodes rather than
* ASCII representations of characters. */
Uint8 const *sdlstate = SDL_GetKeyboardState(nullptr); Uint8 const *sdlstate = SDL_GetKeyboardState(nullptr);

int keyindex = 0; int keyindex = 0;
# define KEY_FUNC(name, index) \
m_keyboard->SetKey(keyindex++, sdlstate[index] != 0);
/* FIXME: we ignore SDLK_WORLD_0, which means our list of
* keys and SDL's list of keys could be out of sync. */
# include "input/keys.h"
# undef KEY_FUNC
# define _SC(value, str, name) \
m_keyboard->SetKey(keyindex++, sdlstate[value] != 0);
# include "input/scancodes.h"


# elif USE_OLD_SDL # elif USE_OLD_SDL
Uint8 *sdlstate = SDL_GetKeyState(nullptr); Uint8 *sdlstate = SDL_GetKeyState(nullptr);

int keyindex = 0; int keyindex = 0;
# define KEY_FUNC(name, index) \ # define KEY_FUNC(name, index) \
m_keyboard->SetKey(keyindex++, sdlstate[index] != 0); m_keyboard->SetKey(keyindex++, sdlstate[index] != 0);


Loading…
Cancel
Save