diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llui/llaccordionctrltab.cpp | 8 | ||||
| -rw-r--r-- | indra/llui/llflatlistview.h | 5 | ||||
| -rw-r--r-- | indra/llui/llfloater.cpp | 12 | ||||
| -rw-r--r-- | indra/llui/llfloater.h | 8 | ||||
| -rw-r--r-- | indra/llui/lltextbase.cpp | 11 | ||||
| -rw-r--r-- | indra/newview/llavataractions.cpp | 8 | ||||
| -rw-r--r-- | indra/newview/llavatarlist.cpp | 11 | ||||
| -rw-r--r-- | indra/newview/llavatarlist.h | 2 | ||||
| -rw-r--r-- | indra/newview/llavatarlistitem.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llimview.cpp | 21 | ||||
| -rw-r--r-- | indra/newview/llimview.h | 18 | ||||
| -rw-r--r-- | indra/newview/llpanellandmarkinfo.cpp | 11 | ||||
| -rw-r--r-- | indra/newview/llpanellandmarks.cpp | 18 | ||||
| -rw-r--r-- | indra/newview/llpanelpeople.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llpanelpermissions.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llpanelpicks.cpp | 3 | ||||
| -rw-r--r-- | indra/newview/llstatusbar.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llsyswellwindow.cpp | 12 | ||||
| -rw-r--r-- | indra/newview/llsyswellwindow.h | 3 | ||||
| -rw-r--r-- | indra/newview/llviewermessage.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/strings.xml | 4 | 
21 files changed, 144 insertions, 33 deletions
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp index e12776f83a..0959722aa6 100644 --- a/indra/llui/llaccordionctrltab.cpp +++ b/indra/llui/llaccordionctrltab.cpp @@ -465,10 +465,11 @@ void LLAccordionCtrlTab::setHeaderVisible(bool value)  	reshape(getRect().getWidth(), getRect().getHeight(), FALSE);  }; -//vurtual +//virtual  BOOL LLAccordionCtrlTab::postBuild()  { -	mHeader->setVisible(mHeaderVisible); +	if(mHeader) +		mHeader->setVisible(mHeaderVisible);  	static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0); @@ -504,7 +505,8 @@ BOOL LLAccordionCtrlTab::postBuild()  		mScrollbar->setVisible(false);  	} -	mContainerPanel->setVisible(mDisplayChildren); +	if(mContainerPanel) +		mContainerPanel->setVisible(mDisplayChildren);  	return LLUICtrl::postBuild();  } diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h index 92cb40332e..5a1ddc2c59 100644 --- a/indra/llui/llflatlistview.h +++ b/indra/llui/llflatlistview.h @@ -379,11 +379,14 @@ private:  	void setNoItemsCommentVisible(bool visible) const; -private: +protected:  	/** Comparator to use when sorting the list. */  	const ItemComparator* mItemComparator; + +private: +  	LLPanel* mItemsPanel;  	S32 mItemsNoScrollWidth; diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index a9accc0ba6..104ae19eda 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -1121,6 +1121,7 @@ void LLFloater::setIsChrome(BOOL is_chrome)  		setFocus(FALSE);  		// can't Ctrl-Tab to "chrome" floaters  		setFocusRoot(FALSE); +		mButtons[BUTTON_CLOSE]->setToolTip(LLStringExplicit(getButtonTooltip(Params(), BUTTON_CLOSE, is_chrome)));  	}  	// no titles displayed on "chrome" floaters @@ -1844,7 +1845,7 @@ void LLFloater::buildButtons(const Params& floater_params)  		p.click_callback.function(boost::bind(sButtonCallbacks[i], this));  		p.tab_stop(false);  		p.follows.flags(FOLLOWS_TOP|FOLLOWS_RIGHT); -		p.tool_tip = getButtonTooltip(floater_params, (EFloaterButton)i); +		p.tool_tip = getButtonTooltip(floater_params, (EFloaterButton)i, getIsChrome());  		p.scale_image(true);  		p.chrome(true); @@ -1899,8 +1900,15 @@ LLUIImage* LLFloater::getButtonPressedImage(const Params& p, EFloaterButton e)  }  // static -std::string LLFloater::getButtonTooltip(const Params& p, EFloaterButton e) +std::string LLFloater::getButtonTooltip(const Params& p, EFloaterButton e, bool is_chrome)  { +	// EXT-4081 (Lag Meter: Ctrl+W does not close floater) +	// If floater is chrome set 'Close' text for close button's tooltip +	if(is_chrome && BUTTON_CLOSE == e) +	{ +		static std::string close_tooltip_chrome = LLTrans::getString("BUTTON_CLOSE_CHROME"); +		return close_tooltip_chrome; +	}  	// TODO: per-floater localizable tooltips set in XML  	return sButtonToolTips[e];  } diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 97d2bda594..d8c77370f6 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -322,8 +322,14 @@ private:  	// up by index.  	static LLUIImage*	getButtonImage(const Params& p, EFloaterButton e);  	static LLUIImage*	getButtonPressedImage(const Params& p, EFloaterButton e); -	static std::string	getButtonTooltip(const Params& p, EFloaterButton e); +	/** +	 * @params is_chrome - if floater is Chrome it means that floater will never get focus. +	 * Therefore it can't be closed with 'Ctrl+W'. So the tooltip text of close button( X ) +	 * should be 'Close' not 'Close(Ctrl+W)' as for usual floaters. +	 */ +	static std::string	getButtonTooltip(const Params& p, EFloaterButton e, bool is_chrome); +  	BOOL			offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButton index);  	void			addResizeCtrls();  	void			layoutResizeCtrls(); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 5f4b16ec9e..56d7a63832 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -962,7 +962,18 @@ void LLTextBase::reshape(S32 width, S32 height, BOOL called_from_parent)  {  	if (width != getRect().getWidth() || height != getRect().getHeight())  	{ +		//EXT-4288 +		//to keep consistance scrolling behaviour  +		//when scrolling from top and from bottom... +		bool is_scrolled_to_end = (mScroller!=NULL) && scrolledToEnd(); +		  		LLUICtrl::reshape( width, height, called_from_parent ); +	 +		if (is_scrolled_to_end) +		{ +			deselect(); +			endOfDoc(); +		}		  		// do this first after reshape, because other things depend on  		// up-to-date mVisibleTextRect diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index e6666c7f83..cb518f0ad6 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -161,6 +161,14 @@ void LLAvatarActions::offerTeleport(const LLUUID& invitee)  	if (invitee.isNull())  		return; +	//waiting until Name Cache gets updated with corresponding avatar name +	std::string just_to_request_name; +	if (!gCacheName->getFullName(invitee, just_to_request_name)) +	{ +		gCacheName->get(invitee, FALSE, boost::bind((void (*)(const LLUUID&)) &LLAvatarActions::offerTeleport, invitee)); +		return; +	} +  	LLDynamicArray<LLUUID> ids;  	ids.push_back(invitee);  	offerTeleport(ids); diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 45c540b3a3..91ebe910ce 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -334,6 +334,17 @@ boost::signals2::connection LLAvatarList::setItemDoubleClickCallback(const mouse  	return mItemDoubleClickSignal.connect(cb);  } +//virtual +S32 LLAvatarList::notifyParent(const LLSD& info) +{ +	if (info.has("sort") && &NAME_COMPARATOR == mItemComparator) +	{ +		sort(); +		return 1; +	} +	return LLFlatListView::notifyParent(info); +} +  void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos)  {  	LLAvatarListItem* item = new LLAvatarListItem(); diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index 00c72f1f9d..b9be1d0bdc 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -96,6 +96,8 @@ public:  	boost::signals2::connection setItemDoubleClickCallback(const mouse_signal_t::slot_type& cb); +	virtual S32 notifyParent(const LLSD& info); +  protected:  	void refresh(); diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index 9645e75e60..44f88cce29 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -119,8 +119,9 @@ S32 LLAvatarListItem::notifyParent(const LLSD& info)  	if (info.has("visibility_changed"))  	{  		updateChildren(); +		return 1;  	} -	return 0; +	return LLPanel::notifyParent(info);  }  void LLAvatarListItem::onMouseEnter(S32 x, S32 y, MASK mask) @@ -334,6 +335,9 @@ void LLAvatarListItem::onNameCache(const std::string& first_name, const std::str  {  	std::string name = first_name + " " + last_name;  	setName(name); + +	//requesting the list to resort +	notifyParent(LLSD().with("sort", LLSD()));  }  // Convert given number of seconds to a string like "23 minutes", "15 hours" or "3 years", diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 7a4febec20..288895be8c 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -80,6 +80,9 @@ const static std::string ADHOC_NAME_SUFFIX(" Conference");  const static std::string NEARBY_P2P_BY_OTHER("nearby_P2P_by_other");  const static std::string NEARBY_P2P_BY_AGENT("nearby_P2P_by_agent"); +/** Timeout of outgoing session initialization (in seconds) */ +const static U32 SESSION_INITIALIZATION_TIMEOUT = 30; +  std::string LLCallDialogManager::sPreviousSessionlName = "";  LLIMModel::LLIMSession::SType LLCallDialogManager::sPreviousSessionType = LLIMModel::LLIMSession::P2P_SESSION;  std::string LLCallDialogManager::sCurrentSessionlName = ""; @@ -91,6 +94,19 @@ const LLUUID LLOutgoingCallDialog::OCD_KEY = LLUUID("7CF78E11-0CFE-498D-ADB9-141  //  LLIMMgr* gIMMgr = NULL; + +BOOL LLSessionTimeoutTimer::tick() +{ +	if (mSessionId.isNull()) return TRUE; + +	LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(mSessionId); +	if (session && !session->mSessionInitialized) +	{ +		gIMMgr->showSessionStartError("session_initialization_timed_out_error", mSessionId); +	} +	return TRUE; +} +  void toast_callback(const LLSD& msg){  	// do not show toast in busy mode or it goes from agent  	if (gAgent.getBusy() || gAgent.getID() == msg["from_id"]) @@ -214,6 +230,11 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&  		//so we're already initialized  		mSessionInitialized = true;  	} +	else +	{ +		//tick returns TRUE - timer will be deleted after the tick +		new LLSessionTimeoutTimer(mSessionID, SESSION_INITIALIZATION_TIMEOUT); +	}  	if (IM_NOTHING_SPECIAL == type)  	{ diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index f1693d0e17..475d407bea 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -34,6 +34,7 @@  #define LL_LLIMVIEW_H  #include "lldockablefloater.h" +#include "lleventtimer.h"  #include "llinstantmessage.h"  #include "lllogchat.h" @@ -45,7 +46,24 @@ class LLFriendObserver;  class LLCallDialogManager;	  class LLIMSpeakerMgr; +/** + * Timeout Timer for outgoing Ad-Hoc/Group IM sessions which being initialized by the server + */ +class LLSessionTimeoutTimer : public LLEventTimer +{ +public: +	LLSessionTimeoutTimer(const LLUUID& session_id, F32 period) : LLEventTimer(period), mSessionId(session_id) {} +	virtual ~LLSessionTimeoutTimer() {}; +	/* virtual */ BOOL tick(); + +private: +	LLUUID mSessionId; +}; + +/** + * Model (MVC) for IM Sessions + */  class LLIMModel :  public LLSingleton<LLIMModel>  {  public: diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp index 143a64d08b..a60c69f169 100644 --- a/indra/newview/llpanellandmarkinfo.cpp +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -396,17 +396,20 @@ std::string LLPanelLandmarkInfo::getFullFolderName(const LLViewerInventoryCatego  				if (is_under_root_category || cat->getParentUUID() == gInventory.getRootFolderID())  				{  					std::string localized_name; + +					// Looking for translation only for protected type categories +					// to avoid warnings about non existent string in strings.xml. +					bool is_protected_type = LLFolderType::lookupIsProtectedType(cat->getPreferredType()); +  					if (is_under_root_category)  					{  						// translate category name, if it's right below the root -						// FIXME: it can throw notification about non existent string in strings.xml -						bool is_found = LLTrans::findString(localized_name, "InvFolder " + name); +						bool is_found = is_protected_type && LLTrans::findString(localized_name, "InvFolder " + name);  						name = is_found ? localized_name : name;  					}  					else  					{ -						// FIXME: it can throw notification about non existent string in strings.xml -						bool is_found = LLTrans::findString(localized_name, "InvFolder " + cat->getName()); +						bool is_found = is_protected_type && LLTrans::findString(localized_name, "InvFolder " + cat->getName());  						// add translated category name to folder's full name  						name = (is_found ? localized_name : cat->getName()) + "/" + name; diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index e3b8581aca..6ff784db0a 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -923,12 +923,7 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const  			return false;  		}  	} -	else if (!root_folder_view && "category" != command_name) -	{ -		return false; -	}  	else if (  "paste"		== command_name -			|| "rename"		== command_name  			|| "cut"		== command_name  			|| "copy"		== command_name  			|| "delete"		== command_name @@ -940,17 +935,16 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const  	}  	else if (  "teleport"		== command_name  			|| "more_info"		== command_name -			|| "rename"			== command_name  			|| "show_on_map"	== command_name  			|| "copy_slurl"		== command_name  			)  	{  		// disable some commands for multi-selection. EXT-1757 -		if (root_folder_view && -		    root_folder_view->getSelectedCount() > 1) -		{ -			return false; -		} +		return root_folder_view && root_folder_view->getSelectedCount() == 1; +	} +	else if ("rename" == command_name) +	{ +		return root_folder_view && root_folder_view->getSelectedCount() == 1 && canSelectedBeModified(command_name);  	}  	else if("category" == command_name)  	{ @@ -1079,7 +1073,7 @@ bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) co  		}  		else if ("delete" == command_name)  		{ -			can_be_modified = listenerp ? listenerp->isItemRemovable() : false; +			can_be_modified = listenerp ? listenerp->isItemRemovable() && !listenerp->isItemInTrash() : false;  		}  		else if("paste" == command_name)  		{ diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 03e8ab644e..2025bd52dc 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -178,8 +178,8 @@ public:  protected:  	virtual bool doCompare(const LLAvatarListItem* item1, const LLAvatarListItem* item2) const  	{ -		LLPointer<LLSpeaker> lhs = LLLocalSpeakerMgr::instance().findSpeaker(item1->getAvatarId()); -		LLPointer<LLSpeaker> rhs = LLLocalSpeakerMgr::instance().findSpeaker(item2->getAvatarId()); +		LLPointer<LLSpeaker> lhs = LLActiveSpeakerMgr::instance().findSpeaker(item1->getAvatarId()); +		LLPointer<LLSpeaker> rhs = LLActiveSpeakerMgr::instance().findSpeaker(item2->getAvatarId());  		if ( lhs.notNull() && rhs.notNull() )  		{  			// Compare by last speaking time @@ -708,7 +708,7 @@ void LLPanelPeople::updateNearbyList()  	mNearbyList->setDirty();  	DISTANCE_COMPARATOR.updateAvatarsPositions(positions, mNearbyList->getIDs()); -	LLLocalSpeakerMgr::instance().update(TRUE); +	LLActiveSpeakerMgr::instance().update(TRUE);  }  void LLPanelPeople::updateRecentList() diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index 01b6e8ffad..71d16a08b4 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -195,8 +195,8 @@ void LLPanelPermissions::disableAll()  	childSetEnabled("Owner Name",						FALSE);  	childSetEnabled("Group:",							FALSE); -	childSetText("Group Name",							LLStringUtil::null); -	childSetEnabled("Group Name",						FALSE); +	childSetText("Group Name Proxy",					LLStringUtil::null); +	childSetEnabled("Group Name Proxy",					FALSE);  	childSetEnabled("button set group",					FALSE);  	childSetText("Object Name",							LLStringUtil::null); diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index 6f920cf4b9..bde8d02885 100644 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -288,7 +288,8 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)  		LLAvatarClassifieds* c_info = static_cast<LLAvatarClassifieds*>(data);  		if(c_info && getAvatarId() == c_info->target_id)  		{ -			mClassifiedsList->clear(); +			// do not clear classified list in case we will receive two or more data packets. +			// list has been cleared in updateData(). (fix for EXT-6436)  			LLAvatarClassifieds::classifieds_list_t::const_iterator it = c_info->classifieds_list.begin();  			for(; c_info->classifieds_list.end() != it; ++it) diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 9206b4a43a..4198f047d4 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -371,6 +371,8 @@ void LLStatusBar::setVisibleForMouselook(bool visible)  	mTextTime->setVisible(visible);  	getChild<LLUICtrl>("buycurrency")->setVisible(visible);  	getChild<LLUICtrl>("buyL")->setVisible(visible); +	mBtnVolume->setVisible(visible); +	mMediaToggle->setVisible(visible);  	mSGBandwidth->setVisible(visible);  	mSGPacketLoss->setVisible(visible);  	setBackgroundVisible(visible); diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index 66373feb93..cbb030836e 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -58,7 +58,8 @@ LLSysWellWindow::LLSysWellWindow(const LLSD& key) : LLTransientDockableFloater(N  													mSysWellChiclet(NULL),  													mSeparator(NULL),  													NOTIFICATION_WELL_ANCHOR_NAME("notification_well_panel"), -													IM_WELL_ANCHOR_NAME("im_well_panel") +													IM_WELL_ANCHOR_NAME("im_well_panel"), +													mIsReshapedByUser(false)  {  	mTypedItemsCount[IT_NOTIFICATION] = 0; @@ -100,6 +101,13 @@ void LLSysWellWindow::setMinimized(BOOL minimize)  }  //--------------------------------------------------------------------------------- +void LLSysWellWindow::handleReshape(const LLRect& rect, bool by_user) +{ +	mIsReshapedByUser |= by_user; // mark floater that it is reshaped by user +	LLTransientDockableFloater::handleReshape(rect, by_user); +} + +//---------------------------------------------------------------------------------  void LLSysWellWindow::onStartUpToastClick(S32 x, S32 y, MASK mask)  {  	// just set floater visible. Screen channels will be cleared. @@ -211,7 +219,7 @@ void LLSysWellWindow::reshapeWindow()  	// it includes height from floater top to list top and from floater bottom and list bottom  	static S32 parent_list_delta_height = getRect().getHeight() - mMessageList->getRect().getHeight(); -	if (isDocked()) // Don't reshape undocked Well window. See EXT-5715. +	if (!mIsReshapedByUser) // Don't reshape Well window, if it ever was reshaped by user. See EXT-5715.  	{  		S32 notif_list_height = mMessageList->getItemsRect().getHeight() + 2 * mMessageList->getBorderWidth(); diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h index 3790aa3ea9..296bdf7482 100644 --- a/indra/newview/llsyswellwindow.h +++ b/indra/newview/llsyswellwindow.h @@ -70,6 +70,7 @@ public:  	/*virtual*/ void	setDocked(bool docked, bool pop_on_undock = true);  	// override LLFloater's minimization according to EXT-1216  	/*virtual*/ void	setMinimized(BOOL minimize); +	/*virtual*/ void	handleReshape(const LLRect& rect, bool by_user);  	void onStartUpToastClick(S32 x, S32 y, MASK mask); @@ -121,7 +122,7 @@ protected:  	typedef std::map<EItemType, S32> typed_items_count_t;  	typed_items_count_t mTypedItemsCount; - +	bool mIsReshapedByUser;  };  /** diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index b14df9cd4d..7ba9c54e53 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -5591,6 +5591,10 @@ void handle_lure(const LLUUID& invitee)  // Prompt for a message to the invited user.  void handle_lure(const std::vector<LLUUID>& ids)  { +	if (ids.empty()) return; + +	if (!gAgent.getRegion()) return; +  	LLSD edit_args;  	edit_args["REGION"] = gAgent.getRegion()->getName(); diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 00bbbd65d0..0c73b8d769 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -114,6 +114,7 @@  	<!-- ButtonToolTips, llfloater.cpp -->  	<string name="BUTTON_CLOSE_DARWIN">Close (⌘W)</string>  	<string name="BUTTON_CLOSE_WIN">Close (Ctrl+W)</string> +	<string name="BUTTON_CLOSE_CHROME">Close</string>>  	<string name="BUTTON_RESTORE">Restore</string>  	<string name="BUTTON_MINIMIZE">Minimize</string>  	<string name="BUTTON_TEAR_OFF">Tear Off</string> @@ -3048,6 +3049,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].    <string name="unread_chat_multiple">      [SOURCES] have said something new    </string>" +	<string name="session_initialization_timed_out_error"> +		The session initialization is timed out +	</string>    <!-- Financial operations strings -->    <string name="paid_you_ldollars">[NAME] paid you L$[AMOUNT]</string>  | 
