Update the SDL port to SDL2

SDL2 is a much closer match to the other platform code, and
allows the creation of OpenGL 3 core contexts, which is
now required.
epoxy
Günther Brammer 2016-02-06 15:44:19 +01:00
parent 1010732ba8
commit 934b519bb4
11 changed files with 318 additions and 187 deletions

View File

@ -300,11 +300,11 @@ if(Audio_FOUND)
endif()
# SDL
if(USE_SDL_MAINLOOP OR (Audio_TK STREQUAL "SDL_Mixer"))
find_package(SDL)
SET(HAVE_SDL ${SDL_FOUND})
include_directories(${SDL_INCLUDE_DIR})
if(USE_SDL_MAINLOOP)
find_package(SDL2 REQUIRED)
include_directories(${SDL2_INCLUDE_DIRS})
endif()
set(HAVE_SDL ${SDL2_FOUND})
############################################################################
# generated source files
@ -1093,7 +1093,7 @@ target_link_libraries(openclonk
${PNG_LIBRARIES}
${JPEG_LIBRARIES}
${EXECINFO_LIBRARY}
${SDL_LIBRARY}
${SDL2_LIBRARIES}
${Audio_LIBRARIES}
${GETOPT_LIBRARIES}
${GLEW_LIBRARIES}

View File

@ -82,19 +82,12 @@ macro(__FINDAUDIO_FINDOPENAL)
endif()
endmacro()
macro(__FINDAUDIO_FINDSDLMIXER)
find_package(PkgConfig QUIET)
if(PKG_CONFIG_FOUND)
pkg_check_modules(SDLMixer "SDL_mixer>=1.2.11")
endif()
endmacro()
if(Audio_TK)
# Already chosen, don't do anything
else()
# Test for OpenAL
__FINDAUDIO_FINDOPENAL()
__FINDAUDIO_FINDSDLMIXER()
find_package(SDL2Mixer)
if(OpenAL_FOUND AND Alut_FOUND AND OggVorbis_FOUND)
# Prefer OpenAL

View File

@ -0,0 +1,31 @@
# OpenClonk, http://www.openclonk.org
#
# Copyright (c) 2016, The OpenClonk Team and contributors
#
# Distributed under the terms of the ISC license; see accompanying file
# "COPYING" for details.
#
# "Clonk" is a registered trademark of Matthes Bender, used with permission.
# See accompanying file "TRADEMARK" for details.
#
# To redistribute this file separately, substitute the full license texts
# for the above references.
# Locate SDL2.
# This module defines
# SDL2_INCLUDE_DIRS - a list of directories that need to be added to the include path
# SDL2_LIBRARIES - a list of libraries to link against to use SDL2
# SDL2_FOUND - if false, SDL2 cannot be used
find_path(SDL2_INCLUDE_DIR SDL.h PATH_SUFFIXES SDL2 HINTS ENV SDL2DIR)
mark_as_advanced(SDL2_INCLUDE_DIR)
find_library(SDL2_LIBRARY SDL2 HINTS ENV SDL2DIR)
mark_as_advanced(SDL2_LIBRARY)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(SDL2 REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR)
if (SDL2_FOUND)
set(SDL2_LIBRARIES "${SDL2_LIBRARY}")
set(SDL2_INCLUDE_DIRS "${SDL2_INCLUDE_DIR}")
endif()

View File

@ -0,0 +1,37 @@
# OpenClonk, http://www.openclonk.org
#
# Copyright (c) 2016, The OpenClonk Team and contributors
#
# Distributed under the terms of the ISC license; see accompanying file
# "COPYING" for details.
#
# "Clonk" is a registered trademark of Matthes Bender, used with permission.
# See accompanying file "TRADEMARK" for details.
#
# To redistribute this file separately, substitute the full license texts
# for the above references.
# Locate SDL_Mixer 2.
# This module defines
# SDL2Mixer_INCLUDE_DIRS - a list of directories that need to be added to the include path
# SDL2Mixer_LIBRARIES - a list of libraries to link against to use SDL2
# SDL2Mixer_FOUND - if false, SDL2 cannot be used
if(SDL2Mixer_FIND_QUIETLY)
set(_FIND_SDL2_ARG QUIET)
endif()
find_package(SDL2 ${_FIND_SDL2_ARG})
find_path(SDL2Mixer_INCLUDE_DIR SDL_mixer.h PATH_SUFFIXES SDL2 HINTS ENV SDL2DIR)
mark_as_advanced(SDL2Mixer_INCLUDE_DIR)
find_library(SDL2Mixer_LIBRARY SDL2_mixer HINTS ENV SDL2DIR)
mark_as_advanced(SDL2Mixer_LIBRARY)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(SDL2Mixer REQUIRED_VARS SDL2Mixer_LIBRARY SDL2Mixer_INCLUDE_DIR
SDL2_LIBRARIES SDL2_INCLUDE_DIRS)
if (SDL2Mixer_FOUND)
set(SDL2Mixer_LIBRARIES ${SDL2Mixer_LIBRARY} ${SDL2_LIBRARIES})
set(SDL2Mixer_INCLUDE_DIRS ${SDL2Mixer_INCLUDE_DIR} ${SDL2_INCLUDE_DIRS})
endif()

View File

@ -577,7 +577,11 @@ bool C4ConsoleGUI::ClearLog() {return 0;}
void C4ConsoleGUI::ClearNetMenu() {}
void C4ConsoleGUI::ClearPlayerMenu() {}
void C4ConsoleGUI::ClearViewportMenu() {}
C4Window * C4ConsoleGUI::CreateConsoleWindow(C4AbstractApp*) { return this; }
C4Window * C4ConsoleGUI::CreateConsoleWindow(C4AbstractApp * pApp)
{
C4Rect r(0, 0, 400, 350);
return C4Window::Init(C4Window::W_Console, pApp, LoadResStr("IDS_CNS_CONSOLE"), &r);
}
void C4ConsoleGUI::DisplayInfoText(C4ConsoleGUI::InfoTextType, StdStrBuf&) {}
void C4ConsoleGUI::DoEnableControls(bool) {}
bool C4ConsoleGUI::DoUpdateHaltCtrls(bool) {return 0;}

View File

@ -127,6 +127,8 @@ protected:
HDC hDC; // device context handle
#elif defined(USE_GTK)
/*GLXContext*/void * ctx;
#elif defined(USE_SDL_MAINLOOP)
void * ctx;
#endif
// Global list of all OpenGL contexts in use

View File

@ -580,6 +580,8 @@ CStdGLCtx::CStdGLCtx(): pWindow(0), this_context(contexts.end()) { }
void CStdGLCtx::Clear(bool multisample_change)
{
SDL_GL_DeleteContext(ctx);
ctx = 0;
pWindow = 0;
if (this_context != contexts.end())
@ -595,6 +597,7 @@ bool CStdGLCtx::Init(C4Window * pWindow, C4AbstractApp *)
if (!pGL) return false;
// store window
this->pWindow = pWindow;
ctx = SDL_GL_CreateContext(pWindow->window);
// No luck at all?
if (!Select(true)) return pGL->Error(" gl: Unable to select context");
// init extensions
@ -612,6 +615,7 @@ bool CStdGLCtx::Init(C4Window * pWindow, C4AbstractApp *)
bool CStdGLCtx::Select(bool verbose)
{
SDL_GL_MakeCurrent(pWindow->window, ctx);
SelectCommon();
// update clipper - might have been done by UpdateSize
// however, the wrong size might have been assumed
@ -638,7 +642,7 @@ bool CStdGLCtx::PageFlip()
// flush GL buffer
glFlush();
if (!pWindow) return false;
SDL_GL_SwapBuffers();
SDL_GL_SwapWindow(pWindow->window);
return true;
}

View File

@ -34,31 +34,6 @@
#ifdef USE_SDL_MAINLOOP
#include <SDL.h>
#include <string>
#include <vector>
#include <SDL_keysym.h>
namespace
{
std::string getKeyName(C4KeyCode k)
{
std::string result = SDL_GetKeyName(static_cast<SDLKey>(k));
// unknown key
if (result == "unknown key")
result = FormatString("\\x%x", (DWORD) k).getData();
// some special cases
if (result == "world 0") result = "´";
if (result == "world 1") result = "ß";
if (result == "world 2") result = "Ü";
if (result == "world 3") result = "Ä";
if (result == "world 4") result = "Ö";
// capitalize first letter
result[0] = toupper(result[0]);
// return key name
return result;
}
}
#endif
/* ----------------- Key maps ------------------ */
@ -102,7 +77,9 @@ struct C4KeyCodeMapEntry
const char *szShortName;
};
#if defined(USE_WIN32_WINDOWS) || defined(USE_GTK)
#if defined(USE_COCOA)
#include "CocoaKeycodeMap.h"
#else
const C4KeyCodeMapEntry KeyCodeMap[] = {
{K_ESCAPE, "Escape", "Esc"},
{K_1, "1", NULL},
@ -211,8 +188,6 @@ const C4KeyCodeMapEntry KeyCodeMap[] = {
{K_PRINT, "Print", NULL},
{0x00, NULL, NULL}
};
#elif defined(USE_COCOA)
#include "CocoaKeycodeMap.h"
#endif
void C4KeyCodeEx::FixShiftKeys()
@ -331,7 +306,6 @@ C4KeyCode C4KeyCodeEx::String2KeyCode(const StdStrBuf &sName)
}
}
#if defined(USE_WIN32_WINDOWS) || defined(USE_COCOA) || defined(USE_GTK)
// query map
const C4KeyCodeMapEntry *pCheck = KeyCodeMap;
while (pCheck->szName) {
@ -340,17 +314,11 @@ C4KeyCode C4KeyCodeEx::String2KeyCode(const StdStrBuf &sName)
}
++pCheck;
}
return KEY_Undefined;
#elif defined(USE_SDL_MAINLOOP)
for (C4KeyCode k = 0; k < SDLK_LAST; ++k)
{
if (SEqualNoCase(sName.getData(), getKeyName(k).c_str()))
return k;
}
return KEY_Undefined;
#else
return KEY_Undefined;
#if defined(USE_SDL_MAINLOOP)
SDL_Scancode s = SDL_GetScancodeFromName(sName.getData());
if (s != SDL_SCANCODE_UNKNOWN) return s;
#endif
return KEY_Undefined;
}
StdStrBuf C4KeyCodeEx::KeyCode2String(C4KeyCode wCode, bool fHumanReadable, bool fShort)
@ -465,7 +433,10 @@ StdStrBuf C4KeyCodeEx::KeyCode2String(C4KeyCode wCode, bool fHumanReadable, bool
return buf;
}
#elif defined(USE_SDL_MAINLOOP)
return StdStrBuf(getKeyName(wCode).c_str());
StdStrBuf buf;
buf.Copy(SDL_GetScancodeName(static_cast<SDL_Scancode>(wCode)));
if (!buf.getLength()) buf.Format("\\x%x", wCode);
return buf;
#endif
return FormatString("$%x", static_cast<unsigned int>(wCode));
}

View File

@ -27,7 +27,7 @@
#include <C4Application.h>
#include <C4Gui.h>
#include <C4GamePadCon.h>
// SDL version
#include <C4Version.h>
static void sdlToC4MCBtn(const SDL_MouseButtonEvent &e, int32_t& button, DWORD& flags)
{
@ -79,14 +79,14 @@ static void sdlToC4MCBtn(const SDL_MouseButtonEvent &e, int32_t& button, DWORD&
else
button = C4MC_Button_MiddleUp;
break;
case SDL_BUTTON_WHEELUP:
/*case SDL_BUTTON_WHEELUP:
button = C4MC_Button_Wheel;
flags = (+32) << 16;
break;
case SDL_BUTTON_WHEELDOWN:
button = C4MC_Button_Wheel;
flags = (-32) << 16;
break;
break;*/
}
lastX = e.x;
lastY = e.y;
@ -122,8 +122,7 @@ bool C4AbstractApp::Init(int argc, char * argv[])
return false;
}
SDL_EnableUNICODE(1);
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
//SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
// Custom initialization
return DoInit (argc, argv);
@ -163,24 +162,12 @@ void C4AbstractApp::HandleSDLEvent(SDL_Event& e)
case SDL_QUIT:
Quit();
break;
case SDL_TEXTINPUT:
::pGUI->CharIn(e.text.text);
break;
case SDL_KEYDOWN:
{
#ifndef USE_CONSOLE
if (e.key.keysym.sym == SDLK_f && (e.key.keysym.mod & (KMOD_LMETA | KMOD_RMETA)))
{
Config.Graphics.Windowed = !Config.Graphics.Windowed;
Application.SetVideoMode(Config.Graphics.ResX, Config.Graphics.ResY, Config.Graphics.RefreshRate, Config.Graphics.Monitor, !Config.Graphics.Windowed);
pDraw->InvalidateDeviceObjects();
pDraw->RestoreDeviceObjects();
break;
}
#endif
StdStrBuf c;
c.AppendCharacter(e.key.keysym.unicode);
::pGUI->CharIn(c.getData());
Game.DoKeyboardInput(e.key.keysym.sym, KEYEV_Down,
Game.DoKeyboardInput(e.key.keysym.scancode, KEYEV_Down,
e.key.keysym.mod & (KMOD_LALT | KMOD_RALT),
e.key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL),
e.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT),
@ -188,7 +175,7 @@ void C4AbstractApp::HandleSDLEvent(SDL_Event& e)
break;
}
case SDL_KEYUP:
Game.DoKeyboardInput(e.key.keysym.sym, KEYEV_Up,
Game.DoKeyboardInput(e.key.keysym.scancode, KEYEV_Up,
e.key.keysym.mod & (KMOD_LALT | KMOD_RALT),
e.key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL),
e.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT), false, NULL);
@ -211,87 +198,120 @@ void C4AbstractApp::HandleSDLEvent(SDL_Event& e)
Application.pGamePadControl->FeedEvent(e);
break;
}
#ifdef __APPLE__
MacUtility::ensureWindowInFront();
#endif
}
static int modeCount = 0;
bool C4AbstractApp::GetIndexedDisplayMode(int32_t iIndex, int32_t *piXRes, int32_t *piYRes, int32_t *piBitDepth, int32_t *piRefreshRate, uint32_t iMonitor)
{
// No support for multiple monitors.
if (iMonitor != 0)
return false;
static SDL_Rect** modes = 0;
static int modeCount = 0;
if (!modes)
if (!modeCount)
{
modes = SDL_ListModes(NULL, SDL_OPENGL | SDL_FULLSCREEN);
// -1 means "all modes allowed". Clonk is not prepared
// for this; should probably give some random resolutions
// then.
assert(reinterpret_cast<intptr_t>(modes) != -1);
if (!modes)
modeCount = 0;
else
// Count available modes.
for (SDL_Rect** iter = modes; *iter; ++iter)
++modeCount;
modeCount = SDL_GetNumDisplayModes(iMonitor);
}
if (iIndex >= modeCount)
return false;
*piXRes = modes[iIndex]->w;
*piYRes = modes[iIndex]->h;
*piBitDepth = SDL_GetVideoInfo()->vfmt->BitsPerPixel;
SDL_DisplayMode mode;
SDL_GetDisplayMode(iMonitor, iIndex, &mode);
*piXRes = mode.w;
*piYRes = mode.h;
*piBitDepth = SDL_BITSPERPIXEL(mode.format);
*piRefreshRate = mode.refresh_rate;
return true;
}
bool C4AbstractApp::SetVideoMode(int iXRes, int iYRes, unsigned int RefreshRate, unsigned int iMonitor, bool fFullScreen)
{
//RECT r;
//pWindow->GetSize(&r);
// FIXME: optimize redundant calls away. maybe make all platforms implicitely call SetVideoMode in C4Window::Init?
// SDL doesn't support multiple monitors.
if (!SDL_SetVideoMode(iXRes == -1 ? 0 : iXRes, iYRes == -1 ? 0 : iYRes, C4Draw::COLOR_DEPTH,
SDL_OPENGL | (fFullScreen ? SDL_FULLSCREEN : 0)))
int res;
if (!fFullScreen)
{
sLastError.Copy(SDL_GetError());
return false;
res = SDL_SetWindowFullscreen(pWindow->window, 0);
if (res)
{
LogF("SDL_SetWindowFullscreen: %s", SDL_GetError());
return false;
}
if (iXRes != -1)
pWindow->SetSize(iXRes, iYRes);
C4Rect r;
pWindow->GetSize(&r);
OnResolutionChanged(r.Wdt, r.Hgt);
return true;
}
SDL_ShowCursor(SDL_DISABLE);
const SDL_VideoInfo * info = SDL_GetVideoInfo();
OnResolutionChanged(info->current_w, info->current_h);
return true;
SDL_DisplayMode mode;
if (iXRes < 0 || iYRes < 0)
{
res = SDL_SetWindowFullscreen(pWindow->window, SDL_WINDOW_FULLSCREEN_DESKTOP);
if (res)
{
LogF("SDL_SetWindowFullscreen: %s", SDL_GetError());
return false;
}
res = SDL_GetDesktopDisplayMode(iMonitor, &mode);
if (res)
{
LogF("SDL_GetDesktopDisplayMode: %s", SDL_GetError());
return false;
}
OnResolutionChanged(mode.w, mode.h);
return true;
}
for (int i = 0; i < modeCount; ++i)
{
res = SDL_GetDisplayMode(iMonitor, i, &mode);
if (res)
{
LogF("SDL_GetDisplayMode: %s", SDL_GetError());
return false;
}
if (mode.w == iXRes && mode.h == iYRes && mode.refresh_rate == RefreshRate && SDL_BITSPERPIXEL(mode.format) == C4Draw::COLOR_DEPTH)
{
res = SDL_SetWindowDisplayMode(pWindow->window, &mode);
if (res)
{
LogF("SDL_SetWindowDisplayMode: %s", SDL_GetError());
return false;
}
res = SDL_SetWindowFullscreen(pWindow->window, SDL_WINDOW_FULLSCREEN);
if (res)
{
LogF("SDL_SetWindowFullscreen: %s", SDL_GetError());
return false;
}
OnResolutionChanged(mode.w, mode.h);
return true;
}
}
return false;
}
void C4AbstractApp::RestoreVideoMode()
{
if (pWindow && pWindow->window)
SDL_SetWindowFullscreen(pWindow->window, 0);
}
// For Max OS X, the implementation resides in StdMacApp.mm
#ifndef __APPLE__
// stubs
bool C4AbstractApp::Copy(const StdStrBuf & text, bool fClipboard)
{
return false;
return SDL_SetClipboardText(text.getData()) == 0;
}
StdStrBuf C4AbstractApp::Paste(bool fClipboard)
{
return StdStrBuf("");
char * text = SDL_GetClipboardText();
StdStrBuf buf;
buf.Copy(text);
SDL_free(text);
return buf;
}
bool C4AbstractApp::IsClipboardFull(bool fClipboard)
{
return false;
return SDL_HasClipboardText();
}
void C4AbstractApp::MessageDialog(const char * message)
{
SDL_ShowSimpleMessageBox(0, C4ENGINECAPTION, message, pWindow ? pWindow->window : 0);
}
#endif

View File

@ -172,53 +172,111 @@
#elif defined(USE_SDL_MAINLOOP)
#include <SDL.h>
#define K_SHIFT_L SDLK_LSHIFT
#define K_SHIFT_R SDLK_RSHIFT
#define K_CONTROL_L SDLK_LCTRL
#define K_CONTROL_R SDLK_RCTRL
#define K_ALT_L SDLK_LALT
#define K_ALT_R SDLK_RALT
#define K_F1 SDLK_F1
#define K_F2 SDLK_F2
#define K_F3 SDLK_F3
#define K_F4 SDLK_F4
#define K_F5 SDLK_F5
#define K_F6 SDLK_F6
#define K_F7 SDLK_F7
#define K_F8 SDLK_F8
#define K_F9 SDLK_F9
#define K_F10 SDLK_F10
#define K_F11 SDLK_F11
#define K_F12 SDLK_F12
#define K_ADD SDLK_KP_PLUS
#define K_SUBTRACT SDLK_KP_MINUS
#define K_MULTIPLY SDLK_KP_MULTIPLY
#define K_ESCAPE SDLK_ESCAPE
#define K_PAUSE SDLK_PAUSE
#define K_TAB SDLK_TAB
#define K_RETURN SDLK_RETURN
#define K_DELETE SDLK_DELETE
#define K_INSERT SDLK_INSERT
#define K_BACK SDLK_BACKSPACE
#define K_SPACE SDLK_SPACE
#define K_UP SDLK_UP
#define K_DOWN SDLK_DOWN
#define K_LEFT SDLK_LEFT
#define K_RIGHT SDLK_RIGHT
#define K_HOME SDLK_HOME
#define K_END SDLK_END
#define K_SCROLL SDLK_SCROLLOCK
#define K_MENU SDLK_MENU
#define K_PAGEUP SDLK_PAGEUP
#define K_PAGEDOWN SDLK_PAGEDOWN
#define K_M SDLK_m
#define K_T SDLK_t
#define K_W SDLK_w
#define K_I SDLK_i
#define K_C SDLK_c
#define K_V SDLK_v
#define K_X SDLK_x
#define K_A SDLK_a
#define K_SHIFT_L SDL_SCANCODE_LSHIFT
#define K_SHIFT_R SDL_SCANCODE_RSHIFT
#define K_CONTROL_L SDL_SCANCODE_LCTRL
#define K_CONTROL_R SDL_SCANCODE_RCTRL
#define K_ALT_L SDL_SCANCODE_LALT
#define K_ALT_R SDL_SCANCODE_RALT
#define K_F1 SDL_SCANCODE_F1
#define K_F2 SDL_SCANCODE_F2
#define K_F3 SDL_SCANCODE_F3
#define K_F4 SDL_SCANCODE_F4
#define K_F5 SDL_SCANCODE_F5
#define K_F6 SDL_SCANCODE_F6
#define K_F7 SDL_SCANCODE_F7
#define K_F8 SDL_SCANCODE_F8
#define K_F9 SDL_SCANCODE_F9
#define K_F10 SDL_SCANCODE_F10
#define K_F11 SDL_SCANCODE_F11
#define K_F12 SDL_SCANCODE_F12
#define K_ADD SDL_SCANCODE_KP_PLUS
#define K_SUBTRACT SDL_SCANCODE_KP_MINUS
#define K_MULTIPLY SDL_SCANCODE_KP_MULTIPLY
#define K_ESCAPE SDL_SCANCODE_ESCAPE
#define K_PAUSE SDL_SCANCODE_PAUSE
#define K_TAB SDL_SCANCODE_TAB
#define K_RETURN SDL_SCANCODE_RETURN
#define K_DELETE SDL_SCANCODE_DELETE
#define K_INSERT SDL_SCANCODE_INSERT
#define K_BACK SDL_SCANCODE_BACKSPACE
#define K_SPACE SDL_SCANCODE_SPACE
#define K_UP SDL_SCANCODE_UP
#define K_DOWN SDL_SCANCODE_DOWN
#define K_LEFT SDL_SCANCODE_LEFT
#define K_RIGHT SDL_SCANCODE_RIGHT
#define K_HOME SDL_SCANCODE_HOME
#define K_END SDL_SCANCODE_END
#define K_SCROLL SDL_SCANCODE_SCROLLLOCK
#define K_MENU SDL_SCANCODE_MENU
#define K_PAGEUP SDL_SCANCODE_PAGEUP
#define K_PAGEDOWN SDL_SCANCODE_PAGEDOWN
#define K_1 SDL_SCANCODE_1
#define K_2 SDL_SCANCODE_2
#define K_3 SDL_SCANCODE_3
#define K_4 SDL_SCANCODE_4
#define K_5 SDL_SCANCODE_5
#define K_6 SDL_SCANCODE_6
#define K_7 SDL_SCANCODE_7
#define K_8 SDL_SCANCODE_8
#define K_9 SDL_SCANCODE_9
#define K_0 SDL_SCANCODE_A
#define K_A SDL_SCANCODE_A
#define K_B SDL_SCANCODE_B
#define K_C SDL_SCANCODE_C
#define K_D SDL_SCANCODE_D
#define K_E SDL_SCANCODE_E
#define K_F SDL_SCANCODE_F
#define K_G SDL_SCANCODE_G
#define K_H SDL_SCANCODE_H
#define K_I SDL_SCANCODE_I
#define K_J SDL_SCANCODE_J
#define K_K SDL_SCANCODE_K
#define K_L SDL_SCANCODE_L
#define K_M SDL_SCANCODE_M
#define K_N SDL_SCANCODE_N
#define K_O SDL_SCANCODE_O
#define K_P SDL_SCANCODE_P
#define K_Q SDL_SCANCODE_Q
#define K_R SDL_SCANCODE_R
#define K_S SDL_SCANCODE_S
#define K_T SDL_SCANCODE_T
#define K_U SDL_SCANCODE_U
#define K_V SDL_SCANCODE_V
#define K_W SDL_SCANCODE_W
#define K_X SDL_SCANCODE_X
#define K_Y SDL_SCANCODE_Y
#define K_Z SDL_SCANCODE_Z
#define K_MINUS SDL_SCANCODE_MINUS
#define K_EQUAL SDL_SCANCODE_EQUALS
#define K_LEFT_BRACKET SDL_SCANCODE_LEFTBRACKET
#define K_RIGHT_BRACKET SDL_SCANCODE_RIGHTBRACKET
#define K_SEMICOLON SDL_SCANCODE_SEMICOLON
#define K_APOSTROPHE SDL_SCANCODE_APOSTROPHE
#define K_GRAVE_ACCENT SDL_SCANCODE_GRAVE
#define K_BACKSLASH SDL_SCANCODE_BACKSLASH
#define K_COMMA SDL_SCANCODE_COMMA
#define K_PERIOD SDL_SCANCODE_PERIOD
#define K_SLASH SDL_SCANCODE_SLASH
#define K_CAPS SDL_SCANCODE_CAPSLOCK
#define K_NUM SDL_SCANCODE_NUMLOCKCLEAR
#define K_NUM7 SDL_SCANCODE_KP_7
#define K_NUM8 SDL_SCANCODE_KP_8
#define K_NUM9 SDL_SCANCODE_KP_9
#define K_NUM4 SDL_SCANCODE_KP_4
#define K_NUM5 SDL_SCANCODE_KP_5
#define K_NUM6 SDL_SCANCODE_KP_6
#define K_NUM1 SDL_SCANCODE_KP_1
#define K_NUM2 SDL_SCANCODE_KP_2
#define K_NUM3 SDL_SCANCODE_KP_3
#define K_NUM0 SDL_SCANCODE_KP_0
#define K_DECIMAL SDL_SCANCODE_KP_PERIOD
#define K_86 SDL_SCANCODE_NONUSBACKSLASH
#define K_NUM_RETURN SDL_SCANCODE_KP_ENTER
#define K_DIVIDE SDL_SCANCODE_KP_DIVIDE
#define K_WIN_L SDL_SCANCODE_LGUI
#define K_WIN_R SDL_SCANCODE_RGUI
#define K_PRINT SDL_SCANCODE_PRINTSCREEN
#elif defined(USE_COCOA)
#import "ObjectiveCAssociated.h"
// FIXME
@ -337,6 +395,8 @@ public:
// Set by Init to the widget which is used as a
// render target, which can be the whole window.
/*GtkWidget*/void * render_widget;
#elif defined(USE_SDL_MAINLOOP)
SDL_Window * window;
#endif
#ifdef USE_WGL
HWND renderwnd;

View File

@ -42,19 +42,29 @@ C4Window::~C4Window ()
C4Window * C4Window::Init(WindowKind windowKind, C4AbstractApp * pApp, const char * Title, const C4Rect * size)
{
if (windowKind != W_Fullscreen)
return NULL;
Active = true;
// SDL doesn't support multiple monitors.
if (!SDL_SetVideoMode(Application.GetConfigWidth() == -1 ? 0 : Application.GetConfigWidth(),
Application.GetConfigHeight() == -1 ? 0 : Application.GetConfigHeight(),
C4Draw::COLOR_DEPTH, SDL_OPENGL | (Config.Graphics.Windowed ? 0 : SDL_FULLSCREEN)))
/* SDL_GL_MULTISAMPLEBUFFERS,
SDL_GL_MULTISAMPLESAMPLES,*/
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, /*REQUESTED_GL_CTX_MAJOR*/ 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, /*REQUESTED_GL_CTX_MINOR*/ 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, (Config.Graphics.DebugOpenGL ? SDL_GL_CONTEXT_DEBUG_FLAG : 0));
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
uint32_t flags = SDL_WINDOW_OPENGL;
if (windowKind == W_Fullscreen && size->Wdt == -1)
flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
else if (windowKind == W_Fullscreen)
flags |= SDL_WINDOW_FULLSCREEN;
window = SDL_CreateWindow(Title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, size->Wdt, size->Hgt, flags);
if (!window)
{
Log(SDL_GetError());
return 0;
}
Active = true;
SDL_ShowCursor(SDL_DISABLE);
SetTitle(Title);
return this;
}
@ -65,7 +75,11 @@ bool C4Window::ReInit(C4AbstractApp* pApp)
return false;
}
void C4Window::Clear() {}
void C4Window::Clear()
{
SDL_DestroyWindow(window);
window = 0;
}
void C4Window::EnumerateMultiSamples(std::vector<int>& samples) const
{
@ -82,18 +96,18 @@ bool C4Window::RestorePosition(const char *, const char *, bool) { return true;
bool C4Window::GetSize(C4Rect * pRect)
{
pRect->x = pRect->y = 0;
const SDL_VideoInfo * info = SDL_GetVideoInfo();
pRect->Wdt = info->current_w, pRect->Hgt = info->current_h;
SDL_GL_GetDrawableSize(window, &pRect->Wdt, &pRect->Hgt);
return true;
}
void C4Window::SetSize(unsigned int X, unsigned int Y)
{
SDL_SetWindowSize(window, X, Y);
}
void C4Window::SetTitle(const char * Title)
{
SDL_WM_SetCaption(Title, 0);
SDL_SetWindowTitle(window, Title);
}
void C4Window::RequestUpdate()
@ -102,11 +116,6 @@ void C4Window::RequestUpdate()
PerformUpdate();
}
// For Max OS X, the implementation resides in StdMacApp.mm
#ifndef __APPLE__
void C4Window::FlashWindow()
{
}
#endif