=== modified file 'driver/video/SDL/src/SDL.cpp' --- driver/video/SDL/src/SDL.cpp 2010-03-24 23:00:29 +0000 +++ driver/video/SDL/src/SDL.cpp 2010-03-28 20:53:50 +0000 @@ -191,9 +191,9 @@ // Videomodus setzen #ifdef _WIN32 - if(!(screen = SDL_SetVideoMode( width, height, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_OPENGL | ((fullscreen) ? SDL_FULLSCREEN : 0) ))) + if(!(screen = SDL_SetVideoMode(width, height, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_OPENGL | ((fullscreen) ? SDL_FULLSCREEN : 0) ))) #else - if(!(screen = SDL_SetVideoMode( width, height, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_OPENGL | ((!fullscreen) ? SDL_RESIZABLE : 0) | ((fullscreen) ? SDL_FULLSCREEN : 0) ))) + if(!(screen = SDL_SetVideoMode(width, height, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_OPENGL | (fullscreen ? SDL_FULLSCREEN : SDL_RESIZABLE)))) #endif { fprintf(stderr, "%s\n", SDL_GetError()); @@ -305,7 +305,7 @@ } #else // unter anderen Platformen kann SDL das ohne den OpenGL-Kontext zu killen // Videomodus setzen - if(!(screen = SDL_SetVideoMode( width, height, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_OPENGL | ((!fullscreen) ? SDL_RESIZABLE : 0) | ((fullscreen) ? SDL_FULLSCREEN : 0) ))) + if(!(screen = SDL_SetVideoMode(width, height, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_OPENGL | (fullscreen ? SDL_FULLSCREEN : SDL_RESIZABLE)))) { fprintf(stderr, "%s\n", SDL_GetError()); return false; @@ -581,7 +581,7 @@ KeyEvent VideoSDL::GetModKeyState(void) const { const SDLMod modifiers = SDL_GetModState(); - const KeyEvent ke = { KT_INVALID, 0, modifiers & KMOD_CTRL, modifiers & KMOD_SHIFT, modifiers & KMOD_ALT }; + const KeyEvent ke = { KT_INVALID, 0, (modifiers & KMOD_CTRL != 0), (modifiers & KMOD_SHIFT != 0), (modifiers & KMOD_ALT != 0)}; return ke; } === modified file 'driver/video/WinAPI/src/WinAPI.cpp' --- driver/video/WinAPI/src/WinAPI.cpp 2010-03-24 23:00:29 +0000 +++ driver/video/WinAPI/src/WinAPI.cpp 2010-03-28 20:43:36 +0000 @@ -595,30 +595,24 @@ * * @author FloSoft */ -void VideoWinAPI::OnWMChar(char c, bool disablepaste) +void VideoWinAPI::OnWMChar(char c, bool disablepaste, LPARAM lParam) { // Keine Leerzeichen als Extra-Zeichen senden! if(c == ' ') return; + + KeyEvent ke = {KT_CHAR, c, + (GetKeyState(VK_CONTROL) & 0x8000) != 0, + (GetKeyState(VK_SHIFT) & 0x8000) != 0, + (lParam & KF_ALTDOWN) != 0}; if(c == 'V' || c == 'v' || c == 0x16) + if( !disablepaste && ke.ctrl != 0) { - short state = GetKeyState(VK_CONTROL); - if( !disablepaste && (state & 0xFF00) != 0) - { - OnWMPaste(); - return; - } + OnWMPaste(); + return; } - //char cc[2] = {c, 0}; - //AnsiToOem(cc, cc); - - KeyEvent ke = {KT_CHAR, c, - (GetKeyState(VK_CONTROL)&0xFF00)?true:false, - (GetKeyState(VK_SHIFT)&0xFF00)?true:false, - (GetKeyState(VK_MENU)&0xFF00)?true:false}; - CallBack->Msg_KeyDown(ke); } @@ -630,13 +624,20 @@ * * @author FloSoft */ -void VideoWinAPI::OnWMKeyDown(unsigned char c) +void VideoWinAPI::OnWMKeyDown(unsigned char c, LPARAM lParam) { - KeyEvent ke = {KT_INVALID, 0, false, false, false}; + KeyEvent ke = {KT_INVALID, 0, + (GetKeyState(VK_CONTROL) & 0x8000) != 0, + (GetKeyState(VK_SHIFT) & 0x8000) != 0, + (lParam & KF_ALTDOWN) != 0}; switch(c) { - case VK_RETURN: ke.kt = KT_RETURN; break; + case VK_RETURN: + { // Don't report Alt+Return events, as WinAPI seems to fire them in a lot of cases + ke.kt = KT_RETURN; + ke.alt = false; + } break; case VK_SPACE: ke.kt = KT_SPACE; break; case VK_LEFT: ke.kt = KT_LEFT; break; case VK_RIGHT: ke.kt = KT_RIGHT; break; @@ -658,10 +659,6 @@ } break; } - if(GetKeyState(VK_CONTROL)) ke.ctrl = true; - if(GetKeyState(VK_SHIFT)) ke.shift = true; - if(GetKeyState(VK_MENU)) ke.alt = true; - if(ke.kt != KT_INVALID) pVideoWinAPI->CallBack->Msg_KeyDown(ke); } @@ -795,14 +792,14 @@ } } break; case WM_KEYDOWN: +// case WM_SYSKEYDOWN: // auch abfangen, wenn linkes ALT mit gedrückt wurde { - pVideoWinAPI->OnWMKeyDown((unsigned char)wParam); - } break; + pVideoWinAPI->OnWMKeyDown((unsigned char)wParam, lParam); + } return 0; case WM_CHAR: - case WM_SYSCHAR: // auch abfangen, wenn ALT etc. gedrückt wurde mit + case WM_SYSCHAR: // auch abfangen, wenn linkes ALT mit gedrückt wurde { - pVideoWinAPI->OnWMChar((char)wParam); - + pVideoWinAPI->OnWMChar((char)wParam, false, lParam); } return 0; } return DefWindowProc(window, msg, wParam, lParam); @@ -817,9 +814,9 @@ KeyEvent VideoWinAPI::GetModKeyState(void) const { const KeyEvent ke = { KT_INVALID, 0, - (GetKeyState(VK_CONTROL) & 0xFF00) ? true : false, - (GetKeyState(VK_SHIFT) & 0xFF00) ? true : false, - (GetKeyState(VK_MENU) & 0xFF00) ? true : false }; + (GetKeyState(VK_CONTROL) & 0x8000) != 0, + (GetKeyState(VK_SHIFT) & 0x8000) != 0, + (GetKeyState(VK_MENU) & 0x8000) != 0 }; return ke; } === modified file 'driver/video/WinAPI/src/WinAPI.h' --- driver/video/WinAPI/src/WinAPI.h 2010-03-24 23:00:29 +0000 +++ driver/video/WinAPI/src/WinAPI.h 2010-03-28 20:43:36 +0000 @@ -83,8 +83,8 @@ private: /// Funktion zum Senden einer gedrückten Taste. - void OnWMChar(char c, bool disablepaste = false); - void OnWMKeyDown(unsigned char c); + void OnWMChar(char c, bool disablepaste = false, LPARAM lParam = 0); + void OnWMKeyDown(unsigned char c, LPARAM lParam = 0); /// Funktion zum Pasten von Text aus dem Clipboard. void OnWMPaste(); === modified file 'src/VideoDriverWrapper.cpp' --- src/VideoDriverWrapper.cpp 2010-03-27 23:00:36 +0000 +++ src/VideoDriverWrapper.cpp 2010-03-28 20:43:36 +0000 @@ -116,11 +116,28 @@ } // Fenster erstellen + // On Windows it is necessary to open a windowed mode window at first and then resize it +#ifdef _WIN32 + // We need this doubled up here + // - With WinAPI in the windowed case, otherwise the GL Viewport is set wrong (or something related, seems to be a bug in our WinAPI implementation) + // - With SDL in the fullscreen case + if(!videodriver->CreateScreen(800, 600, false)) + { + fatal_error("Erstellen des Fensters fehlgeschlagen!\n"); + return false; + } + if(!videodriver->ResizeScreen(screen_width, screen_height, fullscreen)) + { + fatal_error("Erstellen des Fensters fehlgeschlagen!\n"); + return false; + } +#else if(!videodriver->CreateScreen(screen_width, screen_height, fullscreen)) { fatal_error("Erstellen des Fensters fehlgeschlagen!\n"); return false; } +#endif // DriverWrapper Initialisieren if(!Initialize()) @@ -129,6 +146,8 @@ return false; } + + // WindowManager informieren WindowManager::inst().Msg_ScreenResize(screen_width, screen_height); @@ -153,14 +172,19 @@ */ bool VideoDriverWrapper::ResizeScreen(const unsigned short screenWidth, const unsigned short screenHeight, const bool fullscreen) { - if(!videodriver->ResizeScreen(screenWidth, screenHeight, fullscreen)) + if(videodriver == NULL) + { + fatal_error("Kein Videotreiber ausgewaehlt!\n"); return false; + } + + const bool result = videodriver->ResizeScreen(screenWidth, screenHeight, fullscreen); RenewViewport(); WindowManager::inst().Msg_ScreenResize(screenWidth, screenHeight); - return true; + return result; } /////////////////////////////////////////////////////////////////////////////// === modified file 'src/WindowManager.cpp' --- src/WindowManager.cpp 2010-03-27 23:00:36 +0000 +++ src/WindowManager.cpp 2010-03-28 20:59:49 +0000 @@ -852,16 +852,20 @@ void WindowManager::Msg_KeyDown(const KeyEvent& ke) { -#ifndef _WIN32 - if(ke.alt && ke.kt == KT_RETURN) + if(ke.alt && (ke.kt == KT_RETURN)) { // Switch Fullscreen/Windowed +#ifdef _WIN32 + VideoDriverWrapper::inst().ResizeScreen(SETTINGS.video.fullscreen_width, + SETTINGS.video.fullscreen_height, + !VideoDriverWrapper::inst().IsFullscreen()); +#else VideoDriverWrapper::inst().ResizeScreen(VideoDriverWrapper::inst().IsFullscreen() ? SETTINGS.video.windowed_width : SETTINGS.video.fullscreen_width, VideoDriverWrapper::inst().IsFullscreen() ? SETTINGS.video.windowed_height : SETTINGS.video.fullscreen_height, !VideoDriverWrapper::inst().IsFullscreen()); +#endif } else -#endif RelayKeyboardMessage(&Window::Msg_KeyDown,ke); } === modified file 'src/ctrlText.cpp' --- src/ctrlText.cpp 2010-03-24 23:00:29 +0000 +++ src/ctrlText.cpp 2010-03-28 20:43:36 +0000 @@ -49,7 +49,7 @@ unsigned int color, unsigned int format, glArchivItem_Font *font) - : Window(x, y, id, parent, width, height), ctrlBaseText(text,color,font), format(format) + : Window(x, y, id, parent), ctrlBaseText(text,color,font), format(format) { }