From 0078df9593bc33fce822fad01350da2f6f4ba938 Mon Sep 17 00:00:00 2001 From: Nimetu Date: Fri, 6 Mar 2020 15:28:58 +0200 Subject: [PATCH 01/14] Fixed: Scroll bar losing position when group window is minimized --- code/nel/src/gui/ctrl_scroll.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/nel/src/gui/ctrl_scroll.cpp b/code/nel/src/gui/ctrl_scroll.cpp index 124655264..df45b428f 100644 --- a/code/nel/src/gui/ctrl_scroll.cpp +++ b/code/nel/src/gui/ctrl_scroll.cpp @@ -49,7 +49,7 @@ namespace NLGUI _Aligned = 1; _TrackPos = 0; _TrackDispPos = 0; - _TrackSize = _TrackSizeMin = 16; + _TrackSize = _TrackSizeMin = 8; _Min = 0; _Max = 100; _Value = 0; From 1337908369766e491376d50a73419cb58ac76eb6 Mon Sep 17 00:00:00 2001 From: Nimetu Date: Sat, 7 Mar 2020 11:27:00 +0200 Subject: [PATCH 02/14] Changed: systemMessageBox on linux/macOS to non-blocking, log only --- code/nel/src/3d/driver/opengl/driver_opengl_window.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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 de330117c..2ab5a3aba 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp @@ -2681,8 +2681,11 @@ IDriver::TMessageBoxId CDriverGL::systemMessageBox (const char* message, const c } nlstop; #else // NL_OS_WINDOWS - // Call the console version! - IDriver::systemMessageBox (message, title, type, icon); + // TODO: if user did not launch from console, then program "freezes" without explanation or possibility to continue + //IDriver::systemMessageBox (message, title, type, icon); + // log only + printf("%s:%s\n", title, message); + nlwarning("%s: %s", title, message); #endif // NL_OS_WINDOWS return okId; } From 0bec2ee2ffc4ef160b5eaf8cbf7c4d367bd13723 Mon Sep 17 00:00:00 2001 From: Nimetu Date: Thu, 5 Mar 2020 15:00:33 +0200 Subject: [PATCH 03/14] Changed: Ignore setMousePos if window does not have input focus. --- .../src/3d/driver/opengl/driver_opengl.cpp | 1 + code/nel/src/3d/driver/opengl/driver_opengl.h | 1 + .../3d/driver/opengl/driver_opengl_inputs.cpp | 9 ++++++++- .../3d/driver/opengl/driver_opengl_window.cpp | 19 +++++++++++++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/code/nel/src/3d/driver/opengl/driver_opengl.cpp b/code/nel/src/3d/driver/opengl/driver_opengl.cpp index c5d7b1d05..90b17958f 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl.cpp @@ -234,6 +234,7 @@ CDriverGL::CDriverGL() _win = EmptyWindow; _WindowX = 0; _WindowY = 0; + _WindowFocus = true; _WindowVisible = true; _DestroyWindow = false; _Maximized = false; diff --git a/code/nel/src/3d/driver/opengl/driver_opengl.h b/code/nel/src/3d/driver/opengl/driver_opengl.h index e9aa2e905..9bd19b14d 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl.h +++ b/code/nel/src/3d/driver/opengl/driver_opengl.h @@ -723,6 +723,7 @@ private: bool _Maximized; uint _Interval; bool _Resizable; + bool _WindowFocus; sint32 _DecorationWidth; sint32 _DecorationHeight; diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_inputs.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_inputs.cpp index 0d27166fc..3ede88b41 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_inputs.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_inputs.cpp @@ -509,7 +509,7 @@ void CDriverGL::setMousePos(float x, float y) { H_AUTO_OGL(CDriverGL_setMousePos) - if (_win == EmptyWindow) + if (_win == EmptyWindow || !_WindowFocus) return; sint x1 = (sint)((float)_CurrentMode.Width*x); @@ -612,6 +612,7 @@ bool CDriverGL::isSystemCursorInClientArea() #ifdef NL_OS_WINDOWS return IsWindowVisible(_win) != FALSE; #endif + return _WindowFocus; } else { @@ -650,7 +651,13 @@ bool CDriverGL::isSystemCursorInClientArea() { return false; } +#elif defined(NL_OS_MAC) + // TODO: implement this +#elif defined (NL_OS_UNIX) + // TODO: implement this #endif + // TODO: probably wrong if NeL window is docked inside parent (ie QT widget) + return _WindowFocus; } return true; 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 2ab5a3aba..293cb28bb 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp @@ -106,6 +106,13 @@ bool GlWndProc(CDriverGL *driver, HWND hWnd, UINT message, WPARAM wParam, LPARAM driver->_WndActive = true; } } + else if ((message == WM_SETFOCUS) || (message == WM_KILLFOCUS)) + { + if (driver != NULL) + { + driver->_WindowFocus = (message == WM_SETFOCUS); + } + } bool trapMessage = false; if (driver->_EventEmitter.getNumEmitters() > 0) @@ -291,6 +298,18 @@ bool GlWndProc(CDriverGL *driver, XEvent &e) break; + case FocusIn: + { + driver->_WindowFocus = true; + return driver->_EventEmitter.processMessage(e); + } + + case FocusOut: + { + driver->_WindowFocus = false; + return driver->_EventEmitter.processMessage(e); + } + default: // Process the message by the emitter From dccbb376a0f41d2b77aeb0f4be93468fe5fdc7a1 Mon Sep 17 00:00:00 2001 From: Nimetu Date: Fri, 6 Mar 2020 10:29:49 +0200 Subject: [PATCH 04/14] Changed: Windows focus events in Direct3d --- code/nel/src/3d/driver/direct3d/driver_direct3d.cpp | 10 ++++++++++ code/nel/src/3d/driver/direct3d/driver_direct3d.h | 1 + .../src/3d/driver/direct3d/driver_direct3d_inputs.cpp | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp b/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp index 691be14df..1ab29c3a0 100644 --- a/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp +++ b/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp @@ -197,6 +197,7 @@ CDriverD3D::CDriverD3D() _BackBuffer = NULL; _Maximized = false; _HandlePossibleSizeChangeNextSize = false; + _WindowFocus = true; _Interval = 1; _AGPMemoryAllocated = 0; _VRAMMemoryAllocated = 0; @@ -1164,6 +1165,14 @@ void D3DWndProc(CDriverD3D *driver, HWND hWnd, UINT message, WPARAM wParam, LPAR } } + if ((message == WM_SETFOCUS) || (message == WM_KILLFOCUS)) + { + if (driver != NULL) + { + driver->_WindowFocus = (message == WM_SETFOCUS); + } + } + if (driver->_EventEmitter.getNumEmitters() > 0) { CWinEventEmitter *we = NLMISC::safe_cast(driver->_EventEmitter.getEmitter(0)); @@ -1370,6 +1379,7 @@ bool CDriverD3D::setDisplay(nlWindow wnd, const GfxMode& mode, bool show, bool r // Reset window state _Maximized = false; _HandlePossibleSizeChangeNextSize = false; + _WindowFocus = true; if (_HWnd) { diff --git a/code/nel/src/3d/driver/direct3d/driver_direct3d.h b/code/nel/src/3d/driver/direct3d/driver_direct3d.h index 8f8048368..636695670 100644 --- a/code/nel/src/3d/driver/direct3d/driver_direct3d.h +++ b/code/nel/src/3d/driver/direct3d/driver_direct3d.h @@ -2324,6 +2324,7 @@ private: sint32 _WindowY; bool _DestroyWindow; bool _Maximized; + bool _WindowFocus; bool _HandlePossibleSizeChangeNextSize; GfxMode _CurrentMode; uint _Interval; diff --git a/code/nel/src/3d/driver/direct3d/driver_direct3d_inputs.cpp b/code/nel/src/3d/driver/direct3d/driver_direct3d_inputs.cpp index d26741faf..d5b4ef482 100644 --- a/code/nel/src/3d/driver/direct3d/driver_direct3d_inputs.cpp +++ b/code/nel/src/3d/driver/direct3d/driver_direct3d_inputs.cpp @@ -374,7 +374,7 @@ void CDriverD3D::setMousePos(float x, float y) { H_AUTO_D3D(CDriverD3D_setMousePos); - if (_HWnd == EmptyWindow) + if (_HWnd == EmptyWindow || !_WindowFocus) return; // convert position size from float to pixels From 9c46a9d8f780e3e670d283f4faf075888f398aaa Mon Sep 17 00:00:00 2001 From: Nimetu Date: Fri, 6 Mar 2020 10:23:39 +0200 Subject: [PATCH 05/14] Changed: Windows focus events on macOS --- code/nel/src/3d/driver/opengl/driver_opengl.h | 2 +- .../3d/driver/opengl/mac/cocoa_window_delegate.h | 2 ++ .../3d/driver/opengl/mac/cocoa_window_delegate.mm | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/code/nel/src/3d/driver/opengl/driver_opengl.h b/code/nel/src/3d/driver/opengl/driver_opengl.h index 9bd19b14d..e1ee968a5 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl.h +++ b/code/nel/src/3d/driver/opengl/driver_opengl.h @@ -700,6 +700,7 @@ public: GfxMode _CurrentMode; sint32 _WindowX; sint32 _WindowY; + bool _WindowFocus; #ifdef NL_OS_MAC NLMISC::CCocoaEventEmitter _EventEmitter; @@ -723,7 +724,6 @@ private: bool _Maximized; uint _Interval; bool _Resizable; - bool _WindowFocus; sint32 _DecorationWidth; sint32 _DecorationHeight; diff --git a/code/nel/src/3d/driver/opengl/mac/cocoa_window_delegate.h b/code/nel/src/3d/driver/opengl/mac/cocoa_window_delegate.h index 9736e2a27..1e9881b47 100644 --- a/code/nel/src/3d/driver/opengl/mac/cocoa_window_delegate.h +++ b/code/nel/src/3d/driver/opengl/mac/cocoa_window_delegate.h @@ -40,5 +40,7 @@ using NL3D::CDriverGL; - (id)initWithDriver:(CDriverGL*)driver; - (void)windowDidMove:(NSNotification*)notification; +- (void)windowDidBecomeKey:(NSNotification *)notification; +- (void)windowDidResignKey:(NSNotification *)notification; @end diff --git a/code/nel/src/3d/driver/opengl/mac/cocoa_window_delegate.mm b/code/nel/src/3d/driver/opengl/mac/cocoa_window_delegate.mm index 2e5faf852..44031f7aa 100644 --- a/code/nel/src/3d/driver/opengl/mac/cocoa_window_delegate.mm +++ b/code/nel/src/3d/driver/opengl/mac/cocoa_window_delegate.mm @@ -55,4 +55,19 @@ static void windowDidMove(NSWindow* window, CDriverGL* driver) windowDidMove([notification object], _driver); } +- (void)windowDidBecomeKey:(NSNotification *)notification +{ + if (!_driver) + return; + + _driver->_WindowFocus = true; +} +- (void)windowDidResignKey:(NSNotification *)notification; +{ + if(!_driver) + return; + + _driver->_WindowFocus = false; +} + @end From 2ebe1c2a3dd8d452f3d2b164ae2e1dc8feb92d1d Mon Sep 17 00:00:00 2001 From: kaetemi Date: Mon, 16 Mar 2020 01:43:19 +0800 Subject: [PATCH 06/14] Clean up analysis warnings --- code/nel/include/nel/3d/landscape.h | 4 ++-- code/nel/include/nel/misc/common.h | 4 ++-- code/nel/include/nel/misc/debug.h | 35 +++++++++++++++++++++-------- code/nel/include/nel/misc/file.h | 2 +- code/nel/include/nel/misc/stream.h | 2 +- 5 files changed, 32 insertions(+), 15 deletions(-) diff --git a/code/nel/include/nel/3d/landscape.h b/code/nel/include/nel/3d/landscape.h index a7383963d..f6e1a5861 100644 --- a/code/nel/include/nel/3d/landscape.h +++ b/code/nel/include/nel/3d/landscape.h @@ -100,8 +100,8 @@ public: public: EBadBind() {} - ~EBadBind() throw () {} - virtual const char *what() const throw(); + virtual ~EBadBind() NL_OVERRIDE {} + virtual const char *what() const throw() NL_OVERRIDE; }; diff --git a/code/nel/include/nel/misc/common.h b/code/nel/include/nel/misc/common.h index f5f99ea6a..a5d1b2f27 100644 --- a/code/nel/include/nel/misc/common.h +++ b/code/nel/include/nel/misc/common.h @@ -368,8 +368,8 @@ public: Exception(); Exception(const std::string &reason); Exception(const char *format, ...); - virtual ~Exception() throw() {} - virtual const char *what() const throw(); + virtual ~Exception() NL_OVERRIDE {} + virtual const char *what() const throw() NL_OVERRIDE; }; diff --git a/code/nel/include/nel/misc/debug.h b/code/nel/include/nel/misc/debug.h index 668c2e5a3..7d4ddcd1b 100644 --- a/code/nel/include/nel/misc/debug.h +++ b/code/nel/include/nel/misc/debug.h @@ -368,13 +368,19 @@ extern bool _assertex_stop_1(bool &ignoreNextTime); // removed because we always check assert (even in release mode) #if defined(NL_DEBUG) +#if defined(_MSC_VER) && _MSC_VER >= 1900 +#define nlassume(exp) do { __analysis_assume(exp); } while (0) // __analysis_assume doesn't evaluate the expression at runtime +#else +#define nlassume(exp) do { ) while (0) +#endif + #ifdef NL_NO_DEBUG -# define nlassert(exp) if(false) -# define nlassertonce(exp) if(false) -# define nlassertex(exp, str) if(false) -# define nlverify(exp) { exp; } -# define nlverifyonce(exp) { exp; } -# define nlverifyex(exp, str) { exp; } +# define nlassert(exp) nlassume(exp) +# define nlassertonce(exp) nlassume(exp) +# define nlassertex(exp, str) nlassume(exp) +# define nlverify(exp) do { exp; nlassume(exp); } while (0) +# define nlverifyonce(exp) do { exp; nlassume(exp); } while (0) +# define nlverifyex(exp, str) do { exp; nlassume(exp); } while (0) #else // NL_NO_DEBUG # ifdef NL_OS_UNIX @@ -383,25 +389,29 @@ extern bool _assertex_stop_1(bool &ignoreNextTime); #define nlassert(exp) \ do { \ - if (!(exp)) { \ + bool _expResult_ = (exp) ? true : false; \ + if (!(_expResult_)) { \ NLMISC::createDebug (); \ NLMISC::INelContext::getInstance().getAssertLog()->setPosition (__LINE__, __FILE__, __FUNCTION__); \ NLMISC::INelContext::getInstance().getAssertLog()->displayNL ("\"%s\" ", #exp); \ NLMISC_BREAKPOINT; \ } \ + nlassume(_expResult_); \ } while(0) #define nlassertonce(exp) nlassert(exp) #define nlassertex(exp, str) \ do { \ - if (!(exp)) { \ + bool _expResult_ = (exp) ? true : false; \ + if (!(_expResult_)) { \ NLMISC::createDebug (); \ NLMISC::INelContext::getInstance().getAssertLog()->setPosition (__LINE__, __FILE__, __FUNCTION__); \ NLMISC::INelContext::getInstance().getAssertLog()->displayNL ("\"%s\" ", #exp); \ NLMISC::INelContext::getInstance().getAssertLog()->displayRawNL str; \ NLMISC_BREAKPOINT; \ } \ + nlassume(_expResult_); \ } while(0) #define nlverify(exp) nlassert(exp) @@ -419,16 +429,19 @@ do { \ NLMISC_BREAKPOINT; \ } \ ASSERT_THROW_EXCEPTION_CODE_EX(_expResult_, #exp) \ + nlassume(_expResult_); \ } while(0) #define nlassertonce(exp) \ do { \ static bool ignoreNextTime = false; \ - if (!ignoreNextTime && !(exp)) { \ + bool _expResult_ = (exp) ? true : false; \ + if (!ignoreNextTime && !(_expResult_)) { \ ignoreNextTime = true; \ if(NLMISC::_assert_stop(ignoreNextTime, __LINE__, __FILE__, __FUNCTION__, #exp)) \ NLMISC_BREAKPOINT; \ } \ + nlassume(_expResult_); \ } while(0) #define nlassertex(exp, str) \ @@ -442,6 +455,7 @@ do { \ NLMISC_BREAKPOINT; \ } \ ASSERT_THROW_EXCEPTION_CODE_EX(_expResult_, #exp) \ + nlassume(_expResult_); \ } while(0) #define nlverify(exp) \ @@ -453,6 +467,7 @@ do { \ NLMISC_BREAKPOINT; \ } \ ASSERT_THROW_EXCEPTION_CODE_EX(_expResult_, #exp) \ + nlassume(_expResult_); \ } while(0) #define nlverifyonce(exp) \ @@ -464,6 +479,7 @@ do { \ if(NLMISC::_assert_stop(ignoreNextTime, __LINE__, __FILE__, __FUNCTION__, #exp)) \ NLMISC_BREAKPOINT; \ } \ + nlassume(_expResult_); \ } while(0) #define nlverifyex(exp, str) \ @@ -477,6 +493,7 @@ do { \ NLMISC_BREAKPOINT; \ } \ ASSERT_THROW_EXCEPTION_CODE_EX(_expResult_, #exp) \ + nlassume(_expResult_); \ } while(0) # endif // NL_OS_UNIX diff --git a/code/nel/include/nel/misc/file.h b/code/nel/include/nel/misc/file.h index 3e40d122a..f634f4378 100644 --- a/code/nel/include/nel/misc/file.h +++ b/code/nel/include/nel/misc/file.h @@ -38,7 +38,7 @@ struct EFile : public EStream EFile (const std::string& filename) : EStream( "Unknown file error in '"+filename+"'" ), Filename(filename) {} EFile (const std::string& filename, const std::string& text, bool ) : EStream( text ), Filename(filename) {} - virtual ~EFile() throw() {} + virtual ~EFile() NL_OVERRIDE {} std::string Filename; }; diff --git a/code/nel/include/nel/misc/stream.h b/code/nel/include/nel/misc/stream.h index da9f2835e..89db78a1c 100644 --- a/code/nel/include/nel/misc/stream.h +++ b/code/nel/include/nel/misc/stream.h @@ -78,7 +78,7 @@ struct EStream : public Exception EStream( const IStream &f, const std::string& str ); - virtual ~EStream() throw() {} + virtual ~EStream() NL_OVERRIDE {} // May Not be Filled... std::string StreamName; From cd555f640b4dc0d0d24aff5cb4cbaff49fef7a65 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Mon, 16 Mar 2020 01:47:13 +0800 Subject: [PATCH 07/14] This should probably clear --- code/nel/src/3d/packed_zone.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/nel/src/3d/packed_zone.cpp b/code/nel/src/3d/packed_zone.cpp index aa3eff11f..72866ea78 100644 --- a/code/nel/src/3d/packed_zone.cpp +++ b/code/nel/src/3d/packed_zone.cpp @@ -492,7 +492,7 @@ static void computeRastersUnion(const CPolygon2D::TRasterVect &inRaster0, CPolyg { if (inRaster1.empty()) { - outRaster.empty(); + outRaster.clear(); finalMinY = -1; return; } From 71c7d3161ead23035a212d9d4700870845300452 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Mon, 16 Mar 2020 01:47:25 +0800 Subject: [PATCH 08/14] Disable unscoped enum warning --- code/nel/include/nel/misc/types_nl.h | 1 + 1 file changed, 1 insertion(+) diff --git a/code/nel/include/nel/misc/types_nl.h b/code/nel/include/nel/misc/types_nl.h index 3797c1137..445882c34 100644 --- a/code/nel/include/nel/misc/types_nl.h +++ b/code/nel/include/nel/misc/types_nl.h @@ -246,6 +246,7 @@ # pragma warning (disable : 4005) // don't warn on redefinitions caused by xp platform sdk # endif // NL_COMP_VC8 || NL_COMP_VC9 # pragma warning (disable : 26495) // Variable is uninitialized. Always initialize a member variable. (On purpose for performance.) +# pragma warning (disable : 26812) // The enum type is unscoped. Prefer 'enum class' over 'enum' (Enum.3). #endif // NL_OS_WINDOWS From 168c770716a0911e538f1e6a83705c50e3fd551b Mon Sep 17 00:00:00 2001 From: kaetemi Date: Mon, 16 Mar 2020 02:17:08 +0800 Subject: [PATCH 09/14] Assert return value --- code/nel/src/ligo/primitive.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/code/nel/src/ligo/primitive.cpp b/code/nel/src/ligo/primitive.cpp index 807894be2..d43d4cde1 100644 --- a/code/nel/src/ligo/primitive.cpp +++ b/code/nel/src/ligo/primitive.cpp @@ -1255,6 +1255,7 @@ const IPrimitive *IPrimitive::getPrimitive (const std::string &absoluteOrRelativ for (childIndex=0;childIndexgetNumChildren();childIndex++) { cursor->getChild(child,childIndex); + nlassert(child); string name; if ( child->getPropertyByName("class", name) && toUpper(name)==childName ) From e65d1587e7694e7aad9790cdab48aa6a226665b1 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Mon, 16 Mar 2020 02:17:21 +0800 Subject: [PATCH 10/14] Set fallback value on uninitialized variable --- code/nel/src/gui/ctrl_scroll.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/nel/src/gui/ctrl_scroll.cpp b/code/nel/src/gui/ctrl_scroll.cpp index df45b428f..14caa75f4 100644 --- a/code/nel/src/gui/ctrl_scroll.cpp +++ b/code/nel/src/gui/ctrl_scroll.cpp @@ -1348,6 +1348,7 @@ namespace NLGUI } else { + hs[hsIndex] = Hotspot_Bx; CLuaIHM::fails(ls, "%s : couldn't parse hotspot for vertical scrollbar", funcName); } } @@ -1369,6 +1370,7 @@ namespace NLGUI } else { + hs[hsIndex] = Hotspot_xL; CLuaIHM::fails(ls, "%s : couldn't parse hotspot for horizontal scrollbar", funcName); } } From 9d5af13c5ec83529ad76ffb76e35bc1713000771 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Mon, 16 Mar 2020 02:21:12 +0800 Subject: [PATCH 11/14] Assert parent exists --- code/nel/src/gui/group_header.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/code/nel/src/gui/group_header.cpp b/code/nel/src/gui/group_header.cpp index f9d3eae86..03d688921 100644 --- a/code/nel/src/gui/group_header.cpp +++ b/code/nel/src/gui/group_header.cpp @@ -179,6 +179,7 @@ namespace NLGUI while (limitingParent && (limitingParent->getResizeFromChildH() || dynamic_cast(limitingParent))) limitingParent = limitingParent->getParent(); + nlassert(limitingParent); getParentContainer()->setH(col->getH() + getParentContainer()->getHReal() - limitingParent->getHReal()); } } From 71e3ed5868f8b3e83192085bd850e5b7cc00094a Mon Sep 17 00:00:00 2001 From: kaetemi Date: Mon, 16 Mar 2020 02:33:07 +0800 Subject: [PATCH 12/14] Fix NULL _Parent and uninitialized parentId --- code/nel/src/gui/interface_group.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/code/nel/src/gui/interface_group.cpp b/code/nel/src/gui/interface_group.cpp index 2b899aca1..8f1d104c9 100644 --- a/code/nel/src/gui/interface_group.cpp +++ b/code/nel/src/gui/interface_group.cpp @@ -622,13 +622,30 @@ namespace NLGUI { std::string parentId; - if( value != "parent" ){ - if( _Parent != NULL ) + if (value != "parent") + { + if (_Parent != NULL) + { parentId = _Parent->getId() + ":" + value; + } else + { + parentId = "ui:" + value; + } + } + else + { + if (_Parent) + { parentId = _Parent->getId(); + } + else + { + parentId = value; + } } - CWidgetManager::getInstance()->getParser()->addParentSizeMaxAssociation( this, parentId ); + + CWidgetManager::getInstance()->getParser()->addParentSizeMaxAssociation(this, parentId); return; } else From 0a1e8186b34732e4acfe5ef5f885df7ea907f6e7 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Mon, 16 Mar 2020 04:18:11 +0800 Subject: [PATCH 13/14] Batch of fixes for client --- code/nel/include/nel/gui/lua_helper.h | 14 ++++---- code/nel/src/georges/form.cpp | 6 ++-- code/nel/src/georges/type.cpp | 2 +- code/nel/src/gui/interface_group.cpp | 1 + code/nel/src/gui/interface_link.cpp | 1 + code/nel/src/gui/lua_ihm.cpp | 32 +++++++++++-------- code/nel/src/gui/view_renderer.cpp | 2 +- code/nel/src/gui/widget_manager.cpp | 2 ++ code/nel/src/misc/bitmap.cpp | 4 +-- code/nel/src/misc/debug.cpp | 7 ++-- code/nel/src/misc/eid_translator.cpp | 2 +- code/nel/src/misc/i_xml.cpp | 5 ++- code/nel/src/misc/system_info.cpp | 1 + code/nel/src/misc/win_displayer.cpp | 4 +-- code/nel/src/pacs/build_indoor.cpp | 1 + code/ryzom/common/src/game_share/crypt.cpp | 8 ++--- .../src/game_share/mirrored_data_set.cpp | 1 + code/ryzom/common/src/game_share/object.cpp | 2 +- .../game_share/server_animation_module.cpp | 3 +- code/ryzom/common/src/game_share/utils.h | 4 +-- 20 files changed, 59 insertions(+), 43 deletions(-) diff --git a/code/nel/include/nel/gui/lua_helper.h b/code/nel/include/nel/gui/lua_helper.h index 0269e1a69..da5c33e6a 100644 --- a/code/nel/include/nel/gui/lua_helper.h +++ b/code/nel/include/nel/gui/lua_helper.h @@ -88,7 +88,7 @@ namespace NLGUI { public: ELuaError() { CLuaStackChecker::incrementExceptionContextCounter(); } - virtual ~ELuaError() throw() { CLuaStackChecker::decrementExceptionContextCounter(); } + virtual ~ELuaError() NL_OVERRIDE { CLuaStackChecker::decrementExceptionContextCounter(); } ELuaError(const std::string &reason) : Exception(reason) { CLuaStackChecker::incrementExceptionContextCounter(); } // what(), plus append the Reason virtual std::string luaWhat() const throw() {return NLMISC::toString("LUAError: %s", what());} @@ -100,9 +100,9 @@ namespace NLGUI public: ELuaParseError() {} ELuaParseError(const std::string &reason) : ELuaError(reason) {} - virtual ~ELuaParseError() throw() { } + virtual ~ELuaParseError() NL_OVERRIDE { } // what(), plus append the Reason - virtual std::string luaWhat() const throw() {return NLMISC::toString("ELuaParseError: %s", what());} + virtual std::string luaWhat() const throw() NL_OVERRIDE {return NLMISC::toString("ELuaParseError: %s", what());} }; /** Exception thrown when something went wrong inside a wrapped function called by lua @@ -113,8 +113,8 @@ namespace NLGUI ELuaWrappedFunctionException(CLuaState *luaState); ELuaWrappedFunctionException(CLuaState *luaState, const std::string &reason); ELuaWrappedFunctionException(CLuaState *luaState, const char *format, ...); - virtual ~ELuaWrappedFunctionException() throw() { } - virtual const char *what() const throw() {return _Reason.c_str();} + virtual ~ELuaWrappedFunctionException() NL_OVERRIDE { } + virtual const char *what() const throw() NL_OVERRIDE {return _Reason.c_str();} protected: void init(CLuaState *ls, const std::string &reason); protected: @@ -127,9 +127,9 @@ namespace NLGUI public: ELuaExecuteError() {} ELuaExecuteError(const std::string &reason) : ELuaError(reason) {} - virtual ~ELuaExecuteError() throw() { } + virtual ~ELuaExecuteError() NL_OVERRIDE { } // what(), plus append the Reason - virtual std::string luaWhat() const throw() {return NLMISC::toString("ELuaExecuteError: %s", what());} + virtual std::string luaWhat() const throw() NL_OVERRIDE {return NLMISC::toString("ELuaExecuteError: %s", what());} }; // A bad cast occurred when using lua_checkcast diff --git a/code/nel/src/georges/form.cpp b/code/nel/src/georges/form.cpp index 7fb51402e..c3fea6e0a 100644 --- a/code/nel/src/georges/form.cpp +++ b/code/nel/src/georges/form.cpp @@ -134,13 +134,13 @@ void CForm::write (xmlDocPtr doc, const std::string &filename) } // Write elements - Elements.write (node, this, NULL, true); + Elements.write (node, this, std::string(), true); // Write held elements uint i; for (i=0; iwrite (node, this, NULL, true); + HeldElements[i]->write (node, this, std::string(), true); } // Header @@ -273,7 +273,7 @@ void CForm::write (NLMISC::IStream &stream) xmlStream.init (&stream); // Write the file - write (xmlStream.getDocument (), NULL); + write (xmlStream.getDocument (), std::string()); } // *************************************************************************** diff --git a/code/nel/src/georges/type.cpp b/code/nel/src/georges/type.cpp index e8b2a8b5b..1055313dd 100644 --- a/code/nel/src/georges/type.cpp +++ b/code/nel/src/georges/type.cpp @@ -599,7 +599,7 @@ bool CType::getValue (string &result, const CForm *form, const CFormElmAtom *nod else if (evaluate == UFormElm::Eval) { // Evaluate numerical expression - if ((Type == Double) || (Type == SignedInt) || (Type == UnsignedInt) || (Type == UnsignedInt)) + if ((Type == Double) || (Type == SignedInt) || (Type == UnsignedInt)) { // Evaluate predefinition uint i; diff --git a/code/nel/src/gui/interface_group.cpp b/code/nel/src/gui/interface_group.cpp index 8f1d104c9..dacaf16cf 100644 --- a/code/nel/src/gui/interface_group.cpp +++ b/code/nel/src/gui/interface_group.cpp @@ -1540,6 +1540,7 @@ namespace NLGUI for (ite = _EltOrder.begin() ; ite != _EltOrder.end(); ite++) { CViewBase *pIE = *ite; + nlassert(pIE); if (pIE->getActive()) { const CInterfaceElement *el = pIE->getParentPos() ? pIE->getParentPos() : pIE->getParent(); diff --git a/code/nel/src/gui/interface_link.cpp b/code/nel/src/gui/interface_link.cpp index 966354e10..03a1212d3 100644 --- a/code/nel/src/gui/interface_link.cpp +++ b/code/nel/src/gui/interface_link.cpp @@ -667,6 +667,7 @@ namespace NLGUI string elt = Target.substr(0,Target.rfind(':')); CInterfaceElement *pIE = CWidgetManager::getInstance()->getElementFromId(elt); CInterfaceGroup *pIG = dynamic_cast(pIE); + nlassert(pIE); if (pIG == NULL) pIG = pIE->getParent(); diff --git a/code/nel/src/gui/lua_ihm.cpp b/code/nel/src/gui/lua_ihm.cpp index 132f1e4b9..946baa560 100644 --- a/code/nel/src/gui/lua_ihm.cpp +++ b/code/nel/src/gui/lua_ihm.cpp @@ -741,7 +741,7 @@ namespace NLGUI } // because this is a method, first parameter is the 'this' CReflectableRefPtrTarget *pRPT = getReflectableOnStack(*state, 1); - if (pRPT == NULL) + if (!pRPT) { state->push(NLMISC::toString("Error while calling lua method %s:%s : 'self' pointer is nil or of bad type, can't make the call.", prop->ParentClass->ClassName.c_str(), prop->Name.c_str()) @@ -752,19 +752,22 @@ namespace NLGUI state->remove(1); // remove 'self' reference from parameters stack // sint numResults = 0; - sint initialStackSize = state->getTop(); - try + if (pRPT) { - // call the actual method - numResults = (pRPT->*(prop->GetMethod.GetLuaMethod))(*state); - } - catch(const std::exception &e) - { - // restore stack to its initial size - state->setTop(initialStackSize); - lua_pushstring(ls, e.what()); - // TODO : see if this is safe to call lua error there" ... (it does a long jump) - lua_error(ls); + sint initialStackSize = state->getTop(); + try + { + // call the actual method + numResults = (pRPT->*(prop->GetMethod.GetLuaMethod))(*state); + } + catch (const std::exception & e) + { + // restore stack to its initial size + state->setTop(initialStackSize); + lua_pushstring(ls, e.what()); + // TODO : see if this is safe to call lua error there" ... (it does a long jump) + lua_error(ls); + } } return numResults; } @@ -787,6 +790,7 @@ namespace NLGUI CInterfaceElement *pIE= CLuaIHM::getUIOnStack(ls, 1); std::string script; ls.toString(2, script); + nlassert(pIE); // must be a group CInterfaceGroup *group= dynamic_cast(pIE); @@ -845,6 +849,7 @@ namespace NLGUI std::string dbList, script; ls.toString(2, dbList); ls.toString(3, script); + nlassert(pIE); // must be a group CInterfaceGroup *group= dynamic_cast(pIE); @@ -873,6 +878,7 @@ namespace NLGUI CInterfaceElement *pIE= CLuaIHM::getUIOnStack(ls, 1); std::string dbList; ls.toString(2, dbList); + nlassert(pIE); // must be a group CInterfaceGroup *group= dynamic_cast(pIE); diff --git a/code/nel/src/gui/view_renderer.cpp b/code/nel/src/gui/view_renderer.cpp index 4c2db062a..82716de4a 100644 --- a/code/nel/src/gui/view_renderer.cpp +++ b/code/nel/src/gui/view_renderer.cpp @@ -887,7 +887,7 @@ namespace NLGUI while (!iFile.eof()) { iFile.getline (bufTmp, 256); - sscanf (bufTmp, "%s %f %f %f %f", tgaName, &uvMinU, &uvMinV, &uvMaxU, &uvMaxV); + sscanf (bufTmp, "%s %f %f %f %f", tgaName, &uvMinU, &uvMinV, &uvMaxU, &uvMaxV); // FIXME: Return value ignored, tgaName may be uninitialized SImage image; image.UVMin.U = uvMinU; image.UVMin.V = uvMinV; diff --git a/code/nel/src/gui/widget_manager.cpp b/code/nel/src/gui/widget_manager.cpp index c0a6a4c85..864e4ef5b 100644 --- a/code/nel/src/gui/widget_manager.cpp +++ b/code/nel/src/gui/widget_manager.cpp @@ -2372,6 +2372,7 @@ namespace NLGUI // make sure all parent windows are active CCtrlBase *cb = getCaptureKeyboard(); CGroupContainer *lastContainer = NULL; + nlassert(cb); for(;;) { CGroupContainer *gc = dynamic_cast(cb); @@ -3226,6 +3227,7 @@ namespace NLGUI for( j = 0; j < mg.Group->getNumGroup(); j++ ) { CInterfaceGroup *g = mg.Group->getGroup( j ); + nlassert(g); if( dynamic_cast< CGroupModal* >( g ) != NULL ) continue; diff --git a/code/nel/src/misc/bitmap.cpp b/code/nel/src/misc/bitmap.cpp index 13fe82247..015a9c4c4 100644 --- a/code/nel/src/misc/bitmap.cpp +++ b/code/nel/src/misc/bitmap.cpp @@ -2046,7 +2046,7 @@ void CBitmap::resamplePicture32 (const NLMISC::CRGBA *pSrc, NLMISC::CRGBA *pDest sint32 nDestWidth, sint32 nDestHeight) { //logResample("RP32: 0 pSrc=%p pDest=%p, Src=%d x %d Dest=%d x %d", pSrc, pDest, nSrcWidth, nSrcHeight, nDestWidth, nDestHeight); - if ((nSrcWidth<=0)||(nSrcHeight<=0)||(nDestHeight<=0)||(nDestHeight<=0)) + if ((nSrcWidth<=0)||(nSrcHeight<=0)||(nDestWidth<=0)||(nDestHeight<=0)) return; // If we're reducing it by 2, call the fast resample @@ -2268,7 +2268,7 @@ void CBitmap::resamplePicture8 (const uint8 *pSrc, uint8 *pDest, sint32 nDestWidth, sint32 nDestHeight) { //logResample("RP8: 0 pSrc=%p pDest=%p, Src=%d x %d Dest=%d x %d", pSrc, pDest, nSrcWidth, nSrcHeight, nDestWidth, nDestHeight); - if ((nSrcWidth<=0)||(nSrcHeight<=0)||(nDestHeight<=0)||(nDestHeight<=0)) + if ((nSrcWidth<=0)||(nSrcHeight<=0)||(nDestWidth<=0)||(nDestHeight<=0)) return; // If we're reducing it by 2, call the fast resample diff --git a/code/nel/src/misc/debug.cpp b/code/nel/src/misc/debug.cpp index 3113de70e..cc3203a14 100644 --- a/code/nel/src/misc/debug.cpp +++ b/code/nel/src/misc/debug.cpp @@ -449,7 +449,7 @@ public: EDebug() { _Reason = "Nothing about EDebug"; } - virtual ~EDebug() throw() {} + virtual ~EDebug() NL_OVERRIDE {} EDebug(EXCEPTION_POINTERS * pexp) : m_pexp(pexp) { nlassert(pexp != 0); createWhat(); } EDebug(const EDebug& se) : m_pexp(se.m_pexp) { createWhat(); } @@ -863,9 +863,10 @@ public: cleanType (type, displayType); char tmp[1024]; + tmp[0]='\0'; if(type == "void") { - tmp[0]='\0'; + // tmp[0]='\0'; } else if(type == "int") { @@ -1716,6 +1717,7 @@ NLMISC_CATEGORISED_COMMAND(nel, writeaccess, "write a uint8 value in an invalid #endif } if(args.size() >= 2) NLMISC::fromString(args[1], val); + nlassume(adr); *adr = val; return true; } @@ -1736,6 +1738,7 @@ NLMISC_CATEGORISED_COMMAND(nel, readaccess, "read a uint8 value in an invalid ad adr = (uint8*)addr32; #endif } + nlassume(adr); val = *adr; log.displayNL("value is %hu", (uint16)val); return true; diff --git a/code/nel/src/misc/eid_translator.cpp b/code/nel/src/misc/eid_translator.cpp index 71d0fd4e2..9978b37e0 100644 --- a/code/nel/src/misc/eid_translator.cpp +++ b/code/nel/src/misc/eid_translator.cpp @@ -570,7 +570,7 @@ string CEntityIdTranslator::getUserName (uint32 uid) return entity.UserName; } } - return 0; + return string(); } void CEntityIdTranslator::getEntityIdInfo (const CEntityId &eid, ucstring &entityName, sint8 &entitySlot, uint32 &uid, string &userName, bool &online, std::string* additional) diff --git a/code/nel/src/misc/i_xml.cpp b/code/nel/src/misc/i_xml.cpp index ae5c8615e..87f848ab9 100644 --- a/code/nel/src/misc/i_xml.cpp +++ b/code/nel/src/misc/i_xml.cpp @@ -171,8 +171,7 @@ bool CIXml::init (IStream &stream) // Try binary mode if (_TryBinaryMode) { - string header; - header.resize(4); + char header[4]; header[0] = buffer[0]; header[1] = buffer[1]; header[2] = buffer[2]; @@ -180,7 +179,7 @@ bool CIXml::init (IStream &stream) toLower(header); // Does it a xml stream ? - if (header != "InternalSurface == currentSurfId); for (oedge=0; oedge<3 && next->Edge[oedge]!=currentFace; ++oedge) diff --git a/code/ryzom/common/src/game_share/crypt.cpp b/code/ryzom/common/src/game_share/crypt.cpp index a10c2ab6e..1416cac52 100644 --- a/code/ryzom/common/src/game_share/crypt.cpp +++ b/code/ryzom/common/src/game_share/crypt.cpp @@ -533,7 +533,7 @@ std::string rz_crypt(register const char *key, register const char *setting, cha keyblock.b[i] = t; } if (rz_des_setkey((char *)keyblock.b)) /* also initializes "a64toi" */ - return (NULL); + return std::string(); encp = &cryptresult[0]; switch (*setting) { @@ -544,14 +544,14 @@ std::string rz_crypt(register const char *key, register const char *setting, cha while (*key) { if (rz_des_cipher((char *)&keyblock, (char *)&keyblock, 0L, 1)) - return (NULL); + return std::string(); for (i = 0; i < 8; i++) { if ((t = 2*(unsigned char)(*key)) != 0) key++; keyblock.b[i] ^= t; } if (rz_des_setkey((char *)keyblock.b)) - return (NULL); + return std::string(); } *encp++ = *setting++; @@ -583,7 +583,7 @@ std::string rz_crypt(register const char *key, register const char *setting, cha encp += salt_size; if (rz_des_cipher((char *)&constdatablock, (char *)&rsltblock, salt, num_iter)) - return ""; + return std::string(); /* * Encode the 64 cipher bits as 11 ascii characters. diff --git a/code/ryzom/common/src/game_share/mirrored_data_set.cpp b/code/ryzom/common/src/game_share/mirrored_data_set.cpp index 2d854c47a..8db024784 100644 --- a/code/ryzom/common/src/game_share/mirrored_data_set.cpp +++ b/code/ryzom/common/src/game_share/mirrored_data_set.cpp @@ -1763,6 +1763,7 @@ void CMirroredDataSet::getValueToString( const TDataSetRow& entityIndex, TPro } default: result = toString( " (%s/E%d/P%hd)", name().c_str(), entityIndex.getIndex(), propIndex ); + return; } result = string(tmpStr); } diff --git a/code/ryzom/common/src/game_share/object.cpp b/code/ryzom/common/src/game_share/object.cpp index c9315997f..ef567d31a 100644 --- a/code/ryzom/common/src/game_share/object.cpp +++ b/code/ryzom/common/src/game_share/object.cpp @@ -1480,7 +1480,7 @@ bool CObjectTable::canTake(sint32 position) const { CObject* parent = getParent(); - if (parent) //try to take the root of a tree + if (!parent) //try to take the root of a tree { return true; } diff --git a/code/ryzom/common/src/game_share/server_animation_module.cpp b/code/ryzom/common/src/game_share/server_animation_module.cpp index 0f0c90bb0..3c3276130 100644 --- a/code/ryzom/common/src/game_share/server_animation_module.cpp +++ b/code/ryzom/common/src/game_share/server_animation_module.cpp @@ -667,11 +667,12 @@ void CAttributeToProperty::setAiStateName(const std::string& prefix) std::string name; CObject* tmp=_Object->getAttr("Id"); - if( !(tmp&&tmp->isString())&&((name = tmp->toString()).length()!=0)) + if (!tmp || !tmp->isString()) { nlwarning("R2Ani: invalide rtData"); return; } + name = tmp->toString(); _Primitive->addPropertyByName("name", new CPropertyString(prefix + name)); diff --git a/code/ryzom/common/src/game_share/utils.h b/code/ryzom/common/src/game_share/utils.h index ed71af34b..a534b156b 100644 --- a/code/ryzom/common/src/game_share/utils.h +++ b/code/ryzom/common/src/game_share/utils.h @@ -122,8 +122,8 @@ inline ucstring capitalize(const ucstring & s) #define GIVEUP_IF(condition,msg,action) if (!(condition));else GIVEUP(msg,action) #define WARN_IF(condition,msg) if (!(condition));else WARN(msg) #define DROP_IF(condition,msg,action) if (!(condition));else DROP(msg,action) -#define BOMB_IF(condition,msg,action) if (!(condition));else BOMB(msg,action) -#define STOP_IF(condition,msg) if (!(condition));else STOP(msg) +#define BOMB_IF(condition,msg,action) if (!(condition));else BOMB(msg,action); do { nlassume(condition); } while (0) +#define STOP_IF(condition,msg) if (!(condition));else STOP(msg); do { nlassume(condition); } while (0) // testing for variable value changes #define ON_CHANGE(type,var,code)\ From c056cd7d249916e963b73206e08644264c3b992d Mon Sep 17 00:00:00 2001 From: kaetemi Date: Mon, 16 Mar 2020 04:23:21 +0800 Subject: [PATCH 14/14] Fixes --- code/ryzom/common/src/game_share/object.cpp | 2 +- code/ryzom/common/src/game_share/timer.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/ryzom/common/src/game_share/object.cpp b/code/ryzom/common/src/game_share/object.cpp index ef567d31a..bb92c4936 100644 --- a/code/ryzom/common/src/game_share/object.cpp +++ b/code/ryzom/common/src/game_share/object.cpp @@ -1120,7 +1120,7 @@ CObject* CObjectTable::clone() const TContainer::const_iterator first(_Value.begin()), last(_Value.end()); for ( ;first != last; ++first ) { - BOMB_IF(!first->second, "Try to clone a table with an NULL component", return 0) + BOMB_IF(!first->second, "Try to clone a table with an NULL component", return 0); nlassert(first->second->getGhost() == this->getGhost()); CObject* clone = first->second->clone(); if (clone) { clone->setParent(0); } diff --git a/code/ryzom/common/src/game_share/timer.h b/code/ryzom/common/src/game_share/timer.h index e00dc3f84..1659464fa 100644 --- a/code/ryzom/common/src/game_share/timer.h +++ b/code/ryzom/common/src/game_share/timer.h @@ -424,7 +424,7 @@ inline void CTimerEvent::set(CTimer* owner,NLMISC::TGameCycle time,uint32 variat _Time = time + i; } } - BOMB_IF(best==NULL,"BUG: This can never happen!",return) + BOMB_IF(best == NULL, "BUG: This can never happen!", return); best->push_back(this); } @@ -452,7 +452,7 @@ inline void CTimerEvent::clear() inline void CTimerEvent::processEvent() { CTimer* owner=_Owner; - BOMB_IF(owner==NULL,"Attempt to process an event that no longer has a valid owner",return) + BOMB_IF(owner == NULL, "Attempt to process an event that no longer has a valid owner", return); // mark the event as expired - the state may be chnaged during the timer callback... // NOTE: This operation results in '_Owner' being set to NULL