- Correct MD5 for libndofdev.

- New dullahan with updated SDL2 keyboard
- Improve keyboard handling for SDL2 and make sure:
  - accelerators work again.
  - enter is properly forwarded as an input event.
  - mousewheel messages get handled.
master
Nicky 2019-03-19 05:23:33 +01:00
parent 7069de1337
commit 940cb4fcd5
6 changed files with 312 additions and 180 deletions

View File

@ -80,9 +80,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>3156400f22047d6e194884970842f571</string>
<string>b2d2a51bca4e3c3acc98eaab881a652e</string>
<key>url</key>
<string>http://downloads.phoenixviewer.com/dullahan_gcc5-1.1.1313_3.3626.1895.g7001d56-linux64-190760044.tar.bz2</string>
<string>http://downloads.phoenixviewer.com/dullahan_gcc5-1.1.1313_3.3626.1895.g7001d56-linux64-190772217.tar.bz2</string>
</map>
<key>name</key>
<string>linux64</string>
@ -866,9 +866,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>ccee21f79ca1628c38c55295cd2544e6</string>
<string>0f83072d15c7265b21d33b677a511efc</string>
<key>url</key>
<string>http://downloads.phoenixviewer.com/dullahan-1.1.1313_3.3626.1895.g7001d56-linux64-190760005.tar.bz2</string>
<string>http://downloads.phoenixviewer.com/dullahan-1.1.1313_3.3626.1895.g7001d56-linux64-190772141.tar.bz2</string>
</map>
<key>name</key>
<string>linux64</string>
@ -2922,7 +2922,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>archive</key>
<map>
<key>hash</key>
<string>63d804306cf94a338a8690050928cefb</string>
<string>a32657211755c612faa3b7c5fb061465</string>
<key>url</key>
<string>http://downloads.phoenixviewer.com/open_libndofdev-0.3.190761441-linux64-190761441.tar.bz2</string>
</map>

View File

@ -42,24 +42,23 @@ LLKeyboardSDL::LLKeyboardSDL()
// SDL maps the letter keys to the ASCII you'd expect, but it's lowercase...
// <FS:ND> Those are handled by SDL2 via text input, do not map them
// U16 cur_char;
// for (cur_char = 'A'; cur_char <= 'Z'; cur_char++)
// {
// mTranslateKeyMap[cur_char] = cur_char;
// }
// for (cur_char = 'a'; cur_char <= 'z'; cur_char++)
// {
// mTranslateKeyMap[cur_char] = (cur_char - 'a') + 'A';
// }
//
// for (cur_char = '0'; cur_char <= '9'; cur_char++)
// {
// mTranslateKeyMap[cur_char] = cur_char;
// }
// <FS:ND> Looks like we need to map those despite of SDL_TEXTINPUT handling most of this, but without
// the translation lower->upper here accelerators will not work.
// </FS:ND
U16 cur_char;
for (cur_char = 'A'; cur_char <= 'Z'; cur_char++)
{
mTranslateKeyMap[cur_char] = cur_char;
}
for (cur_char = 'a'; cur_char <= 'z'; cur_char++)
{
mTranslateKeyMap[cur_char] = (cur_char - 'a') + 'A';
}
for (cur_char = '0'; cur_char <= '9'; cur_char++)
{
mTranslateKeyMap[cur_char] = cur_char;
}
// These ones are translated manually upon keydown/keyup because
// SDL doesn't handle their numlock transition.
@ -325,131 +324,258 @@ U16 LLKeyboardSDL::inverseTranslateNumpadKey(const KEY translated_key)
return inverseTranslateKey(translated_key);
}
// <FS:ND> Compatibility shim for SDL2 > SDL1.
// The dullahan plugin still expects SDL1 codes. Temporarily map those SDL keyes till the plugin is updated
enum class SDL1Keys: U32 {
SDLK_UNKNOWN = 0,
SDLK_BACKSPACE = 8,
SDLK_TAB = 9,
SDLK_CLEAR = 12,
SDLK_RETURN = 13,
SDLK_PAUSE = 19,
SDLK_ESCAPE = 27,
SDLK_DELETE = 127,
SDLK_KP_PERIOD = 266,
SDLK_KP_DIVIDE = 267,
SDLK_KP_MULTIPLY= 268,
SDLK_KP_MINUS = 269,
SDLK_KP_PLUS = 270,
SDLK_KP_ENTER = 271,
SDLK_KP_EQUALS = 272,
SDLK_UP = 273,
SDLK_DOWN = 274,
SDLK_RIGHT = 275,
SDLK_LEFT = 276,
SDLK_INSERT = 277,
SDLK_HOME = 278,
SDLK_END = 279,
SDLK_PAGEUP = 280,
SDLK_PAGEDOWN = 281,
SDLK_F1 = 282,
SDLK_F2 = 283,
SDLK_F3 = 284,
SDLK_F4 = 285,
SDLK_F5 = 286,
SDLK_F6 = 287,
SDLK_F7 = 288,
SDLK_F8 = 289,
SDLK_F9 = 290,
SDLK_F10 = 291,
SDLK_F11 = 292,
SDLK_F12 = 293,
SDLK_F13 = 294,
SDLK_F14 = 295,
SDLK_F15 = 296,
SDLK_CAPSLOCK = 301,
SDLK_RSHIFT = 303,
SDLK_LSHIFT = 304,
SDLK_RCTRL = 305,
SDLK_LCTRL = 306,
SDLK_RALT = 307,
SDLK_LALT = 308,
SDLK_MODE = 313, /**< "Alt Gr" key */
SDLK_HELP = 315,
SDLK_SYSREQ = 317,
SDLK_MENU = 319,
SDLK_POWER = 320, /**< Power Macintosh power key */
SDLK_UNDO = 322, /**< Atari keyboard has Undo */
};
std::map< U32, U32 > mSDL2_to_SDL1;
U32 LLKeyboardSDL::mapSDL2toSDL1( U32 aSymbol )
enum class WindowsVK : U32
{
if( mSDL2_to_SDL1.empty() )
{
mSDL2_to_SDL1[ SDLK_UNKNOWN ] = (U32)SDL1Keys::SDLK_UNKNOWN;
mSDL2_to_SDL1[ SDLK_BACKSPACE ] = (U32)SDL1Keys::SDLK_BACKSPACE;
mSDL2_to_SDL1[ SDLK_TAB ] = (U32)SDL1Keys::SDLK_TAB;
mSDL2_to_SDL1[ SDLK_CLEAR ] = (U32)SDL1Keys::SDLK_CLEAR;
mSDL2_to_SDL1[ SDLK_RETURN ] = (U32)SDL1Keys::SDLK_RETURN;
mSDL2_to_SDL1[ SDLK_PAUSE ] = (U32)SDL1Keys::SDLK_PAUSE;
mSDL2_to_SDL1[ SDLK_ESCAPE ] = (U32)SDL1Keys::SDLK_ESCAPE;
mSDL2_to_SDL1[ SDLK_DELETE ] = (U32)SDL1Keys::SDLK_DELETE;
mSDL2_to_SDL1[ SDLK_KP_PERIOD ] = (U32)SDL1Keys::SDLK_KP_PERIOD;
mSDL2_to_SDL1[ SDLK_KP_DIVIDE ] = (U32)SDL1Keys::SDLK_KP_DIVIDE;
mSDL2_to_SDL1[ SDLK_KP_MULTIPLY] = (U32)SDL1Keys::SDLK_KP_MULTIPLY;
mSDL2_to_SDL1[ SDLK_KP_MINUS ] = (U32)SDL1Keys::SDLK_KP_MINUS;
mSDL2_to_SDL1[ SDLK_KP_PLUS ] = (U32)SDL1Keys::SDLK_KP_PLUS;
mSDL2_to_SDL1[ SDLK_KP_ENTER ] = (U32)SDL1Keys::SDLK_KP_ENTER;
mSDL2_to_SDL1[ SDLK_KP_EQUALS ] = (U32)SDL1Keys::SDLK_KP_EQUALS;
mSDL2_to_SDL1[ SDLK_UP ] = (U32)SDL1Keys::SDLK_UP;
mSDL2_to_SDL1[ SDLK_DOWN ] = (U32)SDL1Keys::SDLK_DOWN;
mSDL2_to_SDL1[ SDLK_RIGHT ] = (U32)SDL1Keys::SDLK_RIGHT;
mSDL2_to_SDL1[ SDLK_LEFT ] = (U32)SDL1Keys::SDLK_LEFT;
mSDL2_to_SDL1[ SDLK_INSERT ] = (U32)SDL1Keys::SDLK_INSERT;
mSDL2_to_SDL1[ SDLK_HOME ] = (U32)SDL1Keys::SDLK_HOME;
mSDL2_to_SDL1[ SDLK_END ] = (U32)SDL1Keys::SDLK_END;
mSDL2_to_SDL1[ SDLK_PAGEUP ] = (U32)SDL1Keys::SDLK_PAGEUP;
mSDL2_to_SDL1[ SDLK_PAGEDOWN ] = (U32)SDL1Keys::SDLK_PAGEDOWN;
mSDL2_to_SDL1[ SDLK_F1 ] = (U32)SDL1Keys::SDLK_F1;
mSDL2_to_SDL1[ SDLK_F2 ] = (U32)SDL1Keys::SDLK_F2;
mSDL2_to_SDL1[ SDLK_F3 ] = (U32)SDL1Keys::SDLK_F3;
mSDL2_to_SDL1[ SDLK_F4 ] = (U32)SDL1Keys::SDLK_F4;
mSDL2_to_SDL1[ SDLK_F5 ] = (U32)SDL1Keys::SDLK_F5;
mSDL2_to_SDL1[ SDLK_F6 ] = (U32)SDL1Keys::SDLK_F6;
mSDL2_to_SDL1[ SDLK_F7 ] = (U32)SDL1Keys::SDLK_F7;
mSDL2_to_SDL1[ SDLK_F8 ] = (U32)SDL1Keys::SDLK_F8;
mSDL2_to_SDL1[ SDLK_F9 ] = (U32)SDL1Keys::SDLK_F9;
mSDL2_to_SDL1[ SDLK_F10 ] = (U32)SDL1Keys::SDLK_F10;
mSDL2_to_SDL1[ SDLK_F11 ] = (U32)SDL1Keys::SDLK_F11;
mSDL2_to_SDL1[ SDLK_F12 ] = (U32)SDL1Keys::SDLK_F12;
mSDL2_to_SDL1[ SDLK_F13 ] = (U32)SDL1Keys::SDLK_F13;
mSDL2_to_SDL1[ SDLK_F14 ] = (U32)SDL1Keys::SDLK_F14;
mSDL2_to_SDL1[ SDLK_F15 ] = (U32)SDL1Keys::SDLK_F15;
mSDL2_to_SDL1[ SDLK_CAPSLOCK ] = (U32)SDL1Keys::SDLK_CAPSLOCK;
mSDL2_to_SDL1[ SDLK_RSHIFT ] = (U32)SDL1Keys::SDLK_RSHIFT;
mSDL2_to_SDL1[ SDLK_LSHIFT ] = (U32)SDL1Keys::SDLK_LSHIFT;
mSDL2_to_SDL1[ SDLK_RCTRL ] = (U32)SDL1Keys::SDLK_RCTRL;
mSDL2_to_SDL1[ SDLK_LCTRL ] = (U32)SDL1Keys::SDLK_LCTRL;
mSDL2_to_SDL1[ SDLK_RALT ] = (U32)SDL1Keys::SDLK_RALT;
mSDL2_to_SDL1[ SDLK_LALT ] = (U32)SDL1Keys::SDLK_LALT;
mSDL2_to_SDL1[ SDLK_MODE ] = (U32)SDL1Keys::SDLK_MODE;
mSDL2_to_SDL1[ SDLK_HELP ] = (U32)SDL1Keys::SDLK_HELP;
mSDL2_to_SDL1[ SDLK_SYSREQ ] = (U32)SDL1Keys::SDLK_SYSREQ;
mSDL2_to_SDL1[ SDLK_MENU ] = (U32)SDL1Keys::SDLK_MENU;
mSDL2_to_SDL1[ SDLK_POWER ] = (U32)SDL1Keys::SDLK_POWER;
mSDL2_to_SDL1[ SDLK_UNDO ] = (U32)SDL1Keys::SDLK_UNDO;
}
VK_UNKNOWN = 0,
VK_BACK = 0x08,
VK_TAB = 0x09,
VK_CLEAR = 0x0C,
VK_RETURN = 0x0D,
VK_SHIFT = 0x10,
VK_CONTROL = 0x11,
VK_MENU = 0x12,
VK_PAUSE = 0x13,
VK_CAPITAL = 0x14,
VK_KANA = 0x15,
VK_HANGUL = 0x15,
VK_JUNJA = 0x17,
VK_FINAL = 0x18,
VK_HANJA = 0x19,
VK_KANJI = 0x19,
VK_ESCAPE = 0x1B,
VK_CONVERT = 0x1C,
VK_NONCONVERT = 0x1D,
VK_ACCEPT = 0x1E,
VK_MODECHANGE = 0x1F,
VK_SPACE = 0x20,
VK_PRIOR = 0x21,
VK_NEXT = 0x22,
VK_END = 0x23,
VK_HOME = 0x24,
VK_LEFT = 0x25,
VK_UP = 0x26,
VK_RIGHT = 0x27,
VK_DOWN = 0x28,
VK_SELECT = 0x29,
VK_PRINT = 0x2A,
VK_EXECUTE = 0x2B,
VK_SNAPSHOT = 0x2C,
VK_INSERT = 0x2D,
VK_DELETE = 0x2E,
VK_HELP = 0x2F,
VK_0 = 0x30,
VK_1 = 0x31,
VK_2 = 0x32,
VK_3 = 0x33,
VK_4 = 0x34,
VK_5 = 0x35,
VK_6 = 0x36,
VK_7 = 0x37,
VK_8 = 0x38,
VK_9 = 0x39,
VK_A = 0x41,
VK_B = 0x42,
VK_C = 0x43,
VK_D = 0x44,
VK_E = 0x45,
VK_F = 0x46,
VK_G = 0x47,
VK_H = 0x48,
VK_I = 0x49,
VK_J = 0x4A,
VK_K = 0x4B,
VK_L = 0x4C,
VK_M = 0x4D,
VK_N = 0x4E,
VK_O = 0x4F,
VK_P = 0x50,
VK_Q = 0x51,
VK_R = 0x52,
VK_S = 0x53,
VK_T = 0x54,
VK_U = 0x55,
VK_V = 0x56,
VK_W = 0x57,
VK_X = 0x58,
VK_Y = 0x59,
VK_Z = 0x5A,
VK_LWIN = 0x5B,
VK_RWIN = 0x5C,
VK_APPS = 0x5D,
VK_SLEEP = 0x5F,
VK_NUMPAD0 = 0x60,
VK_NUMPAD1 = 0x61,
VK_NUMPAD2 = 0x62,
VK_NUMPAD3 = 0x63,
VK_NUMPAD4 = 0x64,
VK_NUMPAD5 = 0x65,
VK_NUMPAD6 = 0x66,
VK_NUMPAD7 = 0x67,
VK_NUMPAD8 = 0x68,
VK_NUMPAD9 = 0x69,
VK_MULTIPLY = 0x6A,
VK_ADD = 0x6B,
VK_SEPARATOR = 0x6C,
VK_SUBTRACT = 0x6D,
VK_DECIMAL = 0x6E,
VK_DIVIDE = 0x6F,
VK_F1 = 0x70,
VK_F2 = 0x71,
VK_F3 = 0x72,
VK_F4 = 0x73,
VK_F5 = 0x74,
VK_F6 = 0x75,
VK_F7 = 0x76,
VK_F8 = 0x77,
VK_F9 = 0x78,
VK_F10 = 0x79,
VK_F11 = 0x7A,
VK_F12 = 0x7B,
VK_F13 = 0x7C,
VK_F14 = 0x7D,
VK_F15 = 0x7E,
VK_F16 = 0x7F,
VK_F17 = 0x80,
VK_F18 = 0x81,
VK_F19 = 0x82,
VK_F20 = 0x83,
VK_F21 = 0x84,
VK_F22 = 0x85,
VK_F23 = 0x86,
VK_F24 = 0x87,
VK_NUMLOCK = 0x90,
VK_SCROLL = 0x91,
VK_LSHIFT = 0xA0,
VK_RSHIFT = 0xA1,
VK_LCONTROL = 0xA2,
VK_RCONTROL = 0xA3,
VK_LMENU = 0xA4,
VK_RMENU = 0xA5,
VK_BROWSER_BACK = 0xA6,
VK_BROWSER_FORWARD = 0xA7,
VK_BROWSER_REFRESH = 0xA8,
VK_BROWSER_STOP = 0xA9,
VK_BROWSER_SEARCH = 0xAA,
VK_BROWSER_FAVORITES = 0xAB,
VK_BROWSER_HOME = 0xAC,
VK_VOLUME_MUTE = 0xAD,
VK_VOLUME_DOWN = 0xAE,
VK_VOLUME_UP = 0xAF,
VK_MEDIA_NEXT_TRACK = 0xB0,
VK_MEDIA_PREV_TRACK = 0xB1,
VK_MEDIA_STOP = 0xB2,
VK_MEDIA_PLAY_PAUSE = 0xB3,
VK_MEDIA_LAUNCH_MAIL = 0xB4,
VK_MEDIA_LAUNCH_MEDIA_SELECT = 0xB5,
VK_MEDIA_LAUNCH_APP1 = 0xB6,
VK_MEDIA_LAUNCH_APP2 = 0xB7,
VK_OEM_1 = 0xBA,
VK_OEM_PLUS = 0xBB,
VK_OEM_COMMA = 0xBC,
VK_OEM_MINUS = 0xBD,
VK_OEM_PERIOD = 0xBE,
VK_OEM_2 = 0xBF,
VK_OEM_3 = 0xC0,
VK_OEM_4 = 0xDB,
VK_OEM_5 = 0xDC,
VK_OEM_6 = 0xDD,
VK_OEM_7 = 0xDE,
VK_OEM_8 = 0xDF,
VK_OEM_102 = 0xE2,
VK_PROCESSKEY = 0xE5,
VK_PACKET = 0xE7,
VK_ATTN = 0xF6,
VK_CRSEL = 0xF7,
VK_EXSEL = 0xF8,
VK_EREOF = 0xF9,
VK_PLAY = 0xFA,
VK_ZOOM = 0xFB,
VK_NONAME = 0xFC,
VK_PA1 = 0xFD,
VK_OEM_CLEAR = 0xFE,
};
auto itr = mSDL2_to_SDL1.find( aSymbol );
if( itr != mSDL2_to_SDL1.end() )
std::map< U32, U32 > mSDL2_to_Win;
std::set< U32 > mIgnoreSDL2Keys;
U32 LLKeyboardSDL::mapSDL2toWin( U32 aSymbol )
{
// <FS:ND> Map SDLK_ virtual keys to Windows VK_ virtual keys.
// Text is handled via unicode input (SDL_TEXTINPUT event) and does not need to be translated into VK_ values as those match already.
if( mSDL2_to_Win.empty() )
{
mSDL2_to_Win[ SDLK_UNKNOWN ] = (U32)WindowsVK::VK_UNKNOWN;
mSDL2_to_Win[ SDLK_BACKSPACE ] = (U32)WindowsVK::VK_BACK;
mSDL2_to_Win[ SDLK_TAB ] = (U32)WindowsVK::VK_TAB;
mSDL2_to_Win[ SDLK_CLEAR ] = (U32)WindowsVK::VK_CLEAR;
mSDL2_to_Win[ SDLK_RETURN ] = (U32)WindowsVK::VK_RETURN;
mSDL2_to_Win[ SDLK_PAUSE ] = (U32)WindowsVK::VK_PAUSE;
mSDL2_to_Win[ SDLK_ESCAPE ] = (U32)WindowsVK::VK_ESCAPE;
mSDL2_to_Win[ SDLK_DELETE ] = (U32)WindowsVK::VK_DELETE;
mSDL2_to_Win[ SDLK_KP_PERIOD ] = (U32)WindowsVK::VK_OEM_PERIOD;
mSDL2_to_Win[ SDLK_KP_DIVIDE ] = (U32)WindowsVK::VK_DIVIDE;
mSDL2_to_Win[ SDLK_KP_MULTIPLY] = (U32)WindowsVK::VK_MULTIPLY;
mSDL2_to_Win[ SDLK_KP_MINUS ] = (U32)WindowsVK::VK_OEM_MINUS;
mSDL2_to_Win[ SDLK_KP_PLUS ] = (U32)WindowsVK::VK_OEM_PLUS;
mSDL2_to_Win[ SDLK_KP_ENTER ] = (U32)WindowsVK::VK_RETURN;
// ?
//mSDL2_to_Win[ SDLK_KP_EQUALS ] = (U32)WindowsVK::VK_EQUALS;
mSDL2_to_Win[ SDLK_UP ] = (U32)WindowsVK::VK_UP;
mSDL2_to_Win[ SDLK_DOWN ] = (U32)WindowsVK::VK_DOWN;
mSDL2_to_Win[ SDLK_RIGHT ] = (U32)WindowsVK::VK_RIGHT;
mSDL2_to_Win[ SDLK_LEFT ] = (U32)WindowsVK::VK_LEFT;
mSDL2_to_Win[ SDLK_INSERT ] = (U32)WindowsVK::VK_INSERT;
mSDL2_to_Win[ SDLK_HOME ] = (U32)WindowsVK::VK_HOME;
mSDL2_to_Win[ SDLK_END ] = (U32)WindowsVK::VK_END;
mSDL2_to_Win[ SDLK_PAGEUP ] = (U32)WindowsVK::VK_PRIOR;
mSDL2_to_Win[ SDLK_PAGEDOWN ] = (U32)WindowsVK::VK_NEXT;
mSDL2_to_Win[ SDLK_F1 ] = (U32)WindowsVK::VK_F1;
mSDL2_to_Win[ SDLK_F2 ] = (U32)WindowsVK::VK_F2;
mSDL2_to_Win[ SDLK_F3 ] = (U32)WindowsVK::VK_F3;
mSDL2_to_Win[ SDLK_F4 ] = (U32)WindowsVK::VK_F4;
mSDL2_to_Win[ SDLK_F5 ] = (U32)WindowsVK::VK_F5;
mSDL2_to_Win[ SDLK_F6 ] = (U32)WindowsVK::VK_F6;
mSDL2_to_Win[ SDLK_F7 ] = (U32)WindowsVK::VK_F7;
mSDL2_to_Win[ SDLK_F8 ] = (U32)WindowsVK::VK_F8;
mSDL2_to_Win[ SDLK_F9 ] = (U32)WindowsVK::VK_F9;
mSDL2_to_Win[ SDLK_F10 ] = (U32)WindowsVK::VK_F10;
mSDL2_to_Win[ SDLK_F11 ] = (U32)WindowsVK::VK_F11;
mSDL2_to_Win[ SDLK_F12 ] = (U32)WindowsVK::VK_F12;
mSDL2_to_Win[ SDLK_F13 ] = (U32)WindowsVK::VK_F13;
mSDL2_to_Win[ SDLK_F14 ] = (U32)WindowsVK::VK_F14;
mSDL2_to_Win[ SDLK_F15 ] = (U32)WindowsVK::VK_F15;
mSDL2_to_Win[ SDLK_CAPSLOCK ] = (U32)WindowsVK::VK_CAPITAL;
mSDL2_to_Win[ SDLK_RSHIFT ] = (U32)WindowsVK::VK_SHIFT;
mSDL2_to_Win[ SDLK_LSHIFT ] = (U32)WindowsVK::VK_SHIFT;
mSDL2_to_Win[ SDLK_RCTRL ] = (U32)WindowsVK::VK_CONTROL;
mSDL2_to_Win[ SDLK_LCTRL ] = (U32)WindowsVK::VK_CONTROL;
mSDL2_to_Win[ SDLK_RALT ] = (U32)WindowsVK::VK_MENU;
mSDL2_to_Win[ SDLK_LALT ] = (U32)WindowsVK::VK_MENU;
// VK_MODECHANGE ?
// mSDL2_to_Win[ SDLK_MODE ] = (U32)WindowsVK::VK_MODE;
mSDL2_to_Win[ SDLK_HELP ] = (U32)WindowsVK::VK_HELP;
// ?
// mSDL2_to_Win[ SDLK_SYSREQ ] = (U32)WindowsVK::VK_SYSREQ;
mSDL2_to_Win[ SDLK_MENU ] = (U32)WindowsVK::VK_MENU;
// ?
// mSDL2_to_Win[ SDLK_POWER ] = (U32)WindowsVK::VK_POWER;
// ?
//mSDL2_to_Win[ SDLK_UNDO ] = (U32)WindowsVK::VK_UNDO;
}
auto itr = mSDL2_to_Win.find( aSymbol );
if( itr != mSDL2_to_Win.end() )
return itr->second;
return aSymbol;
}
// </FS:ND> Compatibility shim for SDL2 > SDL1.
#endif

View File

@ -52,7 +52,7 @@ private:
std::map<KEY, U32> mInvTranslateNumpadMap; // inverse of the above
public:
static U32 mapSDL2toSDL1( U32 );
static U32 mapSDL2toWin( U32 );
};
#endif

View File

@ -250,7 +250,6 @@ LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks,
mFlashing = FALSE;
#endif // LL_X11
mKeyScanCode = 0;
mKeyVirtualKey = 0;
mKeyModifiers = KMOD_NONE;
}
@ -1738,6 +1737,11 @@ void LLWindowSDL::gatherInput()
{
switch (event.type)
{
case SDL_MOUSEWHEEL:
if( event.wheel.y != 0 )
mCallbacks->handleScrollWheel(this, event.wheel.y);
break;
case SDL_MOUSEMOTION:
{
LLCoordWindow winCoord(event.button.x, event.button.y);
@ -1753,44 +1757,39 @@ void LLWindowSDL::gatherInput()
auto string = utf8str_to_utf16str( event.text.text );
for( auto key: string )
{
mKeyScanCode = string[0];
mKeyVirtualKey = string[0];
mKeyModifiers = SDL_GetModState();
mSDLSym = string[0];
handleUnicodeUTF16( key, gKeyboard->currentMask(FALSE));
handleUnicodeUTF16( key, mKeyModifiers );
}
break;
}
case SDL_KEYDOWN:
mKeyScanCode = event.key.keysym.scancode;
mKeyVirtualKey = LLKeyboardSDL::mapSDL2toSDL1( event.key.keysym.sym );
mKeyVirtualKey = event.key.keysym.sym;
mKeyModifiers = event.key.keysym.mod;
mSDLSym = LLKeyboardSDL::mapSDL2toSDL1( event.key.keysym.sym );
gKeyboard->handleKeyDown(event.key.keysym.sym, event.key.keysym.mod);
gKeyboard->handleKeyDown(mKeyVirtualKey, mKeyModifiers );
// <FS:ND> Slightly hacky :| To make the viewer honor enter (eg to accept form input) we've to not only send handleKeyDown but also send a
// invoke handleUnicodeUTF16 in case the user hits return.
// Note that we cannot blindly use handleUnicodeUTF16 for each SDL_KEYDOWN. Doing so will create bogus keyboard input (like % for cursor left).
if( mKeyVirtualKey == SDLK_RETURN )
handleUnicodeUTF16( mKeyVirtualKey, mKeyModifiers );
// part of the fix for SL-13243
if (SDLCheckGrabbyKeys(event.key.keysym.sym, TRUE) != 0)
SDLReallyCaptureInput(TRUE);
{
KEY dummyKey{};
if( gKeyboard->translateKey( mSDLSym, &dummyKey ) )
handleUnicodeUTF16( mSDLSym, gKeyboard->currentMask(FALSE));
}
break;
case SDL_KEYUP:
mKeyScanCode = event.key.keysym.scancode;
mKeyVirtualKey = LLKeyboardSDL::mapSDL2toSDL1( event.key.keysym.sym );
mKeyVirtualKey = event.key.keysym.sym;
mKeyModifiers = event.key.keysym.mod;
mSDLSym = LLKeyboardSDL::mapSDL2toSDL1( event.key.keysym.sym );
if (SDLCheckGrabbyKeys(event.key.keysym.sym, FALSE) == 0)
if (SDLCheckGrabbyKeys(mKeyVirtualKey, FALSE) == 0)
SDLReallyCaptureInput(FALSE); // part of the fix for SL-13243
gKeyboard->handleKeyUp(event.key.keysym.sym, event.key.keysym.mod);
gKeyboard->handleKeyUp(mKeyVirtualKey,mKeyModifiers);
break;
case SDL_MOUSEBUTTONDOWN:
@ -2365,7 +2364,7 @@ static void color_changed_callback(GtkWidget *widget,
*/
LLSD LLWindowSDL::getNativeKeyData()
{
LLSD result = LLSD::emptyMap();
LLSD result = LLSD::emptyMap();
U32 modifiers = 0; // pretend-native modifiers... oh what a tangled web we weave!
@ -2383,11 +2382,11 @@ LLSD LLWindowSDL::getNativeKeyData()
// *todo: test ALTs - I don't have a case for testing these. Do you?
// *todo: NUM? - I don't care enough right now (and it's not a GDK modifier).
result["scan_code"] = (S32)mKeyScanCode;
result["virtual_key"] = (S32)mKeyVirtualKey;
result["virtual_key"] = (S32)mKeyVirtualKey;
result["virtual_key_win"] = (S32)LLKeyboardSDL::mapSDL2toWin( mKeyVirtualKey );
result["modifiers"] = (S32)modifiers;
result[ "sdl_sym" ] = (S32)mSDLSym; // <FS:ND/> Store the SDL Keysym too.
return result;
return result;
}

View File

@ -215,10 +215,8 @@ private:
LLTimer mFlashTimer;
#endif //LL_X11
U32 mKeyScanCode;
U32 mKeyVirtualKey;
U32 mKeyModifiers;
U32 mSDLSym; // <FS:ND/> Store the SDL Keysym too.
BOOL mUseLegacyCursors; // <FS:LO> Legacy cursor setting from main program
private:

View File

@ -832,12 +832,20 @@ void MediaPluginCEF::keyEvent(dullahan::EKeyEvent key_event, LLSD native_key_dat
// <FS:ND> Keyboard handling for Linux.
#if LL_LINUX
uint32_t native_scan_code = (uint32_t)(native_key_data["sdl_sym"].asInteger());
uint32_t native_virtual_key = (uint32_t)(native_key_data["virtual_key"].asInteger());
uint32_t native_modifiers = (uint32_t)(native_key_data["cef_modifiers"].asInteger());
if( native_scan_code == '\n' )
native_scan_code = '\r';
mCEFLib->nativeKeyboardEvent(key_event, native_scan_code, native_virtual_key, native_modifiers);
uint32_t native_virtual_key = (uint32_t)(native_key_data["virtual_key_win"].asInteger());
uint32_t native_modifiers = (uint32_t)(native_key_data["modifiers"].asInteger());
if( native_virtual_key == '\n' )
native_virtual_key = '\r';
mCEFLib->nativeKeyboardEventSDL2(key_event, native_virtual_key, native_modifiers, false);
// <FS:ND> Slightly hacky :| To make CEF honor enter (eg to accept form input) we've to not only send KE_KEY_UP/KE_KEY_DOWN
// but also a KE_KEY_CHAR event.
// Note that we cannot blindly send a KE_CHAR for each KE_KEY_UP. Doing so will create bogus keyboard input (like % for cursor left).
// Adding this just in llwindowsdl does not seem to fire an appropriate unicodeInput event down below, thus repeat this check here again :(
if( dullahan::KE_KEY_UP == key_event && native_virtual_key == '\r' )
mCEFLib->nativeKeyboardEventSDL2(dullahan::KE_KEY_CHAR, native_virtual_key, native_modifiers, false);
#endif
// </FS:ND>
};
@ -872,12 +880,13 @@ void MediaPluginCEF::unicodeInput(std::string event, LLSD native_key_data = LLSD
#endif
// <FS:ND> Keyboard handling for Linux.
#if LL_LINUX
uint32_t native_scan_code = (uint32_t)(native_key_data["sdl_sym"].asInteger());
uint32_t native_virtual_key = (uint32_t)(native_key_data["virtual_key"].asInteger());
uint32_t native_modifiers = (uint32_t)(native_key_data["cef_modifiers"].asInteger());
if( native_scan_code == '\n' )
native_scan_code = '\r';
mCEFLib->nativeKeyboardEvent(dullahan::KE_KEY_DOWN, native_scan_code, native_virtual_key, native_modifiers);
uint32_t native_virtual_key = (uint32_t)(native_key_data["virtual_key_win"].asInteger());
uint32_t native_modifiers = (uint32_t)(native_key_data["modifiers"].asInteger());
if( native_virtual_key == '\n' )
native_virtual_key = '\r';
mCEFLib->nativeKeyboardEventSDL2(dullahan::KE_KEY_CHAR, native_virtual_key, native_modifiers, false);
#endif
// </FS:ND>
};