diff options
59 files changed, 509 insertions, 188 deletions
| diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 52b8de8365..750e35a71a 100755 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -345,15 +345,10 @@ void LLGLSLShader::unloadInternal()          GLhandleARB obj[1024];          GLsizei count; -        glGetAttachedObjectsARB(mProgramObject, 1024, &count, obj); +        glGetAttachedObjectsARB(mProgramObject, sizeof(obj)/sizeof(obj[0]), &count, obj);          for (GLsizei i = 0; i < count; i++)          { -#if !LL_DARWIN -            if (glIsProgramARB(obj[i])) -#endif -            { -                glDeleteObjectARB(obj[i]); -            } +            glDeleteObjectARB(obj[i]);          }          glDeleteObjectARB(mProgramObject); diff --git a/indra/llrender/llgltexture.cpp b/indra/llrender/llgltexture.cpp index 56e263c5f1..3a6eebebba 100644 --- a/indra/llrender/llgltexture.cpp +++ b/indra/llrender/llgltexture.cpp @@ -112,7 +112,8 @@ void LLGLTexture::setBoostLevel(S32 level)  	if(mBoostLevel != level)  	{  		mBoostLevel = level ; -		if(mBoostLevel != LLGLTexture::BOOST_NONE) +		if(mBoostLevel != LLGLTexture::BOOST_NONE +		   && mBoostLevel != LLGLTexture::BOOST_ICON)  		{  			setNoDelete() ;		  		} diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index 77e7d375c8..0cb959a315 100755 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -417,6 +417,7 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par  	mExpireOption(p.expire_option),  	mURLOption(p.url.option),  	mURLTarget(p.url.target), +	mForceUrlsExternal(p.force_urls_external),  	mUnique(p.unique.isProvided()),  	mCombineBehavior(p.unique.combine),  	mPriority(p.priority), @@ -748,6 +749,11 @@ S32 LLNotification::getURLOpenExternally() const  	return(mTemplatep? mTemplatep->mURLTarget == "_external": -1);  } +bool LLNotification::getForceUrlsExternal() const +{ +    return (mTemplatep ? mTemplatep->mForceUrlsExternal : false); +} +  bool LLNotification::hasUniquenessConstraints() const   {   	return (mTemplatep ? mTemplatep->mUnique : false); diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index 010e6caba2..354add0b82 100755 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -553,7 +553,8 @@ public:  	std::string getLabel() const;  	std::string getURL() const;  	S32 getURLOption() const; -    S32 getURLOpenExternally() const; +	S32 getURLOpenExternally() const; //for url responce option +	bool getForceUrlsExternal() const;  	bool canLogToChat() const;  	bool canLogToIM() const;  	bool canShowToast() const; diff --git a/indra/llui/llnotificationtemplate.h b/indra/llui/llnotificationtemplate.h index c23fc53763..bed29254d8 100755 --- a/indra/llui/llnotificationtemplate.h +++ b/indra/llui/llnotificationtemplate.h @@ -177,7 +177,8 @@ struct LLNotificationTemplate  		Optional<bool>					persist,  										log_to_im,  										show_toast, -										log_to_chat; +										log_to_chat, +										force_urls_external;  		Optional<std::string>			functor,  										icon,  										label, @@ -201,6 +202,7 @@ struct LLNotificationTemplate  			log_to_im("log_to_im", false),  			show_toast("show_toast", true),  			log_to_chat("log_to_chat", true), +			force_urls_external("force_urls_external", false),  			functor("functor"),  			icon("icon"),  			label("label"), @@ -284,11 +286,16 @@ struct LLNotificationTemplate      // that URL. Obsolete this and eliminate the buttons for affected      // messages when we allow clickable URLs in the UI      U32 mURLOption; -	 -	std::string mURLTarget; -	//This is a flag that tells if the url needs to open externally dispite  + +	//This is a flag that tells if option url needs to open externally dispite   	//what the user setting is. -	 +	std::string mURLTarget; + +	// All links clicked inside notification will be opened in external browser +	// Note: Some notifications block and exit viewer, yet they provide a link +	// to click, we should be able to open such links in external browser. +	bool mForceUrlsExternal; +  	// does this notification persist across sessions? if so, it will be  	// serialized to disk on first receipt and read on startup  	bool mPersist; diff --git a/indra/llui/llradiogroup.cpp b/indra/llui/llradiogroup.cpp index b53bb16d97..8cf72928ff 100755 --- a/indra/llui/llradiogroup.cpp +++ b/indra/llui/llradiogroup.cpp @@ -179,6 +179,18 @@ BOOL LLRadioGroup::setSelectedIndex(S32 index, BOOL from_event)  		return FALSE;  	} +    if (index < -1) +    { +        // less then minimum value +        return FALSE; +    } + +    if (index < 0 && mSelectedIndex >= 0 && !mAllowDeselect) +    { +        // -1 is "nothing selected" +        return FALSE; +    } +  	if (mSelectedIndex >= 0)  	{  		LLRadioCtrl* old_radio_item = mRadioButtons[mSelectedIndex]; diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 4309e6557e..4ccf1ef009 100755 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -164,6 +164,7 @@ LLTextBase::Params::Params()  	trusted_content("trusted_content", true),  	use_ellipses("use_ellipses", false),  	parse_urls("parse_urls", false), +	force_urls_external("force_urls_external", false),  	parse_highlights("parse_highlights", false)  {  	addSynonym(track_end, "track_bottom"); @@ -216,6 +217,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)  	mWordWrap(p.wrap),  	mUseEllipses( p.use_ellipses ),  	mParseHTML(p.parse_urls), +	mForceUrlsExternal(p.force_urls_external),  	mParseHighlights(p.parse_highlights),  	mBGVisible(p.bg_visible),  	mScroller(NULL), @@ -1937,7 +1939,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)  	registrar.add("Url.Open", boost::bind(&LLUrlAction::openURL, url));  	registrar.add("Url.OpenInternal", boost::bind(&LLUrlAction::openURLInternal, url));  	registrar.add("Url.OpenExternal", boost::bind(&LLUrlAction::openURLExternal, url)); -	registrar.add("Url.Execute", boost::bind(&LLUrlAction::executeSLURL, url)); +	registrar.add("Url.Execute", boost::bind(&LLUrlAction::executeSLURL, url, true));  	registrar.add("Url.Block", boost::bind(&LLUrlAction::blockObject, url));  	registrar.add("Url.Teleport", boost::bind(&LLUrlAction::teleportToLocation, url));  	registrar.add("Url.ShowProfile", boost::bind(&LLUrlAction::showProfile, url)); @@ -3227,7 +3229,15 @@ BOOL LLNormalTextSegment::handleMouseUp(S32 x, S32 y, MASK mask)  		// Only process the click if it's actually in this segment, not to the right of the end-of-line.  		if(mEditor.getSegmentAtLocalPos(x, y, false) == this)  		{ -			LLUrlAction::clickAction(getStyle()->getLinkHREF(), mEditor.isContentTrusted()); +            std::string url = getStyle()->getLinkHREF(); +            if (!mEditor.mForceUrlsExternal) +            { +                LLUrlAction::clickAction(url, mEditor.isContentTrusted()); +            } +            else if (!LLUrlAction::executeSLURL(url, mEditor.isContentTrusted())) +            { +                LLUrlAction::openURLExternal(url); +            }  			return TRUE;  		}  	} diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index ac408bbe7a..7d87271b0e 100755 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -300,6 +300,7 @@ public:  								wrap,  								use_ellipses,  								parse_urls, +								force_urls_external,  								parse_highlights,  								clip,  								clip_partial, @@ -654,6 +655,7 @@ protected:  	S32							mLineSpacingPixels;	// padding between lines  	bool						mBorderVisible;  	bool                		mParseHTML;			// make URLs interactive +	bool						mForceUrlsExternal; // URLs from this textbox will be opened in external browser  	bool						mParseHighlights;	// highlight user-defined keywords  	bool                		mWordWrap;  	bool						mUseEllipses; diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp index 12537d9dd1..027a3e3a64 100755 --- a/indra/llui/llurlaction.cpp +++ b/indra/llui/llurlaction.cpp @@ -83,12 +83,13 @@ void LLUrlAction::openURLExternal(std::string url)  	}  } -void LLUrlAction::executeSLURL(std::string url) +bool LLUrlAction::executeSLURL(std::string url, bool trusted_content)  {  	if (sExecuteSLURLCallback)  	{ -		sExecuteSLURLCallback(url ,true); +		return sExecuteSLURLCallback(url, trusted_content);  	} +	return false;  }  void LLUrlAction::clickAction(std::string url, bool trusted_content) diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h index 5f3626490c..5497e28bb4 100755 --- a/indra/llui/llurlaction.h +++ b/indra/llui/llurlaction.h @@ -57,7 +57,7 @@ public:  	static void openURLExternal(std::string url);  	/// execute the given secondlife: SLURL -	static void executeSLURL(std::string url); +	static bool executeSLURL(std::string url, bool trusted_content = true);  	/// if the Url specifies an SL location, teleport there  	static void teleportToLocation(std::string url); diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm index 406bc9cf47..f3b8dac844 100644 --- a/indra/llwindow/llopenglview-objc.mm +++ b/indra/llwindow/llopenglview-objc.mm @@ -341,6 +341,9 @@ attributedStringInfo getSegments(NSAttributedString *str)          callRightMouseUp(mMousePos, [theEvent modifierFlags]);          mSimulatedRightClick = false;      } else { +        NSPoint mPoint = [theEvent locationInWindow]; +        mMousePos[0] = mPoint.x; +        mMousePos[1] = mPoint.y;          callLeftMouseUp(mMousePos, [theEvent modifierFlags]);      }  } diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index c4a8fe3532..5b8937429e 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8171,6 +8171,17 @@        <key>Value</key>        <integer>256</integer>      </map> +    <key>RegionCheckTextureHeights</key> +    <map> +      <key>Comment</key> +      <string>Don't allow user to set low heights greater than high</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RememberPassword</key>      <map>        <key>Comment</key> diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index c62b45ed81..fd6b1b5b3f 100755 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -98,7 +98,18 @@              <string>Boolean</string>          <key>Value</key>              <integer>1</integer> -    </map>    +    </map>  +         <key>NavigationBarRatio</key>	 +   	 <map>	 +        <key>Comment</key> +            <string>The ratio between the width of Navigation layout panel and the width of whole Navigation layout stack</string>	 +        <key>Persist</key>	 +            <integer>1</integer> +        <key>Type</key> +	            <string>F32</string>	 +        <key>Value</key>	 +            <real>0.6</real>	 +    </map>        <key>InstantMessageLogPath</key>          <map>          <key>Comment</key> diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 99dcb80a4a..8b84b1b89b 100755 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -2073,7 +2073,7 @@ void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)  	}  	const LLUUID& base_id = append ? getBaseOutfitUUID() : category;  	LLViewerInventoryCategory *base_cat = gInventory.getCategory(base_id); -	if (base_cat) +	if (base_cat && (base_cat->getPreferredType() == LLFolderType::FT_OUTFIT))  	{  		LLSD base_contents;  		base_contents["name"] = base_cat->getName(); diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 8dc8a2ff20..00bc8ebe87 100755 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -564,7 +564,8 @@ namespace action_give_inventory  	static LLInventoryPanel* get_active_inventory_panel()  	{  		LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); -		if (!active_panel) +		LLFloater* floater_appearance = LLFloaterReg::findInstance("appearance"); +		if (!active_panel || (floater_appearance && floater_appearance->hasFocus()))  		{  			active_panel = get_outfit_editor_inventory_panel();  		} diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index f9fd5069af..7f952d4dd4 100755 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -39,6 +39,7 @@  #include "llagent.h"  #include "llagentaccess.h" +#include "llappviewer.h"  #include "llbutton.h"  #include "llcheckboxctrl.h"  #include "llcombobox.h" @@ -475,13 +476,36 @@ BOOL LLPanelLandGeneral::postBuild()  	mBtnBuyLand = getChild<LLButton>("Buy Land...");  	mBtnBuyLand->setClickedCallback(onClickBuyLand, (void*)&BUY_PERSONAL_LAND); + +	mBtnBuyGroupLand = getChild<LLButton>("Buy For Group..."); +	mBtnBuyGroupLand->setClickedCallback(onClickBuyLand, (void*)&BUY_GROUP_LAND); + + +	mBtnBuyPass = getChild<LLButton>("Buy Pass..."); +	mBtnBuyPass->setClickedCallback(onClickBuyPass, this); + +	mBtnReleaseLand = getChild<LLButton>("Abandon Land..."); +	mBtnReleaseLand->setClickedCallback(onClickRelease, NULL); + +	mBtnReclaimLand = getChild<LLButton>("Reclaim Land..."); +	mBtnReclaimLand->setClickedCallback(onClickReclaim, NULL); + +	mBtnStartAuction = getChild<LLButton>("Linden Sale..."); +	mBtnStartAuction->setClickedCallback(onClickStartAuction, this); + +	mBtnScriptLimits = getChild<LLButton>("Scripts..."); + +	if(gDisconnected) +	{ +		return TRUE; +	} +  	// note: on region change this will not be re checked, should not matter on Agni as  	// 99% of the time all regions will return the same caps. In case of an erroneous setting  	// to enabled the floater will just throw an error when trying to get it's cap  	std::string url = gAgent.getRegion()->getCapability("LandResources");  	if (!url.empty())  	{ -		mBtnScriptLimits = getChild<LLButton>("Scripts...");  		if(mBtnScriptLimits)  		{  			mBtnScriptLimits->setClickedCallback(onClickScriptLimits, this); @@ -489,28 +513,11 @@ BOOL LLPanelLandGeneral::postBuild()  	}  	else  	{ -		mBtnScriptLimits = getChild<LLButton>("Scripts...");  		if(mBtnScriptLimits)  		{  			mBtnScriptLimits->setVisible(false);  		}  	} -	 -	mBtnBuyGroupLand = getChild<LLButton>("Buy For Group..."); -	mBtnBuyGroupLand->setClickedCallback(onClickBuyLand, (void*)&BUY_GROUP_LAND); -	 -	 -	mBtnBuyPass = getChild<LLButton>("Buy Pass..."); -	mBtnBuyPass->setClickedCallback(onClickBuyPass, this); - -	mBtnReleaseLand = getChild<LLButton>("Abandon Land..."); -	mBtnReleaseLand->setClickedCallback(onClickRelease, NULL); - -	mBtnReclaimLand = getChild<LLButton>("Reclaim Land..."); -	mBtnReclaimLand->setClickedCallback(onClickReclaim, NULL); -	 -	mBtnStartAuction = getChild<LLButton>("Linden Sale..."); -	mBtnStartAuction->setClickedCallback(onClickStartAuction, this);  	return TRUE;  } @@ -524,9 +531,58 @@ LLPanelLandGeneral::~LLPanelLandGeneral()  // public  void LLPanelLandGeneral::refresh()  { -	mBtnStartAuction->setVisible(gAgent.isGodlike()); +	mEditName->setEnabled(FALSE); +	mEditName->setText(LLStringUtil::null); -	LLParcel *parcel = mParcel->getParcel(); +	mEditDesc->setEnabled(FALSE); +	mEditDesc->setText(getString("no_selection_text")); + +	mTextSalePending->setText(LLStringUtil::null); +	mTextSalePending->setEnabled(FALSE); + +	mBtnDeedToGroup->setEnabled(FALSE); +	mBtnSetGroup->setEnabled(FALSE); +	mBtnStartAuction->setEnabled(FALSE); + +	mCheckDeedToGroup	->set(FALSE); +	mCheckDeedToGroup	->setEnabled(FALSE); +	mCheckContributeWithDeed->set(FALSE); +	mCheckContributeWithDeed->setEnabled(FALSE); + +	mTextOwner->setText(LLStringUtil::null); +	mContentRating->setText(LLStringUtil::null); +	mLandType->setText(LLStringUtil::null); +	mBtnProfile->setLabel(getString("profile_text")); +	mBtnProfile->setEnabled(FALSE); + +	mTextClaimDate->setText(LLStringUtil::null); +	mTextGroup->setText(LLStringUtil::null); +	mTextPrice->setText(LLStringUtil::null); + +	mSaleInfoForSale1->setVisible(FALSE); +	mSaleInfoForSale2->setVisible(FALSE); +	mSaleInfoForSaleObjects->setVisible(FALSE); +	mSaleInfoForSaleNoObjects->setVisible(FALSE); +	mSaleInfoNotForSale->setVisible(FALSE); +	mBtnSellLand->setVisible(FALSE); +	mBtnStopSellLand->setVisible(FALSE); + +	mTextPriceLabel->setText(LLStringUtil::null); +	mTextDwell->setText(LLStringUtil::null); + +	mBtnBuyLand->setEnabled(FALSE); +	mBtnScriptLimits->setEnabled(FALSE); +	mBtnBuyGroupLand->setEnabled(FALSE); +	mBtnReleaseLand->setEnabled(FALSE); +	mBtnReclaimLand->setEnabled(FALSE); +	mBtnBuyPass->setEnabled(FALSE); + +	if(gDisconnected) +	{ +		return; +	} + +	mBtnStartAuction->setVisible(gAgent.isGodlike());  	bool region_owner = false;  	LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion();  	if(regionp && (regionp->getOwner() == gAgent.getID())) @@ -540,56 +596,8 @@ void LLPanelLandGeneral::refresh()  		mBtnReleaseLand->setVisible(TRUE);  		mBtnReclaimLand->setVisible(FALSE);  	} -	if (!parcel) -	{ -		// nothing selected, disable panel -		mEditName->setEnabled(FALSE); -		mEditName->setText(LLStringUtil::null); - -		mEditDesc->setEnabled(FALSE); -		mEditDesc->setText(getString("no_selection_text")); - -		mTextSalePending->setText(LLStringUtil::null); -		mTextSalePending->setEnabled(FALSE); - -		mBtnDeedToGroup->setEnabled(FALSE); -		mBtnSetGroup->setEnabled(FALSE); -		mBtnStartAuction->setEnabled(FALSE); - -		mCheckDeedToGroup	->set(FALSE); -		mCheckDeedToGroup	->setEnabled(FALSE); -		mCheckContributeWithDeed->set(FALSE); -		mCheckContributeWithDeed->setEnabled(FALSE); - -		mTextOwner->setText(LLStringUtil::null); -		mContentRating->setText(LLStringUtil::null); -		mLandType->setText(LLStringUtil::null); -		mBtnProfile->setLabel(getString("profile_text")); -		mBtnProfile->setEnabled(FALSE); - -		mTextClaimDate->setText(LLStringUtil::null); -		mTextGroup->setText(LLStringUtil::null); -		mTextPrice->setText(LLStringUtil::null); - -		mSaleInfoForSale1->setVisible(FALSE); -		mSaleInfoForSale2->setVisible(FALSE); -		mSaleInfoForSaleObjects->setVisible(FALSE); -		mSaleInfoForSaleNoObjects->setVisible(FALSE); -		mSaleInfoNotForSale->setVisible(FALSE); -		mBtnSellLand->setVisible(FALSE); -		mBtnStopSellLand->setVisible(FALSE); - -		mTextPriceLabel->setText(LLStringUtil::null); -		mTextDwell->setText(LLStringUtil::null); - -		mBtnBuyLand->setEnabled(FALSE); -		mBtnScriptLimits->setEnabled(FALSE); -		mBtnBuyGroupLand->setEnabled(FALSE); -		mBtnReleaseLand->setEnabled(FALSE); -		mBtnReclaimLand->setEnabled(FALSE); -		mBtnBuyPass->setEnabled(FALSE); -	} -	else +	LLParcel *parcel = mParcel->getParcel(); +	if (parcel)  	{  		// something selected, hooray!  		BOOL is_leased = (LLParcel::OS_LEASED == parcel->getOwnershipStatus()); @@ -1246,7 +1254,7 @@ void LLPanelLandObjects::refresh()  	mOwnerList->deleteAllItems();  	mOwnerList->setEnabled(FALSE); -	if (!parcel) +	if (!parcel || gDisconnected)  	{  		mSWTotalObjects->setTextArg("[COUNT]", llformat("%d", 0));  		mSWTotalObjects->setTextArg("[TOTAL]", llformat("%d", 0)); @@ -1974,7 +1982,7 @@ void LLPanelLandOptions::refresh()  	refreshSearch();  	LLParcel *parcel = mParcel->getParcel(); -	if (!parcel) +	if (!parcel || gDisconnected)  	{  		mCheckEditObjects	->set(FALSE);  		mCheckEditObjects	->setEnabled(FALSE); @@ -2154,7 +2162,7 @@ void LLPanelLandOptions::draw()  void LLPanelLandOptions::refreshSearch()  {  	LLParcel *parcel = mParcel->getParcel(); -	if (!parcel) +	if (!parcel || gDisconnected)  	{  		mCheckShowDirectory->set(FALSE);  		mCheckShowDirectory->setEnabled(FALSE); @@ -2419,7 +2427,7 @@ void LLPanelLandAccess::refresh()  	LLParcel *parcel = mParcel->getParcel();  	// Display options -	if (parcel) +	if (parcel && !gDisconnected)  	{  		BOOL use_access_list = parcel->getParcelFlag(PF_USE_ACCESS_LIST);  		BOOL use_group = parcel->getParcelFlag(PF_USE_ACCESS_GROUP); @@ -2599,7 +2607,7 @@ void LLPanelLandAccess::refresh_ui()  	getChildView("remove_banned")->setEnabled(FALSE);  	LLParcel *parcel = mParcel->getParcel(); -	if (parcel) +	if (parcel && !gDisconnected)  	{  		BOOL can_manage_allowed = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_ALLOWED);  		BOOL can_manage_banned = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_BANNED); @@ -2945,7 +2953,7 @@ BOOL LLPanelLandCovenant::postBuild()  void LLPanelLandCovenant::refresh()  {  	LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion(); -	if(!region) return; +	if(!region || gDisconnected) return;  	LLTextBox* region_name = getChild<LLTextBox>("region_name_text");  	if (region_name) @@ -3170,7 +3178,7 @@ void LLPanelLandExperiences::refreshPanel(LLPanelExperienceListEditor* panel, U3  	{  		return;  	} -	if (parcel == NULL) +	if (!parcel || gDisconnected)  	{  		// disable the panel  		panel->setEnabled(FALSE); diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index a6a9838a3c..576d6e890f 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -338,25 +338,25 @@ BOOL LLFloaterModelPreview::postBuild()  		LLTextBox* text = getChild<LLTextBox>(lod_label_name[i]);  		if (text)  		{ -			text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i)); +			text->setMouseDownCallback(boost::bind(&LLFloaterModelPreview::setPreviewLOD, this, i));  		}  		text = getChild<LLTextBox>(lod_triangles_name[i]);  		if (text)  		{ -			text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i)); +			text->setMouseDownCallback(boost::bind(&LLFloaterModelPreview::setPreviewLOD, this, i));  		}  		text = getChild<LLTextBox>(lod_vertices_name[i]);  		if (text)  		{ -			text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i)); +			text->setMouseDownCallback(boost::bind(&LLFloaterModelPreview::setPreviewLOD, this, i));  		}  		text = getChild<LLTextBox>(lod_status_name[i]);  		if (text)  		{ -			text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i)); +			text->setMouseDownCallback(boost::bind(&LLFloaterModelPreview::setPreviewLOD, this, i));  		}  	}  	std::string current_grid = LLGridManager::getInstance()->getGridId(); @@ -1363,6 +1363,14 @@ void LLFloaterModelPreview::setDetails(F32 x, F32 y, F32 z, F32 streaming_cost,  	childSetTextArg("import_dimensions", "[Z]", llformat("%.3f", z));  } +void LLFloaterModelPreview::setPreviewLOD(S32 lod) +{ +	if (mModelPreview) +	{ +		mModelPreview->setPreviewLOD(lod); +	} +} +  void LLModelPreview::rebuildUploadData()  { diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index b2bb15ef05..a73ca50260 100755 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -95,6 +95,7 @@ public:  	static void setUploadAmount(S32 amount) { sUploadAmount = amount; }  	void setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost); +	void setPreviewLOD(S32 lod);  	void onBrowseLOD(S32 lod); diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index aed3294189..4eacd728c3 100755 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -233,6 +233,11 @@ BOOL LLFloaterRegionInfo::postBuild()  	panel->buildFromFile("panel_region_debug.xml");  	mTab->addTabPanel(panel); +	if(gDisconnected) +	{ +		return TRUE; +	} +  	if(!gAgent.getRegion()->getCapability("RegionExperiences").empty())  	{  		panel = new LLPanelRegionExperiences; @@ -256,6 +261,11 @@ LLFloaterRegionInfo::~LLFloaterRegionInfo()  void LLFloaterRegionInfo::onOpen(const LLSD& key)  { +	if(gDisconnected) +	{ +		disableTabCtrls(); +		return; +	}  	refreshFromRegion(gAgent.getRegion());  	requestRegionInfo();  	requestMeshRezInfo(); @@ -479,7 +489,16 @@ LLPanelRegionExperiences* LLFloaterRegionInfo::getPanelExperiences()  	return (LLPanelRegionExperiences*)tab->getChild<LLPanel>("Experiences");  } +void LLFloaterRegionInfo::disableTabCtrls() +{ +	LLTabContainer* tab = getChild<LLTabContainer>("region_panels"); +	tab->getChild<LLPanel>("General")->setCtrlsEnabled(FALSE); +	tab->getChild<LLPanel>("Debug")->setCtrlsEnabled(FALSE); +	tab->getChild<LLPanel>("Terrain")->setCtrlsEnabled(FALSE); +	tab->getChild<LLPanel>("panel_env_info")->setCtrlsEnabled(FALSE); +	tab->getChild<LLPanel>("Estate")->setCtrlsEnabled(FALSE); +}  void LLFloaterRegionInfo::onTabSelected(const LLSD& param)  { @@ -1160,6 +1179,22 @@ BOOL LLPanelRegionTerrainInfo::validateTextureSizes()  	return TRUE;  } +BOOL LLPanelRegionTerrainInfo::validateTextureHeights() +{ +	for (S32 i = 0; i < CORNER_COUNT; ++i) +	{ +		std::string low = llformat("height_start_spin_%d", i); +		std::string high = llformat("height_range_spin_%d", i); + +		if (getChild<LLUICtrl>(low)->getValue().asReal() > getChild<LLUICtrl>(high)->getValue().asReal()) +		{ +			return FALSE; +		} +	} + +	return TRUE; +} +  /////////////////////////////////////////////////////////////////////////////  // LLPanelRegionTerrainInfo  ///////////////////////////////////////////////////////////////////////////// @@ -1192,6 +1227,9 @@ BOOL LLPanelRegionTerrainInfo::postBuild()  	childSetAction("upload_raw_btn", onClickUploadRaw, this);  	childSetAction("bake_terrain_btn", onClickBakeTerrain, this); +	mAskedTextureHeights = false; +	mConfirmedTextureHeights = false; +  	return LLPanelRegionInfo::postBuild();  } @@ -1274,6 +1312,21 @@ BOOL LLPanelRegionTerrainInfo::sendUpdate()  		return FALSE;  	} +	// Check if terrain Elevation Ranges are correct +	if (gSavedSettings.getBOOL("RegionCheckTextureHeights") && !validateTextureHeights()) +	{ +		if (!mAskedTextureHeights) +		{ +			LLNotificationsUtil::add("ConfirmTextureHeights", LLSD(), LLSD(), boost::bind(&LLPanelRegionTerrainInfo::callbackTextureHeights, this, _1, _2)); +			mAskedTextureHeights = true; +			return FALSE; +		} +		else if (!mConfirmedTextureHeights) +		{ +			return FALSE; +		} +	} +  	LLTextureCtrl* texture_ctrl;  	std::string id_str;  	LLMessageSystem* msg = gMessageSystem; @@ -1314,6 +1367,29 @@ BOOL LLPanelRegionTerrainInfo::sendUpdate()  	return TRUE;  } +bool LLPanelRegionTerrainInfo::callbackTextureHeights(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +	if (option == 0) // ok +	{ +		mConfirmedTextureHeights = true; +	} +	else if (option == 1) // cancel +	{ +		mConfirmedTextureHeights = false; +	} +	else if (option == 2) // don't ask +	{ +		gSavedSettings.setBOOL("RegionCheckTextureHeights", FALSE); +		mConfirmedTextureHeights = true; +	} + +	onBtnSet(); + +	mAskedTextureHeights = false; +	return false; +} +  // static  void LLPanelRegionTerrainInfo::onClickDownloadRaw(void* data)  { @@ -3018,6 +3094,11 @@ bool LLPanelEnvironmentInfo::refreshFromRegion(LLViewerRegion* region)  void LLPanelEnvironmentInfo::refresh()  { +	if(gDisconnected) +	{ +		return; +	} +  	populateWaterPresetsList();  	populateSkyPresetsList();  	populateDayCyclesList(); diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index 3c74618fff..46f2b42137 100755 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -113,6 +113,7 @@ private:  protected:  	void onTabSelected(const LLSD& param); +	void disableTabCtrls();  	void refreshFromRegion(LLViewerRegion* region);  	// member data @@ -240,6 +241,7 @@ public:  	void setEnvControls(bool available);									// Whether environment settings are available for this region  	BOOL validateTextureSizes(); +	BOOL validateTextureHeights();  	//static void onChangeAnything(LLUICtrl* ctrl, void* userData);			// callback for any change, to enable commit button @@ -249,6 +251,11 @@ public:  	static void onClickUploadRaw(void*);  	static void onClickBakeTerrain(void*);  	bool callbackBakeTerrain(const LLSD& notification, const LLSD& response); +	bool callbackTextureHeights(const LLSD& notification, const LLSD& response); + +private: +	bool mConfirmedTextureHeights; +	bool mAskedTextureHeights;  };  ///////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp index aee20ff706..c7218ad9d5 100755 --- a/indra/newview/llfloatersidepanelcontainer.cpp +++ b/indra/newview/llfloatersidepanelcontainer.cpp @@ -69,7 +69,11 @@ void LLFloaterSidePanelContainer::closeFloater(bool app_quitting)  			LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance*>(getPanel("appearance"));  			if ( panel_appearance )  			{ -				panel_appearance->getWearable()->onClose(); +				LLPanelEditWearable *edit_wearable_ptr = panel_appearance->getWearable(); +				if (edit_wearable_ptr) +				{ +					edit_wearable_ptr->onClose(); +				}  				panel_appearance->showOutfitsInventoryPanel();  			}  		} diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp index f8681fe098..e20360066e 100755 --- a/indra/newview/llfloatertopobjects.cpp +++ b/indra/newview/llfloatertopobjects.cpp @@ -183,10 +183,15 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)  			msg->getU32("DataExtended", "TimeStamp", time_stamp, block);  			msg->getF32("DataExtended", "MonoScore", mono_score, block);  			msg->getS32("DataExtended", "PublicURLs", public_urls, block); -			if (msg->getSize("DataExtended", "ParcelName") > 0) + +			std::string parcel_name; +			F32 script_size = 0.f; +			msg->getString("DataExtended", "ParcelName", parcel_name, block); +			msg->getF32("DataExtended", "Size", script_size, block); +			if (parcel_name.size() > 0 || script_size > 0)  			{ -				msg->getString("DataExtended", "ParcelName", parcel_buf, block); -				msg->getF32("DataExtended", "Size", script_memory, block); +				parcel_buf = parcel_name; +				script_memory = script_size;  			}  		} diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index bdbe253723..494b8808e3 100755 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -3405,6 +3405,11 @@ void LLInventoryModel::removeCategory(const LLUUID& category_id)  void LLInventoryModel::removeObject(const LLUUID& object_id)  { +	if(object_id.isNull()) +	{ +		return; +	} +  	LLInventoryObject* obj = getObject(object_id);  	if (dynamic_cast<LLViewerInventoryItem*>(obj))  	{ diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp index 6c81378622..72ec092ed4 100755 --- a/indra/newview/llinventoryobserver.cpp +++ b/indra/newview/llinventoryobserver.cpp @@ -306,6 +306,12 @@ void LLInventoryFetchItemsObserver::startFetch()  			continue;  		} +		if ((*it).isNull()) +		{ +			LL_WARNS("Inventory") << "Skip fetching for a NULL uuid" << LL_ENDL; +			continue; +		} +  		// It's incomplete, so put it on the incomplete container, and  		// pack this on the message.  		mIncomplete.push_back(*it); diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 02d378bc51..f5dcbf838d 100755 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -1332,6 +1332,11 @@ void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const L  		}  		else  		{ +			LLFloater* floater_inventory = LLFloaterReg::getInstance("inventory"); +			if (floater_inventory) +			{ +				floater_inventory->setFocus(TRUE); +			}  			active_panel->setSelection(obj_id, TAKE_FOCUS_YES);  		}  	} diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index 85faa70552..3cbe742e3c 100755 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -2081,7 +2081,7 @@ BOOL LLManipScale::canAffectSelection()  			{  				LLViewerObject *root_object = (objectp == NULL) ? NULL : objectp->getRootEdit();  				return objectp->permModify() && objectp->permMove() && !objectp->isPermanentEnforced() && -					((root_object == NULL) || !root_object->isPermanentEnforced()) && +					(root_object == NULL || (!root_object->isPermanentEnforced() && !root_object->isSeat())) &&  					!objectp->isSeat();  			}  		} func; diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index 8c4849d28d..84a2cd8be1 100755 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -44,6 +44,7 @@  #include "lllocationinputctrl.h"  #include "llpaneltopinfobar.h"  #include "llteleporthistory.h" +#include "llresizebar.h"  #include "llsearchcombobox.h"  #include "llslurl.h"  #include "llurlregistry.h" @@ -267,7 +268,10 @@ LLNavigationBar::LLNavigationBar()  	mBtnForward(NULL),  	mBtnHome(NULL),  	mCmbLocation(NULL), -	mSaveToLocationHistory(false) +	mSaveToLocationHistory(false), +	mNavigationPanel(NULL), +	mFavoritePanel(NULL), +	mNavPanWidth(0)  {  	buildFromFile( "panel_navigation_bar.xml"); @@ -286,7 +290,7 @@ BOOL LLNavigationBar::postBuild()  	mBtnBack	= getChild<LLPullButton>("back_btn");  	mBtnForward	= getChild<LLPullButton>("forward_btn");  	mBtnHome	= getChild<LLButton>("home_btn"); -	 +  	mCmbLocation= getChild<LLLocationInputCtrl>("location_combo");  	mBtnBack->setEnabled(FALSE); @@ -318,6 +322,11 @@ BOOL LLNavigationBar::postBuild()  	LLHints::registerHintTarget("nav_bar", getHandle()); +	mNavigationPanel = getChild<LLLayoutPanel>("navigation_layout_panel"); +	mFavoritePanel = getChild<LLLayoutPanel>("favorites_layout_panel"); +	mNavigationPanel->getResizeBar()->setResizeListener(boost::bind(&LLNavigationBar::onNavbarResized, this)); +	mFavoritePanel->getResizeBar()->setResizeListener(boost::bind(&LLNavigationBar::onNavbarResized, this)); +  	return TRUE;  } @@ -356,7 +365,6 @@ BOOL LLNavigationBar::handleRightMouseDown(S32 x, S32 y, MASK mask)  		show_navbar_context_menu(this,x,y);  		handled = true;  	} -					  	return handled;  } @@ -365,6 +373,18 @@ void LLNavigationBar::onBackButtonClicked()  	LLTeleportHistory::getInstance()->goBack();  } +void LLNavigationBar::onNavbarResized() +{ +	S32 new_nav_pan_width = mNavigationPanel->getRect().getWidth(); +	if(mNavPanWidth != new_nav_pan_width) +	{ +		S32 new_stack_width = new_nav_pan_width + mFavoritePanel->getRect().getWidth(); +		F32 ratio = (F32)new_nav_pan_width / (F32)new_stack_width; +		gSavedPerAccountSettings.setF32("NavigationBarRatio", ratio); +		mNavPanWidth = new_nav_pan_width; +	} +} +  void LLNavigationBar::onBackOrForwardButtonHeldDown(LLUICtrl* ctrl, const LLSD& param)  {  	if (param["count"].asInteger() == 0) @@ -667,8 +687,18 @@ void LLNavigationBar::handleLoginComplete()  	LLTeleportHistory::getInstance()->handleLoginComplete();  	LLPanelTopInfoBar::instance().handleLoginComplete();  	mCmbLocation->handleLoginComplete(); +	resizeLayoutPanel();  } +void LLNavigationBar::resizeLayoutPanel() +{ +	LLRect nav_bar_rect = mNavigationPanel->getRect(); + +	S32 nav_panel_width = (nav_bar_rect.getWidth() + mFavoritePanel->getRect().getWidth()) * gSavedPerAccountSettings.getF32("NavigationBarRatio"); + +	nav_bar_rect.setLeftTopAndSize(nav_bar_rect.mLeft, nav_bar_rect.mTop, nav_panel_width, nav_bar_rect.getHeight()); +	mNavigationPanel->handleReshape(nav_bar_rect,true); +}  void LLNavigationBar::invokeSearch(std::string search_text)  {  	LLFloaterReg::showInstance("search", LLSD().with("category", "all").with("query", LLSD(search_text))); diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h index 7878bab24e..29dbaedf7a 100755 --- a/indra/newview/llnavigationbar.h +++ b/indra/newview/llnavigationbar.h @@ -29,6 +29,7 @@  #include "llpanel.h"  #include "llbutton.h" +#include "lllayoutstack.h"  class LLLocationInputCtrl;  class LLMenuGL; @@ -108,6 +109,7 @@ private:  	void rebuildTeleportHistoryMenu();  	void showTeleportHistoryMenu(LLUICtrl* btn_ctrl);  	void invokeSearch(std::string search_text); +	void resizeLayoutPanel();  	// callbacks  	void onTeleportHistoryMenuItemClicked(const LLSD& userdata);  	void onTeleportHistoryChanged(); @@ -120,6 +122,7 @@ private:  	void onLocationPrearrange(const LLSD& data);  	void onTeleportFinished(const LLVector3d& global_agent_pos);  	void onTeleportFailed(); +	void onNavbarResized();  	void onRegionNameResponse(  			std::string typed_location,  			std::string region_name, @@ -135,6 +138,7 @@ private:  		}  	} +	S32							mNavPanWidth;  	LLMenuGL*					mTeleportHistoryMenu;  	LLPullButton*				mBtnBack;  	LLPullButton*				mBtnForward; @@ -142,6 +146,8 @@ private:  	LLLocationInputCtrl*		mCmbLocation;  	LLRect						mDefaultNbRect;  	LLRect						mDefaultFpRect; +	LLLayoutPanel* 				mNavigationPanel; +	LLLayoutPanel* 				mFavoritePanel;  	boost::signals2::connection	mTeleportFailedConnection;  	boost::signals2::connection	mTeleportFinishConnection;  	boost::signals2::connection	mHistoryMenuConnection; diff --git a/indra/newview/llpanelgroupexperiences.cpp b/indra/newview/llpanelgroupexperiences.cpp index a88a55ab22..6c40499208 100644 --- a/indra/newview/llpanelgroupexperiences.cpp +++ b/indra/newview/llpanelgroupexperiences.cpp @@ -30,7 +30,7 @@  #include "lluictrlfactory.h"  #include "roles_constants.h" - +#include "llappviewer.h"  #include "llagent.h"  #include "llviewerregion.h"  #include "llflatlistview.h" @@ -67,7 +67,7 @@ BOOL LLPanelGroupExperiences::postBuild()  void LLPanelGroupExperiences::activate()  { -	if (getGroupID() == LLUUID::null) +	if ((getGroupID() == LLUUID::null) || gDisconnected)  	{  		return;  	} diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index 263c73dc0e..0088163fee 100755 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -1080,28 +1080,30 @@ void LLPanelPermissions::setAllSaleInfo()  	LLSaleInfo new_sale_info(sale_type, price);  	LLSelectMgr::getInstance()->selectionSetObjectSaleInfo(new_sale_info); -	 -	U8 old_click_action = 0; -	LLSelectMgr::getInstance()->selectionGetClickAction(&old_click_action); -	if (old_sale_info.isForSale() -		&& !new_sale_info.isForSale() -		&& old_click_action == CLICK_ACTION_BUY) -	{ -		// If turned off for-sale, make sure click-action buy is turned -		// off as well -		LLSelectMgr::getInstance()-> -			selectionSetClickAction(CLICK_ACTION_TOUCH); -	} -	else if (new_sale_info.isForSale() -		&& !old_sale_info.isForSale() -		&& old_click_action == CLICK_ACTION_TOUCH) -	{ -		// If just turning on for-sale, preemptively turn on one-click buy -		// unless user have a different click action set -		LLSelectMgr::getInstance()-> -			selectionSetClickAction(CLICK_ACTION_BUY); -	} +    bool selection_set_for_sale = new_sale_info.isForSale(); +    bool selection_was_for_sale = old_sale_info.isForSale(); +    if (selection_was_for_sale != selection_set_for_sale) +    { +        // sale state changed, switch click-actions +        // but don't touch user changed actions +        U8 old_action = selection_set_for_sale ? CLICK_ACTION_TOUCH : CLICK_ACTION_BUY; +        U8 new_action = selection_set_for_sale ? CLICK_ACTION_BUY : CLICK_ACTION_TOUCH; +        struct f : public LLSelectedObjectFunctor +        { +            U8 mActionOld, mActionNew; +            f(const U8& t_old, const U8& t_new) : mActionOld(t_old), mActionNew(t_new) {} +            virtual bool apply(LLViewerObject* object) +            { +                if (object->getClickAction() == mActionOld) +                { +                    object->setClickAction(mActionNew); +                } +                return true; +            } +        } func(old_action, new_action); +        LLSelectMgr::getInstance()->getSelection()->applyToObjects(&func); +    }  }  struct LLSelectionPayable : public LLSelectedObjectFunctor diff --git a/indra/newview/llpersistentnotificationstorage.cpp b/indra/newview/llpersistentnotificationstorage.cpp index 9e4f50b7a7..9c0222d0bc 100755 --- a/indra/newview/llpersistentnotificationstorage.cpp +++ b/indra/newview/llpersistentnotificationstorage.cpp @@ -123,11 +123,28 @@ void LLPersistentNotificationStorage::loadNotifications()  	LLNotifications& instance = LLNotifications::instance();  	S32 processed_notifications = 0; +	std::vector<LLSD> notifications_array;  	for (LLSD::reverse_array_iterator notification_it = data.rbeginArray();  		notification_it != data.rendArray();  		++notification_it)  	{  		LLSD notification_params = *notification_it; +		notifications_array.push_back(notification_params); + +		++processed_notifications; +		if (processed_notifications >= gSavedSettings.getS32("MaxPersistentNotifications")) +		{ +			LL_WARNS() << "Too many persistent notifications." +					<< " Processed " << gSavedSettings.getS32("MaxPersistentNotifications") << " of " << data.size() << " persistent notifications." << LL_ENDL; +		    break; +		} +	} + +	for (LLSD::reverse_array_iterator notification_it = notifications_array.rbegin(); +			notification_it != notifications_array.rend(); +			++notification_it) +	{ +		LLSD notification_params = *notification_it;  		LLNotificationPtr notification(new LLNotification(notification_params));  		LLNotificationResponderPtr responder(createResponder(notification_params["name"], notification_params["responder"])); @@ -143,14 +160,8 @@ void LLPersistentNotificationStorage::loadNotifications()  			// hide saved toasts so they don't confuse the user  			notification_channel->hideToast(notification->getID());  		} -		++processed_notifications; -		if (processed_notifications >= gSavedSettings.getS32("MaxPersistentNotifications")) -		{ -			LL_WARNS() << "Too many persistent notifications." -					<< " Processed " << gSavedSettings.getS32("MaxPersistentNotifications") << " of " << data.size() << " persistent notifications." << LL_ENDL; -		    break; -	}  	} +  	LLNotifications::instance().getChannel("Persistent")->  			connectChanged(boost::bind(&LLPersistentNotificationStorage::onPersistentChannelChanged, this, _1));  	LL_INFOS("LLPersistentNotificationStorage") << "finished loading notifications" << LL_ENDL; diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index ea7cf82674..86135ee6e8 100755 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -198,7 +198,7 @@ void LLSidepanelAppearance::updateToVisibility(const LLSD &new_visibility)  		if (is_outfit_edit_visible || is_wearable_edit_visible)  		{ -			const LLViewerWearable *wearable_ptr = mEditWearable->getWearable(); +			const LLViewerWearable *wearable_ptr = mEditWearable ? mEditWearable->getWearable() : NULL;  			if (!wearable_ptr)  			{  				LL_WARNS() << "Visibility change to invalid wearable" << LL_ENDL; diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp index 503dd6747d..cb356726e6 100755 --- a/indra/newview/llsurface.cpp +++ b/indra/newview/llsurface.cpp @@ -718,7 +718,6 @@ void LLSurface::decompressDCTPatch(LLBitPack &bitpack, LLGroupHeader *gopp, BOOL  				<< " quant_wbits " << (S32)ph.quant_wbits  				<< " patchids " << (S32)ph.patchids  				<< LL_ENDL; -            LLAppViewer::instance()->badNetworkHandler();  			return;  		} diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index bcdf8360ed..37cc908e84 100755 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -1491,6 +1491,7 @@ void LLTextureCache::readHeaderCache()  						new_entries.push_back(entry);  					}  				} +                mFreeList.clear(); // recreating list, no longer valid.  				llassert_always(new_entries.size() <= sCacheMaxEntries);  				mHeaderEntriesInfo.mEntries = new_entries.size();  				writeEntriesHeader(); diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index 63ede7f8ac..7020ac0c65 100755 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -380,10 +380,6 @@ void LLToast::setVisible(BOOL show)  		{  			mTimer->start();  		} -		if (!getVisible()) -		{ -			LLModalDialog::setFrontmost(FALSE); -		}  	}  	else  	{ diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp index 530bd9a18f..bbce717c20 100755 --- a/indra/newview/lltoastalertpanel.cpp +++ b/indra/newview/lltoastalertpanel.cpp @@ -181,6 +181,7 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal  	params.wrap(true);  	params.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);  	params.allow_scroll(true); +	params.force_urls_external(mNotification->getForceUrlsExternal());  	LLTextBox * msg_box = LLUICtrlFactory::create<LLTextBox> (params);  	// Compute max allowable height for the dialog text, so we can allocate diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index e43a6d2b8f..518d014e8c 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2362,6 +2362,20 @@ static void god_message_name_cb(const LLAvatarName& av_name, LLChat chat, std::s  	}  } +const std::string NOT_ONLINE_MSG("User not online - message will be stored and delivered later."); +const std::string NOT_ONLINE_INVENTORY("User not online - inventory has been saved."); +void translate_if_needed(std::string& message) +{ +	if (message == NOT_ONLINE_MSG) +	{ +		message = LLTrans::getString("not_online_msg"); +	} +	else if (message == NOT_ONLINE_INVENTORY) +	{ +		message = LLTrans::getString("not_online_inventory"); +	} +} +  void process_improved_im(LLMessageSystem *msg, void **user_data)  {  	LLUUID from_id; @@ -2426,6 +2440,11 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  	chat.mFromID = from_id;  	chat.mFromName = name;  	chat.mSourceType = (from_id.isNull() || (name == std::string(SYSTEM_FROM))) ? CHAT_SOURCE_SYSTEM : CHAT_SOURCE_AGENT; +	 +	if (chat.mSourceType == CHAT_SOURCE_SYSTEM) +	{ // Translate server message if required (MAINT-6109) +		translate_if_needed(message); +	}  	LLViewerObject *source = gObjectList.findObject(session_id); //Session ID is probably the wrong thing.  	if (source) @@ -7419,7 +7438,7 @@ void callback_load_url_name(const LLUUID& id, const std::string& full_name, bool  			args["URL"] = load_url_info["url"].asString();  			args["MESSAGE"] = load_url_info["message"].asString();;  			args["OBJECTNAME"] = load_url_info["object_name"].asString(); -			args["NAME"] = owner_name; +			args["NAME_SLURL"] = LLSLURL(is_group ? "group" : "agent", id, "about").getSLURLString();  			LLNotificationsUtil::add("LoadWebPage", args, load_url_info);  		} diff --git a/indra/newview/llvieweroctree.cpp b/indra/newview/llvieweroctree.cpp index 03c3f0fc08..023f1b92ba 100644 --- a/indra/newview/llvieweroctree.cpp +++ b/indra/newview/llvieweroctree.cpp @@ -1201,6 +1201,12 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera, const LLVector4a* sh  			bounds[0].add(*shift);  		} +		F32 OCCLUSION_FUDGE_Z = SG_OCCLUSION_FUDGE; //<-- #Solution #2 +		if (LLDrawPool::POOL_WATER == mSpatialPartition->mDrawableType) +		{ +			OCCLUSION_FUDGE_Z = 1.; +		} +  		// Don't cull hole/edge water, unless we have the GL_ARB_depth_clamp extension  		if (earlyFail(camera, bounds))  		{ @@ -1260,7 +1266,7 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera, const LLVector4a* sh  						shader->uniform3fv(LLShaderMgr::BOX_CENTER, 1, bounds[0].getF32ptr());  						shader->uniform3f(LLShaderMgr::BOX_SIZE, bounds[1][0]+SG_OCCLUSION_FUDGE,   																 bounds[1][1]+SG_OCCLUSION_FUDGE,  -																 bounds[1][2]+SG_OCCLUSION_FUDGE); +																 bounds[1][2]+OCCLUSION_FUDGE_Z);  						if (!use_depth_clamp && mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER)  						{ @@ -1270,7 +1276,7 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera, const LLVector4a* sh  							if (camera->getOrigin().isExactlyZero())  							{ //origin is invalid, draw entire box  								gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, 0); -								gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, b111*8);				 +								gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, b111*8);  							}  							else  							{ @@ -1283,7 +1289,7 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera, const LLVector4a* sh  							if (camera->getOrigin().isExactlyZero())  							{ //origin is invalid, draw entire box  								gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, 0); -								gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, b111*8);				 +								gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, b111*8);  							}  							else  							{ diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index e2b8ff8e80..3e059f3b68 100755 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -716,7 +716,8 @@ void LLViewerTexture::setBoostLevel(S32 level)  	{  		mBoostLevel = level;  		if(mBoostLevel != LLViewerTexture::BOOST_NONE &&  -			mBoostLevel != LLViewerTexture::BOOST_SELECTED) +			mBoostLevel != LLViewerTexture::BOOST_SELECTED &&  +			mBoostLevel != LLViewerTexture::BOOST_ICON)  		{  			setNoDelete();		  		} diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 9ee5ed758f..e2a3ad1981 100755 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -450,11 +450,17 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string&  		if (boost_priority != 0)  		{ -			if (boost_priority == LLViewerFetchedTexture::BOOST_UI -				|| boost_priority == LLViewerFetchedTexture::BOOST_ICON) +			if (boost_priority == LLViewerFetchedTexture::BOOST_UI)  			{  				imagep->dontDiscard();  			} +			if (boost_priority == LLViewerFetchedTexture::BOOST_ICON) +			{ +				// Agent and group Icons are downloadable content, nothing manages +				// icon deletion yet, so they should not persist +				imagep->dontDiscard(); +				imagep->forceActive(); +			}  			imagep->setBoostLevel(boost_priority);  		}  	} @@ -554,10 +560,16 @@ LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id,  	if (boost_priority != 0)  	{ -		if (boost_priority == LLViewerFetchedTexture::BOOST_UI -			|| boost_priority == LLViewerFetchedTexture::BOOST_ICON) +		if (boost_priority == LLViewerFetchedTexture::BOOST_UI) +		{ +			imagep->dontDiscard(); +		} +		if (boost_priority == LLViewerFetchedTexture::BOOST_ICON)  		{ +			// Agent and group Icons are downloadable content, nothing manages +			// icon deletion yet, so they should not persist.  			imagep->dontDiscard(); +			imagep->forceActive();  		}  		imagep->setBoostLevel(boost_priority);  	} diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index f96c4b7bf0..d3416ec5fc 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -4951,6 +4951,13 @@ void LLViewerWindow::stopGL(BOOL save_state)  		gGLManager.mIsDisabled = TRUE;  		stop_glerror(); + +		//unload shader's +		while (LLGLSLShader::sInstances.size()) +		{ +			LLGLSLShader* shader = *(LLGLSLShader::sInstances.begin()); +			shader->unload(); +		}  		LL_INFOS() << "Remaining allocated texture memory: " << LLImageGL::sGlobalTextureMemory.value() << " bytes" << LL_ENDL;  	} diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 21c38e9bc1..d47638146a 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -7975,6 +7975,13 @@ void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_weara  			// show the cloned params inside the wearables as well.  			gAgentAvatarp->dumpWearableInfo(outfile);  		} +		LLSD args; +		args["PATH"] = fullpath; +		LLNotificationsUtil::add("AppearanceToXMLSaved", args); +	} +	else +	{ +		LLNotificationsUtil::add("AppearanceToXMLFailed");  	}  	// File will close when handle goes out of scope  } diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml index aad3b9d062..3e0f0133dd 100755 --- a/indra/newview/skins/default/xui/da/notifications.xml +++ b/indra/newview/skins/default/xui/da/notifications.xml @@ -1432,7 +1432,7 @@ Hvis du ikke forlader regionen, vil du blive logget af.  [MESSAGE] -Fra objekt: <nolink>[OBJECTNAME]</nolink>, ejer: [NAME]? +Fra objekt: <nolink>[OBJECTNAME]</nolink>, ejer: [NAME_SLURL]?  		<form name="form">  			<button name="Gotopage" text="Gå til side"/>  			<button name="Cancel" text="Afbryd"/> diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index fa7db0a8a3..670d081faf 100755 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -2956,7 +2956,7 @@ Wenn Sie in dieser Region bleiben, werden Sie abgemeldet.  [MESSAGE] -Von Objekt: <nolink>[OBJECTNAME]</nolink>, Eigentümer: [NAME] +Von Objekt: <nolink>[OBJECTNAME]</nolink>, Eigentümer: [NAME_SLURL]  		<form name="form">  			<button name="Gotopage" text="Zur Seite"/>  			<button name="Cancel" text="Abbrechen"/> diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index 384ae6bb1e..8391bacf51 100755 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -570,8 +570,7 @@           left="0"           top="0"           help_topic="land_covenant_tab" -         name="land_covenant_panel" -         word_wrap="true"> +         name="land_covenant_panel">              <panel.string               name="can_resell"               word_wrap="true"> @@ -1076,7 +1075,7 @@               name="Autoreturn"               top_pad="0"               width="412" -             wrap="true"> +             word_wrap="true">                  Auto return other Residents' objects (minutes, 0 for off):              </text>              <line_editor @@ -1461,7 +1460,7 @@ Only large parcels can be listed in search.               top="150"               name="allow_label5"               width="205" -             wrap="true"> +             word_wrap="true">                Avatars on other parcels can see and chat with avatars on this parcel              </text>              <check_box diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 0c09906155..5a77d3fc8c 100755 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -3580,6 +3580,19 @@ Do you really want to bake the current terrain, make it the center for terrain r    <notification     icon="alertmodal.tga" +   name="ConfirmTextureHeights" +   type="alertmodal"> +You're about to use low values greater than high ones for Elevation Ranges. Proceed? +   <tag>confirm</tag> +   <usetemplate +    name="yesnocancelbuttons" +    yestext="Ok" +    notext="Cancel" +    canceltext="Don't ask"/> +  </notification> + +  <notification +   icon="alertmodal.tga"     name="MaxAllowedAgentOnRegion"     type="alertmodal">  You can only have [MAX_AGENTS] Allowed Residents. @@ -3857,9 +3870,10 @@ We have downloaded an update to your [APP_NAME] installation.    </notification>    <notification - icon="alertmodal.tga" - name="RequiredUpdateDownloadedVerboseDialog" - type="alertmodal"> +   icon="alertmodal.tga" +   name="RequiredUpdateDownloadedVerboseDialog" +   type="alertmodal" +   force_urls_external="true">  We have downloaded a required software update.  Version [VERSION] [[INFO_URL] Information about this update] @@ -3871,9 +3885,10 @@ We must restart [APP_NAME] to install the update.    </notification>    <notification - icon="alertmodal.tga" - name="RequiredUpdateDownloadedDialog" - type="alertmodal"> +   icon="alertmodal.tga" +   name="RequiredUpdateDownloadedDialog" +   type="alertmodal" +   force_urls_external="true">  We must restart [APP_NAME] to install the update.  [[INFO_URL] Information about this update]      <tag>confirm</tag> @@ -3913,9 +3928,10 @@ see [[INFO_URL] Information about this update]    </notification>    <notification - icon="alertmodal.tga" - name="OtherChannelRequiredUpdateDownloadedVerboseDialog" - type="alertmodal"> +   icon="alertmodal.tga" +   name="OtherChannelRequiredUpdateDownloadedVerboseDialog" +   type="alertmodal" +   force_urls_external="true">  We have downloaded a required software update.  Version [VERSION]  This experimental viewer has been replaced by a [NEW_CHANNEL] viewer; @@ -3929,9 +3945,10 @@ We must restart [APP_NAME] to install the update.    </notification>    <notification - icon="alertmodal.tga" - name="OtherChannelRequiredUpdateDownloadedDialog" - type="alertmodal"> +   icon="alertmodal.tga" +   name="OtherChannelRequiredUpdateDownloadedDialog" +   type="alertmodal" +   force_urls_external="true">  We must restart [APP_NAME] to install the update.  This experimental viewer has been replaced by a [NEW_CHANNEL] viewer;  see [[INFO_URL] Information about this update] @@ -7520,8 +7537,8 @@ Load web page [URL] ?  [MESSAGE] -From object: <nolink>[OBJECTNAME]</nolink>, owner: [NAME] -    <tag>confirm</tag> +From object: <nolink>[OBJECTNAME]</nolink>, owner: [NAME_SLURL] +	<tag>confirm</tag>      <form name="form">        <button         index="0" @@ -8261,6 +8278,16 @@ Are you sure you want to close all IMs?  		name="AttachmentSaved" type="notifytip">  Attachment has been saved.    </notification> +   +  <notification icon="notify.tga" persist="true" +		name="AppearanceToXMLSaved" type="notify"> +Appearance has been saved to XML to [PATH] +  </notification> +   +    <notification icon="notifytip.tga" +		name="AppearanceToXMLFailed" type="notifytip"> +Failed to save appearance to XML. +  </notification>    <notification      icon="alertmodal.tga" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index 6c485c0595..e1b8662ece 100755 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -619,6 +619,7 @@           height="16"           increment="0.125"           initial_value="160" +         min_val="0.125"           label="  Trees:"           label_width="185"           layout="topleft" diff --git a/indra/newview/skins/default/xui/en/role_actions.xml b/indra/newview/skins/default/xui/en/role_actions.xml index c2e7c706d6..4d20ecb9b6 100755 --- a/indra/newview/skins/default/xui/en/role_actions.xml +++ b/indra/newview/skins/default/xui/en/role_actions.xml @@ -105,9 +105,6 @@  		<action description="Always allow 'Create Objects'"  		     longdescription="Members in a Role with this Ability can create objects on a group-owned parcel, even if it's turned off in About Land > Options tab."  		     name="land allow create" value="25" /> -		<action description="Always allow 'Create Landmark'" -		     longdescription="Members in a Role with this Ability can landmark a group-owned parcel, even if it's turned off in About Land > Options tab." -		     name="land allow landmark" value="26" />  		<action description="Allow 'Set Home to Here' on group land"  		     longdescription="Members in a Role with this Ability can use World menu > Landmarks > Set Home to Here on a parcel deeded to this group."  		     name="land allow set home" value="28" /> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index f2eddbb38e..ff98d2f109 100755 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -3530,6 +3530,8 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  	<string name="IM_unblock_only_groups_friends">To see this message, you must uncheck 'Only friends and groups can call or IM me' in Preferences/Privacy.</string>    <string name="OnlineStatus">Online</string>    <string name="OfflineStatus">Offline</string> +	<string name="not_online_msg">User not online - message will be stored and delivered later.</string> +	<string name="not_online_inventory">User not online - inventory has been saved.</string>  	<!-- voice calls -->  	<string name="answered_call">Your call has been answered</string> diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 1e367b33fc..2aac4458e3 100755 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -2950,7 +2950,7 @@ Si permaneces en esta región serás desconectado.  [MESSAGE] -Del objeto: <nolink>[OBJECTNAME]</nolink>, propietario: [NAME] +Del objeto: <nolink>[OBJECTNAME]</nolink>, propietario: [NAME_SLURL]  		<form name="form">  			<button name="Gotopage" text="Cargar"/>  			<button name="Cancel" text="Cancelar"/> diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index 29e6fe1979..55a67e1187 100755 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -2942,7 +2942,7 @@ Si vous restez dans cette région, vous serez déconnecté(e).  [MESSAGE] -Venant de l'objet : <nolink>[OBJECTNAME]</nolink>, propriétaire : [NAME] +Venant de l'objet : <nolink>[OBJECTNAME]</nolink>, propriétaire : [NAME_SLURL]  		<form name="form">  			<button name="Gotopage" text="Charger"/>  			<button name="Cancel" text="Annuler"/> diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml index 61131b09c3..6aeabcc505 100755 --- a/indra/newview/skins/default/xui/it/notifications.xml +++ b/indra/newview/skins/default/xui/it/notifications.xml @@ -2947,7 +2947,7 @@ Se rimani qui verrai scollegato da Second Life.  [MESSAGE] -Dall'oggetto: <nolink>[OBJECTNAME]</nolink>, proprietario: [NAME] +Dall'oggetto: <nolink>[OBJECTNAME]</nolink>, proprietario: [NAME_SLURL]  		<form name="form">  			<button name="Gotopage" text="Caricare"/>  			<button name="Cancel" text="Annulla"/> diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index 5f0ce7a73b..b3b4e06a68 100755 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -2990,7 +2990,7 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ  [MESSAGE] -送信元のオブジェクト:<nolink>[OBJECTNAME]</nolink>、所有者:[NAME] +送信元のオブジェクト:<nolink>[OBJECTNAME]</nolink>、所有者:[NAME_SLURL]  		<form name="form">  			<button name="Gotopage" text="ページに移動"/>  			<button name="Cancel" text="取り消し"/> diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml index c4a65d92b4..25cc43a6e3 100755 --- a/indra/newview/skins/default/xui/pl/notifications.xml +++ b/indra/newview/skins/default/xui/pl/notifications.xml @@ -2493,7 +2493,7 @@ Nastąpi wylogowanie jeżeli zostaniesz w tym regionie.  [MESSAGE] -Od obiektu: <nolink>[OBJECTNAME]</nolink>, właściciel właściciel: [NAME]? +Od obiektu: <nolink>[OBJECTNAME]</nolink>, właściciel właściciel: [NAME_SLURL]?  		<form name="form">  			<button name="Gotopage" text="Załaduj"/>  			<button name="Cancel" text="Anuluj"/> diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index a264495404..3a3603307e 100755 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -2931,7 +2931,7 @@ Se permanecer aqui, você será desconectado.  [MESSAGE] -Do objeto: <nolink>[OBJECTNAME]</nolink>, de: [NAME] +Do objeto: <nolink>[OBJECTNAME]</nolink>, de: [NAME_SLURL]  		<form name="form">  			<button name="Gotopage" text="Carregar"/>  			<button name="Cancel" text="Cancelar"/> diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml index 70b9a25590..7b024926e2 100755 --- a/indra/newview/skins/default/xui/ru/notifications.xml +++ b/indra/newview/skins/default/xui/ru/notifications.xml @@ -2942,7 +2942,7 @@ http://secondlife.com/download.  [MESSAGE] -Из объекта: <nolink>[OBJECTNAME]</nolink>, владелец: [NAME] +Из объекта: <nolink>[OBJECTNAME]</nolink>, владелец: [NAME_SLURL]  		<form name="form">  			<button name="Gotopage" text="Перейти на страницу"/>  			<button name="Cancel" text="Отмена"/> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index 0d64b2cae9..18ae202230 100755 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -4223,6 +4223,12 @@ support@secondlife.com.  	<string name="OfflineStatus">  		Оффлайн  	</string> +	<string name="not_online_msg"> +		Пользователь оффлайн - сообщение будет сохранено и доставлено позже. +	</string> +	<string name="not_online_inventory"> +		Пользователь оффлайн - инвентарь сохранен. +	</string>  	<string name="answered_call">  		На ваш звонок ответили  	</string> diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml index df22251b3d..9875399b34 100755 --- a/indra/newview/skins/default/xui/tr/notifications.xml +++ b/indra/newview/skins/default/xui/tr/notifications.xml @@ -2942,7 +2942,7 @@ Bu bölgede kalmaya devam ederseniz oturumunuz sonlandırılacak.  [MESSAGE] -Kaynak nesne: <nolink>[OBJECTNAME]</nolink>, sahibi: [NAME] +Kaynak nesne: <nolink>[OBJECTNAME]</nolink>, sahibi: [NAME_SLURL]  		<form name="form">  			<button name="Gotopage" text="Sayfaya git"/>  			<button name="Cancel" text="İptal"/> diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml index 0a98101b60..371f5d9b39 100755 --- a/indra/newview/skins/default/xui/zh/notifications.xml +++ b/indra/newview/skins/default/xui/zh/notifications.xml @@ -2932,7 +2932,7 @@ SHA1 指紋:[MD5_DIGEST]  [MESSAGE] -來源物件:<nolink>[OBJECTNAME]</nolink>(所有人:[NAME]) +來源物件:<nolink>[OBJECTNAME]</nolink>(所有人:[NAME_SLURL])  		<form name="form">  			<button name="Gotopage" text="前往頁面"/>  			<button name="Cancel" text="取消"/> | 
