diff options
28 files changed, 446 insertions, 580 deletions
| @@ -229,3 +229,5 @@ c4911ec8cd81e676dfd2af438b3e065407a94a7a 3.2.1-start  a8c7030d6845186fac7c188be4323a0e887b4184 DRTVWR-99_3.2.1-release  a8c7030d6845186fac7c188be4323a0e887b4184 3.2.1-release  3fe994349fae64fc40874bb59db387131eb35a41 3.2.4-start +3fe994349fae64fc40874bb59db387131eb35a41 DRTVWR-104_3.2.4-beta1 +3fe994349fae64fc40874bb59db387131eb35a41 3.2.4-beta1 diff --git a/doc/contributions.txt b/doc/contributions.txt index 9f6de781b4..274632a804 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -171,6 +171,7 @@ Ansariel Hiller  	VWR-25480  	VWR-26150  	STORM-1685 +	STORM-1713  Aralara Rajal  Ardy Lay  	STORM-859 @@ -583,12 +584,17 @@ Jonathan Yap  	STORM-1639  	STORM-910  	STORM-1642 +	STORM-591  	STORM-1105  	STORM-1679  	STORM-1222  	STORM-1659  	STORM-1674  	STORM-1685 +	STORM-1721 +	STORM-1719 +	STORM-1712 +	STORM-1728  Kadah Coba  	STORM-1060  Jondan Lundquist @@ -923,6 +929,7 @@ Robin Cornelius  	SNOW-599  	SNOW-747  	STORM-422 +	STORM-591  	STORM-960  	STORM-1019  	STORM-1095 diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp index dc3a1099b1..9d0d73b81e 100644 --- a/indra/llwindow/llwindow.cpp +++ b/indra/llwindow/llwindow.cpp @@ -108,6 +108,7 @@ LLWindow::LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags)  	  mSupportedResolutions(NULL),  	  mNumSupportedResolutions(0),  	  mCurrentCursor(UI_CURSOR_ARROW), +	  mNextCursor(UI_CURSOR_ARROW),  	  mCursorHidden(FALSE),  	  mBusyCount(0),  	  mIsMouseClipping(FALSE), diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index e8a86a1880..e5fcd19f2c 100644 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -91,8 +91,9 @@ public:  	virtual S32 getBusyCount() const;  	// Sets cursor, may set to arrow+hourglass -	virtual void setCursor(ECursorType cursor) = 0; +	virtual void setCursor(ECursorType cursor) { mNextCursor = cursor; };  	virtual ECursorType getCursor() const; +	virtual void updateCursor() = 0;  	virtual void captureMouse() = 0;  	virtual void releaseMouse() = 0; @@ -181,6 +182,7 @@ protected:  	LLWindowResolution* mSupportedResolutions;  	S32			mNumSupportedResolutions;  	ECursorType	mCurrentCursor; +	ECursorType	mNextCursor;  	BOOL		mCursorHidden;  	S32			mBusyCount;	// how deep is the "cursor busy" stack?  	BOOL		mIsMouseClipping;  // Is this window currently clipping the mouse diff --git a/indra/llwindow/llwindowheadless.h b/indra/llwindow/llwindowheadless.h index ac53e6a86e..1e911d7547 100644 --- a/indra/llwindow/llwindowheadless.h +++ b/indra/llwindow/llwindowheadless.h @@ -55,7 +55,7 @@ public:  	/*virtual*/ void showCursorFromMouseMove() {};  	/*virtual*/ void hideCursorUntilMouseMove() {};  	/*virtual*/ BOOL isCursorHidden() {return FALSE;}; -	/*virtual*/ void setCursor(ECursorType cursor) {}; +	/*virtual*/ void updateCursor() {};  	//virtual ECursorType getCursor() { return mCurrentCursor; };  	/*virtual*/ void captureMouse() {};  	/*virtual*/ void releaseMouse() {}; diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index d116f0dfff..d4832602a0 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -1164,6 +1164,8 @@ void LLWindowMacOSX::gatherInput()  		}  	} +	 +	updateCursor();  }  BOOL LLWindowMacOSX::getPosition(LLCoordScreen *position) @@ -2841,7 +2843,7 @@ static void initPixmapCursor(int cursorid, int hotspotX, int hotspotY)  	gCursors[cursorid] = createImageCursor(fullpath.c_str(), hotspotX, hotspotY);  } -void LLWindowMacOSX::setCursor(ECursorType cursor) +void LLWindowMacOSX::updateCursor()  {  	OSStatus result = noErr; @@ -2849,30 +2851,30 @@ void LLWindowMacOSX::setCursor(ECursorType cursor)  	{  		// A drag is in progress...remember the requested cursor and we'll  		// restore it when it is done -		mCurrentCursor = cursor; +		mCurrentCursor = mNextCursor;  		return;  	} -	if (cursor == UI_CURSOR_ARROW +	if (mNextCursor == UI_CURSOR_ARROW  		&& mBusyCount > 0)  	{ -		cursor = UI_CURSOR_WORKING; +		mNextCursor = UI_CURSOR_WORKING;  	} -	if(mCurrentCursor == cursor) +	if(mCurrentCursor == mNextCursor)  		return;  	// RN: replace multi-drag cursors with single versions -	if (cursor == UI_CURSOR_ARROWDRAGMULTI) +	if (mNextCursor == UI_CURSOR_ARROWDRAGMULTI)  	{ -		cursor = UI_CURSOR_ARROWDRAG; +		mNextCursor = UI_CURSOR_ARROWDRAG;  	} -	else if (cursor == UI_CURSOR_ARROWCOPYMULTI) +	else if (mNextCursor == UI_CURSOR_ARROWCOPYMULTI)  	{ -		cursor = UI_CURSOR_ARROWCOPY; +		mNextCursor = UI_CURSOR_ARROWCOPY;  	} -	switch(cursor) +	switch(mNextCursor)  	{  	default:  	case UI_CURSOR_ARROW: @@ -2923,7 +2925,7 @@ void LLWindowMacOSX::setCursor(ECursorType cursor)  	case UI_CURSOR_TOOLSIT:  	case UI_CURSOR_TOOLBUY:  	case UI_CURSOR_TOOLOPEN: -		result = setImageCursor(gCursors[cursor]); +		result = setImageCursor(gCursors[mNextCursor]);  		break;  	} @@ -2933,7 +2935,7 @@ void LLWindowMacOSX::setCursor(ECursorType cursor)  		InitCursor();  	} -	mCurrentCursor = cursor; +	mCurrentCursor = mNextCursor;  }  ECursorType LLWindowMacOSX::getCursor() const diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index 6c9e075a21..1414a7e2a7 100644 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -67,7 +67,7 @@ public:  	/*virtual*/ void showCursorFromMouseMove();  	/*virtual*/ void hideCursorUntilMouseMove();  	/*virtual*/ BOOL isCursorHidden(); -	/*virtual*/ void setCursor(ECursorType cursor); +	/*virtual*/ void updateCursor();  	/*virtual*/ ECursorType getCursor() const;  	/*virtual*/ void captureMouse();  	/*virtual*/ void releaseMouse(); diff --git a/indra/llwindow/llwindowmesaheadless.h b/indra/llwindow/llwindowmesaheadless.h index fd4bd635e2..db7cb43754 100644 --- a/indra/llwindow/llwindowmesaheadless.h +++ b/indra/llwindow/llwindowmesaheadless.h @@ -59,7 +59,7 @@ public:  	/*virtual*/ void showCursorFromMouseMove() {};  	/*virtual*/ void hideCursorUntilMouseMove() {};  	/*virtual*/ BOOL isCursorHidden() {return FALSE;}; -	/*virtual*/ void setCursor(ECursorType cursor) {}; +	/*virtual*/ void updateCursor() {};  	//virtual ECursorType getCursor() { return mCurrentCursor; };  	/*virtual*/ void captureMouse() {};  	/*virtual*/ void releaseMouse() {}; diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 8acb52516a..f8c6697432 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -1920,6 +1920,8 @@ void LLWindowSDL::gatherInput()  		break;          }      } +	 +	updateCursor();  #if LL_X11      // This is a good time to stop flashing the icon if our mFlashTimer has @@ -2006,7 +2008,7 @@ static SDL_Cursor *makeSDLCursorFromBMP(const char *filename, int hotx, int hoty  	return sdlcursor;  } -void LLWindowSDL::setCursor(ECursorType cursor) +void LLWindowSDL::updateCursor()  {  	if (ATIbug) {  		// cursor-updating is very flaky when this bug is @@ -2014,11 +2016,11 @@ void LLWindowSDL::setCursor(ECursorType cursor)  		return;  	} -	if (mCurrentCursor != cursor) +	if (mCurrentCursor != mNextCursor)  	{ -		if (cursor < UI_CURSOR_COUNT) +		if (mNextCursor < UI_CURSOR_COUNT)  		{ -			SDL_Cursor *sdlcursor = mSDLCursors[cursor]; +			SDL_Cursor *sdlcursor = mSDLCursors[mNextCursor];  			// Try to default to the arrow for any cursors that  			// did not load correctly.  			if (!sdlcursor && mSDLCursors[UI_CURSOR_ARROW]) @@ -2026,9 +2028,9 @@ void LLWindowSDL::setCursor(ECursorType cursor)  			if (sdlcursor)  				SDL_SetCursor(sdlcursor);  		} else { -			llwarns << "Tried to set invalid cursor number " << cursor << llendl; +			llwarns << "Tried to set invalid cursor number " << mNextCursor << llendl;  		} -		mCurrentCursor = cursor; +		mCurrentCursor = mNextCursor;  	}  } diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h index fa544b16ce..fb3b117693 100644 --- a/indra/llwindow/llwindowsdl.h +++ b/indra/llwindow/llwindowsdl.h @@ -72,7 +72,7 @@ public:  	/*virtual*/ void showCursorFromMouseMove();  	/*virtual*/ void hideCursorUntilMouseMove();  	/*virtual*/ BOOL isCursorHidden(); -	/*virtual*/ void setCursor(ECursorType cursor); +	/*virtual*/ void updateCursor();  	/*virtual*/ void captureMouse();  	/*virtual*/ void releaseMouse();  	/*virtual*/ void setMouseClipping( BOOL b ); diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 799f0a3fab..03fff3d526 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -1667,18 +1667,18 @@ void LLWindowWin32::initCursors() -void LLWindowWin32::setCursor(ECursorType cursor) +void LLWindowWin32::updateCursor()  { -	if (cursor == UI_CURSOR_ARROW +	if (mNextCursor == UI_CURSOR_ARROW  		&& mBusyCount > 0)  	{ -		cursor = UI_CURSOR_WORKING; +		mNextCursor = UI_CURSOR_WORKING;  	} -	if( mCurrentCursor != cursor ) +	if( mCurrentCursor != mNextCursor )  	{ -		mCurrentCursor = cursor; -		SetCursor( mCursor[cursor] ); +		mCurrentCursor = mNextCursor; +		SetCursor( mCursor[mNextCursor] );  	}  } @@ -1760,6 +1760,8 @@ void LLWindowWin32::gatherInput()  	mInputProcessingPaused = FALSE; +	updateCursor(); +  	// clear this once we've processed all mouse messages that might have occurred after  	// we slammed the mouse position  	mMousePositionModified = FALSE; diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h index 387e4cbdb6..84f731a79f 100644 --- a/indra/llwindow/llwindowwin32.h +++ b/indra/llwindow/llwindowwin32.h @@ -66,7 +66,7 @@ public:  	/*virtual*/ void showCursorFromMouseMove();  	/*virtual*/ void hideCursorUntilMouseMove();  	/*virtual*/ BOOL isCursorHidden(); -	/*virtual*/ void setCursor(ECursorType cursor); +	/*virtual*/ void updateCursor();  	/*virtual*/ ECursorType getCursor() const;  	/*virtual*/ void captureMouse();  	/*virtual*/ void releaseMouse(); diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 6641c80b94..99dbfcae51 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -395,7 +395,7 @@      <attachment_point         id="39" -       group="9" +       group="6"         pie_slice="1"         name="Neck"         joint="mNeck" @@ -405,7 +405,7 @@    	<attachment_point         id="40" -       group="9" +       group="6"         pie_slice="2"         name="Avatar Center"         joint="mRoot" diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp index a09b9ea235..cece8d299c 100644 --- a/indra/newview/llfloaterinspect.cpp +++ b/indra/newview/llfloaterinspect.cpp @@ -37,6 +37,7 @@  #include "llselectmgr.h"  #include "lltoolcomp.h"  #include "lltoolmgr.h" +#include "lltrans.h"  #include "llviewercontrol.h"  #include "llviewerobject.h"  #include "lluictrlfactory.h" @@ -166,6 +167,15 @@ LLUUID LLFloaterInspect::getSelectedUUID()  	return LLUUID::null;  } +void LLFloaterInspect::onGetAvNameCallback(const LLUUID& idCreator, const LLAvatarName& av_name, void* FloaterPtr) +{ +	if (FloaterPtr) +	{ +		LLFloaterInspect* floater = (LLFloaterInspect*)FloaterPtr; +		floater->dirty(); +	} +} +  void LLFloaterInspect::refresh()  {  	LLUUID creator_id; @@ -205,11 +215,32 @@ void LLFloaterInspect::refresh()  		substitution["datetime"] = (S32) timestamp;  		LLStringUtil::format (timeStr, substitution); +		const LLUUID& idOwner = obj->mPermissions->getOwner(); +		const LLUUID& idCreator = obj->mPermissions->getCreator();  		LLAvatarName av_name; -		LLAvatarNameCache::get(obj->mPermissions->getOwner(), &av_name); -		owner_name = av_name.getCompleteName(); -		LLAvatarNameCache::get(obj->mPermissions->getCreator(), &av_name); -		creator_name = av_name.getCompleteName(); + +		// Only work with the names if we actually get a result +		// from the name cache. If not, defer setting the +		// actual name and set a placeholder. +		if (LLAvatarNameCache::get(idOwner, &av_name)) +		{ +			owner_name = av_name.getCompleteName(); +		} +		else +		{ +			owner_name = LLTrans::getString("RetrievingData"); +			LLAvatarNameCache::get(idOwner, boost::bind(&LLFloaterInspect::onGetAvNameCallback, _1, _2, this)); +		} + +		if (LLAvatarNameCache::get(idCreator, &av_name)) +		{ +			creator_name = av_name.getCompleteName(); +		} +		else +		{ +			creator_name = LLTrans::getString("RetrievingData"); +			LLAvatarNameCache::get(idCreator, boost::bind(&LLFloaterInspect::onGetAvNameCallback, _1, _2, this)); +		}  		row["id"] = obj->getObject()->getID();  		row["columns"][0]["column"] = "object_name"; diff --git a/indra/newview/llfloaterinspect.h b/indra/newview/llfloaterinspect.h index d9ffdf114b..7ee83ccdb4 100644 --- a/indra/newview/llfloaterinspect.h +++ b/indra/newview/llfloaterinspect.h @@ -29,6 +29,7 @@  #ifndef LL_LLFLOATERINSPECT_H  #define LL_LLFLOATERINSPECT_H +#include "llavatarname.h"  #include "llfloater.h"  //class LLTool; @@ -53,6 +54,9 @@ public:  	void onClickCreatorProfile();  	void onClickOwnerProfile();  	void onSelectObject(); + +	static void onGetAvNameCallback(const LLUUID& idCreator, const LLAvatarName& av_name, void* FloaterPtr); +  	LLScrollListCtrl* mObjectList;  protected:  	// protected members diff --git a/indra/newview/lloverlaybar.cpp b/indra/newview/lloverlaybar.cpp deleted file mode 100644 index c2bbec0470..0000000000 --- a/indra/newview/lloverlaybar.cpp +++ /dev/null @@ -1,378 +0,0 @@ -/**  - * @file lloverlaybar.cpp - * @brief LLOverlayBar class implementation - * - * $LicenseInfo:firstyear=2002&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -// Temporary buttons that appear at the bottom of the screen when you -// are in a mode. - -#include "llviewerprecompiledheaders.h" - -#include "lloverlaybar.h" - -#include "llaudioengine.h" -#include "llrender.h" -#include "llagent.h" -#include "llbutton.h" -#include "llfocusmgr.h" -#include "llimview.h" -#include "llmediaremotectrl.h" -#include "llparcel.h" -#include "lltextbox.h" -#include "llui.h" -#include "llviewercontrol.h" -#include "llviewertexturelist.h" -#include "llviewerjoystick.h" -#include "llviewermedia.h" -#include "llviewermenu.h"	// handle_reset_view() -#include "llviewermedia.h" -#include "llviewerparcelmedia.h" -#include "llviewerparcelmgr.h" -#include "lluictrlfactory.h" -#include "llviewerwindow.h" -#include "llvoiceclient.h" -#include "llvoavatarself.h" -#include "llvoiceremotectrl.h" -#include "llmediactrl.h" -#include "llselectmgr.h" - -// -// Globals -// - -LLOverlayBar *gOverlayBar = NULL; - -extern S32 MENU_BAR_HEIGHT; - -// -// Functions -// - - - -void* LLOverlayBar::createMediaRemote(void* userdata) -{ -	LLOverlayBar *self = (LLOverlayBar*)userdata;	 -	self->mMediaRemote =  new LLMediaRemoteCtrl (); -	return self->mMediaRemote; -} - -void* LLOverlayBar::createVoiceRemote(void* userdata) -{ -	LLOverlayBar *self = (LLOverlayBar*)userdata;	 -	self->mVoiceRemote = new LLVoiceRemoteCtrl(); -	return self->mVoiceRemote; -} - -LLOverlayBar::LLOverlayBar() -	:	LLPanel(), -		mMediaRemote(NULL), -		mVoiceRemote(NULL), -		mMusicState(STOPPED) -{ -	setMouseOpaque(FALSE); -	setIsChrome(TRUE); - -	mBuilt = false; - -	mFactoryMap["media_remote"] = LLCallbackMap(LLOverlayBar::createMediaRemote, this); -	mFactoryMap["voice_remote"] = LLCallbackMap(LLOverlayBar::createVoiceRemote, this); -	 -	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_overlaybar.xml"); -} - -BOOL LLOverlayBar::postBuild() -{ -	childSetAction("Set Not Busy",onClickSetNotBusy,this); -	childSetAction("Mouselook",onClickMouselook,this); -	childSetAction("Stand Up",onClickStandUp,this); - 	childSetAction("Flycam",onClickFlycam,this); -	childSetVisible("chat_bar", gSavedSettings.getBOOL("ChatVisible")); - -	mVoiceRemote->expandOrCollapse(); -	mMediaRemote->expandOrCollapse(); - -	setFocusRoot(TRUE); -	mBuilt = true; - -	layoutButtons(); -	return TRUE; -} - -LLOverlayBar::~LLOverlayBar() -{ -	// LLView destructor cleans up children -} - -// virtual -void LLOverlayBar::reshape(S32 width, S32 height, BOOL called_from_parent) -{ -	LLView::reshape(width, height, called_from_parent); - -	if (mBuilt)  -	{ -		layoutButtons(); -	} -} - -void LLOverlayBar::layoutButtons() -{ -	LLView* state_buttons_panel = getChildView("state_buttons"); - -	if (state_buttons_panel->getVisible()) -	{ -		LLViewQuery query; -		LLWidgetTypeFilter<LLButton> widget_filter; -		query.addPreFilter(LLEnabledFilter::getInstance()); -		query.addPreFilter(&widget_filter); - -		child_list_t button_list = query(state_buttons_panel); - -		const S32 MAX_BAR_WIDTH = 600; -		S32 bar_width = llclamp(state_buttons_panel->getRect().getWidth(), 0, MAX_BAR_WIDTH); - -		// calculate button widths -		const S32 MAX_BUTTON_WIDTH = 150; -		const S32 STATUS_BAR_PAD = 10; -		S32 segment_width = llclamp(lltrunc((F32)(bar_width) / (F32)button_list.size()), 0, MAX_BUTTON_WIDTH); -		S32 btn_width = segment_width - STATUS_BAR_PAD; - -		// Evenly space all buttons, starting from left -		S32 left = 0; -		S32 bottom = 1; - -		for (child_list_reverse_iter_t child_iter = button_list.rbegin(); -			child_iter != button_list.rend(); ++child_iter) -		{ -			LLView *view = *child_iter; -			LLRect r = view->getRect(); -			r.setOriginAndSize(left, bottom, btn_width, r.getHeight()); -			view->setRect(r); -			left += segment_width; -		} -	} -} - -// Per-frame updates of visibility -void LLOverlayBar::refresh() -{ -	BOOL buttons_changed = FALSE; - -	BOOL im_received = gIMMgr->getIMReceived(); -	LLButton* button = getChild<LLButton>("IM Received"); -	if (button && button->getVisible() != im_received) -	{ -		button->setVisible(im_received); -		sendChildToFront(button); -		moveChildToBackOfTabGroup(button); -		buttons_changed = TRUE; -	} - -	BOOL busy = gAgent.getBusy(); -	button = getChild<LLButton>("Set Not Busy"); -	if (button && button->getVisible() != busy) -	{ -		button->setVisible(busy); -		sendChildToFront(button); -		moveChildToBackOfTabGroup(button); -		buttons_changed = TRUE; -	} - -	BOOL flycam = LLViewerJoystick::getInstance()->getOverrideCamera(); -	button = getChild<LLButton>("Flycam"); -	if (button && button->getVisible() != flycam) -	{ -		button->setVisible(flycam); -		sendChildToFront(button); -		moveChildToBackOfTabGroup(button); -		buttons_changed = TRUE; -	}		 - -	BOOL mouselook_grabbed; -	mouselook_grabbed = gAgent.isControlGrabbed(CONTROL_ML_LBUTTON_DOWN_INDEX) -		|| gAgent.isControlGrabbed(CONTROL_ML_LBUTTON_UP_INDEX); -	button = getChild<LLButton>("Mouselook"); - -	if (button && button->getVisible() != mouselook_grabbed) -	{ -		button->setVisible(mouselook_grabbed); -		sendChildToFront(button); -		moveChildToBackOfTabGroup(button); -		buttons_changed = TRUE; -	} - -	BOOL sitting = FALSE; -	if (gAgent.getAvatarObject()) -	{ -		sitting = gAgent.getAvatarObject()->isSitting(); -	} -	button = getChild<LLButton>("Stand Up"); - -	if (button && button->getVisible() != sitting) -	{ -		button->setVisible(sitting); -		sendChildToFront(button); -		moveChildToBackOfTabGroup(button); -		buttons_changed = TRUE; -	} - - -	moveChildToBackOfTabGroup(mMediaRemote); -	moveChildToBackOfTabGroup(mVoiceRemote); - -	// turn off the whole bar in mouselook -	if (gAgent.cameraMouselook()) -	{ -		childSetVisible("media_remote_container", FALSE); -		childSetVisible("voice_remote_container", FALSE); -		childSetVisible("state_buttons", FALSE); -	} -	else -	{ -		// update "remotes" -		childSetVisible("media_remote_container", TRUE); -		childSetVisible("voice_remote_container", LLVoiceClient::getInstance()->voiceEnabled()); -		childSetVisible("state_buttons", TRUE); -	} - -	// always let user toggle into and out of chatbar -	childSetVisible("chat_bar", gSavedSettings.getBOOL("ChatVisible")); - -	if (buttons_changed) -	{ -		layoutButtons(); -	} -} - -//----------------------------------------------------------------------- -// Static functions -//----------------------------------------------------------------------- - -// static -void LLOverlayBar::onClickSetNotBusy(void*) -{ -	gAgent.clearBusy(); -} - - -// static -void LLOverlayBar::onClickFlycam(void*) -{ -	LLViewerJoystick::getInstance()->toggleFlycam(); -} - -// static -void LLOverlayBar::onClickResetView(void* data) -{ -	handle_reset_view(); -} - -//static -void LLOverlayBar::onClickMouselook(void*) -{ -	gAgent.changeCameraToMouselook(); -} - -//static -void LLOverlayBar::onClickStandUp(void*) -{ -	LLSelectMgr::getInstance()->deselectAllForStandingUp(); -	gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); -} - -//////////////////////////////////////////////////////////////////////////////// -// static media helpers -// *TODO: Move this into an audio manager abstraction -//static -void LLOverlayBar::mediaStop(void*) -{ -	if (!gOverlayBar) -	{ -		// return; -	} -	LLViewerParcelMedia::stop(); -} -//static -void LLOverlayBar::toggleMediaPlay(void*) -{ -	if (!gOverlayBar) -	{ -		// return; -	} - -	 -	if (LLViewerParcelMedia::getStatus() == LLViewerMediaImpl::MEDIA_PAUSED) -	{ -		LLViewerParcelMedia::start(); -	} -	else if(LLViewerParcelMedia::getStatus() == LLViewerMediaImpl::MEDIA_PLAYING) -	{ -		LLViewerParcelMedia::pause(); -	} -	else -	{ -		LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); -		if (parcel) -		{ -			LLViewerParcelMedia::play(parcel); -		} -	} -} - -//static -void LLOverlayBar::toggleMusicPlay(void*) -{ -	if (gAudiop->isInternetStreamPlaying() != 1) -	{ -		if (gAudiop) -		{ -			LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); -			if ( parcel ) -			{ -				// this doesn't work properly when crossing parcel boundaries - even when the  -				// stream is stopped, it doesn't return the right thing - commenting out for now. -	// 			if ( gAudiop->isInternetStreamPlaying() == 0 ) -				{ -					gAudiop->startInternetStream(parcel->getMusicURL()); -				} -			} -		} -	} -	//else -	//{ -	//	gOverlayBar->mMusicState = PAUSED; // desired state -	//	if (gAudiop) -	//	{ -	//		gAudiop->pauseInternetStream(1); -	//	} -	//} -	else -	{ -		if (gAudiop) -		{ -			gAudiop->stopInternetStream(); -		} -	} -} - diff --git a/indra/newview/lloverlaybar.h b/indra/newview/lloverlaybar.h deleted file mode 100644 index b36f5ebb73..0000000000 --- a/indra/newview/lloverlaybar.h +++ /dev/null @@ -1,95 +0,0 @@ -/**  - * @file lloverlaybar.h - * @brief LLOverlayBar class definition - * - * $LicenseInfo:firstyear=2002&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#ifndef LL_LLOVERLAYBAR_H -#define LL_LLOVERLAYBAR_H - -#include "llpanel.h" - -// "Constants" loaded from settings.xml at start time -extern S32 STATUS_BAR_HEIGHT; - -class LLButton; -class LLLineEditor; -class LLMediaRemoteCtrl; -class LLMessageSystem; -class LLTextBox; -class LLTextEditor; -class LLUICtrl; -class LLUUID; -class LLFrameTimer; -class LLStatGraph; -class LLSlider; -class LLVoiceRemoteCtrl; - -class LLOverlayBar -:	public LLPanel -{ -public: -	LLOverlayBar(); -	~LLOverlayBar(); - -	/*virtual*/ void refresh(); -	/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); -	/*virtual*/ BOOL postBuild(); - -	void layoutButtons(); - -	// helpers for returning desired state -	BOOL musicPlaying() { return mMusicState == PLAYING; } -	 -	static void onClickSetNotBusy(void* data); -	static void onClickMouselook(void* data); -	static void onClickStandUp(void* data); -	static void onClickResetView(void* data); - 	static void onClickFlycam(void* data); - -	//static media helper functions -	static void toggleMediaPlay(void*); -	static void toggleMusicPlay(void*); -	static void musicPause(void*); -	static void musicStop(void*); -	static void mediaStop(void*); - -	static void toggleAudioVolumeFloater(void*); - -protected:	 -	static void* createMediaRemote(void* userdata); -	static void* createVoiceRemote(void* userdata); - -	void enableMediaButtons(); - -protected: -	LLMediaRemoteCtrl*	mMediaRemote; -	LLVoiceRemoteCtrl*	mVoiceRemote; -	bool mBuilt;	// dialog constructed yet? -	enum { STOPPED=0, PLAYING=1, PAUSED=2 }; -	S32 mMusicState; -}; - -extern LLOverlayBar* gOverlayBar; - -#endif diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp index 2bbd15ae11..c01adc3c35 100644 --- a/indra/newview/llpanelnearbymedia.cpp +++ b/indra/newview/llpanelnearbymedia.cpp @@ -52,6 +52,7 @@  #include "llvovolume.h"  #include "llstatusbar.h"  #include "llsdutil.h" +#include "llvieweraudio.h"  #include "llfloaterreg.h"  #include "llfloaterpreference.h" // for the gear icon @@ -807,14 +808,26 @@ bool LLPanelNearByMedia::setDisabled(const LLUUID &row_id, bool disabled)  {  	if (row_id == PARCEL_AUDIO_LIST_ITEM_UUID)  	{ -		if (disabled) onClickParcelAudioStop(); -		else onClickParcelAudioStart(); +		if (disabled) +		{ +			onClickParcelAudioStop(); +		} +		else +		{ +			onClickParcelAudioPlay(); +		}  		return true;  	}  	else if (row_id == PARCEL_MEDIA_LIST_ITEM_UUID)  	{ -		if (disabled) onClickDisableParcelMedia(); -		else onClickEnableParcelMedia(); +		if (disabled) +		{ +			onClickDisableParcelMedia(); +		} +		else +		{ +			onClickEnableParcelMedia(); +		}  		return true;  	}  	else { @@ -857,24 +870,11 @@ void LLPanelNearByMedia::onClickParcelMediaPause()  	LLViewerParcelMedia::pause();  } -void LLPanelNearByMedia::onClickParcelAudioStart() -{ -	// User *explicitly* started the internet stream, so keep the stream -	// playing and updated as they cross to other parcels etc. -	mParcelAudioAutoStart = true; -		 -	if (!gAudiop) -		return; -	 -	gAudiop->startInternetStream(LLViewerMedia::getParcelAudioURL()); -} -  void LLPanelNearByMedia::onClickParcelAudioPlay()  {  	// User *explicitly* started the internet stream, so keep the stream  	// playing and updated as they cross to other parcels etc.  	mParcelAudioAutoStart = true; -  	if (!gAudiop)  		return; @@ -883,8 +883,9 @@ void LLPanelNearByMedia::onClickParcelAudioPlay()  		// 'false' means unpause  		gAudiop->pauseInternetStream(false);  	} -	else { -		gAudiop->startInternetStream(LLViewerMedia::getParcelAudioURL()); +	else +	{ +		LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLViewerMedia::getParcelAudioURL());  	}  } @@ -894,11 +895,10 @@ void LLPanelNearByMedia::onClickParcelAudioStop()  	// re-start audio when i.e. they move to another parcel, until  	// they explicitly start it again.  	mParcelAudioAutoStart = false; -  	if (!gAudiop)  		return; -	gAudiop->stopInternetStream(); +	LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();  }  void LLPanelNearByMedia::onClickParcelAudioPause() diff --git a/indra/newview/llpanelnearbymedia.h b/indra/newview/llpanelnearbymedia.h index be4d313743..c3634de9b4 100644 --- a/indra/newview/llpanelnearbymedia.h +++ b/indra/newview/llpanelnearbymedia.h @@ -115,7 +115,6 @@ private:  	void onClickParcelMediaPause();  	void onClickParcelAudioPlay();  	void onClickParcelAudioStop(); -	void onClickParcelAudioStart();  	void onClickParcelAudioPause();  	void onCheckAutoPlay();  	void onAdvancedButtonClick();	 diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index fb1153980a..5c95e805ce 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -468,7 +468,7 @@ void LLParticipantList::setValidateSpeakerCallback(validate_speaker_callback_t c  void LLParticipantList::updateRecentSpeakersOrder()  { -	if (E_SORT_BY_RECENT_SPEAKERS == getSortOrder()) +	if (E_SORT_BY_RECENT_SPEAKERS == getSortOrder() && !isHovered())  	{  		// Need to update speakers to sort list correctly  		mSpeakerMgr->update(true); @@ -477,6 +477,13 @@ void LLParticipantList::updateRecentSpeakersOrder()  	}  } +bool LLParticipantList::isHovered() +{ +	S32 x, y; +	LLUI::getMousePositionScreen(&x, &y); +	return mAvatarList->calcScreenRect().pointInRect(x, y); +} +  bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)  {  	LLUUID uu_id = event->getValue().asUUID(); diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index e0b3d42c25..a001d29b67 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -251,6 +251,8 @@ private:  	 */  	void adjustParticipant(const LLUUID& speaker_id); +	bool isHovered(); +  	LLSpeakerMgr*		mSpeakerMgr;  	LLAvatarList*		mAvatarList; diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index f7fa5690d6..2447f5dea8 100644 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -37,9 +37,226 @@  #include "llvoiceclient.h"  #include "llviewermedia.h"  #include "llprogressview.h" +#include "llcallbacklist.h" +#include "llstartup.h" +#include "llviewerparcelmgr.h" +#include "llparcel.h"  ///////////////////////////////////////////////////////// +LLViewerAudio::LLViewerAudio() : +	mDone(true), +	mFadeState(FADE_IDLE), +	mFadeTime(), +    mIdleListnerActive(false), +	mForcedTeleportFade(false) +{ +	mTeleportFailedConnection = LLViewerParcelMgr::getInstance()-> +		setTeleportFailedCallback(boost::bind(&LLViewerAudio::onTeleportFailed, this)); +} + +LLViewerAudio::~LLViewerAudio() +{ +	mTeleportFailedConnection.disconnect(); +} + +void LLViewerAudio::registerIdleListener() +{ +	if(mIdleListnerActive==false) +	{ +		mIdleListnerActive = true; +		doOnIdleRepeating(boost::bind(boost::bind(&LLViewerAudio::onIdleUpdate, this))); +	} + +} + +void LLViewerAudio::startInternetStreamWithAutoFade(std::string streamURI) +{ +	// Old and new stream are identical +	if (mNextStreamURI == streamURI) +	{ +		return; +	} + +	// Record the URI we are going to be switching to	 +	mNextStreamURI = streamURI; + +	switch (mFadeState) +	{ +		case FADE_IDLE: +		// If a stream is playing fade it out first +		if (!gAudiop->getInternetStreamURL().empty()) +		{ +			// The order of these tests is important, state FADE_OUT will be processed below +			mFadeState = FADE_OUT; +		} +		// Otherwise the new stream can be faded in +		else +		{ +			mFadeState = FADE_IN; +			gAudiop->startInternetStream(mNextStreamURI); +			startFading(); +			registerIdleListener(); +			break; +		} + +		case FADE_OUT: +			startFading(); +			registerIdleListener(); +			break; + +		case FADE_IN: +			registerIdleListener(); +			break; + +		default: +			llwarns << "Unknown fading state: " << mFadeState << llendl; +			break; +	} +} + +// A return of false from onIdleUpdate means it will be called again next idle update. +// A return of true means we have finished with it and the callback will be deleted. +bool LLViewerAudio::onIdleUpdate() +{ +	bool fadeIsFinished = false; + +	// There is a delay in the login sequence between when the parcel information has +	// arrived and the music stream is started and when the audio system is called to set +	// initial volume levels.  This code extends the fade time so you hear a full fade in. +	if ((LLStartUp::getStartupState() < STATE_STARTED)) +	{ +		stream_fade_timer.reset(); +		stream_fade_timer.setTimerExpirySec(mFadeTime); +	} + +	if (mDone) +	{ +		//  This should be a rare or never occurring state. +		if (mFadeState == FADE_IDLE) +		{ +			deregisterIdleListener(); +			fadeIsFinished = true; // Stop calling onIdleUpdate +		} + +		// we have finished the current fade operation +		if (mFadeState == FADE_OUT) +		{ +			// Clear URI +			gAudiop->startInternetStream(LLStringUtil::null); +			gAudiop->stopInternetStream(); +				 +			if (!mNextStreamURI.empty()) +			{ +				mFadeState = FADE_IN; +				gAudiop->startInternetStream(mNextStreamURI); +				startFading(); +			} +			else +			{ +				mFadeState = FADE_IDLE; +				deregisterIdleListener(); +				fadeIsFinished = true; // Stop calling onIdleUpdate +			} +		} +		else if (mFadeState == FADE_IN) +		{ +			if (mNextStreamURI != gAudiop->getInternetStreamURL()) +			{ +				mFadeState = FADE_OUT; +				startFading(); +			} +			else +			{ +				mFadeState = FADE_IDLE; +				deregisterIdleListener(); +				fadeIsFinished = true; // Stop calling onIdleUpdate +			} +		} +	} + +	return fadeIsFinished; +} + +void LLViewerAudio::stopInternetStreamWithAutoFade() +{ +	mFadeState = FADE_IDLE; +	mNextStreamURI = LLStringUtil::null; +	mDone = true; + +	gAudiop->startInternetStream(LLStringUtil::null); +	gAudiop->stopInternetStream(); +} + +void LLViewerAudio::startFading() +{ +	const F32 AUDIO_MUSIC_FADE_IN_TIME = 3.0f; +	const F32 AUDIO_MUSIC_FADE_OUT_TIME = 2.0f; +	// This minimum fade time prevents divide by zero and negative times +	const F32 AUDIO_MUSIC_MINIMUM_FADE_TIME = 0.01f; + +	if(mDone) +	{ +		// The fade state here should only be one of FADE_IN or FADE_OUT, but, in case it is not, +		// rather than check for both states assume a fade in and check for the fade out case. +		mFadeTime = AUDIO_MUSIC_FADE_IN_TIME; +		if (LLViewerAudio::getInstance()->getFadeState() == LLViewerAudio::FADE_OUT) +		{ +			mFadeTime = AUDIO_MUSIC_FADE_OUT_TIME; +		} + +		// Prevent invalid fade time +		mFadeTime = llmax(mFadeTime, AUDIO_MUSIC_MINIMUM_FADE_TIME); + +		stream_fade_timer.reset(); +		stream_fade_timer.setTimerExpirySec(mFadeTime); +		mDone = false; +	} +} + +F32 LLViewerAudio::getFadeVolume() +{ +	F32 fade_volume = 1.0f; + +	if (stream_fade_timer.hasExpired()) +	{ +		mDone = true; +		// If we have been fading out set volume to 0 until the next fade state occurs to prevent +		// an audio transient. +		if (LLViewerAudio::getInstance()->getFadeState() == LLViewerAudio::FADE_OUT) +		{ +			fade_volume = 0.0f; +		} +	} + +	if (!mDone) +	{ +		// Calculate how far we are into the fade time +		fade_volume = stream_fade_timer.getElapsedTimeF32() / mFadeTime; +		 +		if (LLViewerAudio::getInstance()->getFadeState() == LLViewerAudio::FADE_OUT) +		{ +			// If we are not fading in then we are fading out, so invert the fade +			// direction; start loud and move towards zero volume. +			fade_volume = 1.0f - fade_volume; +		} +	} + +	return fade_volume; +} + +void LLViewerAudio::onTeleportFailed() +{ +	if (gAudiop) +	{ +		LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); +		if (parcel) +		{ +			mNextStreamURI = parcel->getMusicURL(); +		} +	} +} +  void init_audio()   {  	if (!gAudiop)  @@ -142,12 +359,25 @@ void audio_update_volume(bool force_update)  	// Streaming Music  	if (gAudiop)  -	{		 +	{ +		if (progress_view_visible  && !LLViewerAudio::getInstance()->getForcedTeleportFade()) +		{ +			LLViewerAudio::getInstance()->setForcedTeleportFade(true); +			LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null); +			LLViewerAudio::getInstance()->setNextStreamURI(LLStringUtil::null); +		} + +		if (!progress_view_visible && LLViewerAudio::getInstance()->getForcedTeleportFade() == true) +		{ +			LLViewerAudio::getInstance()->setForcedTeleportFade(false); +		} +  		F32 music_volume = gSavedSettings.getF32("AudioLevelMusic");  		BOOL music_muted = gSavedSettings.getBOOL("MuteMusic"); -		music_volume = mute_volume * master_volume * music_volume; -		gAudiop->setInternetStreamGain ( music_muted || progress_view_visible ? 0.f : music_volume ); -	 +		F32 fade_volume = LLViewerAudio::getInstance()->getFadeVolume(); + +		music_volume = mute_volume * master_volume * music_volume * fade_volume; +		gAudiop->setInternetStreamGain (music_muted ? 0.f : music_volume);  	}  	// Streaming Media diff --git a/indra/newview/llvieweraudio.h b/indra/newview/llvieweraudio.h index e5916285fb..a3da9fc6b8 100644 --- a/indra/newview/llvieweraudio.h +++ b/indra/newview/llvieweraudio.h @@ -27,6 +27,9 @@  #ifndef LL_VIEWERAUDIO_H  #define LL_VIEWERAUDIO_H +#include "llframetimer.h" +#include "llsingleton.h" +  // comment out to turn off wind  #define kAUDIO_ENABLE_WIND   //#define kAUDIO_ENABLE_WATER 1	// comment out to turn off water @@ -38,4 +41,48 @@ void audio_update_volume(bool force_update = true);  void audio_update_listener();  void audio_update_wind(bool force_update = true); +class LLViewerAudio : public LLSingleton<LLViewerAudio> +{ +public: + +	enum EFadeState +	{ +		FADE_IDLE, +		FADE_IN, +		FADE_OUT, +	}; + +	LLViewerAudio(); +	virtual ~LLViewerAudio(); +	 +	void startInternetStreamWithAutoFade(std::string streamURI); +	void stopInternetStreamWithAutoFade(); +	 +	bool onIdleUpdate(); + +	EFadeState getFadeState() { return mFadeState; } +	bool isDone() { return mDone; }; +	F32 getFadeVolume(); +	bool getForcedTeleportFade() { return mForcedTeleportFade; }; +	void setForcedTeleportFade(bool fade) { mForcedTeleportFade = fade;} ; +	void setNextStreamURI(std::string stream) { mNextStreamURI = stream; } ; + +private: + +	bool mDone; +	F32 mFadeTime; +	std::string mNextStreamURI; +	EFadeState mFadeState; +	LLFrameTimer stream_fade_timer; +	bool mIdleListnerActive; +	bool mForcedTeleportFade; +	boost::signals2::connection	mTeleportFailedConnection; + +	void registerIdleListener(); +	void deregisterIdleListener() { mIdleListnerActive = false; }; +	void startFading(); +	void onTeleportFailed(); + +}; +  #endif //LL_VIEWER_H diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 98f4ce58fe..4ac1b7fa6e 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -67,7 +67,7 @@  //#include "llfirstuse.h"  #include "llviewernetwork.h"  #include "llwindow.h" - +#include "llvieweraudio.h"  #include "llfloaterwebcontent.h"	// for handling window close requests and geometry change requests in media browser windows. @@ -986,7 +986,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg)  			{  				if(LLViewerMedia::isParcelAudioPlaying() && gAudiop && LLViewerMedia::hasParcelAudio())  				{ -					gAudiop->stopInternetStream(); +					LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();  				}  			}  			pimpl->setPriority(new_priority); @@ -1090,13 +1090,24 @@ void LLViewerMedia::setAllMediaEnabled(bool val)  			gAudiop &&   			LLViewerMedia::hasParcelAudio())  		{ -			gAudiop->startInternetStream(LLViewerMedia::getParcelAudioURL()); +			if (LLAudioEngine::AUDIO_PAUSED == gAudiop->isInternetStreamPlaying()) +			{ +				// 'false' means unpause +				gAudiop->pauseInternetStream(false); +			} +			else +			{ +				LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLViewerMedia::getParcelAudioURL()); +			}  		}  	}  	else {  		// This actually unloads the impl, as opposed to "stop"ping the media  		LLViewerParcelMedia::stop(); -		if (gAudiop) gAudiop->stopInternetStream(); +		if (gAudiop) +		{ +			LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade(); +		}  	}  } diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index d6002e7320..c64e8dd6af 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -67,6 +67,7 @@  #include "llworld.h"  #include "roles_constants.h"  #include "llweb.h" +#include "llvieweraudio.h"  const F32 PARCEL_COLLISION_DRAW_SECS = 1.f; @@ -1725,7 +1726,10 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use  	}  	else  	{ -		// look for music. +		// Check for video +		LLViewerParcelMedia::update(parcel); + +		// Then check for music  		if (gAudiop)  		{  			if (parcel) @@ -1736,46 +1740,34 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use  				std::string music_url = music_url_raw;  				LLStringUtil::trim(music_url); -				// On entering a new parcel, stop the last stream if the -				// new parcel has a different music url.  (Empty URL counts -				// as different.) -				const std::string& stream_url = gAudiop->getInternetStreamURL(); - -				if (music_url.empty() || music_url != stream_url) +				// If there is a new music URL and it's valid, play it. +				if (music_url.size() > 12)  				{ -					// URL is different from one currently playing. -					gAudiop->stopInternetStream(); - -					// If there is a new music URL and it's valid, play it. -					if (music_url.size() > 12) +					if (music_url.substr(0,7) == "http://")  					{ -						if (music_url.substr(0,7) == "http://") -						{ -							optionally_start_music(music_url); -						} -						else -						{ -							llinfos << "Stopping parcel music (invalid audio stream URL)" << llendl; -							// clears the URL  -							gAudiop->startInternetStream(LLStringUtil::null);  -						} +						optionally_start_music(music_url);  					} -					else if (!gAudiop->getInternetStreamURL().empty()) +					else  					{ -						llinfos << "Stopping parcel music (parcel stream URL is empty)" << llendl; -						gAudiop->startInternetStream(LLStringUtil::null); +						llinfos << "Stopping parcel music (invalid audio stream URL)" << llendl; +						// clears the URL  +						// null value causes fade out +						LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);  					}  				} +				else if (!gAudiop->getInternetStreamURL().empty()) +				{ +					llinfos << "Stopping parcel music (parcel stream URL is empty)" << llendl; +					// null value causes fade out +					LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null); +				}  			}  			else  			{  				// Public land has no music -				gAudiop->stopInternetStream(); +				LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();  			}  		}//if gAudiop - -		// now check for video -		LLViewerParcelMedia::update( parcel );  	};  } @@ -1794,7 +1786,11 @@ void optionally_start_music(const std::string& music_url)  			 gSavedSettings.getBOOL("MediaTentativeAutoPlay")))  		{  			llinfos << "Starting parcel music " << music_url << llendl; -			gAudiop->startInternetStream(music_url); +			LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(music_url); +		} +		else +		{ +			LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);  		}  	}  } diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index c8c1922bf6..3a581e7e6e 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -1723,12 +1723,6 @@                   function="Tools.EnableReleaseKeys"                   parameter="" />              </menu_item_call> -            <menu_item_call -             label="Set UI Size to Default" -             name="Set UI Size to Default"> -                <menu_item_call.on_click -                 function="View.DefaultUISize" /> -            </menu_item_call>              <!-- This second, alternative shortcut for Show Advanced Menu is for backward compatibility.  The main shortcut has been changed so it's Linux-friendly, where the old shortcut is typically eaten by the window manager. -->              <menu_item_check                 label="Show Advanced Menu - legacy shortcut" diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index e4458f33b1..4e4eea0354 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6939,7 +6939,7 @@ With the following Residents:  	<usetemplate       name="okcancelbuttons"       notext="Cancel" -     yestext="Ok"/> +     yestext="OK"/>    </notification>    <notification @@ -7135,7 +7135,7 @@ Mute everyone?      <usetemplate       ignoretext="Confirm before I mute all participants in a group call"       name="okcancelignore" -     yestext="Ok" +     yestext="OK"       notext="Cancel">        <unique/>      </usetemplate> diff --git a/indra/newview/skins/default/xui/en/panel_region_covenant.xml b/indra/newview/skins/default/xui/en/panel_region_covenant.xml index df16f6fd37..112f12500d 100644 --- a/indra/newview/skins/default/xui/en/panel_region_covenant.xml +++ b/indra/newview/skins/default/xui/en/panel_region_covenant.xml @@ -57,7 +57,7 @@       mouse_opaque="false"       name="estate_name_text"       top_delta="0" -     width="150"> +     width="350">          mainland      </text>      <text @@ -79,7 +79,7 @@       mouse_opaque="false"       name="estate_owner_text"       top_delta="0" -     width="150"> +     width="350">          (none)      </text>      <text | 
