diff --git a/source/gui/CGUI.cpp b/source/gui/CGUI.cpp index ec28f6f15e..53b869b55b 100644 --- a/source/gui/CGUI.cpp +++ b/source/gui/CGUI.cpp @@ -158,38 +158,45 @@ InReaction CGUI::HandleEvent(const SDL_Event_* ev) SetFocusedObject(pNearest); if (pNearest) - { ret = pNearest->SendEvent(GUIM_MOUSE_PRESS_LEFT, "mouseleftpress"); - } break; case SDL_BUTTON_RIGHT: if (pNearest) - { ret = pNearest->SendEvent(GUIM_MOUSE_PRESS_RIGHT, "mouserightpress"); - } break; +#if !SDL_VERSION_ATLEAST(2, 0, 0) case SDL_BUTTON_WHEELDOWN: // wheel down if (pNearest) - { ret = pNearest->SendEvent(GUIM_MOUSE_WHEEL_DOWN, "mousewheeldown"); - } break; case SDL_BUTTON_WHEELUP: // wheel up if (pNearest) - { ret = pNearest->SendEvent(GUIM_MOUSE_WHEEL_UP, "mousewheelup"); - } break; - +#endif default: break; } } - else - if (ev->ev.type == SDL_MOUSEBUTTONUP) +#if SDL_VERSION_ATLEAST(2, 0, 0) + else if (ev->ev.type == SDL_MOUSEWHEEL) + { + if (ev->ev.wheel.y < 0) + { + if (pNearest) + ret = pNearest->SendEvent(GUIM_MOUSE_WHEEL_DOWN, "mousewheeldown"); + } + else if (ev->ev.wheel.y > 0) + { + if (pNearest) + ret = pNearest->SendEvent(GUIM_MOUSE_WHEEL_UP, "mousewheelup"); + } + } +#endif + else if (ev->ev.type == SDL_MOUSEBUTTONUP) { switch (ev->ev.button.button) { diff --git a/source/gui/scripting/GuiScriptConversions.cpp b/source/gui/scripting/GuiScriptConversions.cpp index 40a35b4bb0..93c26007dc 100644 --- a/source/gui/scripting/GuiScriptConversions.cpp +++ b/source/gui/scripting/GuiScriptConversions.cpp @@ -35,15 +35,19 @@ template<> jsval ScriptInterface::ToJSVal(JSContext* cx, SDL_Event_ switch (val.ev.type) { +#if SDL_VERSION_ATLEAST(2, 0, 0) + case SDL_WINDOWEVENT: typeName = "windowevent"; break; +#else case SDL_ACTIVEEVENT: typeName = "activeevent"; break; + case SDL_VIDEOEXPOSE: typeName = "videoexpose"; break; + case SDL_VIDEORESIZE: typeName = "videoresize"; break; +#endif case SDL_KEYDOWN: typeName = "keydown"; break; case SDL_KEYUP: typeName = "keyup"; break; case SDL_MOUSEMOTION: typeName = "mousemotion"; break; case SDL_MOUSEBUTTONDOWN: typeName = "mousebuttondown"; break; case SDL_MOUSEBUTTONUP: typeName = "mousebuttonup"; break; case SDL_QUIT: typeName = "quit"; break; - case SDL_VIDEOEXPOSE: typeName = "videoexpose"; break; - case SDL_VIDEORESIZE: typeName = "videoresize"; break; case SDL_HOTKEYDOWN: typeName = "hotkeydown"; break; case SDL_HOTKEYUP: typeName = "hotkeyup"; break; default: typeName = "(unknown)"; break; @@ -57,12 +61,14 @@ template<> jsval ScriptInterface::ToJSVal(JSContext* cx, SDL_Event_ switch (val.ev.type) { +#if !SDL_VERSION_ATLEAST(2, 0, 0) case SDL_ACTIVEEVENT: { SET(obj, "gain", (int)val.ev.active.gain); SET(obj, "state", (int)val.ev.active.state); break; } +#endif case SDL_KEYDOWN: case SDL_KEYUP: { diff --git a/source/lib/sysdep/gfx.cpp b/source/lib/sysdep/gfx.cpp index 04e22782af..313997c693 100644 --- a/source/lib/sysdep/gfx.cpp +++ b/source/lib/sysdep/gfx.cpp @@ -93,8 +93,12 @@ std::wstring DriverInfo() size_t MemorySizeMiB() { +#if SDL_VERSION_ATLEAST(2, 0, 0) + return 0; +#else // (maybe add the size of the framebuffer?) return (SDL_GetVideoInfo()->video_mem) / 1048576; // [MiB] +#endif } } // namespace gfx diff --git a/source/lib/sysdep/os/unix/x/x.cpp b/source/lib/sysdep/os/unix/x/x.cpp index 4b868cbd0e..5da89582e2 100644 --- a/source/lib/sysdep/os/unix/x/x.cpp +++ b/source/lib/sysdep/os/unix/x/x.cpp @@ -35,6 +35,8 @@ #include "lib/debug.h" #include "lib/sysdep/gfx.h" +#include "ps/VideoMode.h" + #define Cursor X__Cursor #include @@ -299,7 +301,11 @@ Status x11_clipboard_init() SDL_SysWMinfo info; SDL_VERSION(&info.version); +#if SDL_VERSION_ATLEAST(2, 0, 0) + if (SDL_GetWindowWMInfo(g_VideoMode.GetWindow(), &info)) +#else if (SDL_GetWMInfo(&info)) +#endif { /* Save the information for later use */ if (info.subsystem == SDL_SYSWM_X11) diff --git a/source/main.cpp b/source/main.cpp index 3635a38fd4..1ab5cdac78 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -94,6 +94,23 @@ static InReaction MainInputHandler(const SDL_Event_* ev) { switch(ev->ev.type) { +#if SDL_VERSION_ATLEAST(2, 0, 0) + case SDL_WINDOWEVENT: + switch(ev->ev.window.event) + { + case SDL_WINDOWEVENT_ENTER: + RenderCursor(true); + break; + case SDL_WINDOWEVENT_LEAVE: + RenderCursor(false); + break; + case SDL_WINDOWEVENT_RESIZED: + g_ResizedW = ev->ev.window.data1; + g_ResizedH = ev->ev.window.data2; + break; + } + break; +#else case SDL_ACTIVEEVENT: if (ev->ev.active.state == SDL_APPMOUSEFOCUS) { @@ -106,14 +123,15 @@ static InReaction MainInputHandler(const SDL_Event_* ev) } break; - case SDL_QUIT: - kill_mainloop(); - break; - case SDL_VIDEORESIZE: g_ResizedW = ev->ev.resize.w; g_ResizedH = ev->ev.resize.h; break; +#endif + + case SDL_QUIT: + kill_mainloop(); + break; case SDL_HOTKEYDOWN: std::string hotkey = static_cast(ev->ev.user.data1); @@ -389,7 +407,11 @@ static void Frame() Render(); PROFILE3("swap buffers"); +#if SDL_VERSION_ATLEAST(2, 0, 0) + SDL_GL_SwapWindow(g_VideoMode.GetWindow()); +#else SDL_GL_SwapBuffers(); +#endif } ogl_WarnIfError(); diff --git a/source/ps/CConsole.cpp b/source/ps/CConsole.cpp index 4c855344ef..7c35b24de5 100644 --- a/source/ps/CConsole.cpp +++ b/source/ps/CConsole.cpp @@ -625,7 +625,11 @@ void CConsole::ReceivedChatMessage(const wchar_t *szSender, const wchar_t *szMes InsertMessage(L"%ls: %ls", szSender, szMessage); } +#if SDL_VERSION_ATLEAST(2, 0, 0) +static bool isUnprintableChar(SDL_Keysym key) +#else static bool isUnprintableChar(SDL_keysym key) +#endif { // U+0000 to U+001F are control characters if (key.unicode < 0x20) @@ -686,7 +690,7 @@ InReaction conInputHandler(const SDL_Event_* ev) if (ev->ev.type != SDL_KEYDOWN) return IN_PASS; - SDLKey sym = ev->ev.key.keysym.sym; + int sym = ev->ev.key.keysym.sym; // Stop unprintable characters (ctrl+, alt+ and escape), // also prevent ` and/or ~ appearing in console every time it's toggled. diff --git a/source/ps/GameSetup/GameSetup.cpp b/source/ps/GameSetup/GameSetup.cpp index c40dd12ec9..4f48485e99 100644 --- a/source/ps/GameSetup/GameSetup.cpp +++ b/source/ps/GameSetup/GameSetup.cpp @@ -508,7 +508,9 @@ static void InitPs(bool setup_gui, const CStrW& gui_page, CScriptVal initData) static void InitInput() { +#if !SDL_VERSION_ATLEAST(2, 0, 0) SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); +#endif g_Joystick.Initialise(); @@ -612,7 +614,12 @@ static void InitSDL() throw PSERROR_System_SDLInitFailed(); } atexit(SDL_Quit); + +#if SDL_VERSION_ATLEAST(2, 0, 0) + SDL_StartTextInput(); +#else SDL_EnableUNICODE(1); +#endif } static void ShutdownSDL() @@ -885,7 +892,9 @@ void InitGraphics(const CmdLineArgs& args, int flags) if (!g_VideoMode.InitSDL()) throw PSERROR_System_VmodeFailed(); // abort startup +#if !SDL_VERSION_ATLEAST(2, 0, 0) SDL_WM_SetCaption("0 A.D.", "0 A.D."); +#endif } RunHardwareDetection(); diff --git a/source/ps/Globals.cpp b/source/ps/Globals.cpp index bcf9c03505..a4d6bde55c 100644 --- a/source/ps/Globals.cpp +++ b/source/ps/Globals.cpp @@ -41,6 +41,31 @@ InReaction GlobalsInputHandler(const SDL_Event_* ev) switch(ev->ev.type) { +#if SDL_VERSION_ATLEAST(2, 0, 0) + case SDL_WINDOWEVENT: + switch(ev->ev.window.event) + { + case SDL_WINDOWEVENT_MINIMIZED: + g_app_minimized = true; + break; + case SDL_WINDOWEVENT_RESTORED: + g_app_minimized = false; + break; + case SDL_WINDOWEVENT_FOCUS_GAINED: + g_app_has_focus = true; + break; + case SDL_WINDOWEVENT_FOCUS_LOST: + g_app_has_focus = false; + break; + case SDL_WINDOWEVENT_ENTER: + g_mouse_active = true; + break; + case SDL_WINDOWEVENT_LEAVE: + g_mouse_active = false; + break; + } + return IN_PASS; +#else case SDL_ACTIVEEVENT: if(ev->ev.active.state & SDL_APPACTIVE) g_app_minimized = (ev->ev.active.gain == 0); // negated @@ -49,6 +74,7 @@ InReaction GlobalsInputHandler(const SDL_Event_* ev) if(ev->ev.active.state & SDL_APPMOUSEFOCUS) g_mouse_active = (ev->ev.active.gain != 0); return IN_PASS; +#endif case SDL_MOUSEMOTION: g_mouse_x = ev->ev.motion.x; diff --git a/source/ps/Hotkey.cpp b/source/ps/Hotkey.cpp index 5d98ae3663..d5a08ea0f3 100644 --- a/source/ps/Hotkey.cpp +++ b/source/ps/Hotkey.cpp @@ -28,9 +28,15 @@ static bool unified[UNIFIED_LAST - UNIFIED_SHIFT]; +#if SDL_VERSION_ATLEAST(2, 0, 0) +#define SDLKEY SDL_Keycode +#else +#define SDLKEY SDLKey +#endif + struct SKey { - SDLKey code; // keycode or MOUSE_ or UNIFIED_ value + SDLKEY code; // keycode or MOUSE_ or UNIFIED_ value bool negated; // whether the key must be pressed (false) or unpressed (true) }; @@ -105,7 +111,7 @@ static void LoadConfigBindings() continue; } - SKey key = { (SDLKey)mapping, negateNext }; + SKey key = { (SDLKEY)mapping, negateNext }; keyCombination.push_back(key); negateNext = false; @@ -176,9 +182,12 @@ InReaction HotkeyInputHandler( const SDL_Event_* ev ) case SDL_KEYUP: keycode = (int)ev->ev.key.keysym.sym; break; + case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: -#if SDL_VERSION_ATLEAST(1, 2, 13) +#if SDL_VERSION_ATLEAST(2, 0, 0) + if ((int)ev->ev.button.button <= SDL_BUTTON_RIGHT) +#elif SDL_VERSION_ATLEAST(1, 2, 13) if ((int)ev->ev.button.button <= SDL_BUTTON_X2) #else if ((int)ev->ev.button.button <= SDL_BUTTON_WHEELDOWN) @@ -187,7 +196,23 @@ InReaction HotkeyInputHandler( const SDL_Event_* ev ) keycode = CUSTOM_SDL_KEYCODE + (int)ev->ev.button.button; break; } - // fall through + return IN_PASS; + +#if SDL_VERSION_ATLEAST(2, 0, 0) + case SDL_MOUSEWHEEL: + if (ev->ev.wheel.y < 0) + { + keycode = MOUSE_WHEELUP; + break; + } + else if (ev->ev.wheel.y > 0) + { + keycode = MOUSE_WHEELDOWN; + break; + } + return IN_PASS; +#endif + default: return IN_PASS; } @@ -205,32 +230,30 @@ InReaction HotkeyInputHandler( const SDL_Event_* ev ) phantom.ev.type = ( ( ev->ev.type == SDL_KEYDOWN ) || ( ev->ev.type == SDL_MOUSEBUTTONDOWN ) ) ? SDL_KEYDOWN : SDL_KEYUP; if( ( keycode == SDLK_LSHIFT ) || ( keycode == SDLK_RSHIFT ) ) { - phantom.ev.key.keysym.sym = (SDLKey)UNIFIED_SHIFT; + phantom.ev.key.keysym.sym = (SDLKEY)UNIFIED_SHIFT; unified[0] = ( phantom.ev.type == SDL_KEYDOWN ); HotkeyInputHandler( &phantom ); } else if( ( keycode == SDLK_LCTRL ) || ( keycode == SDLK_RCTRL ) ) { - phantom.ev.key.keysym.sym = (SDLKey)UNIFIED_CTRL; + phantom.ev.key.keysym.sym = (SDLKEY)UNIFIED_CTRL; unified[1] = ( phantom.ev.type == SDL_KEYDOWN ); HotkeyInputHandler( &phantom ); } else if( ( keycode == SDLK_LALT ) || ( keycode == SDLK_RALT ) ) { - phantom.ev.key.keysym.sym = (SDLKey)UNIFIED_ALT; + phantom.ev.key.keysym.sym = (SDLKEY)UNIFIED_ALT; unified[2] = ( phantom.ev.type == SDL_KEYDOWN ); HotkeyInputHandler( &phantom ); } - else if( ( keycode == SDLK_LMETA ) || ( keycode == SDLK_RMETA ) ) - { - phantom.ev.key.keysym.sym = (SDLKey)UNIFIED_META; - unified[3] = ( phantom.ev.type == SDL_KEYDOWN ); - HotkeyInputHandler( &phantom ); - } +#if SDL_VERSION_ATLEAST(2, 0, 0) + else if( ( keycode == SDLK_LGUI ) || ( keycode == SDLK_RGUI ) ) +#else else if( ( keycode == SDLK_LSUPER ) || ( keycode == SDLK_RSUPER ) ) +#endif { - phantom.ev.key.keysym.sym = (SDLKey)UNIFIED_SUPER; - unified[4] = ( phantom.ev.type == SDL_KEYDOWN ); + phantom.ev.key.keysym.sym = (SDLKEY)UNIFIED_SUPER; + unified[3] = ( phantom.ev.type == SDL_KEYDOWN ); HotkeyInputHandler( &phantom ); } diff --git a/source/ps/KeyName.cpp b/source/ps/KeyName.cpp index d20332de73..e563ba3332 100644 --- a/source/ps/KeyName.cpp +++ b/source/ps/KeyName.cpp @@ -110,104 +110,19 @@ static SKeycodeMapping keycodeMapping[] = { SDLK_y, "Y", 0 }, { SDLK_z, "Z", 0 }, { SDLK_DELETE, "Delete", "Del" }, -/* - { SDLK_WORLD_0, "world 0" }, - { SDLK_WORLD_1, "world 1" }, - { SDLK_WORLD_2, "world 2" }, - { SDLK_WORLD_3, "world 3" }, - { SDLK_WORLD_4, "world 4" }, - { SDLK_WORLD_5, "world 5" }, - { SDLK_WORLD_6, "world 6" }, - { SDLK_WORLD_7, "world 7" }, - { SDLK_WORLD_8, "world 8" }, - { SDLK_WORLD_9, "world 9" }, - { SDLK_WORLD_10, "world 10" }, - { SDLK_WORLD_11, "world 11" }, - { SDLK_WORLD_12, "world 12" }, - { SDLK_WORLD_13, "world 13" }, - { SDLK_WORLD_14, "world 14" }, - { SDLK_WORLD_15, "world 15" }, - { SDLK_WORLD_16, "world 16" }, - { SDLK_WORLD_17, "world 17" }, - { SDLK_WORLD_18, "world 18" }, - { SDLK_WORLD_19, "world 19" }, - { SDLK_WORLD_20, "world 20" }, - { SDLK_WORLD_21, "world 21" }, - { SDLK_WORLD_22, "world 22" }, - { SDLK_WORLD_23, "world 23" }, - { SDLK_WORLD_24, "world 24" }, - { SDLK_WORLD_25, "world 25" }, - { SDLK_WORLD_26, "world 26" }, - { SDLK_WORLD_27, "world 27" }, - { SDLK_WORLD_28, "world 28" }, - { SDLK_WORLD_29, "world 29" }, - { SDLK_WORLD_30, "world 30" }, - { SDLK_WORLD_31, "world 31" }, - { SDLK_WORLD_32, "world 32" }, - { SDLK_WORLD_33, "world 33" }, - { SDLK_WORLD_34, "world 34" }, - { SDLK_WORLD_35, "world 35" }, - { SDLK_WORLD_36, "world 36" }, - { SDLK_WORLD_37, "world 37" }, - { SDLK_WORLD_38, "world 38" }, - { SDLK_WORLD_39, "world 39" }, - { SDLK_WORLD_40, "world 40" }, - { SDLK_WORLD_41, "world 41" }, - { SDLK_WORLD_42, "world 42" }, - { SDLK_WORLD_43, "world 43" }, - { SDLK_WORLD_44, "world 44" }, - { SDLK_WORLD_45, "world 45" }, - { SDLK_WORLD_46, "world 46" }, - { SDLK_WORLD_47, "world 47" }, - { SDLK_WORLD_48, "world 48" }, - { SDLK_WORLD_49, "world 49" }, - { SDLK_WORLD_50, "world 50" }, - { SDLK_WORLD_51, "world 51" }, - { SDLK_WORLD_52, "world 52" }, - { SDLK_WORLD_53, "world 53" }, - { SDLK_WORLD_54, "world 54" }, - { SDLK_WORLD_55, "world 55" }, - { SDLK_WORLD_56, "world 56" }, - { SDLK_WORLD_57, "world 57" }, - { SDLK_WORLD_58, "world 58" }, - { SDLK_WORLD_59, "world 59" }, - { SDLK_WORLD_60, "world 60" }, - { SDLK_WORLD_61, "world 61" }, - { SDLK_WORLD_62, "world 62" }, - { SDLK_WORLD_63, "world 63" }, - { SDLK_WORLD_64, "world 64" }, - { SDLK_WORLD_65, "world 65" }, - { SDLK_WORLD_66, "world 66" }, - { SDLK_WORLD_67, "world 67" }, - { SDLK_WORLD_68, "world 68" }, - { SDLK_WORLD_69, "world 69" }, - { SDLK_WORLD_70, "world 70" }, - { SDLK_WORLD_71, "world 71" }, - { SDLK_WORLD_72, "world 72" }, - { SDLK_WORLD_73, "world 73" }, - { SDLK_WORLD_74, "world 74" }, - { SDLK_WORLD_75, "world 75" }, - { SDLK_WORLD_76, "world 76" }, - { SDLK_WORLD_77, "world 77" }, - { SDLK_WORLD_78, "world 78" }, - { SDLK_WORLD_79, "world 79" }, - { SDLK_WORLD_80, "world 80" }, - { SDLK_WORLD_81, "world 81" }, - { SDLK_WORLD_82, "world 82" }, - { SDLK_WORLD_83, "world 83" }, - { SDLK_WORLD_84, "world 84" }, - { SDLK_WORLD_85, "world 85" }, - { SDLK_WORLD_86, "world 86" }, - { SDLK_WORLD_87, "world 87" }, - { SDLK_WORLD_88, "world 88" }, - { SDLK_WORLD_89, "world 89" }, - { SDLK_WORLD_90, "world 90" }, - { SDLK_WORLD_91, "world 91" }, - { SDLK_WORLD_92, "world 92" }, - { SDLK_WORLD_93, "world 93" }, - { SDLK_WORLD_94, "world 94" }, - { SDLK_WORLD_95, "world 95" }, -*/ + +#if SDL_VERSION_ATLEAST(2, 0, 0) + { SDLK_KP_0, "Numpad 0", "Num0" }, + { SDLK_KP_1, "Numpad 1", "Num1" }, + { SDLK_KP_2, "Numpad 2", "Num2" }, + { SDLK_KP_3, "Numpad 3", "Num3" }, + { SDLK_KP_4, "Numpad 4", "Num4" }, + { SDLK_KP_5, "Numpad 5", "Num5" }, + { SDLK_KP_6, "Numpad 6", "Num6" }, + { SDLK_KP_7, "Numpad 7", "Num7" }, + { SDLK_KP_8, "Numpad 8", "Num8" }, + { SDLK_KP_9, "Numpad 9", "Num9" }, +#else { SDLK_KP0, "Numpad 0", "Num0" }, { SDLK_KP1, "Numpad 1", "Num1" }, { SDLK_KP2, "Numpad 2", "Num2" }, @@ -218,6 +133,8 @@ static SKeycodeMapping keycodeMapping[] = { SDLK_KP7, "Numpad 7", "Num7" }, { SDLK_KP8, "Numpad 8", "Num8" }, { SDLK_KP9, "Numpad 9", "Num9" }, +#endif + { SDLK_KP_PERIOD, "Numpad .", "NumPoint" }, { SDLK_KP_DIVIDE, "Numpad /", "NumDivide" }, { SDLK_KP_MULTIPLY, "Numpad *", "NumMultiply" }, @@ -252,29 +169,55 @@ static SKeycodeMapping keycodeMapping[] = { SDLK_F14, "F14", 0 }, { SDLK_F15, "F15", 0 }, +#if SDL_VERSION_ATLEAST(2, 0, 0) + { SDLK_NUMLOCKCLEAR, "Num Lock", "NumLock" }, +#else { SDLK_NUMLOCK, "Num Lock", "NumLock" }, +#endif + { SDLK_CAPSLOCK, "Caps Lock", "CapsLock" }, + +#if SDL_VERSION_ATLEAST(2, 0, 0) + { SDLK_SCROLLLOCK, "Scroll Lock", "ScrlLock" }, +#else { SDLK_SCROLLOCK, "Scroll Lock", "ScrlLock" }, +#endif + { SDLK_RSHIFT, "Right Shift", "RightShift" }, { SDLK_LSHIFT, "Left Shift", "LeftShift" }, { SDLK_RCTRL, "Right Ctrl", "RightCtrl" }, { SDLK_LCTRL, "Left Ctrl", "LeftCtrl" }, { SDLK_RALT, "Right Alt", "RightAlt" }, { SDLK_LALT, "Left Alt", "LeftAlt" }, - { SDLK_RMETA, "Right Meta", 0 }, // ? - { SDLK_LMETA, "Left Meta", 0 }, // ? + +#if SDL_VERSION_ATLEAST(2, 0, 0) + { SDLK_LGUI, "Left Super", "LeftWin" }, /* "Windows" keys */ + { SDLK_RGUI, "Right Super", "RightWin" }, +#else { SDLK_LSUPER, "Left Super", "LeftWin" }, /* "Windows" keys */ { SDLK_RSUPER, "Right Super", "RightWin" }, +#endif + { SDLK_MODE, "Alt Gr", "AltGr" }, - { SDLK_COMPOSE, "Compose", 0 }, // ? { SDLK_HELP, "Help", 0 }, // ? + +#if SDL_VERSION_ATLEAST(2, 0, 0) + { SDLK_PRINTSCREEN, "Print Screen", "PrtSc" }, +#else { SDLK_PRINT, "Print Screen", "PrtSc" }, +#endif + { SDLK_SYSREQ, "SysRq", 0 }, + +#if SDL_VERSION_ATLEAST(2, 0, 0) + { SDLK_STOP, "Break", 0 }, +#else { SDLK_BREAK, "Break", 0 }, +#endif + { SDLK_MENU, "Menu", 0 }, // ? { SDLK_POWER, "Power", 0 }, // ? - { SDLK_EURO, "Euro", 0 }, { SDLK_UNDO, "Undo", 0 }, // ? { MOUSE_LEFT, "Left Mouse Button", "MouseLeft" }, { MOUSE_RIGHT, "Right Mouse Button", "MouseRight" }, @@ -286,7 +229,6 @@ static SKeycodeMapping keycodeMapping[] = { UNIFIED_SHIFT, "Shift", "AnyShift" }, { UNIFIED_CTRL, "Ctrl", "AnyCtrl" }, { UNIFIED_ALT, "Alt", "AnyAlt" }, - { UNIFIED_META, "Meta", "AnyMeta" }, { UNIFIED_SUPER, "Super", "AnyWindows" }, { 0, 0, 0 }, }; diff --git a/source/ps/KeyName.h b/source/ps/KeyName.h index 28444d4703..6fbcbbee99 100644 --- a/source/ps/KeyName.h +++ b/source/ps/KeyName.h @@ -39,12 +39,23 @@ enum { MOUSE_LEFT = CUSTOM_SDL_KEYCODE + SDL_BUTTON_LEFT, MOUSE_RIGHT = CUSTOM_SDL_KEYCODE + SDL_BUTTON_RIGHT, MOUSE_MIDDLE = CUSTOM_SDL_KEYCODE + SDL_BUTTON_MIDDLE, + +#if SDL_VERSION_ATLEAST(2, 0, 0) + // SDL2 doesn't count wheels as buttons, so just give them the next sequential IDs + MOUSE_X1 = CUSTOM_SDL_KEYCODE + SDL_BUTTON_X1, + MOUSE_X2 = CUSTOM_SDL_KEYCODE + SDL_BUTTON_X2, + MOUSE_WHEELUP, + MOUSE_WHEELDOWN, +#elif SDL_VERSION_ATLEAST(1, 2, 13) + // SDL 1.2 defines wheel buttons before X1/X2 buttons MOUSE_WHEELUP = CUSTOM_SDL_KEYCODE + SDL_BUTTON_WHEELUP, MOUSE_WHEELDOWN = CUSTOM_SDL_KEYCODE + SDL_BUTTON_WHEELDOWN, -#if SDL_VERSION_ATLEAST(1, 2, 13) MOUSE_X1 = CUSTOM_SDL_KEYCODE + SDL_BUTTON_X1, MOUSE_X2 = CUSTOM_SDL_KEYCODE + SDL_BUTTON_X2, #else + // SDL <1.2.13 doesn't support X1/X2 buttons, so define them manually + MOUSE_WHEELUP = CUSTOM_SDL_KEYCODE + SDL_BUTTON_WHEELUP, + MOUSE_WHEELDOWN = CUSTOM_SDL_KEYCODE + SDL_BUTTON_WHEELDOWN, MOUSE_X1 = CUSTOM_SDL_KEYCODE + SDL_BUTTON_WHEELDOWN + 1, MOUSE_X2 = CUSTOM_SDL_KEYCODE + SDL_BUTTON_WHEELDOWN + 2, #endif @@ -53,7 +64,6 @@ enum { UNIFIED_SHIFT, UNIFIED_CTRL, UNIFIED_ALT, - UNIFIED_META, UNIFIED_SUPER, UNIFIED_LAST }; diff --git a/source/ps/ProfileViewer.cpp b/source/ps/ProfileViewer.cpp index 24377e4fd4..24e7224063 100644 --- a/source/ps/ProfileViewer.cpp +++ b/source/ps/ProfileViewer.cpp @@ -302,10 +302,10 @@ InReaction CProfileViewer::Input(const SDL_Event_* ev) if (!m->profileVisible) break; - u16 k = ev->ev.key.keysym.unicode; - if (k >= '0' && k <= '9') + int k = ev->ev.key.keysym.sym; + if (k >= SDLK_0 && k <= SDLK_9) { - m->NavigateTree(k - '0'); + m->NavigateTree(k - SDLK_0); return IN_HANDLED; } break; diff --git a/source/ps/VideoMode.cpp b/source/ps/VideoMode.cpp index 195e257863..b342b68425 100644 --- a/source/ps/VideoMode.cpp +++ b/source/ps/VideoMode.cpp @@ -22,6 +22,7 @@ #include "graphics/Camera.h" #include "graphics/GameView.h" #include "gui/GUIManager.h" +#include "lib/config2.h" #include "lib/ogl.h" #include "lib/external_libraries/libsdl.h" #include "lib/sysdep/gfx.h" @@ -41,7 +42,7 @@ static int DEFAULT_FULLSCREEN_H = 768; CVideoMode g_VideoMode; CVideoMode::CVideoMode() : - m_IsInitialised(false), + m_IsInitialised(false), m_Window(NULL), m_PreferredW(0), m_PreferredH(0), m_PreferredBPP(0), m_PreferredFreq(0), m_ConfigW(0), m_ConfigH(0), m_ConfigBPP(0), m_ConfigFullscreen(false), m_ConfigForceS3TCEnable(true), m_WindowedW(DEFAULT_WINDOW_W), m_WindowedH(DEFAULT_WINDOW_H) @@ -64,6 +65,48 @@ void CVideoMode::ReadConfig() bool CVideoMode::SetVideoMode(int w, int h, int bpp, bool fullscreen) { +#if SDL_VERSION_ATLEAST(2, 0, 0) + Uint32 flags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN; + if (fullscreen) + flags |= SDL_WINDOW_FULLSCREEN; + else + flags |= SDL_WINDOW_RESIZABLE; + + m_Window = SDL_CreateWindow("0 A.D.", 0, 0, w, h, flags); + if (!m_Window) + { + LOGERROR(L"SetVideoMode failed in SDL_CreateWindow: %dx%d:%d %d (\"%hs\")", + w, h, bpp, fullscreen ? 1 : 0, SDL_GetError()); + return false; + // TODO: fall back to windowed mode + } + + if (SDL_SetWindowDisplayMode(m_Window, NULL) < 0) + { + LOGERROR(L"SetVideoMode failed in SDL_SetWindowDisplayMode: %dx%d:%d %d (\"%hs\")", + w, h, bpp, fullscreen ? 1 : 0, SDL_GetError()); + return false; + } + + SDL_GLContext context = SDL_GL_CreateContext(m_Window); + if (!context) + { + LOGERROR(L"SetVideoMode failed in SDL_GL_CreateContext: %dx%d:%d %d (\"%hs\")", + w, h, bpp, fullscreen ? 1 : 0, SDL_GetError()); + return false; + } + + // Grab the current video settings + SDL_GetWindowSize(m_Window, &m_CurrentW, &m_CurrentH); + m_CurrentBPP = bpp; + + if (fullscreen) + SDL_SetWindowGrab(m_Window, SDL_TRUE); + else + SDL_SetWindowGrab(m_Window, SDL_FALSE); + +#else // SDL 1.2: + Uint32 flags = SDL_OPENGL; if (fullscreen) flags |= SDL_FULLSCREEN; @@ -92,18 +135,19 @@ bool CVideoMode::SetVideoMode(int w, int h, int bpp, bool fullscreen) } } - if (fullscreen) - SDL_WM_GrabInput(SDL_GRAB_ON); - else - SDL_WM_GrabInput(SDL_GRAB_OFF); - - m_IsFullscreen = fullscreen; - // Grab the current video settings m_CurrentW = screen->w; m_CurrentH = screen->h; m_CurrentBPP = screen->format->BitsPerPixel; + if (fullscreen) + SDL_WM_GrabInput(SDL_GRAB_ON); + else + SDL_WM_GrabInput(SDL_GRAB_OFF); +#endif + + m_IsFullscreen = fullscreen; + g_xres = m_CurrentW; g_yres = m_CurrentH; @@ -160,6 +204,12 @@ bool CVideoMode::InitSDL() SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, g_VSync ? 1 : 0); #endif +#if CONFIG2_GLES + // Require GLES 2.0 + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); +#endif + if (!SetVideoMode(w, h, bpp, m_ConfigFullscreen)) { // Fall back to a smaller depth buffer @@ -187,8 +237,15 @@ bool CVideoMode::InitSDL() ogl_Init(); // required after each mode change // (TODO: does that mean we need to call this when toggling fullscreen later?) +#if SDL_VERSION_ATLEAST(2, 0, 0) + u16 ramp[256]; + SDL_CalculateGammaRamp(g_Gamma, ramp); + if (SDL_SetWindowGammaRamp(m_Window, ramp, ramp, ramp) < 0) + LOGWARNING(L"SDL_SetGamma failed"); +#else if (SDL_SetGamma(g_Gamma, g_Gamma, g_Gamma) < 0) LOGWARNING(L"SDL_SetGamma failed"); +#endif m_IsInitialised = true; @@ -410,3 +467,9 @@ int CVideoMode::GetDesktopFreq() ENSURE(m_IsInitialised); return m_PreferredFreq; } + +SDL_Window* CVideoMode::GetWindow() +{ + ENSURE(m_IsInitialised); + return m_Window; +} diff --git a/source/ps/VideoMode.h b/source/ps/VideoMode.h index 4ce27974be..4b6452fb33 100644 --- a/source/ps/VideoMode.h +++ b/source/ps/VideoMode.h @@ -18,6 +18,8 @@ #ifndef INCLUDED_VIDEOMODE #define INCLUDED_VIDEOMODE +typedef struct SDL_Window SDL_Window; + class CVideoMode { public: @@ -71,6 +73,8 @@ public: int GetDesktopBPP(); int GetDesktopFreq(); + SDL_Window* GetWindow(); + private: void ReadConfig(); int GetBestBPP(); @@ -84,6 +88,8 @@ private: */ bool m_IsInitialised; + SDL_Window* m_Window; + // Initial desktop settings int m_PreferredW; int m_PreferredH; diff --git a/source/tools/atlas/GameInterface/Handlers/MiscHandlers.cpp b/source/tools/atlas/GameInterface/Handlers/MiscHandlers.cpp index 11ff34d13d..d6af053dc1 100644 --- a/source/tools/atlas/GameInterface/Handlers/MiscHandlers.cpp +++ b/source/tools/atlas/GameInterface/Handlers/MiscHandlers.cpp @@ -181,7 +181,11 @@ MESSAGEHANDLER(GuiKeyEvent) { SDL_Event_ ev = { { 0 } }; ev.ev.type = msg->pressed ? SDL_KEYDOWN : SDL_KEYUP; +#if SDL_VERSION_ATLEAST(2, 0, 0) + ev.ev.key.keysym.sym = (SDL_Keycode)(int)msg->sdlkey; +#else ev.ev.key.keysym.sym = (SDLKey)(int)msg->sdlkey; +#endif ev.ev.key.keysym.unicode = msg->unichar; in_dispatch_event(&ev); } @@ -194,7 +198,11 @@ MESSAGEHANDLER(GuiCharEvent) SDL_Event_ ev = { { 0 } }; ev.ev.type = SDL_KEYDOWN; +#if SDL_VERSION_ATLEAST(2, 0, 0) + ev.ev.key.keysym.sym = (SDL_Keycode)(int)msg->sdlkey; +#else ev.ev.key.keysym.sym = (SDLKey)(int)msg->sdlkey; +#endif ev.ev.key.keysym.unicode = msg->unichar; in_dispatch_event(&ev);