void setWindowIcon(SDL_Window &window) { #if defined(WIN32) // Try to set the windows icon from the ICO in the resources. // If that fails, use the static icon. if (!setWindowsIcon(window)) setStaticIcon(window); #elif defined(MACOSX) // Do nothing on Mac OS X. The external icon is pulled in by default already. #else /* TODO: We should try setting _NET_WM_ICON on GNU/Linux to get support for scalable * icons there as well. Additionally, XSetWMHints() should be used for * window manager that do not support _NET_WM_ICON (like e16). */ setStaticIcon(window); #endif }
bool GLAppSDL::initialize(int argc, char* argv[]) { if (!AppBaseSDL::initialize(argc, argv)) return false; SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, profile); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, majorVersion); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minorVersion); #if defined(DEBUG) SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG); #endif if (profile == SDL_GL_CONTEXT_PROFILE_ES) { #if 0 int numVideoDrivers = SDL_GetNumVideoDrivers(); int i; const char** drivers; drivers = (const char**)SDL_malloc(sizeof(const char*) * numVideoDrivers); for (i = 0; i < numVideoDrivers; i++) { drivers[i] = SDL_GetVideoDriver(i); } #endif // Only the indicated platforms pay attention to these hints // but they could be set on any platform. #if __WINDOWS__ || __LINUX__ SDL_SetHint(SDL_HINT_OPENGL_ES_DRIVER, "1"); #endif #if __WINDOWS__ // If using ANGLE copied from Chrome should set to "d3dcompiler_46.dll" // Should set value via compiler -D definition from gyp file. SDL_SetHint(SDL_HINT_VIDEO_WIN_D3DCOMPILER, "none"); #endif } #if __MACOSX__ SDL_SetHint(SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK, "1"); #endif pswMainWindow = SDL_CreateWindow( szName, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, w_width, w_height, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE ); if (pswMainWindow == NULL) { (void)SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, szName, SDL_GetError(), NULL); return false; } #if __WINDOWS__ // Set the applications own icon in place of the Windows default set by SDL. // Needs to be done here to avoid change being visible. setWindowsIcon(pswMainWindow); #endif sgcGLContext = SDL_GL_CreateContext(pswMainWindow); // Work around bug in SDL. It returns a 2.x context when 3.x is requested. // It does though internally record an error. const char* error = SDL_GetError(); if (sgcGLContext == NULL || (error[0] != '\0' && majorVersion >= 3 && (profile == SDL_GL_CONTEXT_PROFILE_CORE || profile == SDL_GL_CONTEXT_PROFILE_COMPATIBILITY)) ) { (void)SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, szName, SDL_GetError(), NULL); return false; } #if __WINDOWS__ if (profile != SDL_GL_CONTEXT_PROFILE_ES) { // No choice but to use GLEW for GL on Windows; there is no .lib with static // bindings. For ES we use one of the hardware vendor SDKs all of which have // static bindings. // TODO: Figure out how to support {GLX,WGL}_EXT_create_context_es2_profile // were there are no static bindings. Need a GLEW equivalent for ES and // different compile options. Perhaps can borrow function loading stuff // from SDL's testgles2.c. // So one build of this library can be linked in to applications using GLEW and // applications not using GLEW, do not call any GLEW functions directly. // Call via queried function pointers. void* glewdll = SDL_LoadObject("glew32.dll"); if (glewdll == NULL) { std::string sName(szName); (void)SDL_ShowSimpleMessageBox( SDL_MESSAGEBOX_ERROR, szName, SDL_GetError(), NULL); return false; } typedef GLenum(GLEWAPIENTRY PFNGLEWINIT)(void); typedef const GLubyte * GLEWAPIENTRY PFNGLEWGETERRORSTRING(GLenum error); PFNGLEWINIT* pGlewInit; PFNGLEWGETERRORSTRING* pGlewGetErrorString; bool error = true; #define STR(s) #s #if defined(_M_IX86) /* Win32 GLEW uses __stdcall. */ #define DNAMESTR(x,n) STR(_##x##@##n) #else /* x64 uses __cdecl. */ #define DNAMESTR(x,n) STR(x) #endif pGlewInit = (PFNGLEWINIT*)SDL_LoadFunction(glewdll, DNAMESTR(glewInit,0)); if (pGlewInit != NULL) { pGlewGetErrorString = (PFNGLEWGETERRORSTRING*)SDL_LoadFunction( glewdll, DNAMESTR(glewGetErrorString,4)); if (pGlewGetErrorString != NULL) { error = false; } } if (error) { std::string sName(szName); (void)SDL_ShowSimpleMessageBox( SDL_MESSAGEBOX_ERROR, szName, SDL_GetError(), NULL); return false; } int iResult = pGlewInit(); if (iResult != GLEW_OK) { std::string sName(szName); (void)SDL_ShowSimpleMessageBox( SDL_MESSAGEBOX_ERROR, szName, (const char*)pGlewGetErrorString(iResult), NULL); return false; } }