diff options
Diffstat (limited to 'indra')
60 files changed, 1061 insertions, 304 deletions
diff --git a/indra/llcommon/llapr.cpp b/indra/llcommon/llapr.cpp index ed70b1d9f2..7330b00bcf 100644 --- a/indra/llcommon/llapr.cpp +++ b/indra/llcommon/llapr.cpp @@ -543,14 +543,13 @@ S32 LLAPRFile::readEx(const std::string& filename, void *buf, S32 offset, S32 nb  		return 0;  	} -	S32 off; -	if (offset < 0) -		off = LLAPRFile::seek(file_handle, APR_END, 0); -	else -		off = LLAPRFile::seek(file_handle, APR_SET, offset); +	llassert(offset >= 0); + +	if (offset > 0) +		offset = LLAPRFile::seek(file_handle, APR_SET, offset);  	apr_size_t bytes_read; -	if (off < 0) +	if (offset < 0)  	{  		bytes_read = 0;  	} diff --git a/indra/llcommon/llapr.h b/indra/llcommon/llapr.h index b05a222b33..08cf11e593 100644 --- a/indra/llcommon/llapr.h +++ b/indra/llcommon/llapr.h @@ -182,7 +182,7 @@ typedef LLAtomic32<U32> LLAtomicU32;  typedef LLAtomic32<S32> LLAtomicS32;  // File IO convenience functions. -// Returns NULL if the file fails to openm sets *sizep to file size of not NULL +// Returns NULL if the file fails to open, sets *sizep to file size if not NULL  // abbreviated flags  #define LL_APR_R (APR_READ) // "r"  #define LL_APR_W (APR_CREATE|APR_TRUNCATE|APR_WRITE) // "w" @@ -200,7 +200,7 @@ typedef LLAtomic32<S32> LLAtomicS32;  //      especially do not put some time-costly operations between open() and close().  //      otherwise it might lock the APRFilePool.  //there are two different apr_pools the APRFile can use: -//      1, a temperary pool passed to an APRFile function, which is used within this function and only once. +//      1, a temporary pool passed to an APRFile function, which is used within this function and only once.  //      2, a global pool.  // @@ -255,12 +255,12 @@ public:  	// Returns bytes read/written, 0 if read/write fails:  	static S32 readEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL);	 -	static S32 writeEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL);	 +	static S32 writeEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL); // offset<0 means append  //*******************************************************************************************************************************  };  /** - * @brief Function which approprately logs error or remains quiet on + * @brief Function which appropriately logs error or remains quiet on   * APR_SUCCESS.   * @return Returns <code>true</code> if status is an error condition.   */ diff --git a/indra/llmath/v2math.h b/indra/llmath/v2math.h index 9fef8851cc..65f3714313 100644 --- a/indra/llmath/v2math.h +++ b/indra/llmath/v2math.h @@ -70,6 +70,8 @@ class LLVector2  		void	setVec(const LLVector2 &vec);	// deprecated  		void	setVec(const F32 *vec);			// deprecated +		inline bool isFinite() const; // checks to see if all values of LLVector2 are finite +  		F32		length() const;				// Returns magnitude of LLVector2  		F32		lengthSquared() const;		// Returns magnitude squared of LLVector2  		F32		normalize();					// Normalizes and returns the magnitude of LLVector2 @@ -215,6 +217,7 @@ inline void	LLVector2::setVec(const F32 *vec)  	mV[VY] = vec[VY];  } +  // LLVector2 Magnitude and Normalization Functions  inline F32 LLVector2::length(void) const @@ -247,6 +250,12 @@ inline F32		LLVector2::normalize(void)  	return (mag);  } +// checker +inline bool LLVector2::isFinite() const +{ +	return (llfinite(mV[VX]) && llfinite(mV[VY])); +} +  // deprecated  inline F32		LLVector2::magVec(void) const  { diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 8addee606b..ff47c57c70 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -1738,8 +1738,18 @@ BOOL LLImageGL::getMask(const LLVector2 &tc)  	if (mPickMask)  	{ -		F32 u = tc.mV[0] - floorf(tc.mV[0]); -		F32 v = tc.mV[1] - floorf(tc.mV[1]); +		F32 u,v; +		if (LL_LIKELY(tc.isFinite())) +		{ +			u = tc.mV[0] - floorf(tc.mV[0]); +			v = tc.mV[1] - floorf(tc.mV[1]); +		} +		else +		{ +			LL_WARNS_ONCE("render") << "Ugh, non-finite u/v in mask pick" << LL_ENDL; +			u = v = 0.f; +			llassert(false); +		}  		if (LL_UNLIKELY(u < 0.f || u > 1.f ||  				v < 0.f || v > 1.f)) diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index da4abde451..29b6f490c8 100644 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -91,15 +91,16 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask)  	S32 result;  	while (getNextFileInDir(dirname, mask, filename, FALSE))  	{ -		if ((filename == ".") || (filename == "..")) +		fullpath = dirname; +		fullpath += getDirDelimiter(); +		fullpath += filename; + +		if(LLFile::isdir(fullpath))  		{  			// skipping directory traversal filenames  			count++;  			continue;  		} -		fullpath = dirname; -		fullpath += getDirDelimiter(); -		fullpath += filename;  		S32 retry_count = 0;  		while (retry_count < 5) diff --git a/indra/llvfs/lllfsthread.cpp b/indra/llvfs/lllfsthread.cpp index e85cc437f4..49c198a82d 100644 --- a/indra/llvfs/lllfsthread.cpp +++ b/indra/llvfs/lllfsthread.cpp @@ -188,7 +188,7 @@ bool LLLFSThread::Request::processRequest()  	if (mOperation ==  FILE_READ)  	{  		llassert(mOffset >= 0); -		LLAPRFile infile ; +		LLAPRFile infile ; // auto-closes  		infile.open(mFileName, LL_APR_RB, mThread->getLocalAPRFilePool());  		if (!infile.getFileHandle())  		{ @@ -204,7 +204,6 @@ bool LLLFSThread::Request::processRequest()  		llassert_always(off >= 0);  		mBytesRead = infile.read(mBuffer, mBytes );  		complete = true; -		infile.close() ;  // 		llinfos << "LLLFSThread::READ:" << mFileName << " Bytes: " << mBytesRead << llendl;  	}  	else if (mOperation ==  FILE_WRITE) @@ -212,7 +211,7 @@ bool LLLFSThread::Request::processRequest()  		apr_int32_t flags = APR_CREATE|APR_WRITE|APR_BINARY;  		if (mOffset < 0)  			flags |= APR_APPEND; -		LLAPRFile outfile ; +		LLAPRFile outfile ; // auto-closes  		outfile.open(mFileName, flags, mThread->getLocalAPRFilePool());  		if (!outfile.getFileHandle())  		{ @@ -232,7 +231,6 @@ bool LLLFSThread::Request::processRequest()  		}  		mBytesRead = outfile.write(mBuffer, mBytes );  		complete = true; -  // 		llinfos << "LLLFSThread::WRITE:" << mFileName << " Bytes: " << mBytesRead << "/" << mBytes << " Offset:" << mOffset << llendl;  	}  	else diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 5ee56a2a99..e2da3d1ad8 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -1544,16 +1544,14 @@ void LLWindowWin32::initCursors()  	mCursor[ UI_CURSOR_TOOLZOOMIN ] = LoadCursor(module, TEXT("TOOLZOOMIN"));  	mCursor[ UI_CURSOR_TOOLPICKOBJECT3 ] = LoadCursor(module, TEXT("TOOLPICKOBJECT3"));  	mCursor[ UI_CURSOR_PIPETTE ] = LoadCursor(module, TEXT("TOOLPIPETTE")); +	mCursor[ UI_CURSOR_TOOLSIT ]	= LoadCursor(module, TEXT("TOOLSIT")); +	mCursor[ UI_CURSOR_TOOLBUY ]	= LoadCursor(module, TEXT("TOOLBUY")); +	mCursor[ UI_CURSOR_TOOLOPEN ]	= LoadCursor(module, TEXT("TOOLOPEN"));  	// Color cursors -	gDirUtilp->getExpandedFilename(LL_PATH_EXECUTABLE, "res", "toolbuy.cur"); - -	mCursor[UI_CURSOR_TOOLSIT] = LoadCursorFromFile(utf8str_to_utf16str(gDirUtilp->findSkinnedFilename("textures", "toolsit.cur")).c_str()); -	mCursor[UI_CURSOR_TOOLBUY] = LoadCursorFromFile(utf8str_to_utf16str(gDirUtilp->findSkinnedFilename("textures", "toolbuy.cur")).c_str()); -	mCursor[UI_CURSOR_TOOLOPEN] = LoadCursorFromFile(utf8str_to_utf16str(gDirUtilp->findSkinnedFilename("textures", "toolopen.cur")).c_str()); -	mCursor[UI_CURSOR_TOOLPLAY] = loadColorCursor(TEXT("TOOLPLAY")); -	mCursor[UI_CURSOR_TOOLPAUSE] = loadColorCursor(TEXT("TOOLPAUSE")); -	mCursor[UI_CURSOR_TOOLMEDIAOPEN] = loadColorCursor(TEXT("TOOLMEDIAOPEN")); +	mCursor[ UI_CURSOR_TOOLPLAY ]		= loadColorCursor(TEXT("TOOLPLAY")); +	mCursor[ UI_CURSOR_TOOLPAUSE ]		= loadColorCursor(TEXT("TOOLPAUSE")); +	mCursor[ UI_CURSOR_TOOLMEDIAOPEN ]	= loadColorCursor(TEXT("TOOLMEDIAOPEN"));  	// Note: custom cursors that are not found make LoadCursor() return NULL.  	for( S32 i = 0; i < UI_CURSOR_COUNT; i++ ) diff --git a/indra/media_plugins/webkit/CMakeLists.txt b/indra/media_plugins/webkit/CMakeLists.txt index 4f183cddeb..1a559ed39c 100644 --- a/indra/media_plugins/webkit/CMakeLists.txt +++ b/indra/media_plugins/webkit/CMakeLists.txt @@ -36,6 +36,10 @@ set(media_plugin_webkit_SOURCE_FILES      media_plugin_webkit.cpp      ) +set(media_plugin_webkit_HEADER_FILES +    volume_catcher.h +    ) +  set(media_plugin_webkit_LINK_LIBRARIES    ${LLPLUGIN_LIBRARIES}    ${MEDIA_PLUGIN_BASE_LIBRARIES} @@ -59,11 +63,18 @@ elseif (DARWIN)         ${CORESERVICES_LIBRARY}     # for Component Manager calls         ${AUDIOUNIT_LIBRARY}        # for AudioUnit calls         ) +elseif (WINDOWS) +  list(APPEND media_plugin_webkit_SOURCE_FILES windows_volume_catcher.cpp)  else (LINUX AND PULSEAUDIO)    # All other platforms use the dummy volume catcher for now.    list(APPEND media_plugin_webkit_SOURCE_FILES dummy_volume_catcher.cpp)  endif (LINUX AND PULSEAUDIO) +set_source_files_properties(${media_plugin_webkit_HEADER_FILES} +                            PROPERTIES HEADER_FILE_ONLY TRUE) + +list(APPEND media_plugin_webkit_SOURCE_FILES ${media_plugin_webkit_HEADER_FILES}) +  add_library(media_plugin_webkit      SHARED      ${media_plugin_webkit_SOURCE_FILES} diff --git a/indra/media_plugins/webkit/windows_volume_catcher.cpp b/indra/media_plugins/webkit/windows_volume_catcher.cpp new file mode 100644 index 0000000000..1c1ef0b42f --- /dev/null +++ b/indra/media_plugins/webkit/windows_volume_catcher.cpp @@ -0,0 +1,316 @@ +/**  + * @file windows_volume_catcher.cpp + * @brief A Windows implementation of volume level control of all audio channels opened by a process. + * + * @cond + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + * @endcond + */ + +#include "volume_catcher.h" +#include <windows.h> + +// +// Abstracts a Win32 mixer line and associated state +// for muting and changing volume on a given output +// +class Mixer +{ +public: +	static Mixer* create(U32 index); +	~Mixer(); + +	void setMute(bool mute); +	void setVolume(F32 volume_left, F32 volume_right); + +private: +	// use create(index) to create a Mixer +	Mixer(HMIXER handle, U32 mute_control_id, U32 volume_control_id, U32 min_volume, U32 max_volume); + +	HMIXER	mHandle;		 +	U32		mMuteControlID;		// handle to mixer controller for muting +	U32		mVolumeControlID;	// handle to mixer controller for changing volume +	U32		mMinVolume;			// value that specifies minimum volume as reported by mixer +	U32		mMaxVolume;			// value that specifies maximum volume as reported by mixer +}; + +// factory function that attempts to create a Mixer object associated with a given mixer line index +// returns NULL if creation failed +// static  +Mixer* Mixer::create(U32 index) +{ +	// get handle to mixer object +	HMIXER mixer_handle; +	MMRESULT result = mixerOpen( &mixer_handle, +							index,	 +							0,	// HWND to call when state changes - not used +							0,	// user data for callback - not used +							MIXER_OBJECTF_MIXER ); + +	if (result == MMSYSERR_NOERROR) +	{ +		MIXERLINE mixer_line; +		mixer_line.cbStruct = sizeof( MIXERLINE ); + +		// try speakers first +		mixer_line.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; + +		MMRESULT result = mixerGetLineInfo( reinterpret_cast< HMIXEROBJ >( mixer_handle ), +								&mixer_line, +								MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE ); +		if (result != MMSYSERR_NOERROR) +		{	// failed - try headphones next +			mixer_line.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_HEADPHONES; +			result = mixerGetLineInfo( reinterpret_cast< HMIXEROBJ >( mixer_handle ), +									&mixer_line, +									MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE ); +		} + +		if (result == MMSYSERR_NOERROR) +		{	// successfully found mixer line object, now use it to get volume and mute controls + +			// reuse these objects to query for both volume and mute controls +			MIXERCONTROL mixer_control; +			MIXERLINECONTROLS mixer_line_controls; +			mixer_line_controls.cbStruct = sizeof( MIXERLINECONTROLS ); +			mixer_line_controls.dwLineID = mixer_line.dwLineID; +			mixer_line_controls.cControls = 1; +			mixer_line_controls.cbmxctrl = sizeof( MIXERCONTROL ); +			mixer_line_controls.pamxctrl = &mixer_control; + +			// first, query for mute +			mixer_line_controls.dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE; + +			// get control id for mute controls +			result = mixerGetLineControls( reinterpret_cast< HMIXEROBJ >( mixer_handle ), +				&mixer_line_controls, +				MIXER_OBJECTF_HMIXER | MIXER_GETLINECONTROLSF_ONEBYTYPE ); +			if (result == MMSYSERR_NOERROR ) +			{	// we have a mute controls.  Remember the mute control id and then query for  +				// volume controls using the same struct, but different dwControlType + +				U32 mute_control_id = mixer_control.dwControlID; +				mixer_line_controls.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME; +				result = mixerGetLineControls( reinterpret_cast< HMIXEROBJ >( mixer_handle ), +					&mixer_line_controls, +					MIXER_OBJECTF_HMIXER | MIXER_GETLINECONTROLSF_ONEBYTYPE ); + +				if (result == MMSYSERR_NOERROR) +				{	// we have both mute and volume controls for this mixer, so we're keeping it +					return new Mixer(mixer_handle,  +								mute_control_id,  +								mixer_control.dwControlID,  +								mixer_control.Bounds.dwMinimum,  +								mixer_control.Bounds.dwMaximum); +				} +			} +		} +	} + +	// if we got here, we didn't successfully create a Mixer object +	mixerClose(mixer_handle); +	return NULL; +} + +Mixer::Mixer(HMIXER handle, U32 mute_control_id, U32 volume_control_id, U32 min_volume, U32 max_volume) +:	mHandle(handle), +	mMuteControlID(mute_control_id), +	mVolumeControlID(volume_control_id), +	mMinVolume(min_volume), +	mMaxVolume(max_volume) +{} + +Mixer::~Mixer() +{} + +// toggle mute for this mixer +// if mute is set, then volume level will be ignored +void Mixer::setMute(bool mute) +{ +	MIXERCONTROLDETAILS_BOOLEAN mixer_control_details_bool = { mute }; +	MIXERCONTROLDETAILS mixer_control_details; +	mixer_control_details.cbStruct = sizeof( MIXERCONTROLDETAILS ); +	mixer_control_details.dwControlID = mMuteControlID; +	mixer_control_details.cChannels = 1; +	mixer_control_details.cMultipleItems = 0; +	mixer_control_details.cbDetails = sizeof( MIXERCONTROLDETAILS_BOOLEAN ); +	mixer_control_details.paDetails = &mixer_control_details_bool; + +	mixerSetControlDetails( reinterpret_cast< HMIXEROBJ >( mHandle ), +								 &mixer_control_details, +								 MIXER_OBJECTF_HMIXER | MIXER_SETCONTROLDETAILSF_VALUE ); +} + +// set individual volume levels for left and right channels +// if mute is set, then these values will apply once mute is unset +void Mixer::setVolume(F32 volume_left, F32 volume_right) +{ +	// assuming pan is in range [-1, 1] set volume levels accordingly +	// if pan == -1 then	volume_left_mixer = volume_left	&& volume_right_mixer = 0 +	// if pan == 0 then		volume_left_mixer = volume_left	&& volume_right_mixer = volume_right +	// if pan == 1 then		volume_left_mixer = 0			&& volume_right_mixer = volume_right +	U32 volume_left_mixer = (U32) +							((F32)mMinVolume  +								+ (volume_left * ((F32)mMaxVolume - (F32)mMinVolume))); +	U32 volume_right_mixer = (U32) +							((F32)mMinVolume  +								+ (volume_right * ((F32)mMaxVolume - (F32)mMinVolume))); + +	// pass volume levels on to mixer +	MIXERCONTROLDETAILS_UNSIGNED mixer_control_details_unsigned[ 2 ] = { volume_left_mixer, volume_right_mixer }; +	MIXERCONTROLDETAILS mixer_control_details; +	mixer_control_details.cbStruct = sizeof( MIXERCONTROLDETAILS ); +	mixer_control_details.dwControlID = mVolumeControlID; +	mixer_control_details.cChannels = 2; +	mixer_control_details.cMultipleItems = 0; +	mixer_control_details.cbDetails = sizeof( MIXERCONTROLDETAILS_UNSIGNED ); +	mixer_control_details.paDetails = &mixer_control_details_unsigned; + +	mixerSetControlDetails( reinterpret_cast< HMIXEROBJ >( mHandle ), +								 &mixer_control_details, +								 MIXER_OBJECTF_HMIXER | MIXER_SETCONTROLDETAILSF_VALUE ); +} + +class VolumeCatcherImpl +{ +public: + +	void setVolume(F32 volume); +	void setPan(F32 pan); +	 +	static VolumeCatcherImpl *getInstance(); +private: +	// This is a singleton class -- both callers and the component implementation should use getInstance() to find the instance. +	VolumeCatcherImpl(); +	~VolumeCatcherImpl(); + +	static VolumeCatcherImpl *sInstance; +	 +	F32 	mVolume; +	F32 	mPan; +	typedef std::vector<Mixer*> mixer_vector_t; +	mixer_vector_t	mMixers; +}; + +VolumeCatcherImpl *VolumeCatcherImpl::sInstance = NULL; + +VolumeCatcherImpl *VolumeCatcherImpl::getInstance() +{ +	if(!sInstance) +	{ +		sInstance = new VolumeCatcherImpl; +	} +	 +	return sInstance; +} + +VolumeCatcherImpl::VolumeCatcherImpl() +:	mVolume(1.0f),	// default volume is max +	mPan(0.f)		// default pan is centered +{ +	// for each reported mixer "device", create a proxy object and add to list +	U32 num_mixers = mixerGetNumDevs(); +	for (U32 mixer_index = 0; mixer_index < num_mixers; ++mixer_index) +	{ +		Mixer* mixerp = Mixer::create(mixer_index); +		if (mixerp) +		{ +			mMixers.push_back(mixerp); +		} +	} +} + +VolumeCatcherImpl::~VolumeCatcherImpl() +{ +	for(mixer_vector_t::iterator it = mMixers.begin(), end_it = mMixers.end(); +		it != end_it; +		++it) +	{ +		delete *it; +		*it = NULL; +	} +} + + +void VolumeCatcherImpl::setVolume(F32 volume) +{ +	F32 left_volume = volume * min(1.f, 1.f - mPan); +	F32 right_volume = volume * max(0.f, 1.f + mPan); +	 +	for(mixer_vector_t::iterator it = mMixers.begin(), end_it = mMixers.end(); +		it != end_it; +		++it) +	{	// set volume levels and mute for each mixer +		// note that a muted mixer will ignore this volume level + +		(*it)->setVolume(left_volume, right_volume); +		 +		if (volume == 0.f && mVolume != 0.f) +		{ +			(*it)->setMute(true); +		} +		else if (mVolume == 0.f && volume != 0.f) +		{ +			(*it)->setMute(false); +		} + +	} +	mVolume = volume; +} + +void VolumeCatcherImpl::setPan(F32 pan) +{	// remember pan for calculating individual channel levels later +	mPan = pan; +} + +///////////////////////////////////////////////////// + +VolumeCatcher::VolumeCatcher() +{ +	pimpl = VolumeCatcherImpl::getInstance(); +} + +VolumeCatcher::~VolumeCatcher() +{ +	// Let the instance persist until exit. +} + +void VolumeCatcher::setVolume(F32 volume) +{ +	pimpl->setVolume(volume); +} + +void VolumeCatcher::setPan(F32 pan) +{ +	pimpl->setPan(pan); +} + +void VolumeCatcher::pump() +{ +	// No periodic tasks are necessary for this implementation. +} + diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 73e83b9793..4158899446 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1162,6 +1162,9 @@ if (WINDOWS)          res/toolpickobject2.cur          res/toolpickobject3.cur          res/toolpipette.cur +        res/toolbuy.cur +        res/toolopen.cur +        res/toolsit.cur          )      set_source_files_properties(${viewer_RESOURCE_FILES} diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f76b471c9c..c9b5631d54 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -4,13 +4,14 @@      <key>AFKTimeout</key>      <map>        <key>Comment</key> -      <string>Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never)</string> +      <string>Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never).  +        Valid values are: 0, 120, 300, 600, 1800</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key>        <string>S32</string>        <key>Value</key> -      <real>0</real> +      <real>300</real>      </map>      <key>AdvanceSnapshot</key>      <map> diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 407c5b6153..c7a5691d70 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -32,13 +32,18 @@  #include "llviewerprecompiledheaders.h" +// common +#include "lltrans.h" +  #include "llavatarlist.h"  #include "llagentdata.h" // for comparator  // newview +#include "llavatariconctrl.h"  #include "llcallingcard.h" // for LLAvatarTracker  #include "llcachename.h"  #include "llrecentpeople.h" +#include "lltextutil.h"  #include "lluuid.h"  #include "llvoiceclient.h"  #include "llviewercontrol.h"	// for gSavedSettings @@ -193,6 +198,18 @@ void LLAvatarList::setDirty(bool val /*= true*/, bool force_refresh /*= false*/)  	}  } +void LLAvatarList::addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name) +{ +	LL_DEBUGS("Avaline") << "Adding avaline item into the list: " << item_name << "|" << item_id << ", session: " << session_id << LL_ENDL; +	LLAvalineListItem* item = new LLAvalineListItem; +	item->setAvatarId(item_id, session_id, true, false); +	item->setName(item_name); + +	addItem(item, item_id); +	mIDs.push_back(item_id); +	sort(); +} +  //////////////////////////////////////////////////////////////////////////  // PROTECTED SECTION  ////////////////////////////////////////////////////////////////////////// @@ -471,3 +488,61 @@ bool LLAvatarItemAgentOnTopComparator::doCompare(const LLAvatarListItem* avatar_  	}  	return LLAvatarItemNameComparator::doCompare(avatar_item1,avatar_item2);  } + +/************************************************************************/ +/*             class LLAvalineListItem                                  */ +/************************************************************************/ +LLAvalineListItem::LLAvalineListItem(bool hide_number/* = true*/) : LLAvatarListItem(false) +, mIsHideNumber(hide_number) +{ +	// should not use buildPanel from the base class to ensure LLAvalineListItem::postBuild is called. +	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_avatar_list_item.xml"); +} + +BOOL LLAvalineListItem::postBuild() +{ +	BOOL rv = LLAvatarListItem::postBuild(); + +	if (rv) +	{ +		setOnline(true); +		showLastInteractionTime(false); +		setShowProfileBtn(false); +		setShowInfoBtn(false); +		mAvatarIcon->setValue("Avaline_Icon"); +		mAvatarIcon->setToolTip(std::string("")); +	} +	return rv; +} + +// to work correctly this method should be called AFTER setAvatarId for avaline callers with hidden phone number +void LLAvalineListItem::setName(const std::string& name) +{ +	if (mIsHideNumber) +	{ +		static U32 order = 0; +		typedef std::map<LLUUID, U32> avaline_callers_nums_t; +		static avaline_callers_nums_t mAvalineCallersNums; + +		llassert(getAvatarId() != LLUUID::null); + +		const LLUUID &uuid = getAvatarId(); + +		if (mAvalineCallersNums.find(uuid) == mAvalineCallersNums.end()) +		{ +			mAvalineCallersNums[uuid] = ++order; +			LL_DEBUGS("Avaline") << "Set name for new avaline caller: " << uuid << ", order: " << order << LL_ENDL; +		} +		LLStringUtil::format_map_t args; +		args["[ORDER]"] = llformat("%u", mAvalineCallersNums[uuid]); +		std::string hidden_name = LLTrans::getString("AvalineCaller", args); + +		LL_DEBUGS("Avaline") << "Avaline caller: " << uuid << ", name: " << hidden_name << LL_ENDL; +		LLAvatarListItem::setName(hidden_name); +	} +	else +	{ +		const std::string& formatted_phone = LLTextUtil::formatPhoneNumber(name); +		LLAvatarListItem::setName(formatted_phone); +	} +} diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index 0203617867..528f796b8b 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -96,6 +96,8 @@ public:  	virtual S32 notifyParent(const LLSD& info); +	void addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name); +  protected:  	void refresh(); @@ -175,4 +177,27 @@ protected:  	virtual bool doCompare(const LLAvatarListItem* avatar_item1, const LLAvatarListItem* avatar_item2) const;  }; +/** + * Represents Avaline caller in Avatar list in Voice Control Panel and group chats. + */ +class LLAvalineListItem : public LLAvatarListItem +{ +public: + +	/** +	 * Constructor +	 * +	 * @param hide_number - flag indicating if number should be hidden. +	 *		In this case It will be shown as "Avaline Caller 1", "Avaline Caller 1", etc. +	 */ +	LLAvalineListItem(bool hide_number = true); + +	/*virtual*/ BOOL postBuild(); + +	/*virtual*/ void setName(const std::string& name); + +private: +	bool mIsHideNumber; +}; +  #endif // LL_LLAVATARLIST_H diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index 44f88cce29..2a51eeacfc 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -212,21 +212,25 @@ void LLAvatarListItem::setState(EItemState item_style)  	mAvatarIcon->setColor(item_icon_color_map[item_style]);  } -void LLAvatarListItem::setAvatarId(const LLUUID& id, const LLUUID& session_id, bool ignore_status_changes) +void LLAvatarListItem::setAvatarId(const LLUUID& id, const LLUUID& session_id, bool ignore_status_changes/* = false*/, bool is_resident/* = true*/)  {  	if (mAvatarId.notNull())  		LLAvatarTracker::instance().removeParticularFriendObserver(mAvatarId, this);  	mAvatarId = id; -	mAvatarIcon->setValue(id);  	mSpeakingIndicator->setSpeakerId(id, session_id);  	// We'll be notified on avatar online status changes  	if (!ignore_status_changes && mAvatarId.notNull())  		LLAvatarTracker::instance().addParticularFriendObserver(mAvatarId, this); -	// Set avatar name. -	gCacheName->get(id, FALSE, boost::bind(&LLAvatarListItem::onNameCache, this, _2, _3)); +	if (is_resident) +	{ +		mAvatarIcon->setValue(id); + +		// Set avatar name. +		gCacheName->get(id, FALSE, boost::bind(&LLAvatarListItem::onNameCache, this, _2, _3)); +	}  }  void LLAvatarListItem::showLastInteractionTime(bool show) diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h index 2db6484a30..3ba2c7a3e3 100644 --- a/indra/newview/llavatarlistitem.h +++ b/indra/newview/llavatarlistitem.h @@ -100,7 +100,7 @@ public:  	void setName(const std::string& name);  	void setHighlight(const std::string& highlight);  	void setState(EItemState item_style); -	void setAvatarId(const LLUUID& id, const LLUUID& session_id, bool ignore_status_changes = false); +	void setAvatarId(const LLUUID& id, const LLUUID& session_id, bool ignore_status_changes = false, bool is_resident = true);  	void setLastInteractionTime(U32 secs_since);  	//Show/hide profile/info btn, translating speaker indicator and avatar name coordinates accordingly  	void setShowProfileBtn(bool show); diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp index ef946ac49e..e3e66fa00d 100644 --- a/indra/newview/lldrawpool.cpp +++ b/indra/newview/lldrawpool.cpp @@ -442,7 +442,6 @@ void LLRenderPass::renderTexture(U32 type, U32 mask)  void LLRenderPass::pushBatches(U32 type, U32 mask, BOOL texture)  { -	llpushcallstacks ;  	for (LLCullResult::drawinfo_list_t::iterator i = gPipeline.beginRenderMap(type); i != gPipeline.endRenderMap(type); ++i)	  	{  		LLDrawInfo* pparams = *i; diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index d09d4a412f..19cdccb630 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -825,7 +825,6 @@ void LLBumpImageList::addTextureStats(U8 bump, const LLUUID& base_image_id, F32  void LLBumpImageList::updateImages()  {	 -	llpushcallstacks ;  	for (bump_image_map_t::iterator iter = mBrightnessEntries.begin(); iter != mBrightnessEntries.end(); )  	{  		bump_image_map_t::iterator curiter = iter++; @@ -852,7 +851,6 @@ void LLBumpImageList::updateImages()  			}  		}  	} -	llpushcallstacks ;  	for (bump_image_map_t::iterator iter = mDarknessEntries.begin(); iter != mDarknessEntries.end(); )  	{  		bump_image_map_t::iterator curiter = iter++; @@ -879,7 +877,6 @@ void LLBumpImageList::updateImages()  			}  		}  	} -	llpushcallstacks ;  } diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 9de69a8173..a1336815f7 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -867,7 +867,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  								const LLMatrix4& mat_vert, const LLMatrix3& mat_normal,  								const U16 &index_offset)  { -	llpushcallstacks ;  	const LLVolumeFace &vf = volume.getVolumeFace(f);  	S32 num_vertices = (S32)vf.mVertices.size();  	S32 num_indices = LLPipeline::sUseTriStrips ? (S32)vf.mTriStrip.size() : (S32) vf.mIndices.size(); diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index 01a699506e..d1e99fbd61 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -451,8 +451,8 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void*  	LLFloaterAvatarPicker* floater = LLFloaterReg::findTypedInstance<LLFloaterAvatarPicker>("avatar_picker"); -	// these are not results from our last request -	if (query_id != floater->mQueryID) +	// floater is closed or these are not results from our last request +	if (NULL == floater || query_id != floater->mQueryID)  	{  		return;  	} diff --git a/indra/newview/llfloaterevent.cpp b/indra/newview/llfloaterevent.cpp index 97ebab3425..560cc29080 100644 --- a/indra/newview/llfloaterevent.cpp +++ b/indra/newview/llfloaterevent.cpp @@ -113,7 +113,6 @@ BOOL LLFloaterEvent::postBuild()  	mTBDuration = getChild<LLTextBox>("event_duration");  	mTBDesc = getChild<LLExpandableTextBox>("event_desc"); -	mTBDesc->setEnabled(FALSE);  	mTBRunBy = getChild<LLTextBox>("event_runby");  	mTBLocation = getChild<LLTextBox>("event_location"); diff --git a/indra/newview/llfloaterscriptdebug.cpp b/indra/newview/llfloaterscriptdebug.cpp index eeea71cc4c..d6732a9d5c 100644 --- a/indra/newview/llfloaterscriptdebug.cpp +++ b/indra/newview/llfloaterscriptdebug.cpp @@ -104,6 +104,10 @@ void LLFloaterScriptDebug::addScriptLine(const std::string &utf8mesg, const std:  	LLViewerObject* objectp = gObjectList.findObject(source_id);  	std::string floater_label; +	// Handle /me messages. +	std::string prefix = utf8mesg.substr(0, 4); +	std::string message = (prefix == "/me " || prefix == "/me'") ? user_name + utf8mesg.substr(3) : utf8mesg; +  	if (objectp)  	{  		objectp->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", TRUE, LLViewerTexture::BOOST_UI)); @@ -121,14 +125,14 @@ void LLFloaterScriptDebug::addScriptLine(const std::string &utf8mesg, const std:  	LLFloaterScriptDebugOutput* floaterp = 	LLFloaterReg::getTypedInstance<LLFloaterScriptDebugOutput>("script_debug_output", LLUUID::null);  	if (floaterp)  	{ -		floaterp->addLine(utf8mesg, user_name, color); +		floaterp->addLine(message, user_name, color);  	}  	// add to specific script instance floater  	floaterp = LLFloaterReg::getTypedInstance<LLFloaterScriptDebugOutput>("script_debug_output", source_id);  	if (floaterp)  	{ -		floaterp->addLine(utf8mesg, floater_label, color); +		floaterp->addLine(message, floater_label, color);  	}  } diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 3ec8d11fb0..19dbc564d1 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -499,8 +499,8 @@ void LLIMFloater::setVisible(BOOL visible)  	{  		//only if floater was construced and initialized from xml  		updateMessages(); -		//prevent steal focus when IM opened in multitab mode -		if (!isChatMultiTab()) +		//prevent stealing focus when opening a background IM tab (EXT-5387, checking focus for EXT-6781) +		if (!isChatMultiTab() || hasFocus())  		{  			mInputEditor->setFocus(TRUE);  		} diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index 0f22a50093..0ddc4efc81 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -200,7 +200,8 @@ void LLFloaterMove::setFlyingMode(BOOL fly)  	if (instance)  	{  		instance->setFlyingModeImpl(fly); -		instance->showModeButtons(!fly); +		BOOL is_sitting = isAgentAvatarValid() && gAgentAvatarp->isSitting(); +		instance->showModeButtons(!fly && !is_sitting);  	}  	if (fly)  	{ @@ -696,6 +697,7 @@ void LLPanelStandStopFlying::onStandButtonClick()  	gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);  	setFocus(FALSE); // EXT-482 +	mStandButton->setVisible(FALSE); // force visibility changing to avoid seeing Stand & Move buttons at once.  }  void LLPanelStandStopFlying::onStopFlyingButtonClick() diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 026be882ed..53f92f7ad1 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -50,6 +50,145 @@  static const LLAvatarItemAgentOnTopComparator AGENT_ON_TOP_NAME_COMPARATOR; +// See EXT-4301. +/** + * class LLAvalineUpdater - observe the list of voice participants in session and check + *  presence of Avaline Callers among them. + * + * LLAvalineUpdater is a LLVoiceClientParticipantObserver. It provides two kinds of validation: + *	- whether Avaline caller presence among participants; + *	- whether watched Avaline caller still exists in voice channel. + * Both validations have callbacks which will notify subscriber if any of event occur. + * + * @see findAvalineCaller() + * @see checkIfAvalineCallersExist() + */ +class LLAvalineUpdater : public LLVoiceClientParticipantObserver +{ +public: +	typedef boost::function<void(const LLUUID& speaker_id)> process_avaline_callback_t; + +	LLAvalineUpdater(process_avaline_callback_t found_cb, process_avaline_callback_t removed_cb) +		: mAvalineFoundCallback(found_cb) +		, mAvalineRemovedCallback(removed_cb) +	{ +		LLVoiceClient::getInstance()->addObserver(this); +	} +	~LLAvalineUpdater() +	{ +		if (LLVoiceClient::instanceExists()) +		{ +			LLVoiceClient::getInstance()->removeObserver(this); +		} +	} + +	/** +	 * Adds UUID of Avaline caller to watch. +	 * +	 * @see checkIfAvalineCallersExist(). +	 */ +	void watchAvalineCaller(const LLUUID& avaline_caller_id) +	{ +		mAvalineCallers.insert(avaline_caller_id); +	} + +	void onChange() +	{ +		uuid_set_t participant_uuids; +		LLVoiceClient::getInstance()->getParticipantsUUIDSet(participant_uuids); + + +		// check whether Avaline caller exists among voice participants +		// and notify Participant List +		findAvalineCaller(participant_uuids); + +		// check whether watched Avaline callers still present among voice participant +		// and remove if absents. +		checkIfAvalineCallersExist(participant_uuids); +	} + +private: +	typedef std::set<LLUUID> uuid_set_t; + +	/** +	 * Finds Avaline callers among voice participants and calls mAvalineFoundCallback. +	 * +	 * When Avatar is in group call with Avaline caller and then ends call Avaline caller stays +	 * in Group Chat floater (exists in LLSpeakerMgr). If Avatar starts call with that group again +	 * Avaline caller is added to voice channel AFTER Avatar is connected to group call. +	 * But Voice Control Panel (VCP) is filled from session LLSpeakerMgr and there is no information +	 * if a speaker is Avaline caller. +	 * +	 * In this case this speaker is created as avatar and will be recreated when it appears in +	 * Avatar's Voice session. +	 * +	 * @see LLParticipantList::onAvalineCallerFound() +	 */ +	void findAvalineCaller(const uuid_set_t& participant_uuids) +	{ +		uuid_set_t::const_iterator it = participant_uuids.begin(), it_end = participant_uuids.end(); + +		for(; it != it_end; ++it) +		{ +			const LLUUID& participant_id = *it; +			if (!LLVoiceClient::getInstance()->isParticipantAvatar(participant_id)) +			{ +				LL_DEBUGS("Avaline") << "Avaline caller found among voice participants: " << participant_id << LL_ENDL; + +				if (mAvalineFoundCallback) +				{ +					mAvalineFoundCallback(participant_id); +				} +			} +		} +	} + +	/** +	 * Finds Avaline callers which are not anymore among voice participants and calls mAvalineRemovedCallback. +	 * +	 * The problem is when Avaline caller ends a call it is removed from Voice Client session but +	 * still exists in LLSpeakerMgr. Server does not send such information. +	 * This method implements a HUCK to notify subscribers that watched Avaline callers by class +	 * are not anymore in the call. +	 * +	 * @see LLParticipantList::onAvalineCallerRemoved() +	 */ +	void checkIfAvalineCallersExist(const uuid_set_t& participant_uuids) +	{ +		uuid_set_t::iterator it = mAvalineCallers.begin(); +		uuid_set_t::const_iterator participants_it_end = participant_uuids.end(); + +		while (it != mAvalineCallers.end()) +		{ +			const LLUUID participant_id = *it; +			LL_DEBUGS("Avaline") << "Check avaline caller: " << participant_id << LL_ENDL; +			bool not_found = participant_uuids.find(participant_id) == participants_it_end; +			if (not_found) +			{ +				LL_DEBUGS("Avaline") << "Watched Avaline caller is not found among voice participants: " << participant_id << LL_ENDL; + +				// notify Participant List +				if (mAvalineRemovedCallback) +				{ +					mAvalineRemovedCallback(participant_id); +				} + +				// remove from the watch list +				mAvalineCallers.erase(it++); +			} +			else +			{ +				++it; +			} +		} +	} + +	process_avaline_callback_t mAvalineFoundCallback; +	process_avaline_callback_t mAvalineRemovedCallback; + +	uuid_set_t mAvalineCallers; +}; +  LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list,  bool use_context_menu/* = true*/,  		bool exclude_agent /*= true*/, bool can_toggle_icons /*= true*/):  	mSpeakerMgr(data_source), @@ -59,6 +198,9 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av  ,	mExcludeAgent(exclude_agent)  ,	mValidateSpeakerCallback(NULL)  { +	mAvalineUpdater = new LLAvalineUpdater(boost::bind(&LLParticipantList::onAvalineCallerFound, this, _1), +		boost::bind(&LLParticipantList::onAvalineCallerRemoved, this, _1)); +  	mSpeakerAddListener = new SpeakerAddListener(*this);  	mSpeakerRemoveListener = new SpeakerRemoveListener(*this);  	mSpeakerClearListener = new SpeakerClearListener(*this); @@ -137,6 +279,9 @@ LLParticipantList::~LLParticipantList()  	}  	mAvatarList->setContextMenu(NULL); +	mAvatarList->setComparator(NULL); + +	delete mAvalineUpdater;  }  void LLParticipantList::setSpeakingIndicatorsVisible(BOOL visible) @@ -210,6 +355,55 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)  	}  } +/* +Seems this method is not necessary after onAvalineCallerRemoved was implemented; + +It does nothing because list item is always created with correct class type for Avaline caller. +For now Avaline Caller is removed from the LLSpeakerMgr List when it is removed from the Voice Client +session. +This happens in two cases: if Avaline Caller ends call itself or if Resident ends group call. + +Probably Avaline caller should be removed from the LLSpeakerMgr list ONLY if it ends call itself. +Asked in EXT-4301. +*/ +void LLParticipantList::onAvalineCallerFound(const LLUUID& participant_id) +{ +	LLPanel* item = mAvatarList->getItemByValue(participant_id); + +	if (NULL == item) +	{ +		LL_WARNS("Avaline") << "Something wrong. Unable to find item for: " << participant_id << LL_ENDL; +		return; +	} + +	if (typeid(*item) == typeid(LLAvalineListItem)) +	{ +		LL_DEBUGS("Avaline") << "Avaline caller has already correct class type for: " << participant_id << LL_ENDL; +		// item representing an Avaline caller has a correct type already. +		return; +	} + +	LL_DEBUGS("Avaline") << "remove item from the list and re-add it: " << participant_id << LL_ENDL; + +	// remove UUID from LLAvatarList::mIDs to be able add it again. +	uuid_vec_t& ids = mAvatarList->getIDs(); +	uuid_vec_t::iterator pos = std::find(ids.begin(), ids.end(), participant_id); +	ids.erase(pos); + +	// remove item directly +	mAvatarList->removeItem(item); + +	// re-add avaline caller with a correct class instance. +	addAvatarIDExceptAgent(participant_id); +} + +void LLParticipantList::onAvalineCallerRemoved(const LLUUID& participant_id) +{ +	LL_DEBUGS("Avaline") << "Removing avaline caller from the list: " << participant_id << LL_ENDL; + +	mSpeakerMgr->removeAvalineSpeaker(participant_id); +} +  void LLParticipantList::setSortOrder(EParticipantSortOrder order)  {  	if ( mSortOrder != order ) @@ -355,8 +549,20 @@ void LLParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id)  	if (mExcludeAgent && gAgent.getID() == avatar_id) return;  	if (mAvatarList->contains(avatar_id)) return; -	mAvatarList->getIDs().push_back(avatar_id); -	mAvatarList->setDirty(); +	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(avatar_id); + +	if (is_avatar) +	{ +		mAvatarList->getIDs().push_back(avatar_id); +		mAvatarList->setDirty(); +	} +	else +	{ +		LLVoiceClient::participantState *participant = LLVoiceClient::getInstance()->findParticipantByID(avatar_id); + +		mAvatarList->addAvalineItem(avatar_id, mSpeakerMgr->getSessionID(), participant ? participant->mAccountName : LLTrans::getString("AvatarNameWaiting")); +		mAvalineUpdater->watchAvalineCaller(avatar_id); +	}  	adjustParticipant(avatar_id);  } diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index 953dff4551..9e5a2cbc1f 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -38,6 +38,7 @@  class LLSpeakerMgr;  class LLAvatarList;  class LLUICtrl; +class LLAvalineUpdater;  class LLParticipantList  { @@ -235,6 +236,9 @@ class LLParticipantList  		void onAvatarListDoubleClicked(LLUICtrl* ctrl);  		void onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param); +		void onAvalineCallerFound(const LLUUID& participant_id); +		void onAvalineCallerRemoved(const LLUUID& participant_id); +  		/**  		 * Adjusts passed participant to work properly.  		 * @@ -272,4 +276,5 @@ class LLParticipantList  		LLPointer<LLAvatarItemRecentSpeakerComparator> mSortByRecentSpeakers;  		validate_speaker_callback_t mValidateSpeakerCallback; +		LLAvalineUpdater* mAvalineUpdater;  }; diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 4573520647..ba6a44dff4 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -84,7 +84,7 @@ void LLSpeaker::onAvatarNameLookup(const LLUUID& id, const std::string& first, c  bool LLSpeaker::isInVoiceChannel()  { -	return mStatus == LLSpeaker::STATUS_VOICE_ACTIVE || mStatus == LLSpeaker::STATUS_MUTED; +	return mStatus <= LLSpeaker::STATUS_VOICE_ACTIVE || mStatus == LLSpeaker::STATUS_MUTED;  }  LLSpeakerUpdateModeratorEvent::LLSpeakerUpdateModeratorEvent(LLSpeaker* source) diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h index b924fb2f2c..2bb160b7ce 100644 --- a/indra/newview/llspeakers.h +++ b/indra/newview/llspeakers.h @@ -234,6 +234,14 @@ public:  	LLVoiceChannel* getVoiceChannel() { return mVoiceChannel; }  	const LLUUID getSessionID(); +	/** +	 * Removes avaline speaker. +	 * +	 * This is a HACK due to server does not send information that Avaline caller ends call. +	 * It can be removed when server is updated. See EXT-4301 for details +	 */ +	bool removeAvalineSpeaker(const LLUUID& speaker_id) { return removeSpeaker(speaker_id); } +  protected:  	virtual void updateSpeakerList();  	void setSpeakerNotInChannel(LLSpeaker* speackerp); diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index d89c81e7a7..bc6716697e 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -46,10 +46,12 @@  #include "llurl.h" -#if defined(LL_DARWIN) || (defined(LL_WINDOWS) && (! defined(LL_RELEASE_FOR_DOWNLOAD)) ) + +#if defined(LL_DARWIN) || (LL_WINDOWS && !LL_RELEASE_FOR_DOWNLOAD )  #define PER_MEDIA_VOLUME  #endif +  class LLViewerMediaImpl;  class LLUUID;  class LLViewerMediaTexture; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 9542bebde5..ab35df1101 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -32,6 +32,7 @@  #include "llviewerprecompiledheaders.h"  #include "llviewermessage.h" +#include "boost/lexical_cast.hpp"  #include "llanimationstates.h"  #include "llaudioengine.h"  @@ -115,6 +116,11 @@  #include "llnotificationmanager.h" // +#if LL_MSVC +// disable boost::lexical_cast warning +#pragma warning (disable:4702) +#endif +  //  // Constants  // @@ -1856,6 +1862,53 @@ protected:  	}  }; +static void parse_lure_bucket(const std::string& bucket, +							  U64& region_handle, +							  LLVector3& pos, +							  LLVector3& look_at, +							  U8& region_access) +{ +	// tokenize the bucket +	typedef boost::tokenizer<boost::char_separator<char> > tokenizer; +	boost::char_separator<char> sep("|", "", boost::keep_empty_tokens); +	tokenizer tokens(bucket, sep); +	tokenizer::iterator iter = tokens.begin(); + +	S32 gx = boost::lexical_cast<S32>((*(iter)).c_str()); +	S32 gy = boost::lexical_cast<S32>((*(++iter)).c_str()); +	S32 rx = boost::lexical_cast<S32>((*(++iter)).c_str()); +	S32 ry = boost::lexical_cast<S32>((*(++iter)).c_str()); +	S32 rz = boost::lexical_cast<S32>((*(++iter)).c_str()); +	S32 lx = boost::lexical_cast<S32>((*(++iter)).c_str()); +	S32 ly = boost::lexical_cast<S32>((*(++iter)).c_str()); +	S32 lz = boost::lexical_cast<S32>((*(++iter)).c_str()); + +	// Grab region access +	region_access = SIM_ACCESS_MIN; +	if (++iter != tokens.end()) +	{ +		std::string access_str((*iter).c_str()); +		LLStringUtil::trim(access_str); +		if ( access_str == "A" ) +		{ +			region_access = SIM_ACCESS_ADULT; +		} +		else if ( access_str == "M" ) +		{ +			region_access = SIM_ACCESS_MATURE; +		} +		else if ( access_str == "PG" ) +		{ +			region_access = SIM_ACCESS_PG; +		} +	} + +	pos.setVec((F32)rx, (F32)ry, (F32)rz); +	look_at.setVec((F32)lx, (F32)ly, (F32)lz); + +	region_handle = to_region_handle(gx, gy); +} +  void process_improved_im(LLMessageSystem *msg, void **user_data)  {  	if (gNoRender) @@ -2487,10 +2540,19 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			}  			else  			{ +				LLVector3 pos, look_at; +				U64 region_handle; +				U8 region_access; +				std::string region_info = ll_safe_string((char*)binary_bucket, binary_bucket_size); +				parse_lure_bucket(region_info, region_handle, pos, look_at, region_access); + +				std::string region_access_str = LLViewerRegion::accessToString(region_access); +  				LLSD args;  				// *TODO: Translate -> [FIRST] [LAST] (maybe)  				args["NAME_SLURL"] = LLSLURL::buildCommand("agent", from_id, "about");  				args["MESSAGE"] = message; +				args["MATURITY"] = region_access_str;  				LLSD payload;  				payload["from_id"] = from_id;  				payload["lure_id"] = session_id; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index af833db9c3..8c5928224f 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -66,6 +66,7 @@  #include "llkeyframewalkmotion.h"  #include "llmutelist.h"  #include "llmoveview.h" +#include "llnotificationsutil.h"  #include "llquantize.h"  #include "llregionhandle.h"  #include "llresmgr.h" @@ -101,6 +102,8 @@  #include <boost/lexical_cast.hpp> +#define DISPLAY_AVATAR_LOAD_TIMES +  using namespace LLVOAvatarDefines;  //----------------------------------------------------------------------------- @@ -656,6 +659,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,  	mNameMute(FALSE),  	mRenderGroupTitles(sRenderGroupTitles),  	mNameAppearance(FALSE), +	mNameCloud(FALSE),  	mFirstTEMessageReceived( FALSE ),  	mFirstAppearanceMessageReceived( FALSE ),  	mCulled( FALSE ), @@ -2764,25 +2768,20 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)  		if (mNameText.notNull() && firstname && lastname)  		{ -			BOOL is_away = mSignaledAnimations.find(ANIM_AGENT_AWAY)  != mSignaledAnimations.end(); -			BOOL is_busy = mSignaledAnimations.find(ANIM_AGENT_BUSY) != mSignaledAnimations.end(); -			BOOL is_appearance = mSignaledAnimations.find(ANIM_AGENT_CUSTOMIZE) != mSignaledAnimations.end(); -			BOOL is_muted; -			if (isSelf()) -			{ -				is_muted = FALSE; -			} -			else -			{ -				is_muted = LLMuteList::getInstance()->isMuted(getID()); -			} +			const BOOL is_away = mSignaledAnimations.find(ANIM_AGENT_AWAY)  != mSignaledAnimations.end(); +			const BOOL is_busy = mSignaledAnimations.find(ANIM_AGENT_BUSY) != mSignaledAnimations.end(); +			const BOOL is_appearance = mSignaledAnimations.find(ANIM_AGENT_CUSTOMIZE) != mSignaledAnimations.end(); +			const BOOL is_muted = isSelf() ? FALSE : LLMuteList::getInstance()->isMuted(getID()); +			const BOOL is_cloud = getIsCloud();  			if (mNameString.empty() ||  				new_name ||  				(!title && !mTitle.empty()) ||  				(title && mTitle != title->getString()) ||  				(is_away != mNameAway || is_busy != mNameBusy || is_muted != mNameMute) -				|| is_appearance != mNameAppearance) +				|| is_appearance != mNameAppearance  +				|| is_cloud != mNameCloud +				)  			{  				std::string line;  				if (!sRenderGroupTitles) @@ -2836,7 +2835,12 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)  					}  					line += ")";  				} -				if (is_appearance) +				if (is_cloud) +				{ +					line += "\n"; +					line += "(" + LLTrans::getString("LoadingData") + ")"; +				} +				else if (is_appearance)  				{  					line += "\n";  					line += LLTrans::getString("AvatarEditingAppearance"); @@ -2845,6 +2849,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)  				mNameBusy = is_busy;  				mNameMute = is_muted;  				mNameAppearance = is_appearance; +				mNameCloud = is_cloud;  				mTitle = title ? title->getString() : "";  				LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR);  				mNameString = utf8str_to_wstring(line); @@ -5812,27 +5817,29 @@ BOOL LLVOAvatar::isVisible() const  		&& (mDrawable->isVisible() || mIsDummy);  } -// call periodically to keep isFullyLoaded up to date. -// returns true if the value has changed. -BOOL LLVOAvatar::updateIsFullyLoaded() +// Determine if we have enough avatar data to render +BOOL LLVOAvatar::getIsCloud()  { -    // a "heuristic" to determine if we have enough avatar data to render -    // (to avoid rendering a "Ruth" - DEV-3168) -	BOOL loading = FALSE; - -	// do we have a shape? +	// Do we have a shape?  	if (visualParamWeightsAreDefault())  	{ -		loading = TRUE; +		return TRUE;  	}  	if (!isTextureDefined(TEX_LOWER_BAKED) ||   		!isTextureDefined(TEX_UPPER_BAKED) ||   		!isTextureDefined(TEX_HEAD_BAKED))  	{ -		loading = TRUE; +		return TRUE;  	} -	 +	return FALSE; +} + +// call periodically to keep isFullyLoaded up to date. +// returns true if the value has changed. +BOOL LLVOAvatar::updateIsFullyLoaded() +{ +	const BOOL loading = getIsCloud();  	updateRuthTimer(loading);  	return processFullyLoadedChange(loading);  } @@ -5847,6 +5854,7 @@ void LLVOAvatar::updateRuthTimer(bool loading)  	if (mPreviousFullyLoaded)  	{  		mRuthTimer.reset(); +		mRuthDebugTimer.reset();  	}  	const F32 LOADING_TIMEOUT = 120.f; @@ -5875,7 +5883,17 @@ BOOL LLVOAvatar::processFullyLoadedChange(bool loading)  	mFullyLoaded = (mFullyLoadedTimer.getElapsedTimeF32() > PAUSE); -	 +#ifdef DISPLAY_AVATAR_LOAD_TIMES +	if (!mPreviousFullyLoaded && !loading && mFullyLoaded) +	{ +		llinfos << "Avatar '" << getFullname() << "' resolved in " << mRuthDebugTimer.getElapsedTimeF32() << " seconds." << llendl; +		LLSD args; +		args["TIME"] = llformat("%d",(U32)mRuthDebugTimer.getElapsedTimeF32()); +		args["NAME"] = getFullname(); +		LLNotificationsUtil::add("AvatarRezNotification",args); +	} +#endif +  	// did our loading state "change" from last call?  	const S32 UPDATE_RATE = 30;  	BOOL changed = diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index d5485413f4..8da4c226ed 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -247,7 +247,8 @@ public:  public:  	BOOL			isFullyLoaded() const;  protected: -	virtual BOOL	updateIsFullyLoaded(); +	virtual BOOL	getIsCloud(); +	BOOL			updateIsFullyLoaded();  	BOOL			processFullyLoadedChange(bool loading);  	void			updateRuthTimer(bool loading);  	F32 			calcMorphAmount(); @@ -258,6 +259,7 @@ private:  	S32				mFullyLoadedFrameCounter;  	LLFrameTimer	mFullyLoadedTimer;  	LLFrameTimer	mRuthTimer; +	LLFrameTimer	mRuthDebugTimer; // For tracking how long it takes for av to rez  /**                    State   **                                                                            ** @@ -828,6 +830,7 @@ private:  	BOOL	  		mNameBusy;  	BOOL	  		mNameMute;  	BOOL      		mNameAppearance; +	BOOL      		mNameCloud;  	BOOL      		mRenderGroupTitles;  	//-------------------------------------------------------------------- diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index c15dbeb8c6..7473adda1f 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -697,15 +697,6 @@ BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL  /*virtual*/   void LLVOAvatarSelf::updateVisualParams()  { -	for (U32 type = 0; type < WT_COUNT; type++) -	{ -		LLWearable *wearable = gAgentWearables.getTopWearable((EWearableType)type); -		if (wearable) -		{ -			wearable->writeToAvatar(); -		} -	} -  	LLVOAvatar::updateVisualParams();  } @@ -716,7 +707,14 @@ void LLVOAvatarSelf::idleUpdateAppearanceAnimation()  	gAgentWearables.animateAllWearableParams(calcMorphAmount(), FALSE);  	// apply wearable visual params to avatar -	updateVisualParams(); +	for (U32 type = 0; type < WT_COUNT; type++) +	{ +		LLWearable *wearable = gAgentWearables.getTopWearable((EWearableType)type); +		if (wearable) +		{ +			wearable->writeToAvatar(); +		} +	}  	//allow avatar to process updates  	LLVOAvatar::idleUpdateAppearanceAnimation(); @@ -1699,22 +1697,20 @@ void LLVOAvatarSelf::dumpTotalLocalTextureByteCount()  	llinfos << "Total Avatar LocTex GL:" << (gl_bytes/1024) << "KB" << llendl;  } -BOOL LLVOAvatarSelf::updateIsFullyLoaded() +BOOL LLVOAvatarSelf::getIsCloud()  { -	BOOL loading = FALSE; -  	// do we have our body parts?  	if (gAgentWearables.getWearableCount(WT_SHAPE) == 0 ||  		gAgentWearables.getWearableCount(WT_HAIR) == 0 ||  		gAgentWearables.getWearableCount(WT_EYES) == 0 ||  		gAgentWearables.getWearableCount(WT_SKIN) == 0)	  	{ -		loading = TRUE; +		return TRUE;  	}  	if (!isTextureDefined(TEX_HAIR, 0))  	{ -		loading = TRUE; +		return TRUE;  	}  	if (!mPreviousFullyLoaded) @@ -1722,13 +1718,13 @@ BOOL LLVOAvatarSelf::updateIsFullyLoaded()  		if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_LOWER].mTexLayerSet) &&  			(!isTextureDefined(TEX_LOWER_BAKED, 0)))  		{ -			loading = TRUE; +			return TRUE;  		}  		if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_UPPER].mTexLayerSet) &&  			(!isTextureDefined(TEX_UPPER_BAKED, 0)))  		{ -			loading = TRUE; +			return TRUE;  		}  		for (U32 i = 0; i < mBakedTextureDatas.size(); i++) @@ -1736,23 +1732,23 @@ BOOL LLVOAvatarSelf::updateIsFullyLoaded()  			if (i == BAKED_SKIRT && !isWearingWearableType(WT_SKIRT))  				continue; -			BakedTextureData& texture_data = mBakedTextureDatas[i]; +			const BakedTextureData& texture_data = mBakedTextureDatas[i];  			if (!isTextureDefined(texture_data.mTextureIndex, 0))  				continue;  			// Check for the case that texture is defined but not sufficiently loaded to display anything. -			LLViewerTexture* baked_img = getImage( texture_data.mTextureIndex, 0 ); +			const LLViewerTexture* baked_img = getImage( texture_data.mTextureIndex, 0 );  			if (!baked_img || !baked_img->hasGLTexture())  			{ -				loading = TRUE; +				return TRUE;  			} -  		}  	} -	return processFullyLoadedChange(loading); +	return FALSE;  } +  const LLUUID& LLVOAvatarSelf::grabLocalTexture(ETextureIndex type, U32 index) const  {  	if (canGrabLocalTexture(type, index)) diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 4856e82275..337d445eac 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -122,7 +122,7 @@ public:  	// Loading state  	//--------------------------------------------------------------------  public: -	/*virtual*/ BOOL    updateIsFullyLoaded(); +	/*virtual*/ BOOL    getIsCloud();  private:  	//-------------------------------------------------------------------- diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 6b052b8e99..594435475f 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -3293,7 +3293,6 @@ static LLFastTimer::DeclareTimer FTM_REBUILD_VBO("VBO Rebuilt");  void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  { -	llpushcallstacks ;  	if (group->changeLOD())  	{  		group->mLastUpdateDistance = group->mDistance; @@ -3524,7 +3523,6 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  static LLFastTimer::DeclareTimer FTM_VOLUME_GEOM("Volume Geometry");  void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)  { -	llpushcallstacks ;  	llassert(group);  	if (group && group->isState(LLSpatialGroup::MESH_DIRTY) && !group->isState(LLSpatialGroup::GEOM_DIRTY))  	{ @@ -3616,7 +3614,6 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)  void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort)  { -	llpushcallstacks ;  	//calculate maximum number of vertices to store in a single buffer  	U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcStride(group->mSpatialPartition->mVertexDataMask);  	max_vertices = llmin(max_vertices, (U32) 65535); diff --git a/indra/newview/res/resource.h b/indra/newview/res/resource.h index da27e47dfb..6cabd5e10b 100644 --- a/indra/newview/res/resource.h +++ b/indra/newview/res/resource.h @@ -170,14 +170,12 @@  #define IDC_COMBO1                      1138  #define IDC_COMBO_FARM                  1138  #define ID_TESTMENU_TEST                40001 -#define IDC_STATIC                      -1  // Next default values for new objects  //   #ifdef APSTUDIO_INVOKED  #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE        159 -#define _APS_NEXT_RESOURCE_VALUE        167 +#define _APS_NEXT_RESOURCE_VALUE        173  #define _APS_NEXT_COMMAND_VALUE         40002  #define _APS_NEXT_CONTROL_VALUE         1139  #define _APS_NEXT_SYMED_VALUE           101 diff --git a/indra/newview/res/toolbuy.cur b/indra/newview/res/toolbuy.cur Binary files differnew file mode 100644 index 0000000000..a1bc278116 --- /dev/null +++ b/indra/newview/res/toolbuy.cur diff --git a/indra/newview/res/toolopen.cur b/indra/newview/res/toolopen.cur Binary files differnew file mode 100644 index 0000000000..a72cdfe4c0 --- /dev/null +++ b/indra/newview/res/toolopen.cur diff --git a/indra/newview/res/toolsit.cur b/indra/newview/res/toolsit.cur Binary files differnew file mode 100644 index 0000000000..6327bdb281 --- /dev/null +++ b/indra/newview/res/toolsit.cur diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc index 6a1c1cb377..12a09392f6 100644 --- a/indra/newview/res/viewerRes.rc +++ b/indra/newview/res/viewerRes.rc @@ -119,6 +119,9 @@ TOOLPIPETTE             CURSOR                  "toolpipette.cur"  TOOLPLAY                CURSOR                  "toolplay.cur"  TOOLPAUSE               CURSOR                  "toolpause.cur"  TOOLMEDIAOPEN           CURSOR                  "toolmediaopen.cur" +TOOLBUY                 CURSOR                  "toolbuy.cur" +TOOLOPEN                CURSOR                  "toolopen.cur" +TOOLSIT                 CURSOR                  "toolsit.cur"  /////////////////////////////////////////////////////////////////////////////  // diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index c2f25c84b8..97387e9e87 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -1725,7 +1725,7 @@ Inventarobjekt(e) verschieben?  	<notification name="ClickActionNotPayable">  		Achtung: Die Klickaktion „Objekt bezahlen" wurde eingestellt. Diese funktioniert jedoch nicht, wenn ein Skript mit einer Geldtransaktion () hinzugefügt wird.  		<form name="form"> -			<ignore name="ignore" text="I habe die Aktion „Objekt bezahlen" eingestellt, während ich ein Objekt gebaut habe, dass kein Geld()-Skript enthält."/> +			<ignore name="ignore" text="Ich habe die Aktion „Objekt bezahlen" eingestellt, während ich ein Objekt gebaut habe, dass kein Geld()-Skript enthält."/>  		</form>  	</notification>  	<notification name="OpenObjectCannotCopy"> diff --git a/indra/newview/skins/default/xui/de/panel_status_bar.xml b/indra/newview/skins/default/xui/de/panel_status_bar.xml index 803bd1b5ab..0e182fa417 100644 --- a/indra/newview/skins/default/xui/de/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/de/panel_status_bar.xml @@ -22,7 +22,7 @@  		[AMT] L$  	</panel.string>  	<button label="" label_selected="" name="buycurrency" tool_tip="Mein Kontostand"/> -	<button label=" " name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/> +	<button label="Kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/>  	<text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)">  		24:00 H PST  	</text> diff --git a/indra/newview/skins/default/xui/en/floater_joystick.xml b/indra/newview/skins/default/xui/en/floater_joystick.xml index b8156a174d..6e1bb8fcd0 100644 --- a/indra/newview/skins/default/xui/en/floater_joystick.xml +++ b/indra/newview/skins/default/xui/en/floater_joystick.xml @@ -6,7 +6,7 @@   name="Joystick"   help_topic="joystick"   title="JOYSTICK CONFIGURATION" - width="550"> + width="569">      <floater.string       name="NoDevice">          no device detected @@ -148,7 +148,7 @@       halign="right"       height="10"       layout="topleft" -     left="12" +     left="37"       mouse_opaque="false"       name="Control Modes:"       top="110" @@ -161,7 +161,7 @@       halign="center"       label="Avatar"       layout="topleft" -     left="125" +     left="150"       name="JoystickAvatarEnabled"       width="60" />      <check_box @@ -170,7 +170,7 @@       halign="center"       label="Build"       layout="topleft" -     left="194" +     left="219"       name="JoystickBuildEnabled"       width="60" />      <check_box @@ -179,14 +179,14 @@       halign="center"       label="Flycam"       layout="topleft" -     left="262" +     left="289"       name="JoystickFlycamEnabled"       width="60" />      <stat_view       height="250"       label="Joystick Monitor"       layout="topleft" -     left="340" +     left="359"       name="axis_view"       show_label="true"       top="142" @@ -250,9 +250,9 @@       bottom="144"       halign="right"       layout="topleft" -     left="20" +     left="3"       name="XScale" -     width="94"> +     width="140">          X Scale      </text>      <spinner @@ -261,7 +261,7 @@       decimal_digits="2"       label_width="0"       layout="topleft" -     left="125" +     left="150"       max_val="50"       min_val="-50"       name="AvatarAxisScale1" @@ -272,7 +272,7 @@       decimal_digits="2"       label_width="0"       layout="topleft" -     left="195" +     left="220"       max_val="1024"       min_val="-1024"       name="BuildAxisScale1" @@ -283,7 +283,7 @@       decimal_digits="2"       label_width="0"       layout="topleft" -     left="265" +     left="290"       max_val="1024"       min_val="-1024"       name="FlycamAxisScale1" @@ -294,9 +294,9 @@       bottom="164"       halign="right"       layout="topleft" -     left="20" +     left="3"       name="YScale" -     width="94"> +     width="140">          Y Scale      </text>      <spinner @@ -305,7 +305,7 @@       decimal_digits="2"       label_width="0"       layout="topleft" -     left="125" +     left="150"       max_val="50"       min_val="-50"       name="AvatarAxisScale2" @@ -316,7 +316,7 @@       decimal_digits="2"       label_width="0"       layout="topleft" -     left="195" +     left="220"       max_val="1024"       min_val="-1024"       name="BuildAxisScale2" @@ -327,7 +327,7 @@       decimal_digits="2"       label_width="0"       layout="topleft" -     left="265" +     left="290"       max_val="1024"       min_val="-1024"       name="FlycamAxisScale2" @@ -338,9 +338,9 @@       bottom="184"       halign="right"       layout="topleft" -     left="20" +     left="3"       name="ZScale" -     width="94"> +     width="140">          Z Scale      </text>      <spinner @@ -349,7 +349,7 @@       decimal_digits="2"       label_width="0"       layout="topleft" -     left="125" +     left="150"       max_val="50"       min_val="-50"       name="AvatarAxisScale0" @@ -360,7 +360,7 @@       decimal_digits="2"       label_width="0"       layout="topleft" -     left="195" +     left="220"       max_val="1024"       min_val="-1024"       name="BuildAxisScale0" @@ -371,7 +371,7 @@       decimal_digits="2"       label_width="0"       layout="topleft" -     left="265" +     left="290"       max_val="1024"       min_val="-1024"       name="FlycamAxisScale0" @@ -382,9 +382,9 @@       bottom="204"       halign="right"       layout="topleft" -     left="20" +     left="3"       name="PitchScale" -     width="94"> +     width="140">          Pitch Scale      </text>      <spinner @@ -393,7 +393,7 @@       decimal_digits="2"       label_width="0"       layout="topleft" -     left="125" +     left="150"       max_val="1024"       min_val="-1024"       name="AvatarAxisScale4" @@ -404,7 +404,7 @@       decimal_digits="2"       label_width="0"       layout="topleft" -     left="195" +     left="220"       max_val="1024"       min_val="-1024"       name="BuildAxisScale4" @@ -415,7 +415,7 @@       decimal_digits="2"       label_width="0"       layout="topleft" -     left="265" +     left="290"       max_val="1024"       min_val="-1024"       name="FlycamAxisScale4" @@ -426,9 +426,9 @@       bottom="224"       halign="right"       layout="topleft" -     left="20" +     left="3"       name="YawScale" -     width="94"> +     width="140">          Yaw Scale      </text>      <spinner @@ -437,7 +437,7 @@       decimal_digits="2"       label_width="0"       layout="topleft" -     left="125" +     left="150"       max_val="1024"       min_val="-1024"       name="AvatarAxisScale5" @@ -448,7 +448,7 @@       decimal_digits="2"       label_width="0"       layout="topleft" -     left="195" +     left="220"       max_val="1024"       min_val="-1024"       name="BuildAxisScale5" @@ -459,7 +459,7 @@       decimal_digits="2"       label_width="0"       layout="topleft" -     left="265" +     left="290"       max_val="1024"       min_val="-1024"       name="FlycamAxisScale5" @@ -470,9 +470,9 @@       bottom="244"       halign="right"       layout="topleft" -     left="20" +     left="3"       name="RollScale" -     width="94"> +     width="140">          Roll Scale      </text>      <spinner @@ -481,7 +481,7 @@       decimal_digits="2"       label_width="0"       layout="topleft" -     left="195" +     left="220"       max_val="1024"       min_val="-1024"       name="BuildAxisScale3" @@ -492,7 +492,7 @@       decimal_digits="2"       label_width="0"       layout="topleft" -     left="265" +     left="290"       max_val="1024"       min_val="-1024"       name="FlycamAxisScale3" @@ -503,9 +503,9 @@       bottom="274"       halign="right"       layout="topleft" -     left="20" +     left="3"       name="XDeadZone" -     width="94"> +     width="140">          X Dead Zone      </text>      <spinner @@ -515,7 +515,7 @@       increment="0.01"       label_width="0"       layout="topleft" -     left="125" +     left="150"       name="AvatarAxisDeadZone1"       width="56" />      <spinner @@ -525,7 +525,7 @@       increment="0.01"       label_width="0"       layout="topleft" -     left="195" +     left="220"       name="BuildAxisDeadZone1"       width="56" />      <spinner @@ -535,7 +535,7 @@       increment="0.01"       label_width="0"       layout="topleft" -     left="265" +     left="290"       name="FlycamAxisDeadZone1"       width="56" />      <text @@ -544,9 +544,9 @@       bottom="294"       halign="right"       layout="topleft" -     left="20" +     left="3"       name="YDeadZone" -     width="94"> +     width="140">          Y Dead Zone      </text>      <spinner @@ -556,7 +556,7 @@       increment="0.01"       label_width="0"       layout="topleft" -     left="125" +     left="150"       name="AvatarAxisDeadZone2"       width="56" />      <spinner @@ -566,7 +566,7 @@       increment="0.01"       label_width="0"       layout="topleft" -     left="195" +     left="220"       name="BuildAxisDeadZone2"       width="56" />      <spinner @@ -576,7 +576,7 @@       increment="0.01"       label_width="0"       layout="topleft" -     left="265" +     left="290"       name="FlycamAxisDeadZone2"       width="56" />      <text @@ -585,9 +585,9 @@       bottom="314"       halign="right"       layout="topleft" -     left="20" +     left="3"       name="ZDeadZone" -     width="94"> +     width="140">          Z Dead Zone      </text>      <spinner @@ -597,7 +597,7 @@       increment="0.01"       label_width="0"       layout="topleft" -     left="125" +     left="150"       name="AvatarAxisDeadZone0"       width="56" />      <spinner @@ -607,7 +607,7 @@       increment="0.01"       label_width="0"       layout="topleft" -     left="195" +     left="220"       name="BuildAxisDeadZone0"       width="56" />      <spinner @@ -617,7 +617,7 @@       increment="0.01"       label_width="0"       layout="topleft" -     left="265" +     left="290"       name="FlycamAxisDeadZone0"       width="56" />      <text @@ -626,9 +626,9 @@       bottom="334"       halign="right"       layout="topleft" -     left="20" +     left="2"       name="PitchDeadZone" -     width="94"> +     width="140">          Pitch Dead Zone      </text>      <spinner @@ -638,7 +638,7 @@       increment="0.01"       label_width="0"       layout="topleft" -     left="125" +     left="150"       name="AvatarAxisDeadZone4"       width="56" />      <spinner @@ -648,7 +648,7 @@       increment="0.01"       label_width="0"       layout="topleft" -     left="195" +     left="220"       name="BuildAxisDeadZone4"       width="56" />      <spinner @@ -658,7 +658,7 @@       increment="0.01"       label_width="0"       layout="topleft" -     left="265" +     left="290"       name="FlycamAxisDeadZone4"       width="56" />      <text @@ -667,9 +667,9 @@       bottom="354"       halign="right"       layout="topleft" -     left="20" +     left="3"       name="YawDeadZone" -     width="94"> +     width="140">          Yaw Dead Zone      </text>      <spinner @@ -679,7 +679,7 @@       increment="0.01"       label_width="0"       layout="topleft" -     left="125" +     left="150"       name="AvatarAxisDeadZone5"       width="56" />      <spinner @@ -689,7 +689,7 @@       increment="0.01"       label_width="0"       layout="topleft" -     left="195" +     left="220"       name="BuildAxisDeadZone5"       width="56" />      <spinner @@ -699,7 +699,7 @@       increment="0.01"       label_width="0"       layout="topleft" -     left="265" +     left="290"       name="FlycamAxisDeadZone5"       width="56" />      <text @@ -708,9 +708,9 @@       bottom="374"       halign="right"       layout="topleft" -     left="20" +     left="3"       name="RollDeadZone" -     width="94"> +     width="140">          Roll Dead Zone      </text>      <spinner @@ -720,7 +720,7 @@       increment="0.01"       label_width="0"       layout="topleft" -     left="195" +     left="220"       name="BuildAxisDeadZone3"       width="56" />      <spinner @@ -730,7 +730,7 @@       increment="0.01"       label_width="0"       layout="topleft" -     left="265" +     left="290"       name="FlycamAxisDeadZone3"       width="56" />      <text @@ -739,9 +739,9 @@       bottom="402"       halign="right"       layout="topleft" -     left="20" +     left="3"       name="Feathering" -     width="94"> +     width="140">          Feathering      </text>      <slider @@ -752,7 +752,7 @@       increment="1"       initial_value="0.7"       layout="topleft" -     left="116" +     left="141"       max_val="32"       min_val="1"       name="AvatarFeathering" @@ -795,9 +795,9 @@       bottom="430"       halign="right"       layout="topleft" -     left="20" +     left="3"       name="ZoomScale2" -     width="94"> +     width="140">          Zoom Scale      </text>      <spinner @@ -806,7 +806,7 @@       decimal_digits="2"       label_width="0"       layout="topleft" -     left="265" +     left="290"       max_val="1024"       min_val="-1024"       name="FlycamAxisScale6" @@ -817,9 +817,9 @@       bottom="450"       halign="right"       layout="topleft" -     left="20" +     left="3"       name="ZoomDeadZone" -     width="96"> +     width="140">          Zoom Dead Zone      </text>      <spinner @@ -829,7 +829,7 @@       increment="0.01"       label_width="0"       layout="topleft" -     left="265" +     left="290"       name="FlycamAxisDeadZone6"       width="56" />      <button @@ -837,10 +837,10 @@       height="22"       label="SpaceNavigator Defaults"       layout="topleft" -     left="340" +     left="359"       name="SpaceNavigatorDefaults"       top="429" -     width="184" /> +     width="200" />      <button       follows="right|bottom"       height="20" @@ -850,7 +850,7 @@       left_delta="0"       name="ok_btn"       top_pad="9" -     width="90" /> +     width="98" />      <button       follows="right|bottom"       height="20" @@ -860,5 +860,5 @@       left_pad="4"       name="cancel_btn"       top_delta="0" -     width="90" /> +     width="98" />  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml index 291f8f6f51..233ab2c1b2 100644 --- a/indra/newview/skins/default/xui/en/floater_world_map.xml +++ b/indra/newview/skins/default/xui/en/floater_world_map.xml @@ -496,7 +496,7 @@       top_delta="-1"       name="DoSearch"       tool_tip="Search for region" -     width="58"> +     width="62">  		<button.commit_callback  		function="WMap.Location" />      </button> diff --git a/indra/newview/skins/default/xui/en/menu_people_groups.xml b/indra/newview/skins/default/xui/en/menu_people_groups.xml index afa680139d..8f89d37dbb 100644 --- a/indra/newview/skins/default/xui/en/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/en/menu_people_groups.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <menu name="menu_group_plus"   left="0" bottom="0" visible="false" - mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false"> + mouse_opaque="false" opaque="true" color="MenuDefaultBgColor">    <menu_item_call     label="View Info"     name="View Info"> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 9ee4e13f3c..ca922bf724 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -5165,7 +5165,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th     type="offer">  [NAME_SLURL] has offered to teleport you to their location: -[MESSAGE] +[MESSAGE], ([MATURITY])      <form name="form">        <button         index="0" @@ -5968,6 +5968,12 @@ The button will be shown when there is enough space for it.  Drag items from inventory onto a person in the resident picker    </notification> +  <notification +   icon="notifytip.tga" +   name="AvatarRezNotification" +   type="notifytip"> +Avatar '[NAME]' rezzed in [TIME] seconds. +  </notification>    <global name="UnsupportedCPU">  - Your CPU speed does not meet the minimum requirements. diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index 7ec1ca2e2e..96c76576c0 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -119,7 +119,7 @@  	     commit_on_focus_lost="false"  	     follows="right|top"  	     halign="right" -	     height="22" +	     height="23"  	     label="Search"  	     layout="topleft"  	     right="-10" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 233137a76b..8131b75b70 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -477,7 +477,7 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t           label="Share"           layout="topleft"           name="share_btn" -         width="85" /> +         width="62" />          <button           follows="bottom|left"           left_pad="3" diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml index a43b244fa0..9725e9952a 100644 --- a/indra/newview/skins/default/xui/en/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -321,6 +321,7 @@               follows="all"               height="223"               layout="topleft" +             single_expansion="true"               left="0"               name="advanced_info_accordion"               top_pad="10" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index b0bf51c214..813f59ff89 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -148,6 +148,8 @@  	<!-- Group name: text shown for LLUUID::null -->  	<string name="GroupNameNone">(none)</string> +	<string name="AvalineCaller">Avaline Caller [ORDER]</string> +  	<!-- Asset errors. Used in llassetstorage.cpp, translation from error code to error message. -->  	<string name="AssetErrorNone">No error</string>  	<string name="AssetErrorRequestFailed">Asset request: failed</string> diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml index 49bf2a7442..6118a63872 100644 --- a/indra/newview/skins/default/xui/es/floater_about_land.xml +++ b/indra/newview/skins/default/xui/es/floater_about_land.xml @@ -264,7 +264,7 @@ Vaya al menú Mundo > Acerca del terreno o seleccione otra parcela para ver s  				[COUNT]  			</text>  			<text left="4" name="Autoreturn" width="412"> -				Devolución automática de objetos de otros (en min., 0 para desactivarla): +				Devolución automát. de objetos de otros (en min., 0 la desactiva):  			</text>  			<line_editor name="clean other time" right="-20"/>  			<text name="Object Owners:" width="150"> @@ -275,7 +275,7 @@ Vaya al menú Mundo > Acerca del terreno o seleccione otra parcela para ver s  			<name_list name="owner list">  				<name_list.columns label="Tipo" name="type"/>  				<name_list.columns label="Nombre" name="name"/> -				<name_list.columns label="Número" name="count"/> +				<name_list.columns label="Núm." name="count"/>  				<name_list.columns label="Más recientes" name="mostrecent"/>  			</name_list>  		</panel> diff --git a/indra/newview/skins/default/xui/es/floater_joystick.xml b/indra/newview/skins/default/xui/es/floater_joystick.xml index dbd2e4f04e..2c1804bd90 100644 --- a/indra/newview/skins/default/xui/es/floater_joystick.xml +++ b/indra/newview/skins/default/xui/es/floater_joystick.xml @@ -16,7 +16,7 @@  		Modos de control:  	</text>  	<check_box label="Avatar" name="JoystickAvatarEnabled"/> -	<check_box label="Construir" left="192" name="JoystickBuildEnabled"/> +	<check_box label="Construir" name="JoystickBuildEnabled"/>  	<check_box label="Flycam" name="JoystickFlycamEnabled"/>  	<text name="XScale">  		Escala: X @@ -27,7 +27,7 @@  	<text name="ZScale">  		Escala: Z  	</text> -	<text left="3" name="PitchScale" width="115"> +	<text name="PitchScale">  		Escala: arriba/abajo  	</text>  	<text name="YawScale"> @@ -45,10 +45,10 @@  	<text name="ZDeadZone">  		Zona muerta Z  	</text> -	<text left="3" name="PitchDeadZone" width="115"> +	<text name="PitchDeadZone">  		Zona muerta arri./aba.  	</text> -	<text left="3" name="YawDeadZone" width="115"> +	<text name="YawDeadZone">  		Zona muerta izq./der.  	</text>  	<text name="RollDeadZone"> @@ -63,7 +63,7 @@  	<text name="ZoomDeadZone">  		Zona muerta zoom  	</text> -	<button font="SansSerifSmall" label="Por defecto del SpaceNavigator" left="330" name="SpaceNavigatorDefaults" width="210"/> +	<button font="SansSerifSmall" label="Por defecto del SpaceNavigator" name="SpaceNavigatorDefaults"/>  	<button label="OK" label_selected="OK" left="330" name="ok_btn"/>  	<button label="Cancelar" label_selected="Cancelar" left_delta="120" name="cancel_btn"/>  	<stat_view label="Monitor del joystick" name="axis_view"> diff --git a/indra/newview/skins/default/xui/es/panel_region_general.xml b/indra/newview/skins/default/xui/es/panel_region_general.xml index 9ee7bef493..67800b2c6f 100644 --- a/indra/newview/skins/default/xui/es/panel_region_general.xml +++ b/indra/newview/skins/default/xui/es/panel_region_general.xml @@ -32,7 +32,7 @@  	</text>  	<icons_combo_box label="'Mature'" name="access_combo">  		<icons_combo_box.item label="'Adult'" name="Adult" value="42"/> -		<icons_combo_box.item label="'Mature'" name="Mature" value="21"/> +		<icons_combo_box.item label="Moderado" name="Mature" value="21"/>  		<icons_combo_box.item label="'PG'" name="PG" value="13"/>  	</icons_combo_box>  	<button label="Aplicar" name="apply_btn"/> diff --git a/indra/newview/skins/default/xui/fr/floater_joystick.xml b/indra/newview/skins/default/xui/fr/floater_joystick.xml index e00f9564e8..02ac21bf82 100644 --- a/indra/newview/skins/default/xui/fr/floater_joystick.xml +++ b/indra/newview/skins/default/xui/fr/floater_joystick.xml @@ -26,7 +26,7 @@  	<text name="ZScale">  		Échelle des Z  	</text> -	<text left="9" name="PitchScale" width="104"> +	<text name="PitchScale">  		Échelle du tangage  	</text>  	<text name="YawScale"> @@ -44,13 +44,13 @@  	<text name="ZDeadZone">  		Zone neutre Z  	</text> -	<text left="4" name="PitchDeadZone" width="116"> +	<text name="PitchDeadZone">  		Zone neutre tangage  	</text> -	<text name="YawDeadZone" left="10" width="104"> +	<text name="YawDeadZone">  		Zone neutre lacet  	</text> -	<text name="RollDeadZone" left="10" width="104"> +	<text name="RollDeadZone">  		Zone neutre roulis  	</text>  	<text name="Feathering"> @@ -59,7 +59,7 @@  	<text name="ZoomScale2">  		Échelle du zoom  	</text> -	<text left="6" name="ZoomDeadZone" width="120"> +	<text name="ZoomDeadZone">  		Zone neutre du zoom  	</text>  	<button label="Options par défaut du joystick" name="SpaceNavigatorDefaults"/> diff --git a/indra/newview/skins/default/xui/it/floater_joystick.xml b/indra/newview/skins/default/xui/it/floater_joystick.xml index 3eff0cfceb..3d60ded7ab 100644 --- a/indra/newview/skins/default/xui/it/floater_joystick.xml +++ b/indra/newview/skins/default/xui/it/floater_joystick.xml @@ -16,7 +16,7 @@  		Modalità di controllo:  	</text>  	<check_box label="Avatar" name="JoystickAvatarEnabled"/> -	<check_box label="Costruire" left="192" name="JoystickBuildEnabled"/> +	<check_box label="Costruire" name="JoystickBuildEnabled"/>  	<check_box label="Camera dall'alto" name="JoystickFlycamEnabled"/>  	<text name="XScale">  		Regolazione X @@ -27,13 +27,13 @@  	<text name="ZScale">  		Regolazione Z  	</text> -	<text left="3" name="PitchScale" width="112"> +	<text name="PitchScale">  		Regolazione: Pitch  	</text> -	<text left="3" name="YawScale" width="112"> +	<text name="YawScale">  		Regolazione: Yaw  	</text> -	<text left="3" name="RollScale" width="112"> +	<text name="RollScale">  		Regolazione: Roll  	</text>  	<text name="XDeadZone"> @@ -45,22 +45,22 @@  	<text name="ZDeadZone">  		Angolo morto Z  	</text> -	<text left="3" name="PitchDeadZone" width="112"> +	<text name="PitchDeadZone">  		Angolo morto: Pitch  	</text> -	<text left="3" name="YawDeadZone" width="112"> +	<text name="YawDeadZone">  		Angolo morto: Yaw  	</text> -	<text left="3" name="RollDeadZone" width="112"> +	<text name="RollDeadZone">  		Angolo morto: Roll  	</text>  	<text name="Feathering">  		Smussamento  	</text> -	<text left="6" name="ZoomScale2" width="135"> +	<text  name="ZoomScale2">  		Regolazione dello zoom  	</text> -	<text left="6" name="ZoomDeadZone" width="135"> +	<text name="ZoomDeadZone" width="140">  		Angolo morto dello zoom  	</text>  	<button label="SpaceNavigator Defaults" name="SpaceNavigatorDefaults"/> diff --git a/indra/newview/skins/default/xui/it/panel_group_roles.xml b/indra/newview/skins/default/xui/it/panel_group_roles.xml index ef6f85390a..1769ef748d 100644 --- a/indra/newview/skins/default/xui/it/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/it/panel_group_roles.xml @@ -6,23 +6,23 @@  	<panel.string name="want_apply_text">  		Vuoi salvare le modifiche?  	</panel.string> -	<tab_container height="164" name="roles_tab_container"> -		<panel height="148" label="MEMBRI" name="members_sub_tab" tool_tip="Membri"> +	<tab_container name="roles_tab_container"> +		<panel label="MEMBRI" name="members_sub_tab" tool_tip="Membri">  			<panel.string name="help_text">  				Puoi aggiungere o rimuovere i ruoli assegnati ai membri.   Seleziona più membri tenendo premuto il tasto Ctrl e   cliccando sui loro nomi.  			</panel.string>  			<filter_editor label="Filtra Membri" name="filter_input"/> -			<name_list bottom_delta="-105" height="104" name="member_list"> +			<name_list name="member_list">  				<name_list.columns label="Socio" name="name"/>  				<name_list.columns label="Donazioni" name="donated"/>  				<name_list.columns label="Stato" name="online"/>  			</name_list> -			<button label="Invita" name="member_invite" width="165"/> +			<button label="Invita" name="member_invite"/>  			<button label="Espelli" name="member_eject"/>  		</panel> -		<panel height="148" label="RUOLI" name="roles_sub_tab"> +		<panel label="RUOLI" name="roles_sub_tab">  			<panel.string name="help_text">  				I ruoli hanno un titolo con un elenco di abilità permesse  che i membri possono eseguire. I membri possono avere @@ -36,7 +36,7 @@ fra cui il ruolo base o "Tutti" e il ruolo del Proprietario, ovvero il  				Inv_FolderClosed  			</panel.string>  			<filter_editor label="Filtra i ruoli" name="filter_input"/> -			<scroll_list bottom_delta="-104" height="104" name="role_list"> +			<scroll_list name="role_list">  				<scroll_list.columns label="Ruolo" name="name"/>  				<scroll_list.columns label="Titolo" name="title"/>  				<scroll_list.columns label="#" name="members"/> diff --git a/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml index 1fe6ad25ed..a9897c7ae4 100644 --- a/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml @@ -13,10 +13,10 @@  	</layout_stack>  	<layout_stack name="media_controls">  		<layout_panel name="back"> -			<button name="back_btn" tool_tip="Navigate back"/> +			<button name="back_btn" tool_tip="前へ"/>  		</layout_panel>  		<layout_panel name="fwd"> -			<button name="fwd_btn" tool_tip="Navigate forward"/> +			<button name="fwd_btn" tool_tip="次へ"/>  		</layout_panel>  		<layout_panel name="home">  			<button name="home_btn" tool_tip="ホームページ"/> @@ -51,10 +51,10 @@  			<slider_bar initial_value="0.5" name="media_play_slider" tool_tip="ムービー再生進行"/>  		</layout_panel>  		<layout_panel name="skip_back"> -			<button name="skip_back_btn" tool_tip="Step back"/> +			<button name="skip_back_btn" tool_tip="前にステップ"/>  		</layout_panel>  		<layout_panel name="skip_forward"> -			<button name="skip_forward_btn" tool_tip="Step forward"/> +			<button name="skip_forward_btn" tool_tip="次にステップ"/>  		</layout_panel>  		<layout_panel name="media_volume">  			<button name="media_mute_button" tool_tip="ミュート"/> @@ -64,7 +64,7 @@  			<button name="zoom_frame_btn" tool_tip="メディアにズームイン"/>  		</layout_panel>  		<layout_panel name="close"> -			<button name="close_btn" tool_tip="Zoom Back"/> +			<button name="close_btn" tool_tip="ズームバック"/>  		</layout_panel>  		<layout_panel name="new_window">  			<button name="new_window_btn" tool_tip="URL をブラウザで開く"/> diff --git a/indra/newview/skins/default/xui/nl/floater_joystick.xml b/indra/newview/skins/default/xui/nl/floater_joystick.xml index 505e3cd719..1d590dc1f3 100644 --- a/indra/newview/skins/default/xui/nl/floater_joystick.xml +++ b/indra/newview/skins/default/xui/nl/floater_joystick.xml @@ -45,7 +45,7 @@  	<text name="ZDeadZone">  		Z dode zone  	</text> -	<text name="PitchDeadZone" left="4" width="110"> +	<text name="PitchDeadZone">  		Stampen dode zone  	</text>  	<text name="YawDeadZone"> diff --git a/indra/newview/skins/default/xui/pl/floater_joystick.xml b/indra/newview/skins/default/xui/pl/floater_joystick.xml index 78742c39d1..2b1e362b98 100644 --- a/indra/newview/skins/default/xui/pl/floater_joystick.xml +++ b/indra/newview/skins/default/xui/pl/floater_joystick.xml @@ -1,108 +1,108 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Joystick" title="KONFIGURACJA JOYSTICKA" width="590"> +<floater name="Joystick" title="KONFIGURACJA JOYSTICKA">  	<check_box label="Aktywuj Joystick:" name="enable_joystick"/>  	<text left="130" name="joystick_type" width="360"/>  	<spinner label="Kalibracja Osi X" label_width="130" left="20" name="JoystickAxis1" width="170"/>  	<spinner label="Kalibracja Osi Y" label_width="130" left="210" name="JoystickAxis2" width="170"/> -	<spinner label="Kalibracja Osi Z" label_width="130" left="400" name="JoystickAxis0" width="170"/> +	<spinner label="Kalibracja Osi Z" label_width="100" left="400" name="JoystickAxis0" width="140"/>  	<spinner label="Kalibracja wznoszenia" label_width="130" left="20" name="JoystickAxis4" width="170"/>  	<spinner label="Kalibracja wychylania" label_width="130" left="210" name="JoystickAxis5" width="170"/> -	<spinner label="Kalibracja obrotu" label_width="130" left="400" name="JoystickAxis3" width="170"/> +	<spinner label="Kalibracja obrotu" label_width="100" left="400" name="JoystickAxis3" width="140"/>  	<spinner label="Kalibracja powiększania" label_width="130" name="JoystickAxis6" width="170"/>  	<check_box label="Bezpośrednie" left="205" name="ZoomDirect"/>  	<check_box label="Kursor 3D" left="340" name="Cursor3D"/>  	<check_box label="Automatyczne" left="450" name="AutoLeveling"/> -	<text left="22" name="Control Modes:"> +	<text name="Control Modes:">  		Kontroluj:  	</text> -	<check_box label="Awatara" left="130" name="JoystickAvatarEnabled" width="90"/> -	<check_box label="Budowanie" left="205" name="JoystickBuildEnabled" width="90"/> -	<check_box label="Kamerę podczas latania" left="282" name="JoystickFlycamEnabled" width="90"/> -	<text name="XScale" width="104"> +	<check_box label="Awatara" name="JoystickAvatarEnabled" width="90"/> +	<check_box label="Budowanie" name="JoystickBuildEnabled" width="90"/> +	<check_box label="Kamerę podczas latania" left="300" name="JoystickFlycamEnabled" width="90"/> +	<text name="XScale">  		Skala X  	</text> -	<spinner left="133" name="AvatarAxisScale1"/> -	<spinner left="208" name="BuildAxisScale1"/> -	<spinner left="283" name="FlycamAxisScale1"/> -	<text name="YScale" width="104"> +	<spinner name="AvatarAxisScale1"/> +	<spinner name="BuildAxisScale1"/> +	<spinner left="300" name="FlycamAxisScale1"/> +	<text name="YScale">  		Skala Y  	</text> -	<spinner left="133" name="AvatarAxisScale2"/> -	<spinner left="208" name="BuildAxisScale2"/> -	<spinner left="283" name="FlycamAxisScale2"/> -	<text name="ZScale" width="104"> +	<spinner name="AvatarAxisScale2"/> +	<spinner name="BuildAxisScale2"/> +	<spinner left="300" name="FlycamAxisScale2"/> +	<text name="ZScale">  		Skala Z  	</text> -	<spinner left="133" name="AvatarAxisScale0"/> -	<spinner left="208" name="BuildAxisScale0"/> -	<spinner left="283" name="FlycamAxisScale0"/> -	<text name="PitchScale" width="104"> +	<spinner name="AvatarAxisScale0"/> +	<spinner name="BuildAxisScale0"/> +	<spinner left="300" name="FlycamAxisScale0"/> +	<text name="PitchScale">  		Skala wznoszenia  	</text> -	<spinner left="133" name="AvatarAxisScale4"/> -	<spinner left="208" name="BuildAxisScale4"/> -	<spinner left="283" name="FlycamAxisScale4"/> -	<text name="YawScale" width="104"> +	<spinner name="AvatarAxisScale4"/> +	<spinner name="BuildAxisScale4"/> +	<spinner left="300" name="FlycamAxisScale4"/> +	<text name="YawScale">  		Skala odchylania  	</text> -	<spinner left="133" name="AvatarAxisScale5"/> -	<spinner left="208" name="BuildAxisScale5"/> -	<spinner left="283" name="FlycamAxisScale5"/> -	<text name="RollScale" width="104"> +	<spinner name="AvatarAxisScale5"/> +	<spinner name="BuildAxisScale5"/> +	<spinner left="300" name="FlycamAxisScale5"/> +	<text name="RollScale">  		Skala obrotu  	</text> -	<spinner left="208" name="BuildAxisScale3"/> -	<spinner left="283" name="FlycamAxisScale3"/> -	<text name="XDeadZone" width="104"> +	<spinner name="BuildAxisScale3"/> +	<spinner left="300" name="FlycamAxisScale3"/> +	<text name="XDeadZone">  		Tolerancja osi X  	</text> -	<spinner left="133" name="AvatarAxisDeadZone1"/> -	<spinner left="208" name="BuildAxisDeadZone1"/> -	<spinner left="283" name="FlycamAxisDeadZone1"/> -	<text name="YDeadZone" width="104"> +	<spinner name="AvatarAxisDeadZone1"/> +	<spinner name="BuildAxisDeadZone1"/> +	<spinner left="300" name="FlycamAxisDeadZone1"/> +	<text name="YDeadZone">  		Tolerancja osi Y  	</text> -	<spinner left="133" name="AvatarAxisDeadZone2"/> -	<spinner left="208" name="BuildAxisDeadZone2"/> -	<spinner left="283" name="FlycamAxisDeadZone2"/> -	<text name="ZDeadZone" width="104"> +	<spinner name="AvatarAxisDeadZone2"/> +	<spinner name="BuildAxisDeadZone2"/> +	<spinner left="300" name="FlycamAxisDeadZone2"/> +	<text name="ZDeadZone">  		Tolerancja osi Z  	</text> -	<spinner left="133" name="AvatarAxisDeadZone0"/> -	<spinner left="208" name="BuildAxisDeadZone0"/> -	<spinner left="283" name="FlycamAxisDeadZone0"/> -	<text name="PitchDeadZone" width="104"> +	<spinner name="AvatarAxisDeadZone0"/> +	<spinner name="BuildAxisDeadZone0"/> +	<spinner left="300" name="FlycamAxisDeadZone0"/> +	<text name="PitchDeadZone">  		Tolerancja wznoszenia  	</text> -	<spinner left="133" name="AvatarAxisDeadZone4"/> -	<spinner left="208" name="BuildAxisDeadZone4"/> -	<spinner left="283" name="FlycamAxisDeadZone4"/> -	<text name="YawDeadZone" width="104"> +	<spinner name="AvatarAxisDeadZone4"/> +	<spinner name="BuildAxisDeadZone4"/> +	<spinner left="300" name="FlycamAxisDeadZone4"/> +	<text name="YawDeadZone">  		Tolerancja odchylania  	</text> -	<spinner left="133" name="AvatarAxisDeadZone5"/> -	<spinner left="208" name="BuildAxisDeadZone5"/> -	<spinner left="283" name="FlycamAxisDeadZone5"/> -	<text name="RollDeadZone" width="104"> +	<spinner name="AvatarAxisDeadZone5"/> +	<spinner name="BuildAxisDeadZone5"/> +	<spinner left="300" name="FlycamAxisDeadZone5"/> +	<text name="RollDeadZone">  		Tolerancja obrotu  	</text> -	<spinner left="208" name="BuildAxisDeadZone3"/> -	<spinner left="283" name="FlycamAxisDeadZone3"/> -	<text name="Feathering" width="104"> +	<spinner name="BuildAxisDeadZone3"/> +	<spinner left="300" name="FlycamAxisDeadZone3"/> +	<text name="Feathering">  		Przenikanie  	</text> -	<slider label="" left="125" name="AvatarFeathering"/> -	<slider label="" left="200" name="BuildFeathering"/> -	<slider label="" left="275" name="FlycamFeathering"/> -	<text name="ZoomScale2" width="104"> +	<slider label="" name="AvatarFeathering"/> +	<slider label="" name="BuildFeathering"/> +	<slider label="" left_delta="81" name="FlycamFeathering"/> +	<text name="ZoomScale2">  		Skala powiększania  	</text> -	<spinner label="" left="283" name="FlycamAxisScale6"/> -	<text name="ZoomDeadZone" width="104"> +	<spinner label="" left="300" name="FlycamAxisScale6"/> +	<text name="ZoomDeadZone">  		Tolerancja powiększania  	</text> -	<spinner label="" left="283" name="FlycamAxisDeadZone6"/> -	<button label="Ustawienia domyślne" left="366" name="SpaceNavigatorDefaults"/> +	<spinner label="" left="300" name="FlycamAxisDeadZone6"/> +	<button label="Ustawienia domyślne" name="SpaceNavigatorDefaults"/>  	<button label="OK" label_selected="OK" left="366" name="ok_btn"/>  	<button label="Anuluj" label_selected="Anuluj" name="cancel_btn"/>  	<stat_view label="Monitor Joysticka" name="axis_view"> diff --git a/indra/newview/skins/default/xui/pl/panel_people.xml b/indra/newview/skins/default/xui/pl/panel_people.xml index 5ea5356c60..09958c84d6 100644 --- a/indra/newview/skins/default/xui/pl/panel_people.xml +++ b/indra/newview/skins/default/xui/pl/panel_people.xml @@ -47,13 +47,13 @@ Jeżeli szukasz ludzi, z którymi można się spotkać, kliknij tutaj [secondlif  		</panel>  	</tab_container>  	<panel name="button_bar"> -		<button label="Profil" name="view_profile_btn" tool_tip="Pokaż zdjęcie, grupy i inne informacje o Rezydencie"/> -		<button label="IM" name="im_btn" tool_tip="Rozpocznij rozmowę prywatną (IM)"/> -		<button label="Zadzwoń" name="call_btn" tool_tip="Zadzwoń do tego Rezydenta"/> -		<button label="Podziel się" name="share_btn"/> -		<button label="Teleportuj" name="teleport_btn" tool_tip="Zaproponuj teleportację"/> -		<button label="Profil grupy" name="group_info_btn" tool_tip="Pokaż informacje o grupie"/> -		<button label="Konferencja Grupowa" name="chat_btn" tool_tip="Rozpocznij konferencę"/> -		<button label="Rozmowa Głosowa" name="group_call_btn" tool_tip="Rozmowa Głosowa w tej Grupie"/> +		<button width="55" label="Profil" name="view_profile_btn" tool_tip="Pokaż zdjęcie, grupy i inne informacje o Rezydencie"/> +		<button width="35" label="IM" name="im_btn" tool_tip="Rozpocznij rozmowę prywatną (IM)"/> +		<button width="62" label="Zadzwoń" name="call_btn" tool_tip="Zadzwoń do tego Rezydenta"/> +		<button width="72" label="Podziel się" name="share_btn"/> +		<button width="70" label="Teleportuj" name="teleport_btn" tool_tip="Zaproponuj teleportację"/> +		<button width="69" label="Profil grupy" name="group_info_btn" tool_tip="Pokaż informacje o grupie"/> +		<button width="124" label="Konferencja Grupowa" name="chat_btn" tool_tip="Rozpocznij konferencę"/> +		<button width="108" label="Rozmowa Głosowa" name="group_call_btn" tool_tip="Rozmowa Głosowa w tej Grupie"/>  	</panel>  </panel> diff --git a/indra/newview/skins/default/xui/pt/floater_joystick.xml b/indra/newview/skins/default/xui/pt/floater_joystick.xml index ecc4fcc9e9..98d8c0e319 100644 --- a/indra/newview/skins/default/xui/pt/floater_joystick.xml +++ b/indra/newview/skins/default/xui/pt/floater_joystick.xml @@ -16,7 +16,7 @@  		Modos de Controle:  	</text>  	<check_box label="Avatar" name="JoystickAvatarEnabled"/> -	<check_box label="Construir" left="192" name="JoystickBuildEnabled"/> +	<check_box label="Construir" name="JoystickBuildEnabled"/>  	<check_box label="Camera aérea" name="JoystickFlycamEnabled"/>  	<text name="XScale">  		Escala X @@ -27,13 +27,13 @@  	<text name="ZScale">  		Escala Z  	</text> -	<text left="3" name="PitchScale" width="115"> +	<text name="PitchScale">  		Escala de Elevação  	</text> -	<text left="3" name="YawScale" width="115"> +	<text name="YawScale">  		Escala da Guinada  	</text> -	<text left="3" name="RollScale" width="115"> +	<text name="RollScale">  		Escala de Rolagem  	</text>  	<text name="XDeadZone"> @@ -45,13 +45,13 @@  	<text name="ZDeadZone">  		Zona Morta Z  	</text> -	<text left="3" name="PitchDeadZone" width="115"> +	<text name="PitchDeadZone">  		Zona Morta: Elevação  	</text> -	<text left="3" name="YawDeadZone" width="115"> +	<text name="YawDeadZone">  		Zona Morta: Guinada  	</text> -	<text left="3" name="RollDeadZone" width="115"> +	<text name="RollDeadZone">  		Zona Morta: Rolagem  	</text>  	<text name="Feathering"> @@ -60,7 +60,7 @@  	<text name="ZoomScale2">  		Escala de Zoom  	</text> -	<text left="4" name="ZoomDeadZone" width="110"> +	<text name="ZoomDeadZone">  		Zona Morta de Zoom  	</text>  	<button font="SansSerifSmall" label="Padrões do SpaceNavigator" name="SpaceNavigatorDefaults"/>  | 
