Anonymous avatar Anonymous committed e0fa51c Merge

Comments (0)

Files changed (34)

 viewer-tut-teamcity.build_server = false
 viewer-tut-teamcity.build_server_tests = false
 
-# ========================================
-# experience
-# ========================================
-viewer-experience.public_build = false
-viewer-experience.viewer_channel = "Second Life SkyLight Viewer"
-viewer-experience.login_channel = "Second Life SkyLight Viewer"
-
 # =================================================================
 # asset delivery 2010 projects
 # =================================================================

indra/llwindow/llwindowmacosx.cpp

 static EventTypeSpec WindowHandlerEventList[] =
 {
 	// Window-related events
-	//	{ kEventClassWindow, kEventWindowCollapsing },
-	//	{ kEventClassWindow, kEventWindowCollapsed },
-	//	{ kEventClassWindow, kEventWindowShown },
 	{ kEventClassWindow, kEventWindowActivated },
 	{ kEventClassWindow, kEventWindowDeactivated },
 	{ kEventClassWindow, kEventWindowShown },
 	{ kEventClassWindow, kEventWindowClose },
 	{ kEventClassWindow, kEventWindowBoundsChanging },
 	{ kEventClassWindow, kEventWindowBoundsChanged },
-	//	{ kEventClassWindow, kEventWindowZoomed },
-	//	{ kEventClassWindow, kEventWindowDrawContent },
+	{ kEventClassWindow, kEventWindowGetIdealSize },
 
 	// Mouse events
 	{ kEventClassMouse, kEventMouseDown },
 	mCursorIgnoreNextDelta = FALSE;
 	mNeedsResize = FALSE;
 	mOverrideAspectRatio = 0.f;
+	mMaximized = FALSE;
 	mMinimized = FALSE;
 	mTSMDocument = NULL; // Just in case.
 	mLanguageTextInputAllowed = FALSE;
 
 	if(!mFullscreen && (mWindow == NULL))
 	{
-		Rect			window_rect;
 		//int				displayWidth = CGDisplayPixelsWide(mDisplay);
 		//int				displayHeight = CGDisplayPixelsHigh(mDisplay);
 		//const int		menuBarPlusTitleBar = 44;   // Ugly magic number.
 
 		LL_DEBUGS("Window") << "createContext: creating window" << LL_ENDL;
 
-		window_rect.left = (long) x;
-		window_rect.right = (long) x + width;
-		window_rect.top = (long) y;
-		window_rect.bottom = (long) y + height;
+		mPreviousWindowRect.left = (long) x;
+		mPreviousWindowRect.right = (long) x + width;
+		mPreviousWindowRect.top = (long) y;
+		mPreviousWindowRect.bottom = (long) y + height;
 
 		//-----------------------------------------------------------------------
 		// Create the window
 		//-----------------------------------------------------------------------
 		mWindow = NewCWindow(
 			NULL,
-			&window_rect,
+			&mPreviousWindowRect,
 			mWindowTitle,
 			false,				// Create the window invisible.  Whoever calls createContext() should show it after any moving/resizing.
 			//		noGrowDocProc,		// Window with no grow box and no zoom box
 			kFirstWindowOfClass,
 			true,
 			(long)this);
-
-
+		
 		if (!mWindow)
 		{
 			setupFailure("Window creation error", "Error", OSMB_OK);
 
 BOOL LLWindowMacOSX::getMinimized()
 {
-	BOOL result = FALSE;
-	
-	// Since the set of states where we want to act "minimized" is non-trivial, it's easier to
-	// track things locally than to try and retrieve the state from the window manager.
-	result = mMinimized;
-
-	return(result);
+	return mMinimized;
 }
 
 BOOL LLWindowMacOSX::getMaximized()
 {
-	BOOL result = FALSE;
-
-	if (mWindow)
-	{
-		// TODO
-	}
-
-	return(result);
+	return mMaximized;
 }
 
 BOOL LLWindowMacOSX::maximize()
 {
-	// TODO
-	return FALSE;
+	if (mWindow && !mMaximized)
+	{
+		ZoomWindow(mWindow, inContent, true);
+	}
+	
+	return mMaximized;
 }
 
 BOOL LLWindowMacOSX::getFullscreen()
 
 				GetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &currentBounds);
 				GetEventParameter(event, kEventParamPreviousBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &previousBounds);
-
+				
+				// Put an offset into window un-maximize operation since the kEventWindowGetIdealSize
+				// event only allows the specification of size and not position.
+				if (mMaximized)
+				{
+					short leftOffset = mPreviousWindowRect.left - currentBounds.left;
+					currentBounds.left += leftOffset;
+					currentBounds.right += leftOffset;
+					
+					short topOffset = mPreviousWindowRect.top - currentBounds.top;
+					currentBounds.top += topOffset;
+					currentBounds.bottom += topOffset;
+				}
+				else
+				{
+					// Store off the size for future un-maximize operations
+					mPreviousWindowRect = previousBounds;
+				}
 
 				if ((currentBounds.right - currentBounds.left) < MIN_WIDTH)
 				{
 
 		case kEventWindowBoundsChanged:
 			{
+				// Get new window bounds
 				Rect newBounds;
-
 				GetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &newBounds);
+				
+				// Get previous window bounds
+				Rect oldBounds;
+				GetEventParameter(event, kEventParamPreviousBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &oldBounds);
+				
+				// Determine if the new size is larger than the old
+				bool newBoundsLarger = ((newBounds.right - newBounds.left) >= (oldBounds.right - oldBounds.left));
+				newBoundsLarger &= ((newBounds.bottom - newBounds.top) >= (oldBounds.bottom - oldBounds.top));
+				
+				// Check to see if this is a zoom event (+ button on window pane)
+				unsigned int eventParams;
+				GetEventParameter(event, kEventParamAttributes, typeUInt32, NULL, sizeof(int), NULL, &eventParams);
+				bool isZoomEvent = ((eventParams & kWindowBoundsChangeZoom) != 0);
+				
+				// Maximized flag is if zoom event and increasing window size
+				mMaximized = (isZoomEvent && newBoundsLarger);
+				
 				aglUpdateContext(mContext);
+				
 				mCallbacks->handleResize(this, newBounds.right - newBounds.left, newBounds.bottom - newBounds.top);
-
-
+			}
+			break;
+			
+		case kEventWindowGetIdealSize:
+			// Only recommend a new ideal size when un-maximizing
+			if (mMaximized == TRUE)
+			{
+				Point nonMaximizedSize;
+				
+				nonMaximizedSize.v = mPreviousWindowRect.bottom - mPreviousWindowRect.top;
+				nonMaximizedSize.h = mPreviousWindowRect.right - mPreviousWindowRect.left;
+				
+				SetEventParameter(event, kEventParamDimensions, typeQDPoint, sizeof(Point), &nonMaximizedSize);
+				result = noErr;
 			}
 			break;
 

indra/llwindow/llwindowmacosx.h

 	static pascal Boolean staticMoveEventComparator( EventRef event, void* data);
 	OSStatus eventHandler (EventHandlerCallRef myHandler, EventRef event);
 	void adjustCursorDecouple(bool warpingMouse = false);
-	void fixWindowSize(void);
 	void stopDockTileBounce();
 	static MASK modifiersToMask(SInt16 modifiers);
 	
 	EventComparatorUPP  mMoveEventCampartorUPP;
 	
 	Rect		mOldMouseClip;  // Screen rect to which the mouse cursor was globally constrained before we changed it in clipMouse()
+	Rect		mPreviousWindowRect;  // Save previous window for un-maximize event
 	Str255 		mWindowTitle;
 	double		mOriginalAspectRatio;
 	BOOL		mSimulatedRightClick;
 	BOOL		mNeedsResize;		// Constructor figured out the window is too big, it needs a resize.
 	LLCoordScreen   mNeedsResizeSize;
 	F32			mOverrideAspectRatio;
+	BOOL		mMaximized;
 	BOOL		mMinimized;
 	U32			mFSAASamples;
 	BOOL		mForceRebuild;

indra/newview/CMakeLists.txt

     llfloatersettingsdebug.cpp
     llfloatersidetraytab.cpp
     llfloatersnapshot.cpp
+    llfloatersounddevices.cpp
     llfloatertelehub.cpp
     llfloatertestinspectors.cpp
     llfloatertestlistview.cpp
     llfloatersettingsdebug.h
     llfloatersidetraytab.h
     llfloatersnapshot.h
+    llfloatersounddevices.h
     llfloatertelehub.h
     llfloatertestinspectors.h
     llfloatertestlistview.h

indra/newview/app_settings/settings.xml

       <key>Value</key>
       <integer>0</integer>
     </map>
-    <key>VoiceCallsRejectAll</key>
-    <map>
-      <key>Comment</key>
-      <string>Silently reject all incoming voice calls.</string>
+    <key>VoiceCallsRejectGroup</key>
+    <map>
+      <key>Comment</key>
+      <string>Silently reject all incoming group voice calls.</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>

indra/newview/app_settings/settings_minimal.xml

         <key>Value</key>
             <integer>0</integer>
         </map>
-    <key>VoiceCallsRejectAll</key>
+    <key>VoiceCallsRejectGroup</key>
         <map>
         <key>Comment</key>
-            <string>Silently reject all incoming voice calls.</string>
+            <string>Silently reject all incoming group voice calls.</string>
         <key>Type</key>
             <string>Boolean</string>
         <key>Value</key>

indra/newview/llagent.cpp

 #include "llstatusbar.h"
 #include "llteleportflags.h"
 #include "lltool.h"
+#include "lltoolpie.h"
 #include "lltoolmgr.h"
 #include "lltrans.h"
 #include "llurlentry.h"
 // static
 void LLAgent::toggleFlying()
 {
+	LLToolPie::instance().stopClickToWalk();
+
 	BOOL fly = !gAgent.getFlying();
 
 	gAgent.mMoveTimer.reset();

indra/newview/llbottomtray.cpp

 	}
 
 	// We have to enable/disable right and left parts of speak button separately (EXT-4648)
-	mSpeakBtn->setSpeakBtnEnabled(enable);
+	getChild<LLButton>("speak_btn")->setEnabled(enable);
+
 	// skipped to avoid button blinking
 	if (status != STATUS_JOINING && status!= STATUS_LEFT_CHANNEL)
 	{
 		bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
-		mSpeakBtn->setFlyoutBtnEnabled(voice_status);
+		getChild<LLButton>("speak_flyout_btn")->setEnabled(voice_status);
 		if (voice_status)
 		{
 			LLFirstUse::speak(true);
 	setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4));
 
 	mSpeakPanel = getChild<LLPanel>("speak_panel");
-	mSpeakBtn = getChild<LLSpeakButton>("talk");
-	LLHints::registerHintTarget("speak_btn", mSpeakBtn->getHandle());
+	mSpeakBtn = findChild<LLSpeakButton>("talk");
+	if (mSpeakBtn)
+	{
+		LLHints::registerHintTarget("speak_btn", mSpeakBtn->getHandle());
+
+		// Localization tool doesn't understand custom buttons like <talk_button>
+		mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") );
+		mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") );
+	}
 
 	// Both parts of speak button should be initially disabled because
 	// it takes some time between logging in to world and connecting to voice channel.
-	mSpeakBtn->setSpeakBtnEnabled(false);
-	mSpeakBtn->setFlyoutBtnEnabled(false);
+	getChild<LLButton>("speak_btn")->setEnabled(false);
+	getChild<LLButton>("speak_flyout_btn")->setEnabled(false);
 
-	// Localization tool doesn't understand custom buttons like <talk_button>
-	mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") );
-	mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") );
 
 	// Registering Chat Bar to receive Voice client status change notifications.
 	LLVoiceClient::getInstance()->addObserver(this);
 
 	getChild<LLButton>("show_help_btn")->setToggleState(help_floater_visible);
 
+	bool openmic = LLVoiceClient::getInstance()->getUserPTTState();
+	bool voiceenabled = LLVoiceClient::getInstance()->voiceEnabled();
+	getChild<LLButton>("speak_btn")->setToggleState(openmic && voiceenabled);
+	getChild<LLOutputMonitorCtrl>("chat_zone_indicator")->setIsMuted(!voiceenabled);
 
 }
 
 
 			if (possible_shrink_width > 0)
 			{
-				mSpeakBtn->setLabelVisible(false);
+				if (mSpeakBtn)
+				{	
+					mSpeakBtn->setLabelVisible(false);
+				}
+
 				mSpeakPanel->reshape(panel_width - possible_shrink_width, mSpeakPanel->getRect().getHeight());
 
 				required_width += possible_shrink_width;
 		}
 
 		// Reshape the Speak button to its maximum width.
-		mSpeakBtn->setLabelVisible(true);
+		if (mSpeakBtn) mSpeakBtn->setLabelVisible(true);
 		mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight());
 
 		available_width -= required_headroom;

indra/newview/llchiclet.cpp

 	if(needs_resize)
 	{		
 		mShowSpeaker = show;
-		toggleSpeakerControl();
 	}
+
+	toggleSpeakerControl();
 }
 
 void LLIMChiclet::enableCounterControl(bool enable) 

indra/newview/llfloatersounddevices.cpp

+/** 
+ * @file llfloatersounddevices.cpp
+ * @author Leyla Farazha
+ * @brief Sound Preferences used for minimal skin
+ *
+* $LicenseInfo:firstyear=2011&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$
+ */
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatersounddevices.h"
+
+#include "llbottomtray.h"
+#include "lldraghandle.h"
+
+#include "llpanelvoicedevicesettings.h"
+
+// Library includes
+#include "indra_constants.h"
+
+// protected
+LLFloaterSoundDevices::LLFloaterSoundDevices(const LLSD& key)
+:	LLTransientDockableFloater(NULL, false, key)
+{
+	LLTransientFloaterMgr::getInstance()->addControlView(this);
+
+	// force docked state since this floater doesn't save it between recreations
+	setDocked(true);
+}
+
+LLFloaterSoundDevices::~LLFloaterSoundDevices()
+{
+	LLTransientFloaterMgr::getInstance()->removeControlView(this);
+}
+
+// virtual
+BOOL LLFloaterSoundDevices::postBuild()
+{
+	LLTransientDockableFloater::postBuild();
+		
+	LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_flyout_btn");
+	setDockControl(new LLDockControl(anchor_panel, this, getDockTongue(), LLDockControl::TOP));
+
+	setIsChrome(TRUE);
+	if (mDragHandle)
+		mDragHandle->setTitleVisible(TRUE);
+	updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730)
+	
+	return TRUE;
+}
+
+//virtual
+void LLFloaterSoundDevices::setDocked(bool docked, bool pop_on_undock/* = true*/)
+{
+	LLTransientDockableFloater::setDocked(docked, pop_on_undock);
+}
+
+// virtual
+void LLFloaterSoundDevices::setFocus( BOOL b )
+{
+	LLTransientDockableFloater::setFocus(b);
+
+	// Force using active floater transparency
+	// We have to override setFocus() for because selecting an item of the
+	// combobox causes the floater to lose focus and thus become transparent.
+	updateTransparency(TT_ACTIVE);
+}

indra/newview/llfloatersounddevices.h

+/** 
+ * @file llfloatersounddevices.h
+ * @author Leyla Farazha
+ * @brief Sound Preferences used for minimal skin
+ *
+* $LicenseInfo:firstyear=2011&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_LLFLOATERSOUNDDEVICES_H
+#define LL_LLFLOATERSOUNDDEVICES_H
+
+#include "lltransientdockablefloater.h"
+
+class LLFloaterSoundDevices : public LLTransientDockableFloater
+{
+public:
+
+	LOG_CLASS(LLFloaterSoundDevices);
+
+	LLFloaterSoundDevices(const LLSD& key);
+	~LLFloaterSoundDevices();
+
+	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
+	/*virtual*/ void setFocus( BOOL b );
+};
+
+
+#endif //LL_LLFLOATERSOUNDDEVICES_H
+

indra/newview/llimview.cpp

 
 	if (voice_invite)
 	{
-		if	(	// if we're rejecting all incoming call requests
-				gSavedSettings.getBOOL("VoiceCallsRejectAll")	
+		if	(	// if we are rejecting group calls 
+				(gSavedSettings.getBOOL("VoiceCallsRejectGroup") && notify_box_type == "VoiceInviteGroup") ||
 				// or we're rejecting non-friend voice calls and this isn't a friend	
-				|| (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL))
+				(gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL))
 			)
 		{
 			// silently decline the call

indra/newview/llmediactrl.cpp

 :	start_url("start_url"),
 	border_visible("border_visible", true),
 	ignore_ui_scale("ignore_ui_scale", true),
-	hide_loading("hide_loading", false),
 	decouple_texture_size("decouple_texture_size", false),
 	texture_width("texture_width", 1024),
 	texture_height("texture_height", 1024),
 	mCurrentNavUrl( "" ),
 	mStretchToFill( true ),
 	mMaintainAspectRatio ( true ),
-	mHideLoading (false),
-	mHidingInitialLoad (false),
 	mDecoupleTextureSize ( false ),
 	mTextureWidth ( 1024 ),
 	mTextureHeight ( 1024 ),
 	
 	setBorderVisible(p.border_visible);
 	
-	mHideLoading = p.hide_loading;
-	
 	setDecoupleTextureSize(p.decouple_texture_size);
 	
 	setTextureSize(p.texture_width, p.texture_height);
 				mMediaSource->clearCache();
 				mClearCache = false;
 			}
-			
-			if(mHideLoading)
-			{
-				mHidingInitialLoad = true;
-			}
 		}
 		else
 		{
 		}
 	}
 	
-	if(mHidingInitialLoad)
-	{
-		// If we're hiding loading, don't draw at all.
-		draw_media = false;
-	}
+//	if(mHidingInitialLoad)
+//	{
+//		// If we're hiding loading, don't draw at all.
+//		draw_media = false;
+//	}
 	
 	bool background_visible = isBackgroundVisible();
 	bool background_opaque = isBackgroundOpaque();

indra/newview/llpanellogin.cpp

 	}
 };
 
-LLLoginRefreshHandler gLoginRefreshHandler;
-
-
-// helper class that trys to download a URL from a web site and calls a method 
-// on parent class indicating if the web server is working or not
-class LLIamHereLogin : public LLHTTPClient::Responder
-{
-	private:
-		LLIamHereLogin( LLPanelLogin* parent ) :
-		   mParent( parent )
-		{}
-
-		LLPanelLogin* mParent;
-
-	public:
-		static boost::intrusive_ptr< LLIamHereLogin > build( LLPanelLogin* parent )
-		{
-			return boost::intrusive_ptr< LLIamHereLogin >( new LLIamHereLogin( parent ) );
-		};
-
-		virtual void  setParent( LLPanelLogin* parentIn )
-		{
-			mParent = parentIn;
-		};
-
-		// We don't actually expect LLSD back, so need to override completedRaw
-		virtual void completedRaw(U32 status, const std::string& reason,
-								  const LLChannelDescriptors& channels,
-								  const LLIOPipe::buffer_ptr_t& buffer)
-		{
-			completed(status, reason, LLSD()); // will call result() or error()
-		}
-	
-		virtual void result( const LLSD& content )
-		{
-			if ( mParent )
-				mParent->setSiteIsAlive( true );
-		};
-
-		virtual void error( U32 status, const std::string& reason )
-		{
-			if ( mParent )
-				mParent->setSiteIsAlive( false );
-		};
-};
-
-// this is global and not a class member to keep crud out of the header file
-namespace {
-	boost::intrusive_ptr< LLIamHereLogin > gResponsePtr = 0;
-};
-
-
 //---------------------------------------------------------------------------
 // Public methods
 //---------------------------------------------------------------------------
 	mLogoImage(),
 	mCallback(callback),
 	mCallbackData(cb_data),
-	mHtmlAvailable( TRUE ),
 	mListener(new LLPanelLoginListener(this))
 {
 	setBackgroundVisible(FALSE);
 
 	buildFromFile( "panel_login.xml");
 	
-	// Legacy login web page is hidden under the menu bar.
-	// Adjust reg-in-client web browser widget to not be hidden.
-	if (gSavedSettings.getBOOL("RegInClient"))
-	{
-		reshape(rect.getWidth(), rect.getHeight() - MENU_BAR_HEIGHT);
-	}
-	else
-	{
-		reshape(rect.getWidth(), rect.getHeight());
-	}
+	reshape(rect.getWidth(), rect.getHeight());
 
 	getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this);
 
 	// change z sort of clickable text to be behind buttons
-	//sendChildToBack(getChildView("channel_text"));
 	sendChildToBack(getChildView("forgot_password_text"));
 
 	if(LLStartUp::getStartSLURL().getType() != LLSLURL::LOCATION)
 	LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
 	web_browser->addObserver(this);
 	
-	// Clear the browser's cache to avoid any potential for the cache messing up the login screen.
-	web_browser->clearCache();
-
 	reshapeBrowser();
 
-	// kick off a request to grab the url manually
-	gResponsePtr = LLIamHereLogin::build( this );
-
-	LLHTTPClient::head( LLGridManager::getInstance()->getLoginPage(), gResponsePtr );
-
+	loadLoginPage();
+			
 	// Show last logged in user favorites in "Start at" combo.
 	addUsersWithFavoritesToUsername();
 	getChild<LLComboBox>("username_combo")->setTextChangedCallback(boost::bind(&LLPanelLogin::addFavoritesToStartLocation, this));
 	reshape( rect.getWidth(), rect.getHeight(), 1 );
 }
 
-void LLPanelLogin::setSiteIsAlive( bool alive )
-{
-	LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
-	// if the contents of the site was retrieved
-	if ( alive )
-	{
-		if ( web_browser )
-		{
-			loadLoginPage();
-			
-			// mark as available
-			mHtmlAvailable = TRUE;
-		}
-	}
-	else
-	// the site is not available (missing page, server down, other badness)
-	{
-		if ( web_browser )
-		{
-			// hide browser control (revealing default one)
-			web_browser->setVisible( FALSE );
-
-			// mark as unavailable
-			mHtmlAvailable = FALSE;
-		}
-	}
-}
-
-
 LLPanelLogin::~LLPanelLogin()
 {
 	LLPanelLogin::sInstance = NULL;
 
-	// tell the responder we're not here anymore
-	if ( gResponsePtr )
-		gResponsePtr->setParent( 0 );
-
-	//// We know we're done with the image, so be rid of it.
-	//gTextureList.deleteImage( mLogoImage );
-
 	// Controls having keyboard focus by default
 	// must reset it on destroy. (EXT-2748)
 	gFocusMgr.setDefaultKeyboardFocus(NULL);
 		S32 width = getRect().getWidth();
 		S32 height = getRect().getHeight();
 
-		if ( mHtmlAvailable )
+		if (getChild<LLView>("login_widgets")->getVisible())
 		{
-			if (getChild<LLView>("login_widgets")->getVisible())
-			{
-				// draw a background box in black
-				gl_rect_2d( 0, height - 264, width, 264, LLColor4::black );
-				// draw the bottom part of the background image
-				// just the blue background to the native client UI
-				mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight());
-			}
-		}
-		else
-		{
-			// the HTML login page is not available so default to the original screen
-			S32 offscreen_part = height / 3;
-			mLogoImage->draw(0, -offscreen_part, width, height+offscreen_part);
+			// draw a background box in black
+			gl_rect_2d( 0, height - 264, width, 264, LLColor4::black );
+			// draw the bottom part of the background image
+			// just the blue background to the native client UI
+			mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight());
 		};
 	}
 	glPopMatrix();
 	oStr << "&os=" << os_info;
 	curl_free(os_info);
 	
-	
 	gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid());
-	gLoginMenuBarView->setBackgroundColor(gMenuBarView->getBackgroundColor());
 	
 	LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
-
-	// navigate to the "real" page
-	if (gSavedSettings.getBOOL("RegInClient"))
-	{
-		web_browser->setFocus(TRUE);
-		login_page = sInstance->getString("reg_in_client_url");
-		web_browser->navigateTo(login_page, "text/html");
-	}
-	else
-	{
-		web_browser->navigateTo( oStr.str(), "text/html" );
-	}
+	web_browser->navigateTo( oStr.str(), "text/html" );
 }
 
 void LLPanelLogin::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent event)
 {
 	if (sInstance && sInstance->mCallback)
 	{
-		// tell the responder we're not here anymore
-		if ( gResponsePtr )
-			gResponsePtr->setParent( 0 );
-
 		// JC - Make sure the fields all get committed.
 		sInstance->setFocus(FALSE);
 
 	}
 }
 
-/*
-// static
-bool LLPanelLogin::newAccountAlertCallback(const LLSD& notification, const LLSD& response)
-{
-	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-	if (0 == option)
-	{
-		llinfos << "Going to account creation URL" << llendl;
-		LLWeb::loadURLExternal( LLNotifications::instance().getGlobalString("CREATE_ACCOUNT_URL")); 
-	}
-	else
-	{
-		sInstance->setFocus(TRUE);
-	}
-	return false;
-}
-*/
-
 // static
 void LLPanelLogin::onClickNewAccount(void*)
 {

indra/newview/llpanellogin.h

 	void addUsersWithFavoritesToUsername();
 	static void onClickConnect(void*);
 	static void onClickNewAccount(void*);
-//	static bool newAccountAlertCallback(const LLSD& notification, const LLSD& response);
 	static void onClickVersion(void*);
 	static void onClickForgotPassword(void*);
 	static void onClickHelp(void*);
 
 	static LLPanelLogin* sInstance;
 	static BOOL		sCapslockDidNotification;
-	BOOL			mHtmlAvailable;
 };
 
 std::string load_password_from_disk(void);

indra/newview/llpanelvoicedevicesettings.cpp

 	if(LLVoiceClient::getInstance())
 	{
 		LLVoiceClient::getInstance()->setRenderDevice(
-			getChild<LLComboBox>("voice_input_device")->getValue().asString());
+			getChild<LLComboBox>("voice_output_device")->getValue().asString());
 	}
 }

indra/newview/llspeakbutton.cpp

 	// See widgets/talk_button.xml
 }
 
-void LLSpeakButton::draw()
-{
-	// LLVoiceClient::getInstance() is the authoritative global source of info regarding our open-mic state, we merely reflect that state.
-	bool openmic = LLVoiceClient::getInstance()->getUserPTTState();
-	bool voiceenabled = LLVoiceClient::getInstance()->voiceEnabled();
-	mSpeakBtn->setToggleState(openmic && voiceenabled);
-	mOutputMonitor->setIsMuted(!voiceenabled);
-	LLUICtrl::draw();
-}
-void LLSpeakButton::setSpeakBtnEnabled(bool enabled)
-{
-	LLButton* speak_btn = getChild<LLButton>("speak_btn");
-	speak_btn->setEnabled(enabled);
-}
-void LLSpeakButton::setFlyoutBtnEnabled(bool enabled)
-{
-	LLButton* show_btn = getChild<LLBottomtrayButton>("speak_flyout_btn");
-	show_btn->setEnabled(enabled);
-}
-
 LLSpeakButton::LLSpeakButton(const Params& p)
 : LLUICtrl(p)
 , mOutputMonitor(NULL)

indra/newview/llspeakbutton.h

 	};
 
 	/*virtual*/ ~LLSpeakButton();
-	/*virtual*/ void draw();
 	
-	// methods for enabling/disabling right and left parts of speak button separately(EXT-4648)
-	void setSpeakBtnEnabled(bool enabled);
-	void setFlyoutBtnEnabled(bool enabled);
-
 	// *HACK: Need to put tooltips in a translatable location,
 	// the panel that contains this button.
 	void setSpeakToolTip(const std::string& msg);

indra/newview/lltoolpie.cpp

 	return LLTool::handleMouseUp(x, y, mask);
 }
 
+void LLToolPie::stopClickToWalk()
+{
+	mPick.mPosGlobal = gAgent.getPositionGlobal();
+	handle_go_to();
+	if(mAutoPilotDestination) 
+	{ 
+		mAutoPilotDestination->markDead(); 
+	}
+}
 
 BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
 {

indra/newview/lltoolpie.h

 	LLObjectSelection*	getLeftClickSelection() { return (LLObjectSelection*)mLeftClickSelection; }
 	void 				resetSelection();
 	void				blockClickToWalk() { mBlockClickToWalk = true; }
+	void				stopClickToWalk();
 	
 	static void			selectionPropertiesReceived();
 

indra/newview/llviewerfloaterreg.cpp

 #include "llfloatersettingsdebug.h"
 #include "llfloatersidetraytab.h"
 #include "llfloatersnapshot.h"
+#include "llfloatersounddevices.h"
 #include "llfloatertelehub.h"
 #include "llfloatertestinspectors.h"
 #include "llfloatertestlistview.h"
 	LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater);
 	LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>);
 	LLFloaterReg::add("side_bar_tab", "floater_side_bar_tab.xml", &LLFloaterReg::build<LLFloaterSideTrayTab>);
+	LLFloaterReg::add("sound_devices", "floater_sound_devices.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundDevices>);
 	LLFloaterReg::add("stats", "floater_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>);
 	LLFloaterReg::add("start_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRunQueue>);
 	LLFloaterReg::add("stop_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotRunQueue>);

indra/newview/llviewermenu.cpp

 	}
 };
 
+class LLToggleSpeak : public view_listener_t
+{
+	bool handleEvent(const LLSD& userdata)
+	{
+		LLVoiceClient::getInstance()->toggleUserPTTState();
+		return true;
+	}
+};
 class LLShowSidetrayPanel : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
 	commit.add("BuyCurrency", boost::bind(&handle_buy_currency));
 	view_listener_t::addMenu(new LLShowHelp(), "ShowHelp");
 	view_listener_t::addMenu(new LLToggleHelp(), "ToggleHelp");
+	view_listener_t::addMenu(new LLToggleSpeak(), "ToggleSpeak");
 	view_listener_t::addMenu(new LLPromptShowURL(), "PromptShowURL");
 	view_listener_t::addMenu(new LLShowAgentProfile(), "ShowAgentProfile");
 	view_listener_t::addMenu(new LLToggleAgentProfile(), "ToggleAgentProfile");

indra/newview/skins/default/xui/en/floater_sound_devices.xml

+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater
+ border_visible="false"
+ border="false"
+ legacy_header_height="18"
+ can_minimize="true"
+ can_resize="true"
+ can_close="false"
+ save_dock_state="true"
+ save_visibility="true"
+ save_rect="true"
+ single_instance="true"
+ bevel_style="in"
+ height="140"
+ layout="topleft"
+ name="floater_sound_devices"
+ title="Sound Devices"
+ width="315">
+  <panel
+    layout="topleft"
+    follows="all"
+    filename="panel_sound_devices.xml"
+    name="device_settings_panel"
+    width="300"
+    left="2"
+    top="26"
+    class="panel_voice_device_settings"/>
+</floater>

indra/newview/skins/default/xui/en/main_view.xml

  tab_stop="false" 
  name="main_view"
  width="1024">
-  <panel top="0"
-     follows="all"
-     height="768"
-     mouse_opaque="false"
-     name="login_panel_holder"
-     width="1024"/>
   <layout_stack border_size="0"
                 follows="all"
                 mouse_opaque="false"
                       user_resize="false"
                       visible="false"
                       width="333"/>
-      </layout_stack>      
+      </layout_stack>
+      <panel top="0"
+         follows="all"
+         height="500"
+         mouse_opaque="false"
+         name="login_panel_holder"
+         width="1024"/>
+
       <panel follows="all"
                     height="500"
                     left="0"
          top="0" 
          width="1024"
          visible="false"/>
+  
   <view mouse_opaque="false"
         follows="all"
         name="menu_bar_holder"

indra/newview/skins/default/xui/en/menu_viewer.xml

           <menu_item_call
            label="Web Content Browser"
            name="Web Content Browser"
-           shortcut="control|alt|W">
+           shortcut="control|shift|Z">
             <menu_item_call.on_click
              function="Advanced.WebContentTest"
              parameter="http://google.com"/>

indra/newview/skins/default/xui/en/panel_preferences_sound.xml

    name="device_settings_btn"
    width="190">
   </button>
-    <panel
-     background_visible="false"
-     bg_alpha_color="DkGray"
-     visiblity_control="ShowDeviceSettings"
-     border="false"
-     follows="top|left"
-     height="100"
-     label="Device Settings"
-     layout="topleft"
-     left_delta="-2"
-     name="device_settings_panel"
-     class="panel_voice_device_settings"
-     width="470"
-     top_pad="0">
-      <panel.string
-        name="default_text">
-        Default
-      </panel.string>
-      <panel.string
-        name="default system device">
-        Default system device
-      </panel.string>
-      <panel.string
-        name="no device">
-        No device
-      </panel.string>
-      <icon
-             height="18"
-             image_name="Microphone_On"
-             left_delta="4"
-             name="microphone_icon"
-             mouse_opaque="false"
-             top="7"
-             visible="true"
-             width="18" />
-    <text
-     type="string"
-     length="1"
-      font.style="BOLD"
-     follows="left|top"
-     height="16"
-     layout="topleft"
-     left_pad="3"
-     name="Input"
-     width="70">
-        Input
-    </text>
-    <combo_box
-     height="23"
-     control_name="VoiceInputAudioDevice"
-     layout="topleft"
-     left_pad="0"
-     max_chars="128"
-     name="voice_input_device"
-     top_delta="-5"
-     width="200" />
-   <text
-     type="string"
-     length="1"
-     follows="left|top"
-     height="16"
-     layout="topleft"
-     left_delta="-70"
-     name="My volume label"
-     top_pad="4"
-     width="200">
-        My volume:
-    </text>
-      <slider_bar
-        control_name="AudioLevelMic"
-     follows="left|top"
-     height="17"
-     increment="0.025"
-     initial_value="1.0"
-     layout="topleft"
-     left_delta="-6"
-     max_val="2"
-     name="mic_volume_slider"
-     tool_tip="Change the volume using this slider"
-     top_pad="-1"
-     width="220" />
-    <text
-     type="string"
-     text_color="EmphasisColor"
-     length="1"
-     follows="left|top"
-     height="18"
-     layout="topleft"
-     left_pad="5"
-     name="wait_text"
-     top_delta="-1"
-     width="110">
-        Please wait
-    </text>
-    <locate
-     height="20"
-     layout="topleft"
-     left_delta="0"
-     name="bar0"
-     top_delta="-2"
-     width="20" />
-    <locate
-     height="20"
-     layout="topleft"
-     left_pad="5"
-     name="bar1"
-     top_delta="0"
-     width="20" />
-    <locate
-     height="20"
-     layout="topleft"
-     left_pad="5"
-     name="bar2"
-     top_delta="0"
-     width="20" />
-    <locate
-     height="20"
-     layout="topleft"
-     left_pad="5"
-     name="bar3"
-     top_delta="0"
-     width="20" />
-    <locate
-     height="20"
-     layout="topleft"
-     left_pad="5"
-     name="bar4"
-     top_delta="0"
-     width="20" />
-          <icon
-             height="18"
-             image_name="Parcel_Voice_Light"
-             left="5"
-             name="speaker_icon"
-             mouse_opaque="false"
-             top_pad="3"
-             visible="true"
-             width="22" />
-    <text
-     font.style="BOLD"
-     type="string"
-     length="1"
-     follows="left|top"
-     height="15"
-     layout="topleft"
-     left_pad="0"
-     name="Output"
-     width="70">
-        Output
-    </text>
-    <combo_box
-     control_name="VoiceOutputAudioDevice"
-     height="23"
-     layout="topleft"
-     left_pad="0"
-     max_chars="128"
-     name="voice_output_device"
-     top_delta="-3"
-     width="200" />
-    </panel>
-    </panel>
+  <panel
+    layout="topleft"
+    filename="panel_sound_devices.xml"
+    visiblity_control="ShowDeviceSettings"
+    name="device_settings_panel"
+    top="314"
+    width="345"
+    left="18"
+    class="panel_voice_device_settings"/>
+</panel>

indra/newview/skins/default/xui/en/panel_sound_devices.xml

+<panel
+ background_visible="false"
+ bg_alpha_color="DkGray"
+ follows="all"
+ height="200"
+ label="Device Settings"
+ layout="topleft"
+ name="device_settings_panel"
+ width="360">
+	<panel.string
+	  name="default_text">
+		Default
+	</panel.string>
+	<panel.string
+	  name="default system device">
+		Default system device
+	</panel.string>
+	<panel.string
+	  name="no device">
+		No device
+	</panel.string>
+	<icon
+		   height="18"
+		   image_name="Microphone_On"
+		   left_delta="4"
+		   name="microphone_icon"
+		   mouse_opaque="false"
+		   top="7"
+       layout="topleft"
+		   visible="true"
+		   width="18" />
+	<text
+     type="string"
+     length="1"
+      font.style="BOLD"
+     follows="left|top"
+     height="16"
+     layout="topleft"
+     left_pad="3"
+     name="Input"
+     width="70">
+		Input
+	</text>
+	<combo_box
+     height="23"
+     control_name="VoiceInputAudioDevice"
+     follows="left|top"
+     layout="topleft"
+     left_pad="0"
+     max_chars="128"
+     name="voice_input_device"
+     top_delta="-5"
+     width="200" />
+	<text
+	  type="string"
+	  length="1"
+	  follows="left|top"
+	  height="16"
+	  layout="topleft"
+	  left_delta="-70"
+	  name="My volume label"
+	  top_pad="4"
+	  width="200">
+		My volume:
+	</text>
+	<slider_bar
+	  control_name="AudioLevelMic"
+   follows="top|right|left"
+   height="17"
+   increment="0.025"
+   initial_value="1.0"
+   layout="topleft"
+   left_delta="-6"
+   max_val="2"
+   name="mic_volume_slider"
+   tool_tip="Change the volume using this slider"
+   top_pad="-1"
+   width="220" />
+	<text
+     type="string"
+     text_color="EmphasisColor"
+     length="1"
+     follows="right|top"
+     height="18"
+     layout="topleft"
+     left_pad="5"
+     name="wait_text"
+     top_delta="-1"
+     width="110">
+		Please wait
+	</text>
+  <locate
+     follows="right|top"
+     height="20"
+     layout="topleft"
+     left_delta="0"
+     name="bar0"
+     top_delta="-2"
+     width="20" />
+  <locate
+     follows="right|top"
+     height="20"
+     layout="topleft"
+     left_pad="5"
+     name="bar1"
+     top_delta="0"
+     width="20" />
+  <locate
+     follows="right|top"
+     height="20"
+     layout="topleft"
+     left_pad="5"
+     name="bar2"
+     top_delta="0"
+     width="20" />
+  <locate
+     follows="right|top"
+     height="20"
+     layout="topleft"
+     left_pad="5"
+     name="bar3"
+     top_delta="0"
+     width="20" />
+  <locate
+     follows="right|top"
+     height="20"
+     layout="topleft"
+     left_pad="5"
+     name="bar4"
+     top_delta="0"
+     width="20" />
+	<icon
+	   height="18"
+	   image_name="Parcel_Voice_Light"
+	   left="5"
+	   name="speaker_icon"
+	   mouse_opaque="false"
+	   top_pad="3"
+	   visible="true"
+	   width="22" />
+	<text
+     font.style="BOLD"
+     type="string"
+     length="1"
+     follows="left|top"
+     height="15"
+     layout="topleft"
+     left_pad="0"
+     name="Output"
+     width="70">
+		Output
+	</text>
+	<combo_box
+     control_name="VoiceOutputAudioDevice"
+     height="23"
+     follows="left|top"
+     layout="topleft"
+     left_pad="0"
+     max_chars="128"
+     name="voice_output_device"
+     top_delta="-3"
+     width="200" />
+</panel>

indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml

      width="20" />
     <chiclet_im_p2p.avatar_icon
      bottom="3"
+     color="white"
      follows="left|top|bottom"
      height="20"
      left="2"
Add a comment to this file

indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png

Added
New image
Add a comment to this file

indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png

Added
New image

indra/newview/skins/minimal/textures/textures.xml

   <texture name="bottomtray_close_off" file_name="bottomtray/close_off.png" preload="true" />
   <texture name="bottomtray_close_over" file_name="bottomtray/close_over.png" preload="true" />
   <texture name="bottomtray_close_press" file_name="bottomtray/close_press.png" preload="true" />
-</textures>
+  <texture name="Speak_Btn_Off" file_name="bottomtray/Speak_Btn_Off.png" preload="true" scale.left="4" scale.top="16" scale.right="8" scale.bottom="4" />
+  <texture name="Speak_Btn_Selected_Press" file_name="bottomtray/Speak_Btn_Selected_Press.png" preload="true" scale.left="4" scale.top="16" scale.right="8" scale.bottom="4" />
+ </textures>

indra/newview/skins/minimal/xui/en/main_view.xml

  tab_stop="false" 
  name="main_view"
  width="1024">
-  <panel top="0"
-   follows="all"
-   height="768"
-   mouse_opaque="false"
-   name="login_panel_holder"
-   width="1024"/>
- 
   <layout_stack border_size="0"
                 follows="all"
                 mouse_opaque="false"
                      name="stand_stop_flying_container"
                      visible="false"
                      width="500"/>
+              
+              <panel top="0"
+               follows="all"
+               height="500"
+               mouse_opaque="false"
+               name="login_panel_holder"
+               width="1024"/>
+
               <panel follows="all"
 										 height="500"
 										 left="0"

indra/newview/skins/minimal/xui/en/notification_visibility.xml

 <?xml version="1.0" ?>
 <notification_visibility>
-  <respond name="VoiceInviteP2P" response="Decline"/>
-  <respond name="VoiceInviteAdHoc" response="Decline"/>
   <respond name="VoiceInviteGroup" response="Decline"/>
 
   <!-- group and voice are disabled features -->
   <hide tag="group"/>
-  <hide tag="voice"/>
 
   <!-- no spammy scripts -->
   <!-- <hide name="ScriptDialog"/> -->
   <hide name="FirstInventory"/>
   <hide name="HintSidePanel"/>
   <hide name="HintMove"/>
+  <hide name="HintSpeak"/>
   <hide name="HintDisplayName"/>
   <hide name="HintInventory"/>
   <hide name="HintLindenDollar"/>

indra/newview/skins/minimal/xui/en/panel_bottomtray.xml

  focus_root="true"
  top="28"
  width="1310">
-	<string
+  <string
      name="DragIndicationImageName"
      value="Accordion_ArrowOpened_Off" />
-	<string
+  <string
      name="SpeakBtnToolTip"
      value="Turns microphone on/off" />
-	<string
+  <string
      name="VoiceControlBtnToolTip"
      value="Shows/hides voice control panel" />
-	<layout_stack
+  <layout_stack
      border_size="0"
      clip="false"
      follows="all"
      orientation="horizontal"
      top="0"
      width="1310">
-		<layout_panel
+    <layout_panel
          auto_resize="false"
          user_resize="false"
          min_width="2"
          width="2" />
-		<layout_panel
+    <layout_panel
          auto_resize="false"
          layout="topleft"
          max_width="320"
 		 name="chat_bar_layout_panel"
          user_resize="true"
          width="308" >
-			<panel
+      <panel
 		   name="chat_bar"
 			  filename="panel_nearby_chat_bar.xml"
 			  left="0"
         height="28"
         layout="topleft"
         min_height="28"
-        min_width="59"
+        min_width="35"
         mouse_opaque="false"
         name="speak_panel"
         top_delta="0"
         user_resize="false"
-        width="108">
-      <talk_button
+        width="85">
+      <button
        follows="left|right"
        height="23"
        layout="topleft"
+       label="Speak"
        left="0"
-       name="talk"
+       name="speak_btn"
+       tool_tip="Turn your microphone on and off"
+       pad_right="30"
+       halign="center"
+       use_ellipses="true"
+       tab_stop="true"
+    is_toggle="true"
+    image_selected="Speak_Btn_Selected_Press"
+    image_unselected="Speak_Btn_Off"
+		 image_pressed="Speak_Btn_Selected_Press"
+		 image_pressed_selected="Speak_Btn_Selected_Press"
        top="5"
-       width="105">
-        <show_button
-         tab_stop="true">
-          <init_callback
-           function="Button.SetDockableFloaterToggle"
-           parameter="voice_controls" />
-        </show_button>
-        <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales.
-                 & pad_right is default value for long label which can be right aligned. See EXT-6318 -->
-        <speak_button
-         halign="center"
-         label="Speak"
-         label_selected="Speak"
-         name="speak_btn"
-         pad_right="20"
-         tab_stop="true"
-         use_ellipses="true" />
-      </talk_button>
+       width="85">
+
+        <commit_callback
+				  function="ToggleSpeak"
+				  parameter="f1_help" />
+      </button>
     </layout_panel>
-		<layout_panel
+
+    <layout_panel
+          auto_resize="false"
+          follows="left|right"
+          height="28"
+          layout="topleft"
+          min_height="28"
+          min_width="20"
+          mouse_opaque="false"
+          name="speak_flyout_panel"
+          top_delta="0"
+          user_resize="false"
+          width="20">
+      <button
+     follows="left|right"
+     width="20"
+        top="5"
+     left="0"
+     height="23"
+     name="speak_flyout_btn"
+     label=""
+     tab_stop="false"
+     tool_tip="Change your sound preferences"
+     is_toggle="true"
+     image_disabled="ComboButton_UpOff"
+     image_unselected="ComboButton_UpOff"
+     image_selected="ComboButton_On"
+     image_pressed="ComboButton_UpSelected"
+     image_pressed_selected="ComboButton_Selected">
+        <init_callback
+         function="Button.SetDockableFloaterToggle"
+         parameter="sound_devices" />
+      </button>
+
+    </layout_panel>
+
+    <layout_panel
          auto_resize="false"
          follows="right"
          height="28"
          name="gesture_panel"
          top_delta="0"
          user_resize="false"
-         width="85">
+         width="88">
 			<gesture_combo_list
              follows="left|right"
              height="23"
              layout="topleft"
              get_more="false"
              view_all="false"
-             left="0"
+             left="3"
              name="Gesture"
-             tool_tip="Shows/hides gestures"
+             tool_tip="Make your avatar do things"
              top="5"
              width="82">
-				<combo_button
+        <combo_button
                  pad_right="10"
                  can_drag="false"
                  use_ellipses="true" />
-				<combo_list
+        <combo_list
                  page_lines="17" />
-			</gesture_combo_list>
-		</layout_panel>
-		<layout_panel
+      </gesture_combo_list>
+    </layout_panel>
+    <layout_panel
          auto_resize="false"
          follows="left|right"
          height="28"
          name="cam_panel"
          user_resize="false"
          width="83">
-			<bottomtray_button
+      <bottomtray_button
               can_drag="false"
              follows="left|right"
              height="23"
              layout="topleft"
              left="0"
              name="camera_btn"
-             tool_tip="Shows/hides camera controls"
+             tool_tip="Control your camera angle"
              top="5"
              use_ellipses="true"
              width="80">
-				<init_callback
+        <init_callback
                  function="Button.SetDockableFloaterToggle"
                  parameter="camera" />
-			</bottomtray_button>
-		</layout_panel>
-		<layout_panel
+      </bottomtray_button>
+    </layout_panel>
+    <layout_panel
          auto_resize="false"
          follows="left|right"
          height="28"
          name="splitter_panel"
          user_resize="false"
          width="17">
-			<icon
+      <icon
              follows="left|bottom"
              height="18"
              width="2"
              image_name="Button_Separator"
              name="separator"
              top="7"/>
-		</layout_panel>
-		<layout_panel
+    </layout_panel>
+    <layout_panel
 		  auto_resize="false"
 		  follows="left|right"
 		  height="28"
 		  name="avatar_and_destinations_panel"
 		  user_resize="false"
 		  width="103">
-			<bottomtray_button
+      <bottomtray_button
 			 can_drag="false"
 			follows="left|right"
 			height="23"
 			layout="topleft"
 			left="0"
 			name="destination_btn"
-			tool_tip="Shows destinations window"
+			tool_tip="Travel through Second Life"
 			top="5"
 			is_toggle="true"
 			use_ellipses="true"
 			width="100">
-				<bottomtray_button.commit_callback
+        <bottomtray_button.commit_callback
 				  function="Destination.show" />
-			</bottomtray_button>
-		</layout_panel>
-		<layout_panel
+      </bottomtray_button>
+    </layout_panel>
+    <layout_panel
 		  auto_resize="false"
 		  follows="left|right"
 		  height="28"
 		  name="avatar_and_destinations_panel"
 		  user_resize="false"
 		  width="103">
-			<bottomtray_button
+      <bottomtray_button
 			 can_drag="false"
 			follows="left|right"
 			height="23"
 			name="avatar_btn"
 			top="5"
 			is_toggle="true"
+			tool_tip="Change your appearance"
 			use_ellipses="true"
 			width="100">
-				<bottomtray_button.commit_callback
+        <bottomtray_button.commit_callback
 				  function="Avatar.show" />
-			</bottomtray_button>
-		</layout_panel>
-		<layout_panel
+      </bottomtray_button>
+    </layout_panel>
+    <layout_panel
 		  auto_resize="false"
 		  follows="left|right"
 		  height="28"
 		  name="splitter_panel"
 		  user_resize="false"
 		  width="17">
-			<icon
+      <icon
              follows="left|bottom"
              height="18"
              width="2"
              image_name="Button_Separator"
              name="separator"
              top="7"/>
-		</layout_panel>
-		<layout_panel
+    </layout_panel>
+    <layout_panel
          auto_resize="false"
          follows="right"
          height="28"
          top_delta="0"
          user_resize="false"
          width="105">
-			<bottomtray_button
+      <bottomtray_button
 			   can_drag="false"
 			  follows="left|right"
 			  height="23"
 			  layout="topleft"
 			  left="0"
 			  name="show_people_button"
-			  tool_tip="Shows people window"
+			  tool_tip="Find people in Second Life"
 			  top="5"
 			  is_toggle="true"
 			  use_ellipses="true"
 			  width="100">
-				<bottomtray_button.commit_callback
+        <bottomtray_button.commit_callback
 				  function="ShowSidetrayPanel"
 				 parameter="panel_people" />
-			</bottomtray_button>
-		</layout_panel>
-		<layout_panel
+      </bottomtray_button>
+    </layout_panel>
+    <layout_panel
 		   auto_resize="false"
 		   follows="right"
 		   height="28"
 		   top_delta="0"
 		   user_resize="false"
 		   width="105">
-			<bottomtray_button
+      <bottomtray_button
 			   can_drag="false"
 			  follows="left|right"
 			  height="23"
 			  layout="topleft"
 			  left="0"
 			  name="show_profile_btn"
-			  tool_tip="Shows profile window"
+			  tool_tip="View and edit your Profile"
 			  is_toggle="true"
 			  top="5"
 			  use_ellipses="true"
 			  width="100">
-				<bottomtray_button.commit_callback
+        <bottomtray_button.commit_callback
 				  function="ToggleAgentProfile"
 				  parameter="agent"/>
-			</bottomtray_button>
-		</layout_panel>
-		<layout_panel
+      </bottomtray_button>
+    </layout_panel>
+    <layout_panel
 		   auto_resize="false"
 		   follows="right"
 		   height="28"
 		   top_delta="0"
 		   user_resize="false"
 		   width="105">
-			<bottomtray_button
+      <bottomtray_button
 			   can_drag="false"
 			  follows="left|right"
 			  height="23"
 			  layout="topleft"
 			  left="0"
 			  name="show_help_btn"
-			  tool_tip="Open Second Life How To topics"
+			  tool_tip="View Second Life help info"
 			  is_toggle="true"
 			  top="5"
 			  use_ellipses="true"
 			  width="100">
-				<bottomtray_button.commit_callback
+        <bottomtray_button.commit_callback
 				  function="ToggleHelp"
 				  parameter="f1_help" />
-			</bottomtray_button>
-		</layout_panel>
-		<layout_panel
+      </bottomtray_button>
+    </layout_panel>
+    <layout_panel
 		   follows="left|right"
 		   height="30"
 		   layout="topleft"
 		   top="0"
 		   user_resize="false"
 		   width="189">
-			<!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same
+      <!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same
 as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991-->
-			<chiclet_panel
+      <chiclet_panel
              chiclet_padding="4"
              follows="left|right"
              height="24"
              name="chiclet_list"
              top="7"
              width="189">
-				<button
+        <button
                  auto_resize="true"
                  follows="right"
                  height="29"
                  top="-28"
                  visible="false"
                  width="7" />
-				<button
+        <button
                  auto_resize="true"
                  follows="right"
                  height="29"
                  top="-28"
                  visible="false"
                  width="7" />
-			</chiclet_panel>
-		</layout_panel>
-		<layout_panel auto_resize="false"
+      </chiclet_panel>
+    </layout_panel>
+    <layout_panel auto_resize="false"
                       user_resize="false"
                       width="4"
                       min_width="4"/>
-		<layout_panel
+    <layout_panel
          auto_resize="false"
          follows="right"
          height="28"
          top="0"
          user_resize="false"