diff options
39 files changed, 324 insertions, 62 deletions
diff --git a/indra/cmake/VisualLeakDetector.cmake b/indra/cmake/VisualLeakDetector.cmake new file mode 100644 index 0000000000..d3ba554e46 --- /dev/null +++ b/indra/cmake/VisualLeakDetector.cmake @@ -0,0 +1,15 @@ +# -*- cmake -*- + +if (VIEWER) + +  set(INCLUDE_VLD_CMAKE OFF CACHE BOOL "Build the Windows viewer with Visual Leak Detector turned on or off") + +  if (INCLUDE_VLD_CMAKE) + +    if (WINDOWS) +      add_definitions(-DINCLUDE_VLD=1) +    endif (WINDOWS) + +  endif (INCLUDE_VLD_CMAKE) + +endif (VIEWER) diff --git a/indra/llmath/llcoord.h b/indra/llmath/llcoord.h index 1f617e649e..756e23dbdf 100644 --- a/indra/llmath/llcoord.h +++ b/indra/llmath/llcoord.h @@ -45,7 +45,7 @@ public:  	LLCoord():	mX(0), mY(0)  	{} -	LLCoord(S32 x, S32 y): mX(x), mY(y) +	LLCoord(typename COORD_FRAME::value_t x, typename COORD_FRAME::value_t y): mX(x), mY(y)  	{}  	LLCoord(const LLCoordCommon& other) @@ -58,7 +58,7 @@ public:  		return COORD_FRAME::convertToCommon();  	} -	void set(S32 x, S32 y) { mX = x; mY = y;} +	void set(typename COORD_FRAME::value_t x, typename COORD_FRAME::value_t y) { mX = x; mY = y;}  	bool operator==(const self_t& other) const { return mX == other.mX && mY == other.mY; }  	bool operator!=(const self_t& other) const { return !(*this == other); } diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp index 6834b34387..dd56b6e99b 100644 --- a/indra/llwindow/llwindow.cpp +++ b/indra/llwindow/llwindow.cpp @@ -192,6 +192,21 @@ BOOL LLWindow::setSize(LLCoordScreen size)  	return setSizeImpl(size);  } +BOOL LLWindow::setSize(LLCoordWindow size) +{ +	//HACK: we are inconsistently using minimum window dimensions +	// in this case, we are constraining the inner "client" rect and other times +	// we constrain the outer "window" rect +	// There doesn't seem to be a good way to do this consistently without a bunch of platform +	// specific code +	if (!getMaximized()) +	{ +		size.mX = llmax(size.mX, mMinWindowWidth); +		size.mY = llmax(size.mY, mMinWindowHeight); +	} +	return setSizeImpl(size); +} +  // virtual  void LLWindow::setMinSize(U32 min_width, U32 min_height, bool enforce_immediately) diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index d2971581d2..4da87f4e06 100644 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -73,6 +73,7 @@ public:  	virtual BOOL getSize(LLCoordWindow *size) = 0;  	virtual BOOL setPosition(LLCoordScreen position) = 0;  	BOOL setSize(LLCoordScreen size); +	BOOL setSize(LLCoordWindow size);  	virtual void setMinSize(U32 min_width, U32 min_height, bool enforce_immediately = true);  	virtual BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL) = 0;  	virtual BOOL setCursorPosition(LLCoordWindow position) = 0; @@ -172,6 +173,7 @@ protected:  	virtual BOOL canDelete();  	virtual BOOL setSizeImpl(LLCoordScreen size) = 0; +	virtual BOOL setSizeImpl(LLCoordWindow size) = 0;  protected:  	LLWindowCallbacks*	mCallbacks; diff --git a/indra/llwindow/llwindowheadless.h b/indra/llwindow/llwindowheadless.h index d4a778cb85..1f767f4c97 100644 --- a/indra/llwindow/llwindowheadless.h +++ b/indra/llwindow/llwindowheadless.h @@ -47,6 +47,7 @@ public:  	/*virtual*/ BOOL getSize(LLCoordWindow *size) {return FALSE;};  	/*virtual*/ BOOL setPosition(LLCoordScreen position) {return FALSE;};  	/*virtual*/ BOOL setSizeImpl(LLCoordScreen size) {return FALSE;}; +	/*virtual*/ BOOL setSizeImpl(LLCoordWindow size) {return FALSE;};  	/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL) {return FALSE;};  	/*virtual*/ BOOL setCursorPosition(LLCoordWindow position) {return FALSE;};  	/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position) {return FALSE;}; diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index c952f8bbcf..a998d1f877 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -1266,6 +1266,19 @@ BOOL LLWindowMacOSX::setSizeImpl(const LLCoordScreen size)  	return TRUE;  } +BOOL LLWindowMacOSX::setSizeImpl(const LLCoordWindow size) +{ +	Rect client_rect; +	if (mWindow && GetWindowBounds(mWindow, kWindowContentRgn, &client_rect) != noErr) +	{ +		client_rect.right = client_rect.left + size.mX; +		client_rect.bottom = client_rect.top + size.mY; +		OSStatus err = SetWindowBounds(mWindow, kWindowContentRgn, &client_rect); +		return err == noErr; +	} +	return FALSE; +} +  void LLWindowMacOSX::swapBuffers()  {  	aglSwapBuffers(mContext); diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index 073f294b54..52ba8b3bf3 100644 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -59,6 +59,7 @@ public:  	/*virtual*/ BOOL getSize(LLCoordWindow *size);  	/*virtual*/ BOOL setPosition(LLCoordScreen position);  	/*virtual*/ BOOL setSizeImpl(LLCoordScreen size); +	/*virtual*/ BOOL setSizeImpl(LLCoordWindow size);  	/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL);  	/*virtual*/ BOOL setCursorPosition(LLCoordWindow position);  	/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position); diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 5f5baceef8..3d33af9d9b 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -981,6 +981,25 @@ BOOL LLWindowSDL::setSizeImpl(const LLCoordScreen size)  	return FALSE;  } +BOOL LLWindowSDL::setSizeImpl(const LLCoordWindow size) +{ +	if(mWindow) +	{ +		// Push a resize event onto SDL's queue - we'll handle it +		// when it comes out again. +		SDL_Event event; +		event.type = SDL_VIDEORESIZE; +		event.resize.w = size.mX; +		event.resize.h = size.mY; +		SDL_PushEvent(&event); // copied into queue + +		return TRUE; +	} + +	return FALSE; +} + +  void LLWindowSDL::swapBuffers()  {  	if (mWindow) diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h index 59719e4046..4e2a269ea3 100644 --- a/indra/llwindow/llwindowsdl.h +++ b/indra/llwindow/llwindowsdl.h @@ -64,6 +64,7 @@ public:  	/*virtual*/ BOOL getSize(LLCoordWindow *size);  	/*virtual*/ BOOL setPosition(LLCoordScreen position);  	/*virtual*/ BOOL setSizeImpl(LLCoordScreen size); +	/*virtual*/ BOOL setSizeImpl(LLCoordWindow size);  	/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL);  	/*virtual*/ BOOL setCursorPosition(LLCoordWindow position);  	/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position); diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index ebc3203f14..2910c3995a 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -876,6 +876,17 @@ BOOL LLWindowWin32::setSizeImpl(const LLCoordScreen size)  	return TRUE;  } +BOOL LLWindowWin32::setSizeImpl(const LLCoordWindow size) +{ +	RECT window_rect = {0, 0, size.mX, size.mY }; +	DWORD dw_ex_style = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; +	DWORD dw_style = WS_OVERLAPPEDWINDOW; + +	AdjustWindowRectEx(&window_rect, dw_style, FALSE, dw_ex_style); + +	return setSizeImpl(LLCoordScreen(window_rect.right - window_rect.left, window_rect.bottom - window_rect.top)); +} +  // changing fullscreen resolution  BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp)  { @@ -886,12 +897,12 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  	DWORD	current_refresh;  	DWORD	dw_ex_style;  	DWORD	dw_style; -	RECT	window_rect; +	RECT	window_rect = {0, 0, 0, 0};  	S32 width = size.mX;  	S32 height = size.mY;  	BOOL auto_show = FALSE; -	if (mhRC) +	if (mhRC)	  	{  		auto_show = TRUE;  		resetDisplayResolution(); @@ -986,7 +997,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  			dw_ex_style = WS_EX_APPWINDOW;  			dw_style = WS_POPUP; -			// Move window borders out not to cover window contents +			// Move window borders out not to cover window contents. +			// This converts client rect to window rect, i.e. expands it by the window border size.  			AdjustWindowRectEx(&window_rect, dw_style, FALSE, dw_ex_style);  		}  		// If it failed, we don't want to run fullscreen @@ -1014,6 +1026,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  		dw_style = WS_OVERLAPPEDWINDOW;  	} +  	// don't post quit messages when destroying old windows  	mPostQuit = FALSE; diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h index b3602be8b7..54c9ac4d4d 100644 --- a/indra/llwindow/llwindowwin32.h +++ b/indra/llwindow/llwindowwin32.h @@ -58,6 +58,7 @@ public:  	/*virtual*/ BOOL getSize(LLCoordWindow *size);  	/*virtual*/ BOOL setPosition(LLCoordScreen position);  	/*virtual*/ BOOL setSizeImpl(LLCoordScreen size); +	/*virtual*/ BOOL setSizeImpl(LLCoordWindow size);  	/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL);  	/*virtual*/ BOOL setCursorPosition(LLCoordWindow position);  	/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position); diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 69bf1f15a1..66361c8fbf 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -41,6 +41,7 @@ include(UnixInstall)  include(LLKDU)  include(ViewerMiscLibs)  include(LLLogin) +include(VisualLeakDetector)  include(GLOD)  include(CMakeCopyIfDifferent) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index ee8c15752b..ee659ee39e 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -621,6 +621,28 @@        <key>Value</key>        <string>http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/avatars.html</string>      </map> +    <key>AvatarRotateThresholdSlow</key> +    <map> +      <key>Comment</key> +      <string>Angle between avatar facing and camera facing at which avatar turns to face same direction as camera, when moving slowly (degrees)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <integer>60</integer> +    </map>   +    <key>AvatarRotateThresholdFast</key> +    <map> +      <key>Comment</key> +      <string>Angle between avatar facing and camera facing at which avatar turns to face same direction as camera, when moving fast (degrees)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <integer>2</integer> +    </map>        <key>AvatarBakedTextureUploadTimeout</key>      <map>        <key>Comment</key> @@ -9619,18 +9641,29 @@        <key>Value</key>        <integer>1</integer>      </map> -    <key>ShowConsoleWindow</key> -    <map> -      <key>Comment</key> -      <string>Show log in separate OS window</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>NavBarShowCoordinates</key> +  <key>ShowConsoleWindow</key> +  <map> +    <key>Comment</key> +    <string>Show log in separate OS window</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>Boolean</string> +    <key>Value</key> +    <integer>0</integer> +  </map> +  <key>EnableVisualLeakDetector</key> +  <map> +    <key>Comment</key> +    <string>EnableVisualLeakDetector</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>Boolean</string> +    <key>Value</key> +    <integer>0</integer> +  </map> +  <key>NavBarShowCoordinates</key>      <map>        <key>Comment</key>        <string>Show coordinates in navigation bar</string> @@ -12766,7 +12799,7 @@      <key>WindowX</key>      <map>        <key>Comment</key> -      <string>X coordinate of lower left corner of SL viewer window, relative to primary display (pixels)</string> +      <string>X coordinate of upper left corner of SL viewer window, relative to upper left corner of primary display (pixels)</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -12777,7 +12810,7 @@      <key>WindowY</key>      <map>        <key>Comment</key> -      <string>Y coordinate of lower left corner of SL viewer window, relative to primary display (pixels)</string> +      <string>Y coordinate of upper left corner of SL viewer window, relative to upper left corner of primary display (pixels)</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 6931b55c4c..bad60a9757 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -26,6 +26,10 @@  #include "llviewerprecompiledheaders.h" +#ifdef INCLUDE_VLD +#include "vld.h" +#endif +  #include "llappviewerwin32.h"  #include "llmemtype.h" @@ -105,6 +109,14 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,                       LPSTR     lpCmdLine,                       int       nCmdShow)  { +#ifdef INCLUDE_VLD +	// only works for debug builds (hard coded into vld.h) +	#ifdef _DEBUG +		// start with Visual Leak Detector turned off +		VLDGlobalDisable(); +	#endif // _DEBUG +#endif // INCLUDE_VLD +  	LLMemType mt1(LLMemType::MTYPE_STARTUP);  	const S32 MAX_HEAPS = 255; diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 9a7cdcfa21..f618af9536 100755 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -738,6 +738,11 @@ void LLAvatarActions::shareWithAvatars()  	LLFloaterAvatarPicker* picker =  		LLFloaterAvatarPicker::show(boost::bind(give_inventory, _1, _2), TRUE, FALSE); +	if (!picker) +	{ +		return; +	} +  	picker->setOkBtnEnableCb(boost::bind(is_give_inventory_acceptable));  	picker->openFriendsTab();  	LLNotificationsUtil::add("ShareNotification"); diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp index a7388d21a3..bca4b5e447 100644 --- a/indra/newview/llfloaterbuycontents.cpp +++ b/indra/newview/llfloaterbuycontents.cpp @@ -210,7 +210,9 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,  		LLSD row;  		BOOL item_is_multi = FALSE; -		if ( inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED ) +		if ((inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED +			|| inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS) +			&& !(inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK))  		{  			item_is_multi = TRUE;  		} diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp index a34e0353ec..fb905eae11 100644 --- a/indra/newview/llfloatergodtools.cpp +++ b/indra/newview/llfloatergodtools.cpp @@ -1123,8 +1123,12 @@ bool LLPanelObjectTools::callbackSimWideDeletes( const LLSD& notification, const  void LLPanelObjectTools::onClickSet()  { +	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelObjectTools::callbackAvatarID, this, _1,_2));  	// grandparent is a floater, which can have a dependent -	gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLPanelObjectTools::callbackAvatarID, this, _1,_2))); +	if (picker) +	{ +		gFloaterView->getParentFloater(this)->addDependentFloater(picker); +	}  }  void LLPanelObjectTools::onClickSetBySelection(void* data) diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 95da8ff948..ee18c95b34 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -2739,7 +2739,12 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)  void LLPanelLandAccess::onClickAddAccess()  { -	gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1)) ); +	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show( +		boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1)); +	if (picker) +	{ +		gFloaterView->getParentFloater(this)->addDependentFloater(picker); +	}  }  void LLPanelLandAccess::callbackAvatarCBAccess(const uuid_vec_t& ids) @@ -2783,7 +2788,12 @@ void LLPanelLandAccess::onClickRemoveAccess(void* data)  // static  void LLPanelLandAccess::onClickAddBanned()  { -	gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1))); +	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show( +		boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1)); +	if (picker) +	{ +		gFloaterView->getParentFloater(this)->addDependentFloater(picker); +	}  }  // static diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 676059779c..17850ff35d 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -650,7 +650,10 @@ void LLPanelRegionGeneralInfo::onClickKick()  	// in order to set up floater dependency  	LLFloater* parent_floater = gFloaterView->getParentFloater(this);  	LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelRegionGeneralInfo::onKickCommit, this, _1), FALSE, TRUE); -	parent_floater->addDependentFloater(child_floater); +	if (child_floater) +	{ +		parent_floater->addDependentFloater(child_floater); +	}  }  void LLPanelRegionGeneralInfo::onKickCommit(const uuid_vec_t& ids) @@ -1470,7 +1473,10 @@ void LLPanelEstateInfo::onClickKickUser()  	// in order to set up floater dependency  	LLFloater* parent_floater = gFloaterView->getParentFloater(this);  	LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::onKickUserCommit, this, _1), FALSE, TRUE); -	parent_floater->addDependentFloater(child_floater); +	if (child_floater) +	{ +		parent_floater->addDependentFloater(child_floater); +	}  }  void LLPanelEstateInfo::onKickUserCommit(const uuid_vec_t& ids) @@ -1891,6 +1897,26 @@ void LLPanelEstateInfo::sendEstateAccessDelta(U32 flags, const LLUUID& agent_or_  	gAgent.sendReliableMessage();  } +// static +void LLPanelEstateInfo::updateEstateOwnerName(const std::string& name) +{ +	LLPanelEstateInfo* panelp = LLFloaterRegionInfo::getPanelEstate(); +	if (panelp) +	{ +		panelp->setOwnerName(name); +	} +} + +// static +void LLPanelEstateInfo::updateEstateName(const std::string& name) +{ +	LLPanelEstateInfo* panelp = LLFloaterRegionInfo::getPanelEstate(); +	if (panelp) +	{ +		panelp->getChildRef<LLTextBox>("estate_name").setText(name); +	} +} +  void LLPanelEstateInfo::updateControls(LLViewerRegion* region)  {  	BOOL god = gAgent.isGodlike(); diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index ae45949b4a..e36ef4604b 100644 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -294,6 +294,9 @@ public:  	void updateControls(LLViewerRegion* region); +	static void updateEstateName(const std::string& name); +	static void updateEstateOwnerName(const std::string& name); +  	virtual bool refreshFromRegion(LLViewerRegion* region);  	virtual bool estateUpdate(LLMessageSystem* msg); diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index c08848b1ea..3ec1e372eb 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -285,7 +285,11 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)  void LLFloaterReporter::onClickSelectAbuser()  { -	gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLFloaterReporter::callbackAvatarID, this, _1, _2), FALSE, TRUE )); +	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLFloaterReporter::callbackAvatarID, this, _1, _2), FALSE, TRUE ); +	if (picker) +	{ +		gFloaterView->getParentFloater(this)->addDependentFloater(picker); +	}  }  void LLFloaterReporter::callbackAvatarID(const uuid_vec_t& ids, const std::vector<LLAvatarName> names) diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp index 3434841d09..64c0dfa023 100644 --- a/indra/newview/llfloatersellland.cpp +++ b/indra/newview/llfloatersellland.cpp @@ -392,8 +392,12 @@ void LLFloaterSellLandUI::onChangeValue(LLUICtrl *ctrl, void *userdata)  void LLFloaterSellLandUI::doSelectAgent()  { +	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLFloaterSellLandUI::callbackAvatarPick, this, _1, _2), FALSE, TRUE);  	// grandparent is a floater, in order to set up dependency -	addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLFloaterSellLandUI::callbackAvatarPick, this, _1, _2), FALSE, TRUE)); +	if (picker) +	{ +		addDependentFloater(picker); +	}  }  void LLFloaterSellLandUI::callbackAvatarPick(const uuid_vec_t& ids, const std::vector<LLAvatarName> names) diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 5496c273f2..947f74315c 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -150,7 +150,7 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const  	{  		return true;  	} -	 +  	if (mFilterOps.mFilterTypes & FILTERTYPE_CATEGORY)  	{  		// Can only filter categories for items in your inventory @@ -558,8 +558,14 @@ void LLInventoryFilter::setDateRange(time_t min_date, time_t max_date)  		setModified();  	} -	areDateLimitsSet() ? mFilterOps.mFilterTypes |= FILTERTYPE_DATE -			: mFilterOps.mFilterTypes &= ~FILTERTYPE_DATE; +	if (areDateLimitsSet()) +	{ +		mFilterOps.mFilterTypes |= FILTERTYPE_DATE; +	} +	else +	{ +		mFilterOps.mFilterTypes &= ~FILTERTYPE_DATE; +	}  }  void LLInventoryFilter::setDateRangeLastLogoff(BOOL sl) @@ -575,8 +581,14 @@ void LLInventoryFilter::setDateRangeLastLogoff(BOOL sl)  		setModified();  	} -	areDateLimitsSet() ? mFilterOps.mFilterTypes |= FILTERTYPE_DATE -			: mFilterOps.mFilterTypes &= ~FILTERTYPE_DATE; +	if (areDateLimitsSet()) +	{ +		mFilterOps.mFilterTypes |= FILTERTYPE_DATE; +	} +	else +	{ +		mFilterOps.mFilterTypes &= ~FILTERTYPE_DATE; +	}  }  BOOL LLInventoryFilter::isSinceLogoff() const @@ -622,8 +634,14 @@ void LLInventoryFilter::setHoursAgo(U32 hours)  		}  	} -	areDateLimitsSet() ? mFilterOps.mFilterTypes |= FILTERTYPE_DATE -			: mFilterOps.mFilterTypes &= ~FILTERTYPE_DATE; +	if (areDateLimitsSet()) +	{ +		mFilterOps.mFilterTypes |= FILTERTYPE_DATE; +	} +	else +	{ +		mFilterOps.mFilterTypes &= ~FILTERTYPE_DATE; +	}  }  void LLInventoryFilter::setFilterLinks(U64 filter_links) diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index ca48e8561b..7a15d93181 100644 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -289,12 +289,12 @@ void LLPanelGroupInvite::impl::callbackClickAdd(void* userdata)  		//Soon the avatar picker will be embedded into this panel  		//instead of being it's own separate floater.  But that is next week.  		//This will do for now. -jwolk May 10, 2006 -		LLFloater* parentp; - -		parentp = gFloaterView->getParentFloater(panelp); -		parentp->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(impl::callbackAddUsers, _1, -																panelp->mImplementation), -																 TRUE)); +		LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show( +			boost::bind(impl::callbackAddUsers, _1, panelp->mImplementation), TRUE); +		if (picker) +		{ +			gFloaterView->getParentFloater(panelp)->addDependentFloater(picker); +		}  	}  } diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 12aed8f448..37cf916423 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -25,6 +25,11 @@   */  #include "llviewerprecompiledheaders.h" + +#ifdef INCLUDE_VLD +#include "vld.h" +#endif +  #include "llviewermenu.h"   // linden library includes @@ -214,7 +219,7 @@ void near_sit_down_point(BOOL success, void *);  void velocity_interpolate( void* ); - +void handle_visual_leak_detector_toggle(void*);  void handle_rebake_textures(void*);  BOOL check_admin_override(void*);  void handle_admin_override_toggle(void*); @@ -2018,6 +2023,15 @@ class LLAdvancedToggleViewAdminOptions : public view_listener_t  	}  }; +class LLAdvancedToggleVisualLeakDetector : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		handle_visual_leak_detector_toggle(NULL); +		return true; +	} +}; +  class LLAdvancedCheckViewAdminOptions : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -3444,6 +3458,35 @@ void handle_admin_override_toggle(void*)  	show_debug_menus();  } +void handle_visual_leak_detector_toggle(void*) +{ +	static bool vld_enabled = false; + +	if ( vld_enabled ) +	{ +#ifdef INCLUDE_VLD +		// only works for debug builds (hard coded into vld.h) +#ifdef _DEBUG +		// start with Visual Leak Detector turned off +		VLDDisable(); +#endif // _DEBUG +#endif // INCLUDE_VLD +		vld_enabled = false; +	} +	else +	{ +#ifdef INCLUDE_VLD +		// only works for debug builds (hard coded into vld.h) +	#ifdef _DEBUG +		// start with Visual Leak Detector turned off +		VLDEnable(); +	#endif // _DEBUG +#endif // INCLUDE_VLD + +		vld_enabled = true; +	}; +} +  void handle_god_mode(void*)  {  	gAgent.requestEnterGodMode(); @@ -8237,6 +8280,8 @@ void initialize_menus()  	view_listener_t::addMenu(new LLAdvancedEnableViewAdminOptions(), "Advanced.EnableViewAdminOptions");  	view_listener_t::addMenu(new LLAdvancedToggleViewAdminOptions(), "Advanced.ToggleViewAdminOptions");  	view_listener_t::addMenu(new LLAdvancedCheckViewAdminOptions(), "Advanced.CheckViewAdminOptions"); +	view_listener_t::addMenu(new LLAdvancedToggleVisualLeakDetector(), "Advanced.ToggleVisualLeakDetector"); +  	view_listener_t::addMenu(new LLAdvancedRequestAdminStatus(), "Advanced.RequestAdminStatus");  	view_listener_t::addMenu(new LLAdvancedLeaveAdminStatus(), "Advanced.LeaveAdminStatus"); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 716f47150e..17c7644ec4 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -6843,12 +6843,14 @@ void process_covenant_reply(LLMessageSystem* msg, void**)  	LLPanelEstateCovenant::updateEstateName(estate_name);  	LLPanelLandCovenant::updateEstateName(estate_name); +	LLPanelEstateInfo::updateEstateName(estate_name);  	LLFloaterBuyLand::updateEstateName(estate_name);  	std::string owner_name =  		LLSLURL("agent", estate_owner_id, "inspect").getSLURLString();  	LLPanelEstateCovenant::updateEstateOwnerName(owner_name);  	LLPanelLandCovenant::updateEstateOwnerName(owner_name); +	LLPanelEstateInfo::updateEstateOwnerName(owner_name);  	LLFloaterBuyLand::updateEstateOwnerName(owner_name);  	LLPanelPlaceProfile* panel = LLFloaterSidePanelContainer::getPanel<LLPanelPlaceProfile>("places", "panel_place_profile"); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index f5a226b781..b1b6abe723 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2159,9 +2159,13 @@ void LLViewerWindow::reshape(S32 width, S32 height)  			// tell the OS specific window code about min window size  			mWindow->setMinSize(min_window_width, min_window_height); -			// Only save size if not maximized -			gSavedSettings.setU32("WindowWidth", mWindowRectRaw.getWidth()); -			gSavedSettings.setU32("WindowHeight", mWindowRectRaw.getHeight()); +			LLCoordScreen window_rect; +			if (mWindow->getSize(&window_rect)) +			{ +				// Only save size if not maximized +				gSavedSettings.setU32("WindowWidth", window_rect.mX); +				gSavedSettings.setU32("WindowHeight", window_rect.mY); +			}  		}  		LLViewerStats::getInstance()->setStat(LLViewerStats::ST_WINDOW_WIDTH, (F64)width); @@ -4098,7 +4102,7 @@ void LLViewerWindow::movieSize(S32 new_width, S32 new_height)  	gViewerWindow->getWindow()->getSize(&size);  	if ( size != new_size )  	{ -		gViewerWindow->getWindow()->setSize(new_size.convert()); +		gViewerWindow->getWindow()->setSize(new_size);  	}  } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index bc7f5a9744..a3a40de5eb 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -149,10 +149,6 @@ const F32 PELVIS_LAG_WALKING	= 0.4f;	// ...while walking  const F32 PELVIS_LAG_MOUSELOOK = 0.15f;  const F32 MOUSELOOK_PELVIS_FOLLOW_FACTOR = 0.5f;  const F32 PELVIS_LAG_WHEN_FOLLOW_CAM_IS_ON = 0.0001f; // not zero! - something gets divided by this! - -const F32 PELVIS_ROT_THRESHOLD_SLOW = 60.0f;	// amount of deviation allowed between -const F32 PELVIS_ROT_THRESHOLD_FAST = 2.0f;	// the pelvis and the view direction -											// when moving fast & slow  const F32 TORSO_NOISE_AMOUNT = 1.0f;	// Amount of deviation from up-axis, in degrees  const F32 TORSO_NOISE_SPEED = 0.2f;	// Time scale factor on torso noise. @@ -3652,7 +3648,11 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  			BOOL self_in_mouselook = isSelf() && gAgentCamera.cameraMouselook();  			LLVector3 pelvisDir( mRoot.getWorldMatrix().getFwdRow4().mV ); -			F32 pelvis_rot_threshold = clamp_rescale(speed, 0.1f, 1.0f, PELVIS_ROT_THRESHOLD_SLOW, PELVIS_ROT_THRESHOLD_FAST); + +			static LLCachedControl<F32> s_pelvis_rot_threshold_slow(gSavedSettings, "AvatarRotateThresholdSlow"); +			static LLCachedControl<F32> s_pelvis_rot_threshold_fast(gSavedSettings, "AvatarRotateThresholdFast"); + +			F32 pelvis_rot_threshold = clamp_rescale(speed, 0.1f, 1.0f, s_pelvis_rot_threshold_slow, s_pelvis_rot_threshold_fast);  			if (self_in_mouselook)  			{ diff --git a/indra/newview/skins/default/xui/de/panel_status_bar.xml b/indra/newview/skins/default/xui/de/panel_status_bar.xml index 2493d60df6..14ace0ac3a 100644 --- a/indra/newview/skins/default/xui/de/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/de/panel_status_bar.xml @@ -15,7 +15,7 @@  	<panel.string name="buycurrencylabel">  		[AMT] L$  	</panel.string> -	<panel name="balance_bg"> +	<panel left="-415" name="balance_bg" width="205">  		<text name="balance" tool_tip="Klicken, um L$-Guthaben zu aktualisieren" value="20 L$"/>  		<button label="L$ kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/>  		<button label="Einkaufen" name="goShop" tool_tip="Second Life-Marktplatz öffnen" width="85"/> diff --git a/indra/newview/skins/default/xui/en/floater_avatar.xml b/indra/newview/skins/default/xui/en/floater_avatar.xml index 82c3403008..defb8e2d1f 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar.xml @@ -7,7 +7,7 @@   can_close="true"   can_resize="true"   min_height="230" - min_width="450" + min_width="515"   height="230"   layout="topleft"   name="Avatar" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index cd8550b00d..6443e432fe 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -3261,7 +3261,15 @@              <menu_item_call.on_click               function="Advanced.CompressImage" />          </menu_item_call> -        <menu_item_check + +      <menu_item_call +         label="Enable Visual Leak Detector" +         name="Enable Visual Leak Detector"> +        <menu_item_call.on_click +           function="Advanced.ToggleVisualLeakDetector" /> +        </menu_item_call> +       +      <menu_item_check           label="Output Debug Minidump"           name="Output Debug Minidump">              <menu_item_check.on_check diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index 22c1139cdb..3aa34439f1 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -35,8 +35,8 @@      </panel.string>    <panel      height="18" -    left="-370" -    width="160" +    left="-395" +    width="185"      top="1"      follows="right|top"       name="balance_bg"> diff --git a/indra/newview/skins/default/xui/es/panel_status_bar.xml b/indra/newview/skins/default/xui/es/panel_status_bar.xml index 79b2c32b23..7eead3bc18 100644 --- a/indra/newview/skins/default/xui/es/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/es/panel_status_bar.xml @@ -15,7 +15,7 @@  	<panel.string name="buycurrencylabel">  		[AMT] L$  	</panel.string> -	<panel name="balance_bg"> +	<panel left="-410" name="balance_bg" width="200">  		<text name="balance" tool_tip="Haz clic para actualizar tu saldo en L$" value="20 L$"/>  		<button label="Comprar L$" name="buyL" tool_tip="Pulsa para comprar más L$"/>  		<button label="Comprar" name="goShop" tool_tip="Abrir el mercado de Second Life" width="80"/> diff --git a/indra/newview/skins/default/xui/fr/panel_status_bar.xml b/indra/newview/skins/default/xui/fr/panel_status_bar.xml index c0d59a3182..ba36a7d299 100644 --- a/indra/newview/skins/default/xui/fr/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/fr/panel_status_bar.xml @@ -15,7 +15,7 @@  	<panel.string name="buycurrencylabel">  		[AMT] L$  	</panel.string> -	<panel name="balance_bg"> +	<panel left="-405" name="balance_bg" width="195">  		<text name="balance" tool_tip="Cliquer sur ce bouton pour actualiser votre solde en L$." value="20 L$"/>  		<button label="Acheter L$" name="buyL" tool_tip="Cliquer pour acheter plus de L$."/>  		<button label="Achats" name="goShop" tool_tip="Ouvrir la Place du marché Second Life." width="75"/> diff --git a/indra/newview/skins/default/xui/it/panel_status_bar.xml b/indra/newview/skins/default/xui/it/panel_status_bar.xml index 4abc90113f..0aaf89d8c8 100644 --- a/indra/newview/skins/default/xui/it/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/it/panel_status_bar.xml @@ -15,7 +15,7 @@  	<panel.string name="buycurrencylabel">  		L$ [AMT]  	</panel.string> -	<panel name="balance_bg"> +	<panel left="-405" name="balance_bg" width="195">  		<text name="balance" tool_tip="Clicca per aggiornare il tuo saldo in L$" value="L$ 20"/>  		<button label="Acquista L$" name="buyL" tool_tip="Clicca per acquistare più L$"/>  		<button label="Acquisti" name="goShop" tool_tip="Apri Mercato Second Life" width="75"/> diff --git a/indra/newview/skins/default/xui/ja/panel_status_bar.xml b/indra/newview/skins/default/xui/ja/panel_status_bar.xml index 4fb876f690..f09643d562 100644 --- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml @@ -15,7 +15,7 @@  	<panel.string name="buycurrencylabel">  		L$ [AMT]  	</panel.string> -	<panel name="balance_bg"> +	<panel left="-370" name="balance_bg" width="160">  		<text name="balance" tool_tip="クリックして L$ 残高を更新" value="L$20"/>  		<button label="L$ の購入" name="buyL" tool_tip="クリックして L$ を購入します"/>  		<button label="店" name="goShop" tool_tip="Second Life マーケットプレイスを開く"  width="40"/> diff --git a/indra/newview/skins/default/xui/pt/panel_status_bar.xml b/indra/newview/skins/default/xui/pt/panel_status_bar.xml index 22853f0643..cb9a6eb757 100644 --- a/indra/newview/skins/default/xui/pt/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/pt/panel_status_bar.xml @@ -15,7 +15,7 @@  	<panel.string name="buycurrencylabel">  		L$ [AMT]  	</panel.string> -	<panel name="balance_bg"> +	<panel left="-410" name="balance_bg" width="200">  		<text name="balance" tool_tip="Atualizar saldo de L$" value="L$20"/>  		<button label="Comprar L$" name="buyL" tool_tip="Comprar mais L$"/>  		<button label="Comprar" name="goShop" tool_tip="Abrir Mercado do Second Life" width="80"/> diff --git a/indra/newview/skins/default/xui/ru/panel_status_bar.xml b/indra/newview/skins/default/xui/ru/panel_status_bar.xml index babe5811ac..9c84ff1fd8 100644 --- a/indra/newview/skins/default/xui/ru/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/ru/panel_status_bar.xml @@ -15,7 +15,7 @@  	<panel.string name="buycurrencylabel">  		L$ [AMT]  	</panel.string> -	<panel name="balance_bg"> +	<panel left="-450" name="balance_bg" width="240">  		<text name="balance" tool_tip="Щелкните для обновления вашего баланса L$" value="L$20"/>  		<button label="Купить L$" name="buyL" tool_tip="Щелкните для покупки L$"/>  		<button label="Торговый центр" name="goShop" tool_tip="Открыть торговый центр Second Life" width="121"/> diff --git a/indra/newview/skins/default/xui/tr/panel_status_bar.xml b/indra/newview/skins/default/xui/tr/panel_status_bar.xml index 81c304a5d8..178cbda4a2 100644 --- a/indra/newview/skins/default/xui/tr/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/tr/panel_status_bar.xml @@ -15,7 +15,7 @@  	<panel.string name="buycurrencylabel">  		L$ [AMT]  	</panel.string> -	<panel name="balance_bg"> +	<panel left="-425" name="balance_bg" width="215">  		<text name="balance" tool_tip="L$ bakiyenizi yenilemek için buraya tıklayın" value="L$20"/>  		<button label="L$ Satın Al" name="buyL" tool_tip="Daha fazla L$ satın almak için tıklayın"/>  		<button label="Alışveriş yap" name="goShop" tool_tip="Second Life Pazaryeri Aç" width="95"/>  | 
