Skip to content

Commit

Permalink
Support all keyboard keys supported by SDL2
Browse files Browse the repository at this point in the history
  • Loading branch information
Xottab-DUTY committed Jul 23, 2018
1 parent a792d1c commit c33a1af
Show file tree
Hide file tree
Showing 7 changed files with 459 additions and 248 deletions.
1 change: 0 additions & 1 deletion src/Common/PlatformWindows.inl
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#define IDIRECTPLAY2_OR_GREATER // ?
#define DIRECTINPUT_VERSION 0x0800 //

#ifndef _WIN32_WINNT
// Request Windows 7 functionality
Expand Down
2 changes: 1 addition & 1 deletion src/xrEngine/edit_actions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ void type_pair::on_key_press(line_edit_control* const control)

static _locale_t current_locale = _create_locale(LC_ALL, "");

if (pInput->get_key_name(m_dik, buff, sizeof(buff)))
if (pInput->get_dik_name(m_dik, buff, sizeof(buff)))
{
if (_isalpha_l(buff[0], current_locale) || buff[0] == char(-1)) // "я" = -1
{
Expand Down
39 changes: 29 additions & 10 deletions src/xrEngine/xr_input.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -187,27 +187,46 @@ void CInput::KeyUpdate()
cbStack.back()->IR_OnKeyboardHold(i);
}

bool CInput::get_key_name(int dik, LPSTR dest_str, int dest_sz)
pcstr KeyToMouseButtonName(const int dik)
{
switch (dik)
{
case MOUSE_1: return "Left mouse";
case MOUSE_2: return "Right mouse";
case MOUSE_3: return "Center mouse";
case MOUSE_4: return "Fourth mouse";
case MOUSE_5: return "Fifth mouse";
case MOUSE_6: return "Sixth mouse";
case MOUSE_7: return "Seventh mouse";
case MOUSE_8: return "Eighth mouse";
default: return "Unknown mouse";
}
}

bool CInput::get_dik_name(int dik, LPSTR dest_str, int dest_sz)
{
pcstr keyname;

if (dik < SDL_NUM_SCANCODES)
keyname = SDL_GetKeyName(SDL_GetKeyFromScancode((SDL_Scancode)dik));
else
keyname = KeyToMouseButtonName(dik);

if (0 == strlen(keyname))
{
const char* keyname = SDL_GetKeyName(SDL_GetKeyFromScancode((SDL_Scancode)dik));
if (0 == strlen(keyname))
if (dik == SDL_SCANCODE_UNKNOWN)
keyname = "Unknown";
else
{
Msg("! cant convert dik_name for dik[%d]", dik);
Msg("! Can't convert dik_name for dik[%d]", dik);
return false;
}
xr_strcpy(dest_str, dest_sz, keyname);
}
else
xr_sprintf(dest_str, dest_sz, "MOUSE%d", dik - SDL_NUM_SCANCODES);

xr_strcpy(dest_str, dest_sz, keyname);
return true;
}

#define MOUSE_1 (SDL_NUM_SCANCODES + SDL_BUTTON_LEFT)
#define MOUSE_8 (SDL_NUM_SCANCODES + 8)

bool CInput::iGetAsyncKeyState(int dik)
{
if (dik < COUNT_KB_BUTTONS)
Expand Down
36 changes: 34 additions & 2 deletions src/xrEngine/xr_input.h
Original file line number Diff line number Diff line change
@@ -1,9 +1,41 @@
#ifndef __XR_INPUT__
#define __XR_INPUT__

#define DIRECTINPUT_VERSION 0x0800
#include <SDL.h>

// SDL_NUM_SCANCODES - max vavue in SDL_SCANCODE_* enum
#define MOUSE_1 (SDL_NUM_SCANCODES + SDL_BUTTON_LEFT)
#define MOUSE_2 (SDL_NUM_SCANCODES + SDL_BUTTON_RIGHT)
#define MOUSE_3 (SDL_NUM_SCANCODES + SDL_BUTTON_MIDDLE)

#define MOUSE_4 (SDL_NUM_SCANCODES + SDL_BUTTON_X1)
#define MOUSE_5 (SDL_NUM_SCANCODES + SDL_BUTTON_X2)
#define MOUSE_6 (SDL_NUM_SCANCODES + 6)
#define MOUSE_7 (SDL_NUM_SCANCODES + 7)
#define MOUSE_8 (SDL_NUM_SCANCODES + 8)

constexpr int MouseButtonToKey[] = { MOUSE_1, MOUSE_3, MOUSE_2, MOUSE_4, MOUSE_5, MOUSE_6, MOUSE_7, MOUSE_8 };

inline int KeyToMouseButton(const int dik, const bool fromZero = true)
{
int i = 0;
if (!fromZero)
++i;

switch (dik)
{
case MOUSE_1: return 0 + i;
case MOUSE_2: return 1 + i;
case MOUSE_3: return 2 + i;
case MOUSE_4: return 3 + i;
case MOUSE_5: return 4 + i;
case MOUSE_6: return 5 + i;
case MOUSE_7: return 6 + i;
case MOUSE_8: return 7 + i;
default: return dik - SDL_NUM_SCANCODES + i;
}
}

class ENGINE_API IInputReceiver;

//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Expand Down Expand Up @@ -84,7 +116,7 @@ class ENGINE_API CInput
IC bool get_exclusive_mode();
void unacquire();
void acquire(const bool& exclusive);
bool get_key_name(int dik, LPSTR dest, int dest_sz);
bool get_dik_name(int dik, LPSTR dest, int dest_sz);

void feedback(u16 s1, u16 s2, float time);
};
Expand Down
32 changes: 16 additions & 16 deletions src/xrGame/key_binding_registrator_script.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -225,25 +225,25 @@ SCRIPT_EXPORT(KeyBindings, (),
value("DIK_NUMPADCOMMA", int(SDL_SCANCODE_KP_COMMA)),
value("DIK_NUMPADEQUALSAS400", int(SDL_SCANCODE_KP_EQUALSAS400)),

//value("DIK_", int(SDL_SCANCODE_INTERNATIONAL1)),
//value("DIK_", int(SDL_SCANCODE_INTERNATIONAL2)),
value("DIK_INTERNATIONAL1", int(SDL_SCANCODE_INTERNATIONAL1)), // Give a better name?
value("DIK_INTERNATIONAL2", int(SDL_SCANCODE_INTERNATIONAL2)), // Give a better name?
value("DIK_YEN", int(SDL_SCANCODE_INTERNATIONAL3)),
//value("DIK_", int(SDL_SCANCODE_INTERNATIONAL4)),
//value("DIK_", int(SDL_SCANCODE_INTERNATIONAL5)),
//value("DIK_", int(SDL_SCANCODE_INTERNATIONAL6)),
//value("DIK_", int(SDL_SCANCODE_INTERNATIONAL7)),
//value("DIK_", int(SDL_SCANCODE_INTERNATIONAL8)),
//value("DIK_", int(SDL_SCANCODE_INTERNATIONAL9)),

//value("DIK_", int(SDL_SCANCODE_LANG1)),
//value("DIK_", int(SDL_SCANCODE_LANG2)),
value("DIK_INTERNATIONAL4", int(SDL_SCANCODE_INTERNATIONAL4)), // Give a better name?
value("DIK_INTERNATIONAL5", int(SDL_SCANCODE_INTERNATIONAL5)), // Give a better name?
value("DIK_INTERNATIONAL6", int(SDL_SCANCODE_INTERNATIONAL6)), // Give a better name?
value("DIK_INTERNATIONAL7", int(SDL_SCANCODE_INTERNATIONAL7)), // Give a better name?
value("DIK_INTERNATIONAL8", int(SDL_SCANCODE_INTERNATIONAL8)), // Give a better name?
value("DIK_INTERNATIONAL9", int(SDL_SCANCODE_INTERNATIONAL9)), // Give a better name?

value("DIK_HANGUL", int(SDL_SCANCODE_LANG1)),
value("DIK_HANJA", int(SDL_SCANCODE_LANG2)),
value("DIK_KATAKANA", int(SDL_SCANCODE_LANG3)),
value("DIK_HIRAGANA", int(SDL_SCANCODE_LANG4)),
//value("DIK_", int(SDL_SCANCODE_LANG5)),
//value("DIK_", int(SDL_SCANCODE_LANG6)),
//value("DIK_", int(SDL_SCANCODE_LANG7)),
//value("DIK_", int(SDL_SCANCODE_LANG8)),
//value("DIK_", int(SDL_SCANCODE_LANG9)),
value("DIK_ZENHANKAKU", int(SDL_SCANCODE_LANG5)),
value("DIK_LANG6", int(SDL_SCANCODE_LANG6)), // Give a better name?
value("DIK_LANG7", int(SDL_SCANCODE_LANG7)), // Give a better name?
value("DIK_LANG8", int(SDL_SCANCODE_LANG8)), // Give a better name?
value("DIK_LANG9", int(SDL_SCANCODE_LANG9)), // Give a better name?

value("DIK_ALTERASE", int(SDL_SCANCODE_ALTERASE)),
value("DIK_CANCEL", int(SDL_SCANCODE_CANCEL)),
Expand Down
Loading

0 comments on commit c33a1af

Please sign in to comment.