//This file is part of Glest Shared Library (www.glest.org) //Copyright (C) 2005 Matthias Braun //You can redistribute this code and/or modify it under //the terms of the GNU General Public License as published by the Free Software //Foundation; either version 2 of the License, or (at your option) any later //version. #include "window.h" #include #include #include #include #include "conversion.h" #include "platform_util.h" #include "sdl_private.h" #include "noimpl.h" #include "util.h" #include "opengl.h" #ifdef WIN32 #include "SDL_syswm.h" #endif #include "leak_dumper.h" using namespace Shared::Util; using namespace std; namespace Shared{ namespace Platform{ // ======================================= // WINDOW // ======================================= // ========== STATIC INITIALIZATIONS ========== static Window* global_window = 0; static int oldX=0,oldY=0; SDL_Window *Window::sdlWindow = 0; int64 Window::lastMouseEvent = 0; /** for use in mouse hover calculations */ Vec2i Window::mousePos; MouseState Window::mouseState; bool Window::isKeyPressedDown = false; bool Window::isFullScreen = false; SDL_keysym Window::keystate; bool Window::isActive = false; #ifdef WIN32 bool Window::allowAltEnterFullscreenToggle = false; #else bool Window::allowAltEnterFullscreenToggle = true; #endif int Window::lastShowMouseState = 0; bool Window::tryVSynch = false; map Window::mapAllowedKeys; //bool Window::masterserverMode = false; // ========== PUBLIC ========== #ifdef WIN32 static HWND GetSDLWindow() { SDL_SysWMinfo info; SDL_VERSION(&info.version); if (SDL_GetWindowWMInfo(Window::getSDLWindow(),&info) == -1) return NULL; return info.info.win.window; } #endif static bool isUnprintableChar(SDL_keysym key, SDL_Keymod mod) { if(mod) { if ((mod & (KMOD_SHIFT)) && (key.sym <= 127 || key.sym >= 0x20)) { return false; } //if((mod & (KMOD_SHIFT)) && (key.sym == SDLK_QUESTION || key.sym == SDLK_SLASH)) { // return false; //} } switch (key.sym) { // We want to allow some, which are handled specially case SDLK_RETURN: case SDLK_TAB: case SDLK_BACKSPACE: case SDLK_DELETE: case SDLK_HOME: case SDLK_END: case SDLK_LEFT: case SDLK_RIGHT: case SDLK_UP: case SDLK_DOWN: case SDLK_PAGEUP: case SDLK_PAGEDOWN: return true; default: // U+0000 to U+001F are control characters /* Don't post text events for unprintable characters */ if (key.sym > 127) { return true; } if(key.sym < 0x20) { return true; } if(mod) { return true; } //printf("isUnprintableChar returns false for [%d]\n",key.sym); return false; } } Window::Window() { this->sdlWindow=0; // Default to 1x1 until set by caller to avoid divide by 0 //this->w = 1; //this->h = 1; for(int idx = 0; idx < mbCount; idx++) { lastMouseDown[idx] = 0; lastMouseX[idx] = 0; lastMouseY[idx] = 0; } if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); assert(global_window == 0); if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); global_window = this; Window::isActive = true; lastMouseEvent = 0; mousePos = Vec2i(0); mouseState.clear(); #ifdef WIN32 init_win32(); #endif } Window::Window(SDL_Window *sdlWindow) { this->sdlWindow=sdlWindow; // Default to 1x1 until set by caller to avoid divide by 0 //this->w = 1; //this->h = 1; for(int idx = 0; idx < mbCount; idx++) { lastMouseDown[idx] = 0; lastMouseX[idx] = 0; lastMouseY[idx] = 0; } if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); assert(global_window == 0); if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); global_window = this; Window::isActive = true; lastMouseEvent = 0; mousePos = Vec2i(0); mouseState.clear(); #ifdef WIN32 init_win32(); #endif } Window::~Window() { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); #ifdef WIN32 if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); done_win32(); #endif if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); assert(global_window == this); global_window = 0; if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); } void Window::setSDLWindow(SDL_Window *window) { Window::sdlWindow = window; } SDL_Window *Window::getSDLWindow() { return Window::sdlWindow; } bool Window::handleEvent() { string codeLocation = "a"; SDL_Event event; SDL_GetMouseState(&oldX,&oldY); //codeLocation = "b"; SDL_StartTextInput(); while(SDL_PollEvent(&event)) { try { codeLocation = "c"; switch(event.type) { case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: case SDL_MOUSEMOTION: //printf("In [%s::%s] Line :%d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); codeLocation = "d"; setLastMouseEvent(Chrono::getCurMillis()); setMousePos(Vec2i(event.button.x, event.button.y)); break; } codeLocation = "d"; switch(event.type) { case SDL_QUIT: //printf("In [%s::%s] Line :%d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); codeLocation = "e"; return false; case SDL_MOUSEBUTTONDOWN: //printf("In [%s::%s] Line :%d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); codeLocation = "f"; if(global_window) { global_window->handleMouseDown(event); } break; case SDL_MOUSEBUTTONUP: { //printf("In [%s::%s] Line :%d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); codeLocation = "g"; if(global_window) { MouseButton b = getMouseButton(event.button.button); setMouseState(b, false); global_window->eventMouseUp(event.button.x, event.button.y,getMouseButton(event.button.button)); } break; } case SDL_MOUSEWHEEL: { //printf("In [%s::%s] Line :%d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); codeLocation = "g2"; if(global_window) { global_window->handleMouseWheel(event); } break; } case SDL_MOUSEMOTION: { //printf("In [%s::%s] Line :%d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); //MouseState ms; //ms.leftMouse = (event.motion.state & SDL_BUTTON_LMASK) != 0; //ms.rightMouse = (event.motion.state & SDL_BUTTON_RMASK) != 0; //ms.centerMouse = (event.motion.state & SDL_BUTTON_MMASK) != 0; codeLocation = "h"; setMouseState(mbLeft, (event.motion.state & SDL_BUTTON_LMASK) == SDL_BUTTON_LMASK); setMouseState(mbRight, (event.motion.state & SDL_BUTTON_RMASK) == SDL_BUTTON_RMASK); setMouseState(mbCenter, (event.motion.state & SDL_BUTTON_MMASK) == SDL_BUTTON_MMASK); if(global_window) { global_window->eventMouseMove(event.motion.x, event.motion.y, &getMouseState()); //&ms); } break; } case SDL_TEXTINPUT: //case SDL_TEXTEDITING: { if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] =================================== START OF SDL SDL_TEXTINPUT ================================\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); codeLocation = "i"; Window::isKeyPressedDown = true; //#ifdef WIN32 if(SystemFlags::VERBOSE_MODE_ENABLED) printf("KD mod = %d : %d\n",event.key.keysym.mod,SDL_GetModState()); event.key.keysym.mod = SDL_GetModState(); //#endif string keyName = SDL_GetKeyName(event.text.text[0]); if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] Raw SDL key [%d - %c] mod [%d] scancode [%d] keyName [%s]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,event.key.keysym.sym,event.key.keysym.sym,event.key.keysym.mod,event.key.keysym.scancode,keyName.c_str()); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] Raw SDL key [%d] mod [%d] scancode [%d] keyName [%s]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,event.key.keysym.sym,event.key.keysym.mod,event.key.keysym.scancode,keyName.c_str()); //printf("In SDL_TEXTINPUT key [%s] keyName [%s] mod: %d global_window: %p\n",event.text.text,keyName.c_str(),event.key.keysym.mod,global_window); // /* handle ALT+Return */ // if((keyName == "Return" || keyName == "Enter") // && (event.key.keysym.mod & (KMOD_LALT | KMOD_RALT))) { // if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s %d] SDLK_RETURN pressed.\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); // toggleFullscreen(); // } #ifdef WIN32 /* handle ALT+f4 */ if((keyName == "f4" || keyName == "F4") && (event.key.keysym.mod & (KMOD_LALT | KMOD_RALT))) { if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s %d] ALT-F4 pressed.\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); return false; } #endif if(global_window) { if(global_window->eventTextInput(event.text.text) == false) { event.key.keysym.sym = event.text.text[0]; global_window->eventKeyDown(event.key); global_window->eventKeyPress(event.key); } if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); } if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] =================================== END OF SDL SDL_TEXTINPUT ================================\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); } break; break; case SDL_KEYDOWN: { //printf("In SDL_KEYDOWN\n"); if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] =================================== START OF SDL SDL_KEYDOWN ================================\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); keystate = event.key.keysym; bool keyDownConsumed=false; if(global_window) { keyDownConsumed=global_window->eventSdlKeyDown(event.key); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); switch (event.key.keysym.sym) { case SDLK_v: if (event.key.keysym.mod & KMOD_CTRL) { /* Ctrl-V, paste form clipbord */ char *text = SDL_GetClipboardText(); if (*text) { printf("Clipboard text: %s\n", text); if(global_window->eventTextInput(text) == true) { keyDownConsumed=true; } } else { printf("Clipboard text is empty\n"); } SDL_free(text); } break; default: break; } } // Stop unprintable characters (ctrl+, alt+ and escape), // also prevent ` and/or ~ appearing in console every time it's toggled. SDL_Keymod mod = SDL_GetModState(); if (!isUnprintableChar(event.key.keysym,mod)) { //printf("In SDL_KEYDOWN key SKIP [%d]\n",event.key.keysym.sym); break; } codeLocation = "i"; Window::isKeyPressedDown = true; //#ifdef WIN32 if(SystemFlags::VERBOSE_MODE_ENABLED) printf("KD mod = %d : %d\n",event.key.keysym.mod,SDL_GetModState()); event.key.keysym.mod = SDL_GetModState(); //#endif string keyName = SDL_GetKeyName(event.key.keysym.sym); if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] Raw SDL key [%d - %c] mod [%d] scancode [%d] keyName [%s]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,event.key.keysym.sym,event.key.keysym.sym,event.key.keysym.mod,event.key.keysym.scancode,keyName.c_str()); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] Raw SDL key [%d] mod [%d] scancode [%d] keyName [%s]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,event.key.keysym.sym,event.key.keysym.mod,event.key.keysym.scancode,keyName.c_str()); //printf("In SDL_KEYDOWN key [%d] keyName [%s] mod: %d\n",event.key.keysym.sym,keyName.c_str(),event.key.keysym.mod); // handle ALT+Return if((keyName == "Return" || keyName == "Enter") && (event.key.keysym.mod & (KMOD_LALT | KMOD_RALT))) { if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s %d] SDLK_RETURN pressed.\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); toggleFullscreen(); } #ifdef WIN32 // handle ALT+f4 if((keyName == "f4" || keyName == "F4") && (event.key.keysym.mod & (KMOD_LALT | KMOD_RALT))) { if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s %d] ALT-F4 pressed.\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); return false; } #endif if(global_window) { //char key = getKey(event.key.keysym,true); //key = tolower(key); //if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("******************* key [%d]\n",key); //event.key.keysym.mod = SDL_GetModState(); if(!keyDownConsumed){ global_window->eventKeyDown(event.key); global_window->eventKeyPress(event.key); } if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); } if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] =================================== END OF SDL SDL_KEYDOWN ================================\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); } break; case SDL_KEYUP: //printf("In [%s::%s] Line :%d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] =================================== START OF SDL SDL_KEYUP ================================\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); codeLocation = "j"; Window::isKeyPressedDown = false; //#ifdef WIN32 if(SystemFlags::VERBOSE_MODE_ENABLED) printf("KU mod = %d : %d\n",event.key.keysym.mod,SDL_GetModState()); event.key.keysym.mod = SDL_GetModState(); //#endif keystate = event.key.keysym; if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] KEY_UP, Raw SDL key [%d] mod [%d] scancode [%d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,event.key.keysym.sym,event.key.keysym.mod,event.key.keysym.scancode); //printf("In [%s::%s Line: %d] KEY_UP, Raw SDL key [%d] mod [%d] scancode [%d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,event.key.keysym.sym,event.key.keysym.mod,event.key.keysym.scancode); if(global_window) { global_window->eventKeyUp(event.key); } if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] =================================== END OF SDL SDL_KEYUP ================================\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); break; case SDL_WINDOWEVENT: { codeLocation = "k"; // if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] SDL_ACTIVEEVENT event.active.state = %d event.active. = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,event.active.state,event.active.gain); // // if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] Window::isActive = %d event.active.state = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,Window::isActive,event.active.state); // // // Check if the program has lost window focus // if ((event.active.state & (SDL_APPACTIVE | SDL_APPINPUTFOCUS))) { // if (event.active.gain == 0) { // Window::isActive = false; // } // else { // Window::isActive = true; // } // // if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] Window::isActive = %d \n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,Window::isActive); // // if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] Window::isActive = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,Window::isActive); // // bool willShowCursor = (!Window::isActive || (Window::lastShowMouseState == SDL_ENABLE) || Window::getUseDefaultCursorOnly()); // showCursor(willShowCursor); // } //printf("In SDL_WINDOWEVENT, event.window.event: %d\n",event.window.event); /* switch(event.window.event) { case SDL_WINDOWEVENT_ENTER: printf("In SDL_WINDOWEVENT_ENTER\n"); showCursor(true); break; case SDL_WINDOWEVENT_LEAVE: printf("In SDL_WINDOWEVENT_LEAVE\n"); showCursor(false); break; case SDL_WINDOWEVENT_FOCUS_GAINED: printf("SDL_WINDOWEVENT_FOCUS_GAINED\n"); showCursor(true); break; case SDL_WINDOWEVENT_FOCUS_LOST: printf("SDL_WINDOWEVENT_FOCUS_LOST\n"); showCursor(false); break; } */ //showCursor(false); if(global_window) { global_window->eventWindowEvent(event.window); } } break; } } catch(const char *e){ SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] (a1) Couldn't process event: [%s] codeLocation = %s\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,e,codeLocation.c_str()); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] (a1) Couldn't process event: [%s] codeLocation = %s\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,e,codeLocation.c_str()); throw megaglest_runtime_error(e); } catch(const std::runtime_error& e) { SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] (a2) Couldn't process event: [%s] codeLocation = %s\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,e.what(),codeLocation.c_str()); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] (a2) Couldn't process event: [%s] codeLocation = %s\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,e.what(),codeLocation.c_str()); throw megaglest_runtime_error(e.what()); } catch(const std::exception& e) { SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] (b) Couldn't process event: [%s] codeLocation = %s\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,e.what(),codeLocation.c_str()); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] (b) Couldn't process event: [%s] codeLocation = %s\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,e.what(),codeLocation.c_str()); } catch(...) { SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] (c) Couldn't process event: [UNKNOWN ERROR] codeLocation = %s\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,codeLocation.c_str()); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] (c) Couldn't process event: [UNKNOWN ERROR] codeLocation = %s\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,codeLocation.c_str()); } } SDL_StopTextInput(); return true; } void Window::revertMousePos() { SDL_WarpMouseInWindow(sdlWindow,oldX, oldY); } Vec2i Window::getOldMousePos() { return Vec2i(oldX, oldY); } string Window::getText() { const char* c = 0; //SDL_WM_GetCaption(&c, 0); c=SDL_GetWindowTitle(sdlWindow); return string(c); } float Window::getAspect() { return static_cast(getClientH())/getClientW(); } void Window::setText(string text) { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); //SDL_WM_SetCaption(text.c_str(), 0); SDL_SetWindowTitle(sdlWindow,text.c_str()); if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); } void Window::setSize(int w, int h) { //this->w = w; //this->h = h; Private::ScreenWidth = w; Private::ScreenHeight = h; } void Window::setPos(int x, int y) { if(x != 0 || y != 0) { NOIMPL; return; } } void Window::minimize() { NOIMPL; } void Window::setEnabled(bool enabled) { NOIMPL; } void Window::setVisible(bool visible) { NOIMPL; } void Window::setStyle(WindowStyle windowStyle) { if(windowStyle == wsFullscreen) return; // NOIMPL; } void Window::create() { // nothing here if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); #ifdef WIN32 ontop_win32(this->getScreenWidth(),this->getScreenHeight()); #endif if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); } void Window::destroy() { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); SDL_Event event; event.type = SDL_QUIT; SDL_PushEvent(&event); if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); } void Window::setupGraphicsScreen(int depthBits, int stencilBits, bool hardware_acceleration, bool fullscreen_anti_aliasing) { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); static int newDepthBits = depthBits; static int newStencilBits = stencilBits; if(depthBits >= 0) newDepthBits = depthBits; if(stencilBits >= 0) newStencilBits = stencilBits; if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); if(GlobalStaticFlags::getIsNonGraphicalModeEnabled() == false) { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); if(fullscreen_anti_aliasing == true) { SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS,1); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2); } if(hardware_acceleration == true) { SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1); } if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 1); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 1); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 1); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, newStencilBits); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, newDepthBits); if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); //const SDL_VideoInfo *info = SDL_GetVideoInfo(); #ifdef SDL_GL_SWAP_CONTROL if(Window::tryVSynch == true) { /* we want vsync for smooth scrolling */ //SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1); SDL_GL_SetSwapInterval(1); } #endif if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); // setup LOD bias factor //const float lodBias = std::max(std::min( configHandler->Get("TextureLODBias", 0.0f) , 4.0f), -4.0f); const float lodBias = max(min(0.0f,4.0f),-4.0f); //if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("\n\n\n\n\n$$$$ In [%s::%s Line: %d] lodBias = %f\n\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,lodBias); if (std::fabs(lodBias) > 0.01f) { glTexEnvf(GL_TEXTURE_FILTER_CONTROL,GL_TEXTURE_LOD_BIAS, lodBias ); } if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); } } void Window::toggleFullscreen() { if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); Window::isFullScreen = !Window::isFullScreen; if(global_window) { global_window->eventToggleFullScreen(Window::isFullScreen); } if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); } void Window::handleMouseWheel(SDL_Event event) { int x; int y; if (event.type != SDL_MOUSEWHEEL) { return; } if (SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); SDL_GetMouseState(&x, &y); // // windows implementation uses 120 for the resolution of a standard mouse // // wheel notch. However, newer mice have finer resolutions. I dunno if SDL // // handles those, but for now we're going to say that each mouse wheel // // movement is 120. eventMouseWheel(x, y, event.wheel.y * 120); return; } void Window::handleMouseDown(SDL_Event event) { static const Uint32 DOUBLECLICKTIME = 500; if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); MouseButton button = getMouseButton(event.button.button); Uint32 ticks = SDL_GetTicks(); int n = (int) button; assert(n >= 0 && n < mbCount); if(n >= 0 && n < mbCount) { if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); static const int DOUBLECLICKDELTA = 5; if(ticks - lastMouseDown[n] < DOUBLECLICKTIME && abs(lastMouseX[n] - event.button.x) < DOUBLECLICKDELTA && abs(lastMouseY[n] - event.button.y) < DOUBLECLICKDELTA) { if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); eventMouseDown(event.button.x, event.button.y, button); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); eventMouseDoubleClick(event.button.x, event.button.y, button); } else { if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); eventMouseDown(event.button.x, event.button.y, button); } if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); lastMouseDown[n] = ticks; lastMouseX[n] = event.button.x; lastMouseY[n] = event.button.y; if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); } } MouseButton Window::getMouseButton(int sdlButton) { switch(sdlButton) { case SDL_BUTTON_LEFT: return mbLeft; case SDL_BUTTON_RIGHT: return mbRight; case SDL_BUTTON_MIDDLE: return mbCenter; default: //throw std::runtime_error("Mouse Button > 3 not handled."); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] Mouse Button [%d] not handled.\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,sdlButton); return mbUnknown; } } wchar_t Window::convertStringtoSDLKey(const string &value) { wchar_t result = SDLK_UNKNOWN; if(value.length() >= 1) { if(value.length() == 3 && value[0] == '\'' && value[2] == '\'') { result = (SDL_Keycode)value[1]; } else { bool foundKey = false; if(value.length() > 1) { for(int i = SDLK_UNKNOWN; i < SDL_NUM_SCANCODES; ++i) { SDL_Keycode key = static_cast(i); string keyName = SDL_GetKeyName(key); if(value == keyName) { result = key; foundKey = true; break; } } } if(foundKey == false) { result = (SDL_Keycode)value[0]; } } } else { string sError = "Unsupported key name: [" + value + "]"; throw megaglest_runtime_error(sError.c_str()); } // Because SDL is based on lower Ascii //result = tolower(result); return result; } void Window::addAllowedKeys(string keyList) { clearAllowedKeys(); if(keyList.empty() == false) { vector keys; Tokenize(keyList,keys,","); if(keys.empty() == false) { for(unsigned int keyIndex = 0; keyIndex < keys.size(); ++keyIndex) { string key = trim(keys[keyIndex]); wchar_t sdl_key = convertStringtoSDLKey(key); if(sdl_key != SDLK_UNKNOWN) { mapAllowedKeys[sdl_key] = true; } if(SystemFlags::VERBOSE_MODE_ENABLED) printf("key: %d [%s] IS ALLOWED\n",sdl_key, key.c_str()); //printf("key: %d [%s] IS ALLOWED\n",sdl_key, key.c_str()); } } } } void Window::clearAllowedKeys() { mapAllowedKeys.clear(); } bool Window::isAllowedKey(wchar_t key) { map::const_iterator iterFind = mapAllowedKeys.find(key); bool result =(iterFind != mapAllowedKeys.end()); if(SystemFlags::VERBOSE_MODE_ENABLED) { string keyName = SDL_GetKeyName((SDL_Keycode)key); printf("key: %d [%s] allowed result: %d\n",key,keyName.c_str(),result); } return result; } bool isKeyPressed(SDL_Keycode compareKey, SDL_KeyboardEvent input,bool modifiersAllowed) { vector modifiersToCheck; if(modifiersAllowed == false) { modifiersToCheck.push_back(KMOD_LCTRL); modifiersToCheck.push_back(KMOD_RCTRL); modifiersToCheck.push_back(KMOD_LALT); modifiersToCheck.push_back(KMOD_RALT); } bool result = isKeyPressed(compareKey, input, modifiersToCheck); return result; } bool isKeyPressed(SDL_Keycode compareKey, SDL_KeyboardEvent input,vector modifiersToCheck) { //Uint16 c = SDLK_UNKNOWN; SDL_Keycode c = SDLK_UNKNOWN; //if(input.keysym.unicode > 0 && input.keysym.unicode < 0x80) { if(input.keysym.sym > 0) { c = input.keysym.sym; } //printf("START isKeyPressed input = %d compare = %d mod = %d\n",c,compareKey,input.keysym.mod); // if(compareKey == SDLK_QUESTION && (c == SDLK_SLASH && (input.keysym.mod & (KMOD_SHIFT)))) { // return true; // } // else if(compareKey == SDLK_SLASH && (c == SDLK_SLASH && (input.keysym.mod & (KMOD_SHIFT)))) { // return false; // } //// string unicodeKeyName = SDL_GetKeyName((SDLKey)input.keysym.unicode); //// //// if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d] input.keysym.unicode = %d input.keysym.mod = %d input.keysym.sym = %d unicodeKeyName [%s]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,input.keysym.unicode,input.keysym.mod,input.keysym.sym,unicodeKeyName.c_str()); //// if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] input.keysym.unicode = %d input.keysym.mod = %d input.keysym.sym = %d unicodeKeyName [%s]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,input.keysym.unicode,input.keysym.mod,input.keysym.sym,unicodeKeyName.c_str()); // // // When modifiers are pressed the unicode result is wrong // // example CTRL-3 will give the ESCAPE vslue 27 in unicode // if( !(input.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) && // !(input.keysym.mod & (KMOD_LALT | KMOD_RALT)) && // !(input.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT)) ) { // if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); // if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); // // c = input.keysym.sym; // //c = toupper(c); // } // else if((input.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT)) && // (input.keysym.sym == SDLK_QUESTION || // input.keysym.sym == SDLK_AT || // input.keysym.sym == SDLK_COLON || // input.keysym.sym == SDLK_LESS || // input.keysym.sym == SDLK_GREATER || // input.keysym.sym == SDLK_CARET || // input.keysym.sym == SDLK_UNDERSCORE || // input.keysym.sym == SDLK_BACKQUOTE || // input.keysym.sym == SDLK_EXCLAIM || // input.keysym.sym == SDLK_QUOTEDBL || // input.keysym.sym == SDLK_HASH || // input.keysym.sym == SDLK_DOLLAR || // input.keysym.sym == SDLK_AMPERSAND || // input.keysym.sym == SDLK_QUOTE || // input.keysym.sym == SDLK_LEFTPAREN || // input.keysym.sym == SDLK_RIGHTPAREN || // input.keysym.sym == SDLK_ASTERISK || // input.keysym.sym == SDLK_KP_MULTIPLY || // input.keysym.sym == SDLK_PLUS || // input.keysym.sym == SDLK_COMMA || // input.keysym.sym == SDLK_MINUS || // input.keysym.sym == SDLK_PERIOD || // input.keysym.sym == SDLK_SLASH || // // Need to allow Shift + # key for AZERTY style keyboards // input.keysym.sym == SDLK_0 || // input.keysym.sym == SDLK_1 || // input.keysym.sym == SDLK_2 || // input.keysym.sym == SDLK_3 || // input.keysym.sym == SDLK_4 || // input.keysym.sym == SDLK_5 || // input.keysym.sym == SDLK_6 || // input.keysym.sym == SDLK_7 || // input.keysym.sym == SDLK_8 || // input.keysym.sym == SDLK_9 // )) { // if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); // if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); // // c = input.keysym.sym; // } // else if(input.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) { // if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); // if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); // // if( (input.keysym.sym >= SDLK_0 && input.keysym.sym <= SDLK_9) || // (input.keysym.sym >= SDLK_KP_0 && input.keysym.sym <= SDLK_KP_9)) { // if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); // if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); // // c = input.keysym.sym; // } // } // // if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d] #1 (c & 0xFF) [%d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,(c & 0xFF)); // if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem, "In [%s::%s Line: %d] #1 (c & 0xFF) [%d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,(c & 0xFF)); // } // //if(c == 0) { // if(c <= SDLK_UNKNOWN.sym || c >= SDLK_LAST.sym) { // c = input.keysym.sym; // } if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %u] c = [%d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,c); //c = (c & 0xFF); if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] returning key [%d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,c); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] returning key [%d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,c); // SDL does NOT handle lowercase if(c >= 'A' && c <= 'Z') { c = tolower(c); } // SDL does NOT handle lowercase if(compareKey >= 'A' && compareKey <= 'Z') { compareKey = (SDL_Keycode)tolower((char)compareKey); } bool result = (c == compareKey); //printf("result = %d input = %d compare = %d\n",result,c,compareKey); if(result == false) { if(compareKey == SDLK_RETURN) { result = (c == SDLK_KP_ENTER); } else if(compareKey == SDLK_KP_ENTER) { result = (c == SDLK_RETURN); } else if(compareKey == SDLK_BACKSPACE) { result = (c == SDLK_DELETE); } } // else if(compareKey == SDLK_ASTERISK) { // result = (c == SDLK_KP_MULTIPLY); // } // else if(compareKey == SDLK_KP_MULTIPLY) { // result = (c == SDLK_ASTERISK); // } // else if (compareKey == SDLK_0) { // result = (c == SDLK_KP_0); // } else if (compareKey == SDLK_1) { // result = (c == SDLK_KP_1); // } else if (compareKey == SDLK_2) { // result = (c == SDLK_KP_2); // } else if (compareKey == SDLK_3) { // result = (c == SDLK_KP_3); // } else if (compareKey == SDLK_4) { // result = (c == SDLK_KP_4); // } else if (compareKey == SDLK_5) { // result = (c == SDLK_KP_5); // } else if (compareKey == SDLK_6) { // result = (c == SDLK_KP_6); // } else if (compareKey == SDLK_7) { // result = (c == SDLK_KP_7); // } else if (compareKey == SDLK_8) { // result = (c == SDLK_KP_8); // } else if (compareKey == SDLK_9) { // result = (c == SDLK_KP_9); // } else if (compareKey == SDLK_KP_0) { // result = (c == SDLK_0); // } else if (compareKey == SDLK_KP_1) { // result = (c == SDLK_1); // } else if (compareKey == SDLK_KP_2) { // result = (c == SDLK_2); // } else if (compareKey == SDLK_KP_3) { // result = (c == SDLK_3); // } else if (compareKey == SDLK_KP_4) { // result = (c == SDLK_4); // } else if (compareKey == SDLK_KP_5) { // result = (c == SDLK_5); // } else if (compareKey == SDLK_KP_6) { // result = (c == SDLK_6); // } else if (compareKey == SDLK_KP_7) { // result = (c == SDLK_7); // } else if (compareKey == SDLK_KP_8) { // result = (c == SDLK_8); // } else if (compareKey == SDLK_KP_9) { // result = (c == SDLK_9); // } // } if(result == true) { //printf("input.keysym.mod = %d\n",input.keysym.mod); for(unsigned int i = 0; i < modifiersToCheck.size(); ++i) { if( (input.keysym.mod & modifiersToCheck[i])) { if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] result *WOULD HAVE BEEN TRUE* but is false due to: input.keysym.mod = %d modifiersToCheck[i] = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,input.keysym.mod,modifiersToCheck[i]); result = false; break; } } } string compareKeyName = SDL_GetKeyName(compareKey); string pressKeyName = SDL_GetKeyName((SDL_Keycode)c); //printf ("In [%s::%s Line: %d] compareKey [%d - %s] pressed key [%d - %s] result = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,compareKey,compareKeyName.c_str(),c,pressKeyName.c_str(),result); if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] compareKey [%d - %s] pressed key [%d - %s] result = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,compareKey,compareKeyName.c_str(),c,pressKeyName.c_str(),result); //printf ("ISPRESS compareKey [%d - %s] pressed key [%d - %s] input.keysym.sym [%d] input.keysym.unicode [%d] mod = %d result = %d\n", // compareKey,compareKeyName.c_str(),c,pressKeyName.c_str(),input.keysym.sym,input.keysym.unicode,input.keysym.mod,result); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] compareKey [%d - %s] pressed key [%d - %s] result = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,compareKey,compareKeyName.c_str(),c,pressKeyName.c_str(),result); return result; } wchar_t extractKeyPressedUnicode(SDL_KeyboardEvent input) { wchar_t c = SDLK_UNKNOWN; //if(input.keysym.unicode > 0 && input.keysym.unicode < 0x80) { if(input.keysym.sym > 0) { if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] input.keysym.sym = %d input.keysym.mod = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,input.keysym.sym,input.keysym.mod); c = input.keysym.sym; // if(c <= SDLK_UNKNOWN || c >= SDLK_LAST) { // c = SDLKey(c & 0xFF); // } //c = toupper(c); if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] #1 (c & 0xFF) [%d] c = [%lc]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,(c & 0xFF),c); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] #1 (c & 0xFF) [%d] c = [%lc]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,(c & 0xFF),c); } if(c == SDLK_UNKNOWN) { c = input.keysym.sym; } if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %u] c = [%d][%lc]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,c); //c = (SDLKey)(c & 0xFF); if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] returning key [%d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,c); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] returning key [%d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,c); string pressKeyName = SDL_GetKeyName((SDL_Keycode)c); //string inputKeyName = SDL_GetKeyName(input.keysym.sym); //printf ("PRESS pressed key [%d - %s] input.keysym.sym [%d] input.keysym.unicode [%d] mod = %d\n", // c,pressKeyName.c_str(),input.keysym.sym,input.keysym.unicode,input.keysym.mod); if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] pressed key [%d - %s]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,c,pressKeyName.c_str()); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] pressed key [%d - %s]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,c,pressKeyName.c_str()); return c; } vector extractKeyPressedUnicodeLength(string text) { vector result; unsigned int i = 0; for(i = 0; i < text.length();) { char c = text[i]; wchar_t keyW = c; wchar_t textAppend[] = { keyW, 0 }; if(*textAppend) { wchar_t newKey = textAppend[0]; if (newKey < 0x80) { result.push_back(1); //printf("1 char, textCharLength = %d\n",textCharLength.size()); } else if (newKey < 0x800) { result.push_back(2); //printf("2 char, textCharLength = %d\n",textCharLength.size()); } else { result.push_back(3); //printf("3 char, textCharLength = %d\n",textCharLength.size()); } i += result[result.size()-1]; } } return result; } SDL_Keycode extractKeyPressed(SDL_KeyboardEvent input) { SDL_Keycode c = SDLK_UNKNOWN; //if(input.keysym.unicode > 0 && input.keysym.unicode < 0x80) { //if(input.keysym.sym > 0) { // if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] input.keysym.sym = %d input.keysym.mod = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,input.keysym.sym,input.keysym.mod); // c = input.keysym.sym; // if(c <= SDLK_UNKNOWN || c >= SDLK_LAST) { // c = SDLKey(c & 0xFF); // } //c = toupper(c); //if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] #1 (c & 0xFF) [%d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,(c & 0xFF)); //if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] #1 (c & 0xFF) [%d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,(c & 0xFF)); //} //if(c <= SDLK_UNKNOWN) { c = input.keysym.sym; //} if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %u] c = [%d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,c); //c = (SDLKey)(c & 0xFF); if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] returning key [%d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,c); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] returning key [%d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,c); string pressKeyName = SDL_GetKeyName(c); //string inputKeyName = SDL_GetKeyName(input.keysym.sym); // printf ("PRESS pressed key [%d - %s] input.keysym.sym [%d] mod = %d\n", // c,pressKeyName.c_str(),input.keysym.sym,input.keysym.mod); if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] pressed key [%d - %s]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,c,pressKeyName.c_str()); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] pressed key [%d - %s]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,c,pressKeyName.c_str()); return c; } bool isAllowedInputTextKey(wchar_t &key) { if(Window::isAllowedKey(key) == true) { return true; } bool result = ( key != SDLK_DELETE && key != SDLK_BACKSPACE && key != SDLK_TAB && key != SDLK_CLEAR && key != SDLK_RETURN && key != SDLK_PAUSE && key != SDLK_UP && key != SDLK_DOWN && key != SDLK_RIGHT && key != SDLK_LEFT && key != SDLK_INSERT && key != SDLK_HOME && key != SDLK_END && key != SDLK_PAGEUP && key != SDLK_PAGEDOWN && key != SDLK_F1 && key != SDLK_F2 && key != SDLK_F3 && key != SDLK_F4 && key != SDLK_F5 && key != SDLK_F6 && key != SDLK_F7 && key != SDLK_F8 && key != SDLK_F9 && key != SDLK_F10 && key != SDLK_F11 && key != SDLK_F12 && key != SDLK_F13 && key != SDLK_F14 && key != SDLK_F15 && key != SDLK_NUMLOCKCLEAR && key != SDLK_CAPSLOCK && key != SDLK_SCROLLLOCK && key != SDLK_RSHIFT && key != SDLK_LSHIFT && key != SDLK_RCTRL && key != SDLK_LCTRL && key != SDLK_RALT && key != SDLK_LALT && key != SDLK_RGUI && key != SDLK_LGUI && key != SDLK_MODE && key != SDLK_HELP && key != SDLK_PRINTSCREEN && key != SDLK_SYSREQ && key != SDLK_PAUSE && key != SDLK_MENU && key != SDLK_POWER); string inputKeyName = SDL_GetKeyName((SDL_Keycode)key); if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d] pressed key [%d - %s] result = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,key,inputKeyName.c_str(),result); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] pressed key [%d - %s] result = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,key,inputKeyName.c_str(),result); return result; } bool isAllowedInputTextKey(SDL_Keycode key) { if(Window::isAllowedKey(key) == true) { return true; } bool result = ( key != SDLK_DELETE && key != SDLK_BACKSPACE && key != SDLK_TAB && key != SDLK_CLEAR && key != SDLK_RETURN && key != SDLK_PAUSE && key != SDLK_UP && key != SDLK_DOWN && key != SDLK_RIGHT && key != SDLK_LEFT && key != SDLK_INSERT && key != SDLK_HOME && key != SDLK_END && key != SDLK_PAGEUP && key != SDLK_PAGEDOWN && key != SDLK_F1 && key != SDLK_F2 && key != SDLK_F3 && key != SDLK_F4 && key != SDLK_F5 && key != SDLK_F6 && key != SDLK_F7 && key != SDLK_F8 && key != SDLK_F9 && key != SDLK_F10 && key != SDLK_F11 && key != SDLK_F12 && key != SDLK_F13 && key != SDLK_F14 && key != SDLK_F15 && key != SDLK_NUMLOCKCLEAR && key != SDLK_CAPSLOCK && key != SDLK_SCROLLLOCK && key != SDLK_RSHIFT && key != SDLK_LSHIFT && key != SDLK_RCTRL && key != SDLK_LCTRL && key != SDLK_RALT && key != SDLK_LALT && key != SDLK_RGUI && key != SDLK_LGUI && key != SDLK_MODE && key != SDLK_HELP && key != SDLK_PRINTSCREEN && key != SDLK_SYSREQ && key != SDLK_PAUSE && key != SDLK_MENU && key != SDLK_POWER); string inputKeyName = SDL_GetKeyName(key); if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d] pressed key [%d - %s] result = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,key,inputKeyName.c_str(),result); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] pressed key [%d - %s] result = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,key,inputKeyName.c_str(),result); return result; } bool Window::isKeyStateModPressed(int mod) { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("isKeyStateModPressed mod = %d, keystate.mod = %d, keystate.mod & mod = %d\n",mod,keystate.mod,(keystate.mod & mod)); if(keystate.mod & mod) { return true; } return false; } wchar_t Window::extractLastKeyPressed() { return keystate.sym; } }}//end namespace