From ac9cc23f0c33820012a0c363a603fdd8d6843fea Mon Sep 17 00:00:00 2001 From: kervala Date: Sat, 12 Jun 2010 22:22:32 +0200 Subject: [PATCH] Fixed: #981 Create createWindow and destroyWindow private methods in OpenGL driver --- .../src/3d/driver/opengl/driver_opengl.cpp | 93 +--- code/nel/src/3d/driver/opengl/driver_opengl.h | 19 +- .../3d/driver/opengl/driver_opengl_window.cpp | 470 ++++++++++-------- 3 files changed, 294 insertions(+), 288 deletions(-) diff --git a/code/nel/src/3d/driver/opengl/driver_opengl.cpp b/code/nel/src/3d/driver/opengl/driver_opengl.cpp index a8a63e1b9..915950053 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl.cpp @@ -104,7 +104,7 @@ uint CDriverGL::_Registered=0; #endif // NL_OS_WINDOWS // Version of the driver. Not the interface version!! Increment when implementation of the driver change. -const uint32 CDriverGL::ReleaseVersion = 0x10; +const uint32 CDriverGL::ReleaseVersion = 0x11; // Number of register to allocate for the EXTVertexShader extension const uint CDriverGL::_EVSNumConstant = 97; @@ -196,7 +196,6 @@ CDriverGL::CDriverGL() #ifdef NL_OS_WINDOWS _PBuffer = NULL; - _hWnd = NULL; _hRC = NULL; _hDC = NULL; _NeedToRestaureGammaRamp = false; @@ -208,7 +207,6 @@ CDriverGL::CDriverGL() #elif defined (NL_OS_UNIX) _cursor = None; - _win = 0; _dpy = 0; # ifdef XF86VIDMODE @@ -218,9 +216,12 @@ CDriverGL::CDriverGL() # endif //XF86VIDMODE #endif // NL_OS_UNIX + _win = EmptyWindow; + _OffScreen = false; _FullScreen = false; _Resizable = false; + _AntiAliasing = -1; _CurrentMaterial=NULL; _Initialized = false; @@ -952,87 +953,9 @@ bool CDriverGL::release() _AGPVertexArrayRange= NULL; _VRAMVertexArrayRange= NULL; -#ifdef NL_OS_WINDOWS - // Then delete. - // wglMakeCurrent(NULL,NULL); + destroyWindow(); - // Off-screen rendering ? - if (_OffScreen) - { - if (_PBuffer) - { - wglDeleteContext( _hRC ); - nwglReleasePbufferDCARB( _PBuffer, _hDC ); - nwglDestroyPbufferARB( _PBuffer ); - } - } - else - { - if (_hRC) - wglDeleteContext(_hRC); - - if (_hWnd&&_hDC) - { - ReleaseDC(_hWnd,_hDC); - if (_DestroyWindow) - DestroyWindow (_hWnd); - } - - if(_FullScreen) - { - restoreScreenMode(); - _FullScreen= false; - } - } - - _hRC=NULL; - _hDC=NULL; - _hWnd=NULL; - _PBuffer = NULL; - - // Restaure monitor color parameters - if (_NeedToRestaureGammaRamp) - { - HDC dc = CreateDC ("DISPLAY", NULL, NULL, NULL); - if (dc) - { - if (!SetDeviceGammaRamp (dc, _GammaRampBackuped)) - nlwarning ("(CDriverGL::release): SetDeviceGammaRamp failed"); - - // Release the DC - ReleaseDC (NULL, dc); - } - else - { - nlwarning ("(CDriverGL::release): can't create DC"); - } - } - -#elif defined(NL_OS_MAC) && defined(NL_MAC_NATIVE) - - NL3D::MAC::release(); - -#elif defined (NL_OS_UNIX) - if (_FullScreen) - { - restoreScreenMode(); - - // Ungrab the keyboard (probably not necessary); - XUnmapWindow(_dpy, _win); - XSync(_dpy, True); - XUngrabKeyboard(_dpy, CurrentTime); - } - - if (_ctx) - { - glXDestroyContext(_dpy, _ctx); - _ctx = NULL; - } - - XCloseDisplay(_dpy); - _dpy = NULL; - -#endif // NL_OS_UNIX + unInit(); // released _Initialized= false; @@ -1045,7 +968,7 @@ void CDriverGL::setupViewport (const class CViewport& viewport) { H_AUTO_OGL(CDriverGL_setupViewport ) #ifdef NL_OS_WINDOWS - if (_hWnd == NULL) return; + if (_win == EmptyWindow) return; // Setup gl viewport int clientWidth = _WindowWidth; @@ -1117,7 +1040,7 @@ void CDriverGL::setupScissor (const class CScissor& scissor) { H_AUTO_OGL(CDriverGL_setupScissor ) #ifdef NL_OS_WINDOWS - if (_hWnd == NULL) return; + if (_win == EmptyWindow) return; // Setup gl viewport int clientWidth = _WindowWidth; diff --git a/code/nel/src/3d/driver/opengl/driver_opengl.h b/code/nel/src/3d/driver/opengl/driver_opengl.h index 7112a998f..39eb70dfc 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl.h +++ b/code/nel/src/3d/driver/opengl/driver_opengl.h @@ -305,13 +305,11 @@ public: virtual nlWindow getDisplay() { -#ifdef NL_OS_WINDOWS - return _hWnd; -#elif defined(NL_OS_MAC) && defined(NL_MAC_NATIVE) +#if defined(NL_OS_MAC) && defined(NL_MAC_NATIVE) return NULL; -#elif defined(NL_OS_UNIX) +#else return _win; -#endif // NL_OS_WINDOWS +#endif } virtual uint32 getAvailableVertexAGPMemory (); @@ -655,20 +653,22 @@ private: private: // Version of the driver. Not the interface version!! Increment when implementation of the driver change. - static const uint32 ReleaseVersion; + static const uint32 ReleaseVersion; bool _FullScreen; bool _OffScreen; bool _Resizable; uint _Interval; + sint8 _AntiAliasing; sint32 _WindowWidth, _WindowHeight, _WindowX, _WindowY; + nlWindow _win; + #ifdef NL_OS_WINDOWS friend static bool GlWndProc(CDriverGL *driver, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); - HWND _hWnd; HDC _hDC; PIXELFORMATDESCRIPTOR _pfd; HGLRC _hRC; @@ -687,7 +687,6 @@ private: Display* _dpy; GLXContext _ctx; - Window _win; Cursor _cursor; NLMISC::CUnixEventEmitter _EventEmitter; @@ -843,7 +842,11 @@ private: private: bool setupDisplay(); + bool unInit(); + bool createWindow(const GfxMode& mode); + bool destroyWindow(); + // Methods to manage screen resolutions bool restoreScreenMode(); bool saveScreenMode(); bool setScreenMode(const GfxMode &mode); diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp index f19201905..ca5978e59 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp @@ -54,7 +54,7 @@ static bool GlWndProc(CDriverGL *driver, HWND hWnd, UINT message, WPARAM wParam, if (driver != NULL) { RECT rect; - GetClientRect (driver->_hWnd, &rect); + GetClientRect (driver->_win, &rect); // Setup gl viewport driver->_WindowWidth = rect.right-rect.left; @@ -201,68 +201,100 @@ bool CDriverGL::init (uint windowIcon, emptyProc exitFunc) return true; } +// *************************************************************************** +bool CDriverGL::unInit() +{ + H_AUTO_OGL(CDriverGL_unInit) + + if (_FullScreen) + { + restoreScreenMode(); + showCursor(true); + + _FullScreen = false; + } + +#ifdef NL_OS_WINDOWS + + // Off-screen rendering ? + if (_PBuffer) + { + nwglReleasePbufferDCARB(_PBuffer, _hDC); + nwglDestroyPbufferARB(_PBuffer); + _PBuffer = NULL; + } + + if (!UnregisterClassW(L"NLClass", GetModuleHandle(NULL))) + nlwarning("Can't unregister NLClass"); + + // Restaure monitor color parameters + if (_NeedToRestaureGammaRamp) + { + HDC dc = CreateDC ("DISPLAY", NULL, NULL, NULL); + if (dc) + { + if (!SetDeviceGammaRamp (dc, _GammaRampBackuped)) + nlwarning ("(CDriverGL::release): SetDeviceGammaRamp failed"); + + // Release the DC + ReleaseDC (NULL, dc); + } + else + { + nlwarning ("(CDriverGL::release): can't create DC"); + } + } + +#elif defined(NL_OS_MAC) && defined(NL_MAC_NATIVE) + + NL3D::MAC::release(); + +#elif defined (NL_OS_UNIX) + + XCloseDisplay(_dpy); + _dpy = NULL; + +#endif // NL_OS_UNIX + + return true; +} + // -------------------------------------------------- bool CDriverGL::setDisplay(nlWindow wnd, const GfxMode &mode, bool show, bool resizeable) throw(EBadDisplay) { H_AUTO_OGL(CDriverGL_setDisplay) - uint width = mode.Width; - uint height = mode.Height; - - if (!setScreenMode(mode)) - return false; + _win = EmptyWindow; + _WindowWidth = _WindowHeight = _WindowX = _WindowY = 0; + _FullScreen = false; + _Resizable = resizeable; + _OffScreen = mode.OffScreen; + _DestroyWindow = false; #ifdef NL_OS_WINDOWS + // Init pointers + _PBuffer = NULL; + _hRC = NULL; + _hDC = NULL; + // Driver caps. //============= // Retrieve the WGL extensions before init the driver. int pf; - _OffScreen = mode.OffScreen; - - // Init pointers - _PBuffer = NULL; - _hWnd = NULL; - _WindowWidth = _WindowHeight = _WindowX = _WindowY = 0; - _hRC = NULL; - _hDC = NULL; - // Offscreen mode ? if (_OffScreen) { - // Get a hdc - - ULONG WndFlags=WS_OVERLAPPEDWINDOW+WS_CLIPCHILDREN+WS_CLIPSIBLINGS; - WndFlags&=~WS_VISIBLE; - RECT WndRect; - WndRect.left=0; - WndRect.top=0; - WndRect.right=width; - WndRect.bottom=height; - AdjustWindowRect(&WndRect,WndFlags,FALSE); - HWND tmpHWND = CreateWindowW(L"NLClass", - L"", - WndFlags, - CW_USEDEFAULT,CW_USEDEFAULT, - WndRect.right,WndRect.bottom, - NULL, - NULL, - GetModuleHandleW(NULL), - NULL); - if (!tmpHWND) - { - nlwarning ("CDriverGL::setDisplay: CreateWindowW failed"); +#if 0 + if (!createWindow(mode)) return false; - } // resize the window RECT rc; SetRect (&rc, 0, 0, width, height); - _WindowWidth = width; - _WindowHeight = height; - AdjustWindowRectEx (&rc, GetWindowStyle (_hWnd), GetMenu (_hWnd) != NULL, GetWindowExStyle (_hWnd)); - SetWindowPos (_hWnd, NULL, 0, 0, rc.right - rc.left, rc.bottom - rc.top, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE ); + AdjustWindowRectEx (&rc, GetWindowStyle (_win), GetMenu (_win) != NULL, GetWindowExStyle (_win)); + SetWindowPos (_win, NULL, 0, 0, rc.right - rc.left, rc.bottom - rc.top, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE ); // Get the HDC tempHDC = GetDC(tmpHWND); @@ -310,7 +342,7 @@ bool CDriverGL::setDisplay(nlWindow wnd, const GfxMode &mode, bool show, bool re nlwarning ("CDriverGL::setDisplay: wglCreateContext failed: 0x%x", error); DestroyWindow (tmpHWND); _PBuffer = NULL; - _hWnd = NULL; + _win = EmptyWindow; _hRC = NULL; _hDC = NULL; return false; @@ -324,7 +356,7 @@ bool CDriverGL::setDisplay(nlWindow wnd, const GfxMode &mode, bool show, bool re wglDeleteContext (tempGLRC); DestroyWindow (tmpHWND); _PBuffer = NULL; - _hWnd = NULL; + _win = EmptyWindow; _hRC = NULL; _hDC = NULL; return false; @@ -341,7 +373,7 @@ bool CDriverGL::setDisplay(nlWindow wnd, const GfxMode &mode, bool show, bool re nlwarning ("CDriverGL::setDisplay: wglGetCurrentDC failed: 0x%x", error); DestroyWindow (tmpHWND); _PBuffer = NULL; - _hWnd = NULL; + _win = EmptyWindow; _hRC = NULL; _hDC = NULL; return false; @@ -413,7 +445,7 @@ bool CDriverGL::setDisplay(nlWindow wnd, const GfxMode &mode, bool show, bool re DestroyWindow (tmpHWND); _PBuffer = NULL; - _hWnd = NULL; + _win = EmptyWindow; _hRC = NULL; _hDC = NULL; return false; @@ -427,7 +459,7 @@ bool CDriverGL::setDisplay(nlWindow wnd, const GfxMode &mode, bool show, bool re wglDeleteContext (tempGLRC); DestroyWindow (tmpHWND); _PBuffer = NULL; - _hWnd = NULL; + _win = EmptyWindow; _hRC = NULL; _hDC = NULL; return false; @@ -440,7 +472,7 @@ bool CDriverGL::setDisplay(nlWindow wnd, const GfxMode &mode, bool show, bool re wglDeleteContext (tempGLRC); DestroyWindow (tmpHWND); _PBuffer = NULL; - _hWnd = NULL; + _win = EmptyWindow; _hRC = NULL; _hDC = NULL; return false; @@ -462,7 +494,7 @@ bool CDriverGL::setDisplay(nlWindow wnd, const GfxMode &mode, bool show, bool re DestroyWindow (tmpHWND); _PBuffer = NULL; - _hWnd = NULL; + _win = EmptyWindow; _hRC = NULL; _hDC = NULL; return false; @@ -480,7 +512,7 @@ bool CDriverGL::setDisplay(nlWindow wnd, const GfxMode &mode, bool show, bool re wglDeleteContext (tempGLRC); DestroyWindow (tmpHWND); _PBuffer = NULL; - _hWnd = NULL; + _win = EmptyWindow; _hRC = NULL; _hDC = NULL; return false; @@ -512,85 +544,26 @@ bool CDriverGL::setDisplay(nlWindow wnd, const GfxMode &mode, bool show, bool re nwglDestroyPbufferARB( _PBuffer ); DestroyWindow (tmpHWND); _PBuffer = NULL; - _hWnd = NULL; + _win = EmptyWindow; _hRC = NULL; _hDC = NULL; return false; } +#endif } else { - _FullScreen= false; - if (wnd) + if (wnd == EmptyWindow) { - _hWnd=wnd; - _DestroyWindow=false; + if (!createWindow(mode)) + return false; } else { - ULONG WndFlags; - RECT WndRect; - - // Must destroy this window - _DestroyWindow=true; - - if(mode.Windowed) - if(resizeable) - WndFlags=WS_OVERLAPPEDWINDOW+WS_CLIPCHILDREN+WS_CLIPSIBLINGS; - else - WndFlags=WS_SYSMENU+WS_DLGFRAME+WS_CLIPCHILDREN+WS_CLIPSIBLINGS; - else - { - WndFlags=WS_POPUP; - - _FullScreen= true; - } - WndRect.left=0; - WndRect.top=0; - WndRect.right=width; - WndRect.bottom=height; - AdjustWindowRect(&WndRect,WndFlags,FALSE); - _hWnd = CreateWindowW( L"NLClass", - L"", - WndFlags, - CW_USEDEFAULT,CW_USEDEFAULT, - WndRect.right,WndRect.bottom, - NULL, - NULL, - GetModuleHandleW(NULL), - NULL); - if (_hWnd == NULL) - { - DWORD res = GetLastError(); - nlwarning("CreateWindow failed: %u", res); - return false; - } - - SetWindowLongPtr (_hWnd, GWLP_USERDATA, (LONG_PTR)this); - - // resize the window - RECT rc; - SetRect (&rc, 0, 0, width, height); - AdjustWindowRectEx (&rc, GetWindowStyle (_hWnd), GetMenu (_hWnd) != NULL, GetWindowExStyle (_hWnd)); - UINT flags = SWP_NOZORDER | SWP_NOACTIVATE; - if (mode.Windowed) - flags |= SWP_NOMOVE; - SetWindowPos (_hWnd, NULL, 0, 0, rc.right - rc.left, rc.bottom - rc.top, flags); - - if (show || _FullScreen) - showWindow(true); + _win = wnd; } - // Init Window Width and Height - RECT clientRect; - GetClientRect (_hWnd, &clientRect); - _WindowWidth = clientRect.right-clientRect.left; - _WindowHeight = clientRect.bottom-clientRect.top; - GetWindowRect (_hWnd, &clientRect); - _WindowX = clientRect.left; - _WindowY = clientRect.top; - - _hDC=GetDC(_hWnd); + _hDC=GetDC(_win); wglMakeCurrent(_hDC,NULL); _Depth=uint8(GetDeviceCaps(_hDC,BITSPIXEL)); @@ -643,7 +616,7 @@ bool CDriverGL::setDisplay(nlWindow wnd, const GfxMode &mode, bool show, bool re /// try to get direct input try { - NLMISC::CDIEventEmitter *diee = NLMISC::CDIEventEmitter::create(GetModuleHandle(NULL), _hWnd, we); + NLMISC::CDIEventEmitter *diee = NLMISC::CDIEventEmitter::create(GetModuleHandle(NULL), _win, we); if (diee) { _EventEmitter.addEmitter(diee, true); @@ -696,75 +669,52 @@ bool CDriverGL::setDisplay(nlWindow wnd, const GfxMode &mode, bool show, bool re } _ctx = glXCreateContext (_dpy, visual_info, None, GL_TRUE); - if(_ctx == NULL) + if (_ctx == NULL) { nlerror("glXCreateContext() failed"); } - XSetWindowAttributes attr; - attr.background_pixel = BlackPixel(_dpy, DefaultScreen(_dpy)); - attr.override_redirect = False; - - int attr_flags = CWOverrideRedirect | CWBackPixel; - - if(wnd == EmptyWindow) + if (wnd != EmptyWindow) { - nlWindow root = RootWindow(_dpy, DefaultScreen(_dpy)); - - attr.colormap = XCreateColormap(_dpy, root, visual_info->visual, AllocNone); - attr_flags |= CWColormap; - - _win = XCreateWindow (_dpy, root, 0, 0, width, height, 0, visual_info->depth, InputOutput, visual_info->visual, attr_flags, &attr); - - if (_win == EmptyWindow) - { - nlerror("3D: XCreateWindow() failed"); - } + if (!createWindow(mode)) + return false; } else { _win = wnd; + + XSetWindowAttributes attr; + attr.background_pixel = BlackPixel(_dpy, DefaultScreen(_dpy)); + attr.override_redirect = False; + + int attr_flags = CWOverrideRedirect | CWBackPixel; + XChangeWindowAttributes(_dpy, _win, attr_flags, &attr); } - const char *title="NeL window"; - - XSizeHints size_hints; - size_hints.x = 0; - size_hints.y = 0; - size_hints.width = width; - size_hints.height = height; - size_hints.flags = PSize | PMinSize | PMaxSize; - size_hints.min_width = width; - size_hints.min_height = height; - size_hints.max_width = width; - size_hints.max_height = height; - -#ifdef X_HAVE_UTF8_STRING - Xutf8SetWMProperties (_dpy, _win, (char*)title, (char*)title, NULL, 0, &size_hints, NULL, NULL); -#else - XTextProperty text_property; - XStringListToTextProperty((char**)&title, 1, &text_property); - XSetWMProperties (_dpy, _win, &text_property, &text_property, 0, 0, &size_hints, 0, 0); -#endif - glXMakeCurrent (_dpy, _win, _ctx); XMapRaised (_dpy, _win); XSelectInput (_dpy, _win, KeyPressMask|KeyReleaseMask|ButtonPressMask|ButtonReleaseMask|PointerMotionMask); - XMapWindow(_dpy, _win); +// XMapWindow(_dpy, _win); _EventEmitter.init (_dpy, _win); // XEvent event; // XIfEvent(dpy, &event, WaitForNotify, (char *)this); - setMode(mode); - #endif // NL_OS_UNIX - return setupDisplay(); + setMode(mode); + + if (!setupDisplay()) + return false; + + if (show || _FullScreen) + showWindow(true); + + return true; } #ifdef NL_OS_WINDOWS @@ -950,6 +900,139 @@ bool CDriverGL::setScreenMode(const GfxMode &mode) return true; } +// *************************************************************************** +bool CDriverGL::createWindow(const GfxMode &mode) +{ + H_AUTO_OGL(CDriverGL_createWindow) + + nlWindow window = EmptyWindow; + +#ifdef NL_OS_WINDOWS + + // create the OpenGL window + window = CreateWindowW(L"NLClass", L"NeL Window", WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, + CW_USEDEFAULT, CW_USEDEFAULT, mode.Width, mode.Height, HWND_DESKTOP, NULL, GetModuleHandle(NULL), NULL); + + if (window == EmptyWindow) + { + DWORD res = GetLastError(); + nlwarning("CreateWindow failed: %u", res); + return false; + } + + // associate OpenGL driver to window + SetWindowLongPtr(window, GWLP_USERDATA, (LONG_PTR)this); + +#elif defined(NL_OS_MAC) && defined(NL_MAC_NATIVE) + + // TODO + +#elif defined (NL_OS_UNIX) + + XSetWindowAttributes attr; + attr.background_pixel = BlackPixel(_dpy, DefaultScreen(_dpy)); + +#ifdef XF86VIDMODE + // If we're going to attempt fullscreen, we need to set redirect to True, + // This basically places the window with no borders in the top left + // corner of the screen. + if (mode.Windowed) + { + attr.override_redirect = False; + } + else + { + attr.override_redirect = True; + } +#else + attr.override_redirect = False; +#endif + + int attr_flags = CWOverrideRedirect | CWBackPixel; + + nlWindow root = RootWindow(_dpy, DefaultScreen(_dpy)); + + attr.colormap = XCreateColormap(_dpy, root, visual_info->visual, AllocNone); + attr_flags |= CWColormap; + + window = XCreateWindow (_dpy, root, 0, 0, mode.Width, mode.Height, 0, visual_info->depth, InputOutput, visual_info->visual, attr_flags, &attr); + + if (window == EmptyWindow) + { + nlerror("3D: XCreateWindow() failed"); + return false; + } + +#endif // NL_OS_UNIX + + _win = window; + + _WindowWidth = mode.Width; + _WindowHeight = mode.Height; + + // Must destroy this window + _DestroyWindow = true; + + setWindowTitle(ucstring("NeL window")); + + return true; +} + +// *************************************************************************** +bool CDriverGL::destroyWindow() +{ + H_AUTO_OGL(CDriverGL_destroyWindow) + +#ifdef NL_OS_WINDOWS + + // Then delete. + // wglMakeCurrent(NULL,NULL); + + if (_hDC) + wglMakeCurrent(_hDC, NULL); + + if (_hRC) + { + wglDeleteContext(_hRC); + _hRC = NULL; + } + + if (_win && _hDC) + { + ReleaseDC(_win, _hDC); + _hDC = NULL; + + if (_DestroyWindow) + DestroyWindow(_win); + } + +#elif defined(NL_OS_MAC) && defined(NL_MAC_NATIVE) + + // TODO + +#elif defined (NL_OS_UNIX) + + if (_ctx) + { + glXDestroyContext(_dpy, _ctx); + _ctx = NULL; + } + + if (_win && _DestroyWindow) + XDestroyWindow(_dpy, _win); + + // Ungrab the keyboard (probably not necessary); +// XUnmapWindow(_dpy, _win); + XSync(_dpy, True); + XUngrabKeyboard(_dpy, CurrentTime); + +#endif + + _win = EmptyWindow; + + return true; +} + // -------------------------------------------------- bool CDriverGL::setMode(const GfxMode& mode) { @@ -958,22 +1041,20 @@ bool CDriverGL::setMode(const GfxMode& mode) if (!setScreenMode(mode)) return false; + _WindowWidth = mode.Width; + _WindowHeight = mode.Height; + #ifdef NL_OS_WINDOWS if (mode.Windowed) { if (_FullScreen) - modifyStyle(_hWnd, GWL_STYLE, WS_POPUP, WS_OVERLAPPEDWINDOW+WS_CLIPCHILDREN+WS_CLIPSIBLINGS); - - _WindowWidth = mode.Width; - _WindowHeight = mode.Height; + modifyStyle(_win, GWL_STYLE, WS_POPUP, WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_CLIPSIBLINGS); } else { // mode ok => copy changes - _WindowWidth = mode.Width; - _WindowHeight = mode.Height; - _Depth= mode.Depth; + _Depth = mode.Depth; // if old mode was not fullscreen if (!_FullScreen) @@ -981,7 +1062,7 @@ bool CDriverGL::setMode(const GfxMode& mode) // Under the XP theme desktop, this function call the winproc WM_SIZE and change _WindowWidth and _WindowHeight sint32 windowWidth = _WindowWidth; sint32 windowHeight = _WindowHeight; - modifyStyle(_hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW+WS_CLIPCHILDREN+WS_CLIPSIBLINGS, WS_POPUP); + modifyStyle(_win, GWL_STYLE, WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, WS_POPUP); _WindowWidth = windowWidth; _WindowHeight = windowHeight; } @@ -990,23 +1071,22 @@ bool CDriverGL::setMode(const GfxMode& mode) // Resize the window RECT rc; SetRect (&rc, 0, 0, _WindowWidth, _WindowHeight); - AdjustWindowRectEx (&rc, GetWindowStyle (_hWnd), false, GetWindowExStyle (_hWnd)); + AdjustWindowRectEx (&rc, GetWindowStyle (_win), GetMenu (_win) != NULL, GetWindowExStyle (_win)); UINT flags = SWP_NOZORDER | SWP_NOACTIVATE; if (mode.Windowed) flags |= SWP_NOMOVE; - SetWindowPos (_hWnd, NULL, 0, 0, rc.right - rc.left, rc.bottom - rc.top, flags); + SetWindowPos (_win, NULL, 0, 0, rc.right - rc.left, rc.bottom - rc.top, flags); - showWindow(true); +// showWindow(true); // Init Window Width and Height RECT clientRect; - GetClientRect (_hWnd, &clientRect); + GetClientRect (_win, &clientRect); _WindowWidth = clientRect.right-clientRect.left; _WindowHeight = clientRect.bottom-clientRect.top; - GetWindowRect (_hWnd, &clientRect); + GetWindowRect (_win, &clientRect); _WindowX = clientRect.left; _WindowY = clientRect.top; - _FullScreen = !mode.Windowed; #elif defined(NL_OS_MAC) && defined(NL_MAC_NATIVE) @@ -1054,18 +1134,18 @@ bool CDriverGL::setMode(const GfxMode& mode) } #endif + // Resize and update the window + XResizeWindow(_dpy, _win, mode.Width, mode.Height); +// XMapWindow(_dpy, _win); + +#endif // NL_OS_UNIX + #if !defined(NL_OS_MAC) _FullScreen = !mode.Windowed; #else _FullScreen = false; #endif - // Resize and update the window - XResizeWindow(_dpy, _win, mode.Width, mode.Height); - XMapWindow(_dpy, _win); - -#endif // NL_OS_UNIX - return true; } @@ -1149,7 +1229,7 @@ bool CDriverGL::getCurrentScreenMode(GfxMode &mode) mode.Frequency = devmode.dmDisplayFrequency, mode.Width = (uint16)devmode.dmPelsWidth; mode.Height = (uint16)devmode.dmPelsHeight; - mode.AntiAlias = -1; + mode.AntiAlias = _AntiAliasing; #elif defined(NL_OS_MAC) && defined(NL_MAC_NATIVE) # warning "OpenGL Driver: Temporary Mac Implementation" @@ -1204,7 +1284,7 @@ void CDriverGL::setWindowTitle(const ucstring &title) { #ifdef NL_OS_WINDOWS - SetWindowTextW(_hWnd, (WCHAR*)title.c_str()); + SetWindowTextW(_win, (WCHAR*)title.c_str()); #elif defined(NL_OS_MAC) && defined(NL_MAC_NATIVE) @@ -1231,7 +1311,7 @@ void CDriverGL::setWindowPos(uint32 x, uint32 y) #ifdef NL_OS_WINDOWS - SetWindowPos(_hWnd, NULL, x, y, 0, 0, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE); + SetWindowPos(_win, NULL, x, y, 0, 0, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE); #elif defined(NL_OS_MAC) && defined(NL_MAC_NATIVE) @@ -1248,7 +1328,7 @@ void CDriverGL::setWindowPos(uint32 x, uint32 y) void CDriverGL::showWindow(bool show) { #ifdef NL_OS_WINDOWS - ShowWindow (_hWnd, show ? SW_SHOW:SW_HIDE); + ShowWindow (_win, show ? SW_SHOW:SW_HIDE); #elif defined(NL_OS_MAC) && defined(NL_MAC_NATIVE) # warning "OpenGL Driver: Missing Mac Implementation" nlwarning("OpenGL Driver: Missing Mac Implementation"); @@ -1409,13 +1489,13 @@ void CDriverGL::setMousePos(float x, float y) #ifdef NL_OS_WINDOWS - if (_hWnd) + if (_win) { // NeL window coordinate to MSWindows coordinates POINT pt; - pt.x = (int)((float)(_WindowWidth)*x); - pt.y = (int)((float)(_WindowHeight)*(1.0f-y)); - ClientToScreen (_hWnd, &pt); + pt.x = (sint)((float)(_WindowWidth)*x); + pt.y = (sint)((float)(_WindowHeight)*(1.0f-y)); + ClientToScreen (_win, &pt); SetCursorPos(pt.x, pt.y); } @@ -1451,7 +1531,7 @@ void CDriverGL::getWindowSize(uint32 &width, uint32 &height) } else { - if (_hWnd) + if (_win) { width = (uint32)(_WindowWidth); height = (uint32)(_WindowHeight); @@ -1488,7 +1568,7 @@ void CDriverGL::getWindowPos(uint32 &x, uint32 &y) } else { - if (_hWnd) + if (_win) { x = (uint32)_WindowX; y = (uint32)_WindowY; @@ -1535,7 +1615,7 @@ bool CDriverGL::isActive() #ifdef NL_OS_WINDOWS - res = (IsWindow(_hWnd) != FALSE); + res = (IsWindow(_win) != FALSE); #elif defined(NL_OS_MAC) && defined(NL_MAC_NATIVE) # warning "OpenGL Driver: Missing Mac Implementation" @@ -1557,14 +1637,14 @@ void CDriverGL::setCapture (bool b) if (b) { RECT client; - GetClientRect (_hWnd, &client); + GetClientRect (_win, &client); POINT pt1,pt2; pt1.x = client.left; pt1.y = client.top; - ClientToScreen (_hWnd, &pt1); + ClientToScreen (_win, &pt1); pt2.x = client.right; pt2.y = client.bottom; - ClientToScreen (_hWnd, &pt2); + ClientToScreen (_win, &pt2); client.bottom = pt2.y; client.top = pt1.y; client.left = pt1.x;