diff options
Diffstat (limited to 'indra')
157 files changed, 1290 insertions, 290 deletions
diff --git a/indra/cmake/Boost.cmake b/indra/cmake/Boost.cmake index 3652508b6a..7ce57a5572 100644 --- a/indra/cmake/Boost.cmake +++ b/indra/cmake/Boost.cmake @@ -38,9 +38,9 @@ else (STANDALONE)            debug libboost_signals-vc80-mt-gd-${BOOST_VERSION})      endif (MSVC71)    elseif (DARWIN) -    set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt) -    set(BOOST_REGEX_LIBRARY boost_regex-mt) -    set(BOOST_SIGNALS_LIBRARY boost_signals-mt) +    set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-xgcc40-mt) +    set(BOOST_REGEX_LIBRARY boost_regex-xgcc40-mt) +    set(BOOST_SIGNALS_LIBRARY boost_signals-xgcc40-mt)    elseif (LINUX)      set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-gcc41-mt)      set(BOOST_REGEX_LIBRARY boost_regex-gcc41-mt) diff --git a/indra/cmake/PulseAudio.cmake b/indra/cmake/PulseAudio.cmake new file mode 100644 index 0000000000..f8087a8083 --- /dev/null +++ b/indra/cmake/PulseAudio.cmake @@ -0,0 +1,28 @@ +# -*- cmake -*- +include(Prebuilt) + +if (STANDALONE) +  include(FindPkgConfig) + +  pkg_check_modules(PULSEAUDIO REQUIRED libpulse-mainloop-glib) + +elseif (LINUX) +  use_prebuilt_binary(pulseaudio) +  set(PULSEAUDIO_FOUND ON FORCE BOOL) +  set(PULSEAUDIO_INCLUDE_DIRS +      ${LIBS_PREBUILT_DIR}/include +      ) +  # We don't need to explicitly link against pulseaudio itself, because +  # the viewer probes for the system's copy at runtime. +  set(PULSEAUDIO_LIBRARIES +    # none needed! +    ) +endif (STANDALONE) + +if (PULSEAUDIO_FOUND) +  set(PULSEAUDIO ON CACHE BOOL "Build with PulseAudio support, if available.") +endif (PULSEAUDIO_FOUND) + +if (PULSEAUDIO) +  add_definitions(-DLL_PULSEAUDIO_ENABLED=1) +endif (PULSEAUDIO) diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp index d0c73fbfbc..aa69dfe0cc 100644 --- a/indra/llui/llaccordionctrl.cpp +++ b/indra/llui/llaccordionctrl.cpp @@ -103,6 +103,13 @@ void LLAccordionCtrl::draw()  	LLLocalClipRect clip(local_rect);  	LLPanel::draw(); +	/* +	S32 width = getRect().getWidth(); +	S32 height = getRect().getHeight(); + +	gl_rect_2d(0, 0 , width - 1 ,height - 1,LLColor4::green,true); +	gl_line_2d(0, 0 , width - 1 ,height - 1,LLColor4::black); +	*/  } @@ -338,36 +345,55 @@ void LLAccordionCtrl::addCollapsibleCtrl(LLView* view)  } - -void LLAccordionCtrl::arrange() +void	LLAccordionCtrl::arrangeSinge()  { -	if( mAccordionTabs.size() == 0) -	{ -		//We do not arrange if we do not have what should be arranged -		return; -	} - -	//Calculate params	  	S32 panel_left = BORDER_MARGIN;	  // Margin from left side of Splitter  	S32 panel_top = getRect().getHeight() - BORDER_MARGIN;		  // Top coordinate of the first panel  	S32 panel_width = getRect().getWidth() - 4;		  // Top coordinate of the first panel +	S32 panel_height; -	 -	if(mAccordionTabs.size() == 1) +	S32 collapsed_height = 0; + +	for(size_t i=0;i<mAccordionTabs.size();++i)  	{ -		LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[0]); -		 -		LLRect panel_rect = accordion_tab->getRect(); +		LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]); -		S32 panel_height = getRect().getHeight() - 2*BORDER_MARGIN; +		if(accordion_tab->getVisible() == false) //skip hidden accordion tabs +			continue; +		if(!accordion_tab->isExpanded() ) +		{ +			collapsed_height+=mAccordionTabs[i]->getRect().getHeight(); +		} +	} -		ctrlSetLeftTopAndSize(accordion_tab,panel_rect.mLeft,panel_top,panel_width,panel_height); +	S32 expanded_height = getRect().getHeight() - BORDER_MARGIN - collapsed_height; +	 +	for(size_t i=0;i<mAccordionTabs.size();++i) +	{ +		LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]); -		show_hide_scrollbar(getRect().getWidth(),getRect().getHeight()); -		return; - +		if(accordion_tab->getVisible() == false) //skip hidden accordion tabs +			continue; +		if(!accordion_tab->isExpanded() ) +		{ +			panel_height = accordion_tab->getRect().getHeight(); +		} +		else +		{ +			panel_height = expanded_height; +		} +		ctrlSetLeftTopAndSize(mAccordionTabs[i], panel_left, panel_top, panel_width, panel_height); +		panel_top-=mAccordionTabs[i]->getRect().getHeight();  	} +} + +void	LLAccordionCtrl::arrangeMultiple() +{ +	S32 panel_left = BORDER_MARGIN;	  // Margin from left side of Splitter +	S32 panel_top = getRect().getHeight() - BORDER_MARGIN;		  // Top coordinate of the first panel +	S32 panel_width = getRect().getWidth() - 4;		  // Top coordinate of the first panel +	//Calculate params	  	for(size_t i = 0; i < mAccordionTabs.size(); i++ )  	{  		LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]); @@ -415,7 +441,40 @@ void LLAccordionCtrl::arrange()  	show_hide_scrollbar(getRect().getWidth(),getRect().getHeight());  	updateLayout(getRect().getWidth(),getRect().getHeight()); +} + + +void LLAccordionCtrl::arrange() +{ +	if( mAccordionTabs.size() == 0) +	{ +		//We do not arrange if we do not have what should be arranged +		return; +	} + +	if(mAccordionTabs.size() == 1) +	{ +		S32 panel_top = getRect().getHeight() - BORDER_MARGIN;		  // Top coordinate of the first panel +		S32 panel_width = getRect().getWidth() - 4;		  // Top coordinate of the first panel +		 +		LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[0]); +		 +		LLRect panel_rect = accordion_tab->getRect(); +		 +		S32 panel_height = getRect().getHeight() - 2*BORDER_MARGIN; + +		ctrlSetLeftTopAndSize(accordion_tab,panel_rect.mLeft,panel_top,panel_width,panel_height); +		 +		show_hide_scrollbar(getRect().getWidth(),getRect().getHeight()); +		return; + +	} + +	if(mSingleExpansion) +		arrangeSinge (); +	else +		arrangeMultiple ();  }  //--------------------------------------------------------------------------------- diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h index d57a42df32..7c29e545b7 100644 --- a/indra/llui/llaccordionctrl.h +++ b/indra/llui/llaccordionctrl.h @@ -105,6 +105,9 @@ public:  	void	reset		();  private: +	void	arrangeSinge(); +	void	arrangeMultiple(); +  	// Calc Splitter's height that is necessary to display all child content  	S32		calcRecuiredHeight();  	S32		getRecuiredHeight() const { return mInnerRect.getHeight(); } diff --git a/indra/llui/llsearcheditor.cpp b/indra/llui/llsearcheditor.cpp index e6c5e3f334..8075575bab 100644 --- a/indra/llui/llsearcheditor.cpp +++ b/indra/llui/llsearcheditor.cpp @@ -155,8 +155,8 @@ void LLSearchEditor::setFocus( BOOL b )  void LLSearchEditor::onClearButtonClick(const LLSD& data)  { -	mSearchEditor->selectAll(); -	mSearchEditor->doDelete(); // force keystroke callback +	setText(LLStringUtil::null); +	mSearchEditor->onCommit(); // force keystroke callback  }  void LLSearchEditor::handleKeystroke() diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index c9bdacd4b7..b0c0af9f9a 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -215,7 +215,7 @@ LLTabContainer::Params::Params()  	use_custom_icon_ctrl("use_custom_icon_ctrl", false),  	tab_icon_ctrl_pad("tab_icon_ctrl_pad", 0),  	use_ellipses("use_ellipses"), -	font_halign("font_halign") +	font_halign("halign")  {  	name(std::string("tab_container"));  	mouse_opaque = false; diff --git a/indra/media_plugins/webkit/CMakeLists.txt b/indra/media_plugins/webkit/CMakeLists.txt index 4512c22b5d..9f66a77c64 100644 --- a/indra/media_plugins/webkit/CMakeLists.txt +++ b/indra/media_plugins/webkit/CMakeLists.txt @@ -14,10 +14,12 @@ include(Linking)  include(PluginAPI)  include(MediaPluginBase)  include(FindOpenGL) +include(PulseAudio)  include(WebKitLibPlugin)  include_directories( +    ${PULSEAUDIO_INCLUDE_DIRS}      ${LLPLUGIN_INCLUDE_DIRS}      ${MEDIA_PLUGIN_BASE_INCLUDE_DIRS}      ${LLCOMMON_INCLUDE_DIRS} @@ -34,25 +36,27 @@ set(media_plugin_webkit_SOURCE_FILES      media_plugin_webkit.cpp      ) -add_library(media_plugin_webkit -    SHARED -    ${media_plugin_webkit_SOURCE_FILES} -) -  set(media_plugin_webkit_LINK_LIBRARIES    ${LLPLUGIN_LIBRARIES}    ${MEDIA_PLUGIN_BASE_LIBRARIES}    ${LLCOMMON_LIBRARIES}    ${WEBKIT_PLUGIN_LIBRARIES}    ${PLUGIN_API_WINDOWS_LIBRARIES} +  ${PULSEAUDIO_LIBRARIES}  )  if (LINUX) +  list(APPEND media_plugin_webkit_SOURCE_FILES linux_volume_catcher.cpp)    list(APPEND media_plugin_webkit_LINK_LIBRARIES         ${UI_LIBRARIES}     # for glib/GTK         )  endif (LINUX) +add_library(media_plugin_webkit +    SHARED +    ${media_plugin_webkit_SOURCE_FILES} +) +  target_link_libraries(media_plugin_webkit ${media_plugin_webkit_LINK_LIBRARIES})  add_dependencies(media_plugin_webkit diff --git a/indra/media_plugins/webkit/linux_volume_catcher.cpp b/indra/media_plugins/webkit/linux_volume_catcher.cpp new file mode 100644 index 0000000000..2ba28bd4bf --- /dev/null +++ b/indra/media_plugins/webkit/linux_volume_catcher.cpp @@ -0,0 +1,483 @@ +/**  + * @file linux_volume_catcher.cpp + * @brief A Linux-specific, PulseAudio-specific hack to detect and volume-adjust new audio sources + * + * @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 + */ + +/* +  The high-level design is as follows: +  1) Connect to the PulseAudio daemon +  2) Watch for the creation of new audio players connecting to the daemon (this includes ALSA clients running on the PulseAudio emulation layer, such as Flash plugins) +  3) Examine any new audio player's PID to see if it belongs to our own process +  4) If so, tell PA to adjust the volume of that audio player ('sink input' in PA parlance) +  5) Keep a list of all living audio players that we care about, adjust the volumes of all of them when we get a new setVolume() call + */ + +#include "linden_common.h" + +#include "linux_volume_catcher.h" + + +#if LL_PULSEAUDIO_ENABLED + +extern "C" { +#include <glib.h> + +#include <pulse/introspect.h> +#include <pulse/context.h> +#include <pulse/subscribe.h> +#include <pulse/glib-mainloop.h> // There's no special reason why we want the *glib* PA mainloop, but the generic polling implementation seems broken. + +#include "apr_pools.h" +#include "apr_dso.h" +} + +//////////////////////////////////////////////////// + +#define DEBUGMSG(...) do {} while(0) +#define INFOMSG(...) do {} while(0) +#define WARNMSG(...) do {} while(0) + +#define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) RTN (*ll##PASYM)(__VA_ARGS__) = NULL +#include "linux_volume_catcher_pa_syms.inc" +#include "linux_volume_catcher_paglib_syms.inc" +#undef LL_PA_SYM + +static bool sSymsGrabbed = false; +static apr_pool_t *sSymPADSOMemoryPool = NULL; +static apr_dso_handle_t *sSymPADSOHandleG = NULL; + +bool grab_pa_syms(std::string pulse_dso_name) +{ +	if (sSymsGrabbed) +	{ +		// already have grabbed good syms +		return true; +	} + +	bool sym_error = false; +	bool rtn = false; +	apr_status_t rv; +	apr_dso_handle_t *sSymPADSOHandle = NULL; + +#define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) do{rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll##PASYM, sSymPADSOHandle, #PASYM); if (rv != APR_SUCCESS) {INFOMSG("Failed to grab symbol: %s", #PASYM); if (REQUIRED) sym_error = true;} else DEBUGMSG("grabbed symbol: %s from %p", #PASYM, (void*)ll##PASYM);}while(0) + +	//attempt to load the shared library +	apr_pool_create(&sSymPADSOMemoryPool, NULL); +   +	if ( APR_SUCCESS == (rv = apr_dso_load(&sSymPADSOHandle, +					       pulse_dso_name.c_str(), +					       sSymPADSOMemoryPool) )) +	{ +		INFOMSG("Found DSO: %s", pulse_dso_name.c_str()); + +#include "linux_volume_catcher_pa_syms.inc" +#include "linux_volume_catcher_paglib_syms.inc" +       +		if ( sSymPADSOHandle ) +		{ +			sSymPADSOHandleG = sSymPADSOHandle; +			sSymPADSOHandle = NULL; +		} +       +		rtn = !sym_error; +	} +	else +	{ +		INFOMSG("Couldn't load DSO: %s", pulse_dso_name.c_str()); +		rtn = false; // failure +	} + +	if (sym_error) +	{ +		WARNMSG("Failed to find necessary symbols in PulseAudio libraries."); +	} +#undef LL_PA_SYM + +	sSymsGrabbed = rtn; +	return rtn; +} + + +void ungrab_pa_syms() +{  +	// should be safe to call regardless of whether we've +	// actually grabbed syms. + +	if ( sSymPADSOHandleG ) +	{ +		apr_dso_unload(sSymPADSOHandleG); +		sSymPADSOHandleG = NULL; +	} +	 +	if ( sSymPADSOMemoryPool ) +	{ +		apr_pool_destroy(sSymPADSOMemoryPool); +		sSymPADSOMemoryPool = NULL; +	} +	 +	// NULL-out all of the symbols we'd grabbed +#define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) do{ll##PASYM = NULL;}while(0) +#include "linux_volume_catcher_pa_syms.inc" +#include "linux_volume_catcher_paglib_syms.inc" +#undef LL_PA_SYM + +	sSymsGrabbed = false; +} +//////////////////////////////////////////////////// + +// PulseAudio requires a chain of callbacks with C linkage +extern "C" { +	void callback_discovered_sinkinput(pa_context *context, const pa_sink_input_info *i, int eol, void *userdata); +	void callback_subscription_alert(pa_context *context, pa_subscription_event_type_t t, uint32_t index, void *userdata); +	void callback_context_state(pa_context *context, void *userdata); +} + + +class LinuxVolumeCatcherImpl +{ +public: +	LinuxVolumeCatcherImpl(); +	~LinuxVolumeCatcherImpl(); + +	void setVolume(F32 volume); +	void pump(void); + +	// for internal use - can't be private because used from our C callbacks + +	bool loadsyms(std::string pulse_dso_name); +	void init(); +	void cleanup(); + +	void update_all_volumes(F32 volume); +	void update_index_volume(U32 index, F32 volume); +	void connected_okay(); + +	std::set<U32> mSinkInputIndices; +	std::map<U32,U32> mSinkInputNumChannels; +	F32 mDesiredVolume; +	pa_glib_mainloop *mMainloop; +	pa_context *mPAContext; +	bool mConnected; +	bool mGotSyms; +}; + +LinuxVolumeCatcherImpl::LinuxVolumeCatcherImpl() +	: mDesiredVolume(0.0f), +	  mMainloop(NULL), +	  mPAContext(NULL), +	  mConnected(false), +	  mGotSyms(false) +{ +	init(); +} + +LinuxVolumeCatcherImpl::~LinuxVolumeCatcherImpl() +{ +	cleanup(); +} + +bool LinuxVolumeCatcherImpl::loadsyms(std::string pulse_dso_name) +{ +	return grab_pa_syms(pulse_dso_name); +} + +void LinuxVolumeCatcherImpl::init() +{ +	// try to be as defensive as possible because PA's interface is a +	// bit fragile and (for our purposes) we'd rather simply not function +	// than crash + +	// we cheat and rely upon libpulse-mainloop-glib.so.0 to pull-in +	// libpulse.so.0 - this isn't a great assumption, and the two DSOs should +	// probably be loaded separately.  Our Linux DSO framework needs refactoring, +	// we do this sort of thing a lot with practically identical logic... +	mGotSyms = loadsyms("libpulse-mainloop-glib.so.0"); +	if (!mGotSyms) return; + +	mMainloop = llpa_glib_mainloop_new(g_main_context_default()); +	if (mMainloop) +	{ +		pa_mainloop_api *api = llpa_glib_mainloop_get_api(mMainloop); +		if (api) +		{ +			pa_proplist *proplist = llpa_proplist_new(); +			if (proplist) +			{ +				llpa_proplist_sets(proplist, PA_PROP_APPLICATION_ICON_NAME, "multimedia-player"); +				llpa_proplist_sets(proplist, PA_PROP_APPLICATION_ID, "com.secondlife.viewer.mediaplugvoladjust"); +				llpa_proplist_sets(proplist, PA_PROP_APPLICATION_NAME, "SL Plugin Volume Adjuster"); +				llpa_proplist_sets(proplist, PA_PROP_APPLICATION_VERSION, "1"); + +				// plain old pa_context_new() is broken! +				mPAContext = llpa_context_new_with_proplist(api, NULL, proplist); +				llpa_proplist_free(proplist); +			} +		} +	} + +	// Now we've set up a PA context and mainloop, try connecting the +	// PA context to a PA daemon. +	if (mPAContext) +	{ +		llpa_context_set_state_callback(mPAContext, callback_context_state, this); +		pa_context_flags_t cflags = (pa_context_flags)0; // maybe add PA_CONTEXT_NOAUTOSPAWN? +		if (llpa_context_connect(mPAContext, NULL, cflags, NULL) >= 0) +		{ +			// Okay!  We haven't definitely connected, but we +			// haven't definitely failed yet. +		} +		else +		{ +			// Failed to connect to PA manager... we'll leave +			// things like that.  Perhaps we should try again later. +		} +	} +} + +void LinuxVolumeCatcherImpl::cleanup() +{ +	mConnected = false; + +	if (mGotSyms && mPAContext) +	{ +		llpa_context_disconnect(mPAContext); +		llpa_context_unref(mPAContext); +	} +	mPAContext = NULL; + +	if (mGotSyms && mMainloop) +	{ +		llpa_glib_mainloop_free(mMainloop); +	} +	mMainloop = NULL; +} + +void LinuxVolumeCatcherImpl::setVolume(F32 volume) +{ +	mDesiredVolume = volume; +	 +	if (!mGotSyms) return; + +	if (mConnected && mPAContext) +	{ +		update_all_volumes(mDesiredVolume); +	} + +	pump(); +} + +void LinuxVolumeCatcherImpl::pump() +{ +	gboolean may_block = FALSE; +	g_main_context_iteration(g_main_context_default(), may_block); +} + +void LinuxVolumeCatcherImpl::connected_okay() +{ +	pa_operation *op; + +	// fetch global list of existing sinkinputs +	if ((op = llpa_context_get_sink_input_info_list(mPAContext, +							callback_discovered_sinkinput, +							this))) +	{ +		llpa_operation_unref(op); +	} + +	// subscribe to future global sinkinput changes +	llpa_context_set_subscribe_callback(mPAContext, +					    callback_subscription_alert, +					    this); +	if ((op = llpa_context_subscribe(mPAContext, (pa_subscription_mask_t) +					 (PA_SUBSCRIPTION_MASK_SINK_INPUT), +					 NULL, NULL))) +	{ +		llpa_operation_unref(op); +	} +} + +void LinuxVolumeCatcherImpl::update_all_volumes(F32 volume) +{ +	for (std::set<U32>::iterator it = mSinkInputIndices.begin(); +	     it != mSinkInputIndices.end(); ++it) +	{ +		update_index_volume(*it, volume); +	} +} + +void LinuxVolumeCatcherImpl::update_index_volume(U32 index, F32 volume) +{ +	static pa_cvolume cvol; +	llpa_cvolume_set(&cvol, mSinkInputNumChannels[index], +			 llpa_sw_volume_from_linear(volume)); +	 +	pa_context *c = mPAContext; +	uint32_t idx = index; +	const pa_cvolume *cvolumep = &cvol; +	pa_context_success_cb_t cb = NULL; // okay as null +	void *userdata = NULL; // okay as null + +	pa_operation *op; +	if ((op = llpa_context_set_sink_input_volume(c, idx, cvolumep, cb, userdata))) +	{ +		llpa_operation_unref(op); +	} +} + + +void callback_discovered_sinkinput(pa_context *context, const pa_sink_input_info *sii, int eol, void *userdata) +{ +	LinuxVolumeCatcherImpl *impl = dynamic_cast<LinuxVolumeCatcherImpl*>((LinuxVolumeCatcherImpl*)userdata); +	llassert(impl); + +	if (0 == eol) +	{ +		pa_proplist *proplist = sii->proplist; +		pid_t sinkpid = atoll(llpa_proplist_gets(proplist, PA_PROP_APPLICATION_PROCESS_ID)); +		 +		if (sinkpid == getpid()) // does the discovered sinkinput belong to this process? +		{ +			bool is_new = (impl->mSinkInputIndices.find(sii->index) == +				       impl->mSinkInputIndices.end()); +			 +			impl->mSinkInputIndices.insert(sii->index); +			impl->mSinkInputNumChannels[sii->index] = sii->channel_map.channels; +			 +			if (is_new) +			{ +				// new! +				impl->update_index_volume(sii->index, impl->mDesiredVolume); +			} +			else +			{ +				// seen it already, do nothing. +			} +		} +	} +} + +void callback_subscription_alert(pa_context *context, pa_subscription_event_type_t t, uint32_t index, void *userdata) +{ +	LinuxVolumeCatcherImpl *impl = dynamic_cast<LinuxVolumeCatcherImpl*>((LinuxVolumeCatcherImpl*)userdata); +	llassert(impl); + +	switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) { +        case PA_SUBSCRIPTION_EVENT_SINK_INPUT: +		if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == +		    PA_SUBSCRIPTION_EVENT_REMOVE) +		{ +			// forget this sinkinput, if we were caring about it +			impl->mSinkInputIndices.erase(index); +			impl->mSinkInputNumChannels.erase(index); +		} +		else +		{ +			// ask for more info about this new sinkinput +			pa_operation *op; +			if ((op = llpa_context_get_sink_input_info(impl->mPAContext, index, callback_discovered_sinkinput, impl))) +			{ +				llpa_operation_unref(op); +			} +		} +		break; +		 +	default:; +	} +} + +void callback_context_state(pa_context *context, void *userdata) +{ +	LinuxVolumeCatcherImpl *impl = dynamic_cast<LinuxVolumeCatcherImpl*>((LinuxVolumeCatcherImpl*)userdata); +	llassert(impl); +	 +	switch (llpa_context_get_state(context)) +	{ +	case PA_CONTEXT_READY: +		impl->mConnected = true; +		impl->connected_okay(); +		break; +	case PA_CONTEXT_TERMINATED: +		impl->mConnected = false; +		break; +	case PA_CONTEXT_FAILED: +		impl->mConnected = false; +		break; +	default:; +	} +} + +///////////////////////////////////////////////////// + +LinuxVolumeCatcher::LinuxVolumeCatcher() +{ +	pimpl = new LinuxVolumeCatcherImpl(); +} + +LinuxVolumeCatcher::~LinuxVolumeCatcher() +{ +	delete pimpl; +	pimpl = NULL; +} + +void LinuxVolumeCatcher::setVolume(F32 volume) +{ +	llassert(pimpl); +	pimpl->setVolume(volume); +} + +void LinuxVolumeCatcher::pump() +{ +	llassert(pimpl); +	pimpl->pump(); +} + +#else // !LL_PULSEAUDIO_ENABLED + +// stub. + +LinuxVolumeCatcher::LinuxVolumeCatcher() +{ +	pimpl = NULL; +} + +LinuxVolumeCatcher::~LinuxVolumeCatcher() +{ +} + +void LinuxVolumeCatcher::setVolume(F32 volume) +{ +} + +void LinuxVolumeCatcher::pump() +{ +} + +#endif // LL_PULSEAUDIO_ENABLED diff --git a/indra/media_plugins/webkit/linux_volume_catcher_pa_syms.inc b/indra/media_plugins/webkit/linux_volume_catcher_pa_syms.inc new file mode 100644 index 0000000000..d806b48428 --- /dev/null +++ b/indra/media_plugins/webkit/linux_volume_catcher_pa_syms.inc @@ -0,0 +1,21 @@ +// required symbols to grab +LL_PA_SYM(true, pa_context_connect, int, pa_context *c, const char *server, pa_context_flags_t flags, const pa_spawn_api *api); +LL_PA_SYM(true, pa_context_disconnect, void, pa_context *c); +LL_PA_SYM(true, pa_context_get_sink_input_info, pa_operation*, pa_context *c, uint32_t idx, pa_sink_input_info_cb_t cb, void *userdata); +LL_PA_SYM(true, pa_context_get_sink_input_info_list, pa_operation*, pa_context *c, pa_sink_input_info_cb_t cb, void *userdata); +LL_PA_SYM(true, pa_context_get_state, pa_context_state_t, pa_context *c); +LL_PA_SYM(true, pa_context_new_with_proplist, pa_context*, pa_mainloop_api *mainloop, const char *name, pa_proplist *proplist); +LL_PA_SYM(true, pa_context_set_sink_input_volume, pa_operation*, pa_context *c, uint32_t idx, const pa_cvolume *volume, pa_context_success_cb_t cb, void *userdata); +LL_PA_SYM(true, pa_context_set_state_callback, void, pa_context *c, pa_context_notify_cb_t cb, void *userdata); +LL_PA_SYM(true, pa_context_set_subscribe_callback, void, pa_context *c, pa_context_subscribe_cb_t cb, void *userdata); +LL_PA_SYM(true, pa_context_subscribe, pa_operation*, pa_context *c, pa_subscription_mask_t m, pa_context_success_cb_t cb, void *userdata); +LL_PA_SYM(true, pa_context_unref, void, pa_context *c); +LL_PA_SYM(true, pa_cvolume_set, pa_cvolume*, pa_cvolume *a, unsigned channels, pa_volume_t v); +LL_PA_SYM(true, pa_operation_unref, void, pa_operation *o); +LL_PA_SYM(true, pa_proplist_free, void, pa_proplist* p); +LL_PA_SYM(true, pa_proplist_gets, const char*, pa_proplist *p, const char *key); +LL_PA_SYM(true, pa_proplist_new, pa_proplist*, void); +LL_PA_SYM(true, pa_proplist_sets, int, pa_proplist *p, const char *key, const char *value); +LL_PA_SYM(true, pa_sw_volume_from_linear, pa_volume_t, double v); + +// optional symbols to grab diff --git a/indra/media_plugins/webkit/linux_volume_catcher_paglib_syms.inc b/indra/media_plugins/webkit/linux_volume_catcher_paglib_syms.inc new file mode 100644 index 0000000000..abf628c96c --- /dev/null +++ b/indra/media_plugins/webkit/linux_volume_catcher_paglib_syms.inc @@ -0,0 +1,6 @@ +// required symbols to grab +LL_PA_SYM(true, pa_glib_mainloop_free, void, pa_glib_mainloop* g); +LL_PA_SYM(true, pa_glib_mainloop_get_api, pa_mainloop_api*, pa_glib_mainloop* g); +LL_PA_SYM(true, pa_glib_mainloop_new, pa_glib_mainloop *, GMainContext *c); + +// optional symbols to grab diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index 688d3bcd3d..c7aba04492 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -43,11 +43,15 @@  #include "llpluginmessageclasses.h"  #include "media_plugin_base.h" +#if LL_LINUX +# include "linux_volume_catcher.h" +#endif // LL_LINUX +  #if LL_WINDOWS -#include <direct.h> +# include <direct.h>  #else -#include <unistd.h> -#include <stdlib.h> +# include <unistd.h> +# include <stdlib.h>  #endif  #if LL_WINDOWS @@ -102,6 +106,10 @@ private:  	F32 mBackgroundG;  	F32 mBackgroundB; +#if LL_LINUX +	LinuxVolumeCatcher mLinuxVolumeCatcher; +#endif // LL_LINUX +  	void setInitState(int state)  	{  //		std::cerr << "changing init state to " << state << std::endl; @@ -114,6 +122,10 @@ private:  	{  		LLQtWebKit::getInstance()->pump( milliseconds ); +#if LL_LINUX +		mLinuxVolumeCatcher.pump(); +#endif // LL_LINUX +  		checkEditState();  		if(mInitState == INIT_STATE_NAVIGATE_COMPLETE) @@ -281,6 +293,7 @@ private:  		return false;  	}; +	void setVolume(F32 vol);  	////////////////////////////////////////////////////////////////////////////////  	// virtual @@ -732,6 +745,14 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  //				std::cerr << "MediaPluginWebKit::receiveMessage: unknown base message: " << message_name << std::endl;  			}  		} +                else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME) +		{ +			if(message_name == "set_volume") +			{ +				F32 volume = message_in.getValueReal("volume"); +				setVolume(volume); +			} +		}  		else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)  		{  			if(message_name == "size_change") @@ -998,6 +1019,13 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  	}  } +void MediaPluginWebKit::setVolume(F32 volume) +{ +#if LL_LINUX +	mLinuxVolumeCatcher.setVolume(volume); +#endif // LL_LINUX +} +  int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)  {  	MediaPluginWebKit *self = new MediaPluginWebKit(host_send_func, host_user_data); diff --git a/indra/newview/linux_tools/client-readme.txt b/indra/newview/linux_tools/client-readme.txt index 92d321d8c0..e01b9e4bc6 100644 --- a/indra/newview/linux_tools/client-readme.txt +++ b/indra/newview/linux_tools/client-readme.txt @@ -15,7 +15,7 @@ Life itself - please see <http://www.secondlife.com/whatis/>.     5.3. Blank window after minimizing it     5.4. Audio     5.5. 'Alt' key for camera controls doesn't work -   5.6. In-world streaming movie/music playback +   5.6. In-world streaming movie, music and Flash playback  6. Advanced Troubleshooting     6.1. Audio     6.2. OpenGL @@ -169,12 +169,15 @@ SOLUTION:- Some window managers eat the Alt key for their own purposes; you     example, the 'Windows' key!) which will allow the Alt key to function     properly with mouse actions in Second Life and other applications. -PROBLEM 6:- In-world movie and/or music playback doesn't work for me. +PROBLEM 6:- In-world movie, music, or Flash playback doesn't work for me.  SOLUTION:- You need to have a working installation of GStreamer 0.10; this     is usually an optional package for most versions of Linux.  If you have     installed GStreamer 0.10 and you can play some music/movies but not others     then you need to install a wider selection of GStreamer plugins, either -   from your vendor or an appropriate third party. +   from your vendor (i.e. the 'Ugly' plugins) or an appropriate third party. +   For Flash playback, you need to have Flash 10 installed for your normal +   web browser (for example, Firefox).  PulseAudio is required for Flash +   volume control / muting to fully function inside Second Life.  6. ADVANCED TROUBLESHOOTING diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index f4bc35002b..08cd101b01 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -286,6 +286,7 @@ void LLAgentWearables::addWearableToAgentInventoryCallback::fire(const LLUUID& i  	}  	if (mTodo & CALL_RECOVERDONE)  	{ +		LLAppearanceManager::instance().addCOFItemLink(inv_item,false);  		gAgentWearables.recoverMissingWearableDone();  	}  	/* @@ -1038,7 +1039,7 @@ void LLAgentWearables::onInitialWearableAssetArrived(LLWearable* wearable, void*  	{  		return;  	} - +		  	if (wearable)  	{  		llassert(type == wearable->getType()); @@ -1057,6 +1058,7 @@ void LLAgentWearables::onInitialWearableAssetArrived(LLWearable* wearable, void*  		// Somehow the asset doesn't exist in the database.  		gAgentWearables.recoverMissingWearable(type,index);  	} +	  	gInventory.notifyObservers(); @@ -1576,7 +1578,7 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it  										 const LLDynamicArray< LLWearable* >& wearables,  										 BOOL remove)  { -	lldebugs << "setWearableOutfit() start" << llendl; +	llinfos << "setWearableOutfit() start" << llendl;  	BOOL wearables_to_remove[WT_COUNT];  	wearables_to_remove[WT_SHAPE]		= FALSE; @@ -2485,7 +2487,7 @@ class LLFetchAndLinkObserver: public LLInventoryFetchObserver  public:  	LLFetchAndLinkObserver(LLInventoryFetchObserver::item_ref_t& ids):  		m_ids(ids), -		LLInventoryFetchObserver(true) +		LLInventoryFetchObserver(true) // retry for missing items  	{  	}  	~LLFetchAndLinkObserver() @@ -2494,7 +2496,9 @@ public:  	virtual void done()  	{  		gInventory.removeObserver(this); +  		// Link to all fetched items in COF. +		LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy;  		for (LLInventoryFetchObserver::item_ref_t::iterator it = m_ids.begin();  			 it != m_ids.end();  			 ++it) @@ -2506,8 +2510,13 @@ public:  				llwarns << "fetch failed!" << llendl;  				continue;  			} -			link_inventory_item(gAgent.getID(), item->getLinkedUUID(), LLAppearanceManager::instance().getCOF(), item->getName(), -								LLAssetType::AT_LINK, LLPointer<LLInventoryCallback>(NULL)); + +			link_inventory_item(gAgent.getID(), +								item->getLinkedUUID(), +								LLAppearanceManager::instance().getCOF(), +								item->getName(), +								LLAssetType::AT_LINK, +								link_waiter);  		}  	}  private: @@ -2530,11 +2539,13 @@ void LLInitialWearablesFetch::processWearablesMessage()  #ifdef USE_CURRENT_OUTFIT_FOLDER  				ids.push_back(wearable_data->mItemID);  #endif -				// Fetch the wearables -				LLWearableList::instance().getAsset(wearable_data->mAssetID, -													LLStringUtil::null, -													LLWearableDictionary::getAssetType(wearable_data->mType), -													LLAgentWearables::onInitialWearableAssetArrived, (void*)(wearable_data)); +#if 0 +// 				// Fetch the wearables +// 				LLWearableList::instance().getAsset(wearable_data->mAssetID, +// 													LLStringUtil::null, +// 													LLWearableDictionary::getAssetType(wearable_data->mType), +// 													LLAgentWearables::onInitialWearableAssetArrived, (void*)(wearable_data)); +#endif  			}  			else  			{ diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index eb4a47664b..c9da08701d 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -301,50 +301,52 @@ void LLOutfitFetch::done()  	delete this;  } -class LLUpdateAppearanceOnDestroy: public LLInventoryCallback +LLUpdateAppearanceOnDestroy::LLUpdateAppearanceOnDestroy(): +	mFireCount(0)  { -public: -	LLUpdateAppearanceOnDestroy(): -		mFireCount(0) -	{ -	} +} -	virtual ~LLUpdateAppearanceOnDestroy() +LLUpdateAppearanceOnDestroy::~LLUpdateAppearanceOnDestroy() +{ +	llinfos << "done update appearance on destroy" << llendl; +	 +	if (!LLApp::isExiting())  	{ -		llinfos << "done update appearance on destroy" << llendl; - -		if (!LLApp::isExiting()) -		{ -			LLAppearanceManager::instance().updateAppearanceFromCOF(); -		} +		LLAppearanceManager::instance().updateAppearanceFromCOF();  	} +} -	/* virtual */ void fire(const LLUUID& inv_item) -	{ -		llinfos << "callback fired" << llendl; -		mFireCount++; -	} -private: -	U32 mFireCount; -}; +void LLUpdateAppearanceOnDestroy::fire(const LLUUID& inv_item) +{ +	llinfos << "callback fired" << llendl; +	mFireCount++; +}  struct LLFoundData  { -	LLFoundData() : mAssetType(LLAssetType::AT_NONE), mWearable(NULL) {} +	LLFoundData() : +		mAssetType(LLAssetType::AT_NONE), +		mWearableType(WT_INVALID), +		mWearable(NULL) {} +  	LLFoundData(const LLUUID& item_id, -		    const LLUUID& asset_id, -		    const std::string& name, -		    LLAssetType::EType asset_type) : +				const LLUUID& asset_id, +				const std::string& name, +				const LLAssetType::EType& asset_type, +				const EWearableType& wearable_type +		) :  		mItemID(item_id),  		mAssetID(asset_id),  		mName(name),  		mAssetType(asset_type), +		mWearableType(wearable_type),  		mWearable( NULL ) {}  	LLUUID mItemID;  	LLUUID mAssetID;  	std::string mName;  	LLAssetType::EType mAssetType; +	EWearableType mWearableType;  	LLWearable* mWearable;  }; @@ -355,14 +357,26 @@ public:  	LLWearableHoldingPattern();  	~LLWearableHoldingPattern(); -	bool pollCompletion(); +	bool pollFetchCompletion(); +	void onFetchCompletion();  	bool isFetchCompleted();  	bool isTimedOut(); + +	void checkMissingWearables(); +	bool pollMissingWearables(); +	bool isMissingCompleted(); +	void recoverMissingWearable(EWearableType type); +	void clearCOFLinksForMissingWearables(); +	 +	void onAllComplete();  	typedef std::list<LLFoundData> found_list_t;  	found_list_t mFoundList;  	LLInventoryModel::item_array_t mObjItems;  	LLInventoryModel::item_array_t mGestItems; +	typedef std::set<S32> type_set_t; +	type_set_t mTypesToRecover; +	type_set_t mTypesToLink;  	S32 mResolved;  	LLTimer mWaitTime;  	bool mFired; @@ -389,13 +403,99 @@ bool LLWearableHoldingPattern::isTimedOut()  	return mWaitTime.getElapsedTimeF32() > max_wait_time;   } -bool LLWearableHoldingPattern::pollCompletion() +void LLWearableHoldingPattern::checkMissingWearables() +{ +	std::vector<S32> found_by_type(WT_COUNT,0); +	std::vector<S32> requested_by_type(WT_COUNT,0); +	for (found_list_t::iterator it = mFoundList.begin(); it != mFoundList.end(); ++it) +	{ +		LLFoundData &data = *it; +		if (data.mWearableType < WT_COUNT) +			requested_by_type[data.mWearableType]++; +		if (data.mWearable) +			found_by_type[data.mWearableType]++; +	} + +	for (S32 type = 0; type < WT_COUNT; ++type) +	{ +		llinfos << "type " << type << " requested " << requested_by_type[type] << " found " << found_by_type[type] << llendl; +		if (found_by_type[type] > 0) +			continue; +		if ( +			// Need to recover if at least one wearable of that type +			// was requested but none was found (prevent missing +			// pants) +			(requested_by_type[type] > 0) ||   +			// or if type is a body part and no wearables were found. +			((type == WT_SHAPE) || (type == WT_SKIN) || (type == WT_HAIR) || (type == WT_EYES))) +		{ +			mTypesToRecover.insert(type); +			mTypesToLink.insert(type); +			recoverMissingWearable((EWearableType)type); +			llwarns << "need to replace " << type << llendl;  +		} +	} + +	if (!pollMissingWearables()) +	{ +		mWaitTime.reset(); +		doOnIdleRepeating(boost::bind(&LLWearableHoldingPattern::pollMissingWearables,this)); +	} +} + +void LLWearableHoldingPattern::onAllComplete() +{ +	// Activate all gestures in this folder +	if (mGestItems.count() > 0) +	{ +		llinfos << "Activating " << mGestItems.count() << " gestures" << llendl; +		 +		LLGestureManager::instance().activateGestures(mGestItems); +		 +		// Update the inventory item labels to reflect the fact +		// they are active. +		LLViewerInventoryCategory* catp = +			gInventory.getCategory(LLAppearanceManager::instance().getCOF()); +		 +		if (catp) +		{ +			gInventory.updateCategory(catp); +			gInventory.notifyObservers(); +		} +	} + +	// Update wearables. +	llinfos << "Updating agent wearables with " << mResolved << " wearable items " << llendl; +	LLAppearanceManager::instance().updateAgentWearables(this, false); +	 +	// Update attachments to match those requested. +	LLVOAvatar* avatar = gAgent.getAvatarObject(); +	if( avatar ) +	{ +		llinfos << "Updating " << mObjItems.count() << " attachments" << llendl; +		LLAgentWearables::userUpdateAttachments(mObjItems); +	} + +	if (isFetchCompleted() && isMissingCompleted()) +	{ +		// Only safe to delete if all wearable callbacks and all missing wearables completed. +		delete this; +	} +} + +void LLWearableHoldingPattern::onFetchCompletion() +{ +	checkMissingWearables(); +} + +// Runs as an idle callback until all wearables are fetched (or we time out). +bool LLWearableHoldingPattern::pollFetchCompletion()  {  	bool completed = isFetchCompleted();  	bool timed_out = isTimedOut();  	bool done = completed || timed_out; -	llinfos << "polling, done status: " << completed << " timed out? " << timed_out << " elapsed " << mWaitTime.getElapsedTimeF32() << llendl; +	llinfos << "polling, done status: " << completed << " timed out " << timed_out << " elapsed " << mWaitTime.getElapsedTimeF32() << llendl;  	if (done)  	{ @@ -406,46 +506,184 @@ bool LLWearableHoldingPattern::pollCompletion()  			llwarns << "Exceeded max wait time for wearables, updating appearance based on what has arrived" << llendl;  		} -		// Activate all gestures in this folder -		if (mGestItems.count() > 0) -		{ -			llinfos << "Activating " << mGestItems.count() << " gestures" << llendl; -			 -			LLGestureManager::instance().activateGestures(mGestItems); -			 -			// Update the inventory item labels to reflect the fact -			// they are active. -			LLViewerInventoryCategory* catp = -				gInventory.getCategory(LLAppearanceManager::instance().getCOF()); +		onFetchCompletion(); +	} +	return done; +} -			if (catp) -			{ -				gInventory.updateCategory(catp); -				gInventory.notifyObservers(); -			} -		} +class RecoveredItemLinkCB: public LLInventoryCallback +{ +public: +	RecoveredItemLinkCB(EWearableType type, LLWearable *wearable, LLWearableHoldingPattern* holder): +		mHolder(holder), +		mWearable(wearable), +		mType(type) +	{ +	} +	void fire(const LLUUID& item_id) +	{ +		llinfos << "Recovered item link for type " << mType << llendl; +		mHolder->mTypesToLink.erase(mType); +		// Add wearable to FoundData for actual wearing +		LLViewerInventoryItem *item = gInventory.getItem(item_id); +		LLViewerInventoryItem *linked_item = item ? item->getLinkedItem() : NULL; -		// Update wearables. -		llinfos << "Updating agent wearables with " << mResolved << " wearable items " << llendl; -		LLAppearanceManager::instance().updateAgentWearables(this, false); -		 -		// Update attachments to match those requested. -		LLVOAvatar* avatar = gAgent.getAvatarObject(); -		if( avatar ) +		gInventory.addChangedMask(LLInventoryObserver::LABEL, linked_item->getUUID()); +			 +		if (item && linked_item)  		{ -			llinfos << "Updating " << mObjItems.count() << " attachments" << llendl; -			LLAgentWearables::userUpdateAttachments(mObjItems); +			LLFoundData found(linked_item->getUUID(), +							  linked_item->getAssetUUID(), +							  linked_item->getName(), +							  linked_item->getType(), +							  linked_item->isWearableType() ? linked_item->getWearableType() : WT_INVALID +				); +			found.mWearable = mWearable; +			mHolder->mFoundList.push_front(found);  		} +		else +		{ +			llwarns << "inventory item or link not found for recovered wearable" << llendl; +		} +	} +private: +	LLWearableHoldingPattern* mHolder; +	LLWearable *mWearable; +	EWearableType mType; +}; -		if (completed) +class RecoveredItemCB: public LLInventoryCallback +{ +public: +	RecoveredItemCB(EWearableType type, LLWearable *wearable, LLWearableHoldingPattern* holder): +		mHolder(holder), +		mWearable(wearable), +		mType(type) +	{ +	} +	void fire(const LLUUID& item_id) +	{ +		llinfos << "Recovered item for type " << mType << llendl; +		LLViewerInventoryItem *itemp = gInventory.getItem(item_id); +		LLPointer<LLInventoryCallback> cb = new RecoveredItemLinkCB(mType,mWearable,mHolder); +		mHolder->mTypesToRecover.erase(mType); +		link_inventory_item( gAgent.getID(), +							 item_id, +							 LLAppearanceManager::instance().getCOF(), +							 itemp->getName(), +							 LLAssetType::AT_LINK, +							 cb); +	} +private: +	LLWearableHoldingPattern* mHolder; +	LLWearable *mWearable; +	EWearableType mType; +}; + +void LLWearableHoldingPattern::recoverMissingWearable(EWearableType type) +{ +		// Try to recover by replacing missing wearable with a new one. +	LLNotificationsUtil::add("ReplacedMissingWearable"); +	lldebugs << "Wearable " << LLWearableDictionary::getTypeLabel(type) +			 << " could not be downloaded.  Replaced inventory item with default wearable." << llendl; +	LLWearable* wearable = LLWearableList::instance().createNewWearable(type); + +	// Add a new one in the lost and found folder. +	const LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); +	LLPointer<LLInventoryCallback> cb = new RecoveredItemCB(type,wearable,this); + +	create_inventory_item(gAgent.getID(), +						  gAgent.getSessionID(), +						  lost_and_found_id, +						  wearable->getTransactionID(), +						  wearable->getName(), +						  wearable->getDescription(), +						  wearable->getAssetType(), +						  LLInventoryType::IT_WEARABLE, +						  wearable->getType(), +						  wearable->getPermissions().getMaskNextOwner(), +						  cb); +} + +bool LLWearableHoldingPattern::isMissingCompleted() +{ +	return mTypesToLink.size()==0 && mTypesToRecover.size()==0; +} + +void LLWearableHoldingPattern::clearCOFLinksForMissingWearables() +{ +	for (found_list_t::iterator it = mFoundList.begin(); it != mFoundList.end(); ++it) +	{ +		LLFoundData &data = *it; +		if ((data.mWearableType < WT_COUNT) && (!data.mWearable))  		{ -			// Only safe to delete if all wearable callbacks completed. -			delete this; +			// Wearable link that was never resolved; remove links to it from COF +			llinfos << "removing link for unresolved item " << data.mItemID.asString() << llendl; +			LLAppearanceManager::instance().removeCOFItemLinks(data.mItemID,false);  		}  	} +} + +bool LLWearableHoldingPattern::pollMissingWearables() +{ +	bool timed_out = isTimedOut(); +	bool missing_completed = isMissingCompleted(); +	bool done = timed_out || missing_completed; +	 +	llinfos << "polling missing wearables, waiting for items " << mTypesToRecover.size() +			<< " links " << mTypesToLink.size() +			<< " wearables, timed out " << timed_out +			<< " elapsed " << mWaitTime.getElapsedTimeF32() +			<< " done " << done << llendl; + +	if (done) +	{ +		clearCOFLinksForMissingWearables(); +		onAllComplete(); +	}  	return done;  } +static void onWearableAssetFetch(LLWearable* wearable, void* data) +{ +	LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data; +	holder->mResolved += 1;  // just counting callbacks, not successes. +	llinfos << "onWearableAssetFetch, resolved count " << holder->mResolved << " of requested " << holder->mFoundList.size() << llendl; +	if (wearable) +	{ +		llinfos << "wearable found, type " << wearable->getType() << " asset " << wearable->getAssetID() << llendl; +	} +	else +	{ +		llwarns << "no wearable found" << llendl; +	} + +	if (holder->mFired) +	{ +		llwarns << "called after holder fired" << llendl; +		return; +	} + +	if (!wearable) +	{ +		return; +	} + +	for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin(); +		 iter != holder->mFoundList.end(); ++iter) +	{ +		LLFoundData& data = *iter; +		if(wearable->getAssetID() == data.mAssetID) +		{ +			data.mWearable = wearable; +			// Failing this means inventory or asset server are corrupted in a way we don't handle. +			llassert((data.mWearableType < WT_COUNT) && (wearable->getType() == data.mWearableType)); +			break; +		} +	} +} + +  static void removeDuplicateItems(LLInventoryModel::item_array_t& items)  {  	LLInventoryModel::item_array_t new_items; @@ -473,30 +711,6 @@ static void removeDuplicateItems(LLInventoryModel::item_array_t& items)  	items = new_items;  } -static void onWearableAssetFetch(LLWearable* wearable, void* data) -{ -	LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data; -	if (holder->mFired) -	{ -		llwarns << "called after holder fired" << llendl; -	} - -	if(wearable) -	{ -		for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin(); -			 iter != holder->mFoundList.end(); ++iter) -		{ -			LLFoundData& data = *iter; -			if(wearable->getAssetID() == data.mAssetID) -			{ -				data.mWearable = wearable; -				break; -			} -		} -	} -	holder->mResolved += 1; -} -  const LLUUID LLAppearanceManager::getCOF() const  {  	return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); @@ -718,7 +932,8 @@ void LLAppearanceManager::linkAll(const LLUUID& category,  void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)  { -	llinfos << "starting" << llendl; +	LLViewerInventoryCategory *pcat = gInventory.getCategory(category); +	llinfos << "starting, cat " << (pcat ? pcat->getName() : "[UNKNOWN]") << llendl;  	const LLUUID cof = getCOF(); @@ -893,6 +1108,9 @@ void LLAppearanceManager::updateAppearanceFromCOF()  	// wearables can be resolved immediately, then the  	// callback will be called (and this object deleted)  	// before the final getNextData(). + +	// BAP future cleanup - no point having found_container when +	// mFoundList already has all the info.  	LLDynamicArray<LLFoundData> found_container;  	for(S32 i = 0; i  < wear_items.count(); ++i)  	{ @@ -903,7 +1121,21 @@ void LLAppearanceManager::updateAppearanceFromCOF()  			LLFoundData found(linked_item->getUUID(),  							  linked_item->getAssetUUID(),  							  linked_item->getName(), -							  linked_item->getType()); +							  linked_item->getType(), +							  linked_item->isWearableType() ? linked_item->getWearableType() : WT_INVALID +				); + +#if 0 +			// Fault injection: uncomment this block to test asset +			// fetch failures (should be replaced by new defaults in +			// lost&found). +			if (found.mWearableType == WT_SHAPE || found.mWearableType == WT_JACKET) +			{ +				found.mAssetID.generate(); // Replace with new UUID, guaranteed not to exist in DB +				 +			} +#endif +  			holder->mFoundList.push_front(found);  			found_container.put(found);  		} @@ -923,7 +1155,9 @@ void LLAppearanceManager::updateAppearanceFromCOF()  	for(S32 i = 0; i < found_container.count(); ++i)  	{  		LLFoundData& found = found_container.get(i); -				 + +		llinfos << "waiting for onWearableAssetFetch callback, asset " << found.mAssetID.asString() << llendl; +  		// Fetch the wearables about to be worn.  		LLWearableList::instance().getAsset(found.mAssetID,  											found.mName, @@ -933,9 +1167,9 @@ void LLAppearanceManager::updateAppearanceFromCOF()  	} -	if (!holder->pollCompletion()) +	if (!holder->pollFetchCompletion())  	{ -		doOnIdleRepeating(boost::bind(&LLWearableHoldingPattern::pollCompletion,holder)); +		doOnIdleRepeating(boost::bind(&LLWearableHoldingPattern::pollFetchCompletion,holder));  	}  } diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 28b51ee0f6..e7e2f33520 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -151,6 +151,18 @@ public:  	BOOL getIsProtectedCOFItem(const LLUUID& obj_id) const;  }; +class LLUpdateAppearanceOnDestroy: public LLInventoryCallback +{ +public: +	LLUpdateAppearanceOnDestroy(); +	virtual ~LLUpdateAppearanceOnDestroy(); +	/* virtual */ void fire(const LLUUID& inv_item); + +private: +	U32 mFireCount; +}; + +  #define SUPPORT_ENSEMBLES 0  LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id,const std::string& name); diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 92031be8c5..24b8ef3320 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -926,13 +926,12 @@ void LLBottomTray::processShrinkButtons(S32* required_width, S32* buttons_freed_  		}  		else  		{ -			// -			mSpeakBtn->setLabelVisible(false);  			S32 panel_width = mSpeakPanel->getRect().getWidth();  			S32 possible_shrink_width = panel_width - panel_min_width;  			if (possible_shrink_width > 0)  			{ +				mSpeakBtn->setLabelVisible(false);  				mSpeakPanel->reshape(panel_width - possible_shrink_width, mSpeakPanel->getRect().getHeight());  				*required_width += possible_shrink_width; @@ -1007,18 +1006,18 @@ void LLBottomTray::processExtendButtons(S32* available_width)  	if (*available_width > 0)  	{ -		processExtendButton(RS_BUTTON_CAMERA, available_width); +		processExtendButton(RS_BUTTON_MOVEMENT, available_width);  	}  	if (*available_width > 0)  	{ -		processExtendButton(RS_BUTTON_MOVEMENT, available_width); +		processExtendButton(RS_BUTTON_CAMERA, available_width);  	}  	if (*available_width > 0)  	{  		S32 panel_max_width = mObjectDefaultWidthMap[RS_BUTTON_SPEAK];  		S32 panel_width = mSpeakPanel->getRect().getWidth();  		S32 possible_extend_width = panel_max_width - panel_width; -		if (possible_extend_width > 0 && possible_extend_width <= *available_width) +		if (possible_extend_width >= 0 && possible_extend_width <= *available_width)  // HACK: this button doesn't change size so possible_extend_width will be 0  		{  			mSpeakBtn->setLabelVisible(true);  			mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight()); @@ -1211,8 +1210,8 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible  			if ( (available_width + possible_shrunk_width) >= minimal_width)  			{  				// There is enough space for minimal width, but set the result_width -				// to current_width so buttons widths decreasing will be done in predefined order -				result_width = current_width; +				// to preferred_width so buttons widths decreasing will be done in predefined order +				result_width = (preferred_width > 0) ? preferred_width : current_width;  				decrease_width = true;  			}  			else diff --git a/indra/newview/llfloaterlagmeter.cpp b/indra/newview/llfloaterlagmeter.cpp index 3753dcaaa8..85186cee6b 100644 --- a/indra/newview/llfloaterlagmeter.cpp +++ b/indra/newview/llfloaterlagmeter.cpp @@ -64,7 +64,7 @@ BOOL LLFloaterLagMeter::postBuild()  	setIsChrome(TRUE);  	// were we shrunk last time? -	if (gSavedSettings.getBOOL("LagMeterShrunk")) +	if (isShrunk())  	{  		onClickShrink();  	} @@ -122,6 +122,7 @@ BOOL LLFloaterLagMeter::postBuild()  	mStringArgs["[SERVER_FRAME_RATE_WARNING]"] = getString("server_frame_rate_warning_fps");  //	childSetAction("minimize", onClickShrink, this); +	updateControls(isShrunk()); // if expanded append colon to the labels (EXT-4079)  	return TRUE;  } @@ -130,7 +131,7 @@ LLFloaterLagMeter::~LLFloaterLagMeter()  	// save shrunk status for next time  //	gSavedSettings.setBOOL("LagMeterShrunk", mShrunk);  	// expand so we save the large window rectangle -	if (gSavedSettings.getBOOL("LagMeterShrunk")) +	if (isShrunk())  	{  		onClickShrink();  	} @@ -312,17 +313,15 @@ void LLFloaterLagMeter::determineServer()  	}  } - -void LLFloaterLagMeter::onClickShrink()  // toggle "LagMeterShrunk" +void LLFloaterLagMeter::updateControls(bool shrink)  {  //	LLFloaterLagMeter * self = (LLFloaterLagMeter*)data;  	LLButton * button = getChild<LLButton>("minimize");  	S32 delta_width = mMaxWidth -mMinWidth;  	LLRect r = getRect(); -	bool shrunk = gSavedSettings.getBOOL("LagMeterShrunk"); -	if(shrunk) +	if(!shrink)  	{  		setTitle(getString("max_title_msg", mStringArgs) );  		// make left edge appear to expand @@ -368,5 +367,16 @@ void LLFloaterLagMeter::onClickShrink()  // toggle "LagMeterShrunk"  //	self->childSetVisible("server_help", self->mShrunk);  //	self->mShrunk = !self->mShrunk; -	gSavedSettings.setBOOL("LagMeterShrunk", !gSavedSettings.getBOOL("LagMeterShrunk")); +} + +BOOL LLFloaterLagMeter::isShrunk() +{ +	return gSavedSettings.getBOOL("LagMeterShrunk"); +} + +void LLFloaterLagMeter::onClickShrink()  // toggle "LagMeterShrunk" +{ +	bool shrunk = isShrunk(); +	updateControls(!shrunk); +	gSavedSettings.setBOOL("LagMeterShrunk", !shrunk);  } diff --git a/indra/newview/llfloaterlagmeter.h b/indra/newview/llfloaterlagmeter.h index 592630636a..5416bca790 100644 --- a/indra/newview/llfloaterlagmeter.h +++ b/indra/newview/llfloaterlagmeter.h @@ -51,6 +51,8 @@ private:  	void determineClient();  	void determineNetwork();  	void determineServer(); +	void updateControls(bool shrink); +	BOOL isShrunk();  	void onClickShrink(); diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 68faaeaa0b..7d527fa98a 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -419,6 +419,11 @@ S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_gen  	S32 total_width = LEFT_PAD;  	S32 running_height = mDebugFilters ? llceil(LLFontGL::getFontMonospace()->getLineHeight()) : 0;  	S32 target_height = running_height; +	if(!mHasVisibleChildren)// is there any filtered items ?		 +	{ +		//Nope. We need to display status textbox, let's reserve some place for it  +		target_height += mStatusTextBox->getTextPixelHeight(); +	}  	S32 parent_item_height = getRect().getHeight();  	for (folders_t::iterator iter = mFolders.begin(); diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 6dbd3a81e8..6e7321f739 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -1728,7 +1728,6 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,  		LLGroupMgrGroupData::member_list_t::iterator mit = group_datap->mMembers.find(ejected_member_id);  		if (mit != group_datap->mMembers.end())  		{ -			LLGroupMemberData* member_data = (*mit).second;  			// Add them to the message  			if (start_message)  			{ @@ -1750,6 +1749,8 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,  				start_message = true;  			} +			LLGroupMemberData* member_data = (*mit).second; +  			// Clean up groupmgr  			for (LLGroupMemberData::role_list_t::iterator rit = member_data->roleBegin();  				 rit != member_data->roleEnd(); ++rit) @@ -1762,6 +1763,8 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,  			group_datap->mMembers.erase(ejected_member_id); +			// member_data was introduced and is used here instead of (*mit).second to avoid crash because of invalid iterator +			// It becomes invalid after line with erase above. EXT-4778  			delete member_data;  		}  	} diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 75dc227c53..ba8f757f22 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -1935,7 +1935,7 @@ bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat,  	// - links to attachments  	// - links to gestures  	// - links to ensemble folders -	LLViewerInventoryItem *linked_item = ((LLViewerInventoryItem*)item)->getLinkedItem(); // BAP - safe? +	LLViewerInventoryItem *linked_item = ((LLViewerInventoryItem*)item)->getLinkedItem();  	if (linked_item)  	{  		LLAssetType::EType type = linked_item->getType(); @@ -1946,7 +1946,7 @@ bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat,  	}  	else  	{ -		LLViewerInventoryCategory *linked_category = ((LLViewerInventoryItem*)item)->getLinkedCategory(); // BAP - safe? +		LLViewerInventoryCategory *linked_category = ((LLViewerInventoryItem*)item)->getLinkedCategory();  		// BAP remove AT_NONE support after ensembles are fully working?  		return (linked_category &&  				((linked_category->getPreferredType() == LLFolderType::FT_NONE) || @@ -2976,8 +2976,6 @@ void LLFolderBridge::modifyOutfit(BOOL append)  	LLViewerInventoryCategory* cat = getCategory();  	if(!cat) return; -	// BAP - was: -	// wear_inventory_category_on_avatar( cat, append );  	LLAppearanceManager::instance().wearInventoryCategory( cat, FALSE, append );  } diff --git a/indra/newview/lllocationhistory.h b/indra/newview/lllocationhistory.h index 5f9976f87a..65f0dd2e1b 100644 --- a/indra/newview/lllocationhistory.h +++ b/indra/newview/lllocationhistory.h @@ -41,11 +41,13 @@  #include <boost/function.hpp>  class LLSD; - +/** + * This enum is responsible for identifying of history item. + */  enum ELocationType { -	 TYPED_REGION_SURL//region name or surl  -	,LANDMARK  // name of landmark -	,TELEPORT_HISTORY  +	 TYPED_REGION_SLURL//item added after the user had typed a region name or slurl  +	,LANDMARK  // item has been loaded from landmark folder +	,TELEPORT_HISTORY // item from session teleport history  	};  class LLLocationHistoryItem { diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index e493c4bf9c..04c684b240 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -664,7 +664,7 @@ void LLLocationInputCtrl::onLocationPrearrange(const LLSD& data)  				value["item_type"] = TELEPORT_HISTORY;  				value["global_pos"] = result->mGlobalPos.getValue();  				std::string region_name = result->mTitle.substr(0, result->mTitle.find(',')); -				//TODO*: add Surl to teleportitem or parse region name from title +				//TODO*: add slurl to teleportitem or parse region name from title  				value["tooltip"] = LLSLURL::buildSLURLfromPosGlobal(region_name,  						result->mGlobalPos,	false);  				add(result->getTitle(), value);  @@ -914,7 +914,7 @@ void LLLocationInputCtrl::rebuildLocationHistory(std::string filter)  		LLSD value;  		value["tooltip"] = it->getToolTip();  		//location history can contain only typed locations -		value["item_type"] = TYPED_REGION_SURL; +		value["item_type"] = TYPED_REGION_SLURL;  		value["global_pos"] = it->mGlobalPos.getValue();  		add(it->getLocation(), value);  	} diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 3650b43364..16b13d9218 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -100,10 +100,10 @@ const static int IDX_TEXT = 3;  using namespace boost::posix_time;  using namespace boost::gregorian; -class LLLogChatTimeScaner: public LLSingleton<LLLogChatTimeScaner> +class LLLogChatTimeScanner: public LLSingleton<LLLogChatTimeScanner>  {  public: -	LLLogChatTimeScaner() +	LLLogChatTimeScanner()  	{  		// Note, date/time facets will be destroyed by string streams  		mDateStream.imbue(std::locale(mDateStream.getloc(), new date_input_facet(DATE_FORMAT))); @@ -464,7 +464,7 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im)  		boost::trim(timestamp);  		timestamp.erase(0, 1);  		timestamp.erase(timestamp.length()-1, 1); -		LLLogChatTimeScaner::instance().checkAndCutOffDate(timestamp); +		LLLogChatTimeScanner::instance().checkAndCutOffDate(timestamp);  		im[IM_TIME] = timestamp;  	}  	else diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index 46cab0d868..d42e4bc250 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -449,8 +449,14 @@ void LLNavigationBar::onLocationSelection()  	// Will not teleport to empty location.  	if (typed_location.empty())  		return; - +	//get selected item from combobox item  	LLSD value = mCmbLocation->getSelectedValue(); +	/* since navbar list support autocompletion it contains several types of item: landmark, teleport hystory item, +	 * typed by user slurl or region name. Let's find out which type of item the user has selected  +	 * to make decision about adding this location into typed history. see mSaveToLocationHistory +	 * Note: +	 * Only TYPED_REGION_SLURL item will be added into LLLocationHistory  +	 */    	if(value.has("item_type"))  	{ @@ -480,7 +486,7 @@ void LLNavigationBar::onLocationSelection()  		case TELEPORT_HISTORY:  			//in case of teleport item was selected, teleport by position too. -		case TYPED_REGION_SURL: +		case TYPED_REGION_SLURL:  			if(value.has("global_pos"))  			{  				gAgent.teleportViaLocation(LLVector3d(value["global_pos"])); @@ -492,7 +498,7 @@ void LLNavigationBar::onLocationSelection()  			break;		  		}  	} -	//Let's parse surl or region name +	//Let's parse slurl or region name  	std::string region_name;  	LLVector3 local_coords(128, 128, 0); @@ -505,7 +511,17 @@ void LLNavigationBar::onLocationSelection()  				local_coords.set(x, y, z);  		else  			return; -	}else +	} +	// we have to do this check after previous, because LLUrlRegistry contains handlers for slurl too   +	//but we need to know whether typed_location is a simple http url. +	else if (LLUrlRegistry::instance().isUrl(typed_location))  +	{ +		// display http:// URLs in the media browser, or +		// anything else is sent to the search floater +		LLWeb::loadURL(typed_location); +		return; +	} +	else  	{  		// assume that an user has typed the {region name} or possible {region_name, parcel}  		region_name  = typed_location.substr(0,typed_location.find(',')); @@ -531,7 +547,7 @@ void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos)  		return;  	LLLocationHistory* lh = LLLocationHistory::getInstance(); -	//TODO*: do we need convert surl into readable format? +	//TODO*: do we need convert slurl into readable format?  	std::string location;  	/*NOTE:  	 * We can't use gAgent.getPositionAgent() in case of local teleport to build location. @@ -543,7 +559,7 @@ void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos)  	std::string tooltip (LLSLURL::buildSLURLfromPosGlobal(gAgent.getRegion()->getName(), global_agent_pos, false));  	LLLocationHistoryItem item (location, -			global_agent_pos, tooltip,TYPED_REGION_SURL);// we can add into history only TYPED location +			global_agent_pos, tooltip,TYPED_REGION_SLURL);// we can add into history only TYPED location  	//Touch it, if it is at list already, add new location otherwise  	if ( !lh->touchItem(item) ) {  		lh->addItem(item); @@ -621,20 +637,7 @@ void LLNavigationBar::onRegionNameResponse(  	// Invalid location?  	if (!region_handle)  	{ -		// handle any secondlife:// SLapps, or -		// display http:// URLs in the media browser, or -		// anything else is sent to the search floater -		if (LLUrlRegistry::instance().isUrl(typed_location)) -		{ -			if (! LLURLDispatcher::dispatchFromTextEditor(typed_location)) -			{ -				LLWeb::loadURL(typed_location); -			} -		} -		else -		{ -			invokeSearch(typed_location); -		} +		invokeSearch(typed_location);  		return;  	} diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 86f101e012..6b07409676 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -352,8 +352,10 @@ LLPanelAvatarNotes::~LLPanelAvatarNotes()  	if(getAvatarId().notNull())  	{  		LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this); -		if(LLVoiceClient::getInstance()) +		if(LLVoiceClient::instanceExists()) +		{  			LLVoiceClient::getInstance()->removeObserver((LLVoiceClientStatusObserver*)this); +		}  	}  } @@ -795,8 +797,10 @@ LLPanelAvatarProfile::~LLPanelAvatarProfile()  	if(getAvatarId().notNull())  	{  		LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this); -		if(LLVoiceClient::getInstance()) +		if(LLVoiceClient::instanceExists()) +		{  			LLVoiceClient::getInstance()->removeObserver((LLVoiceClientStatusObserver*)this); +		}  	}  } diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index 8ca044f72b..2a794a06b5 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -72,6 +72,7 @@  #include "llviewerwindow.h"	// for window width, height  #include "llappviewer.h"	// abortQuit()  #include "lltrans.h" +#include "llscrollcontainer.h"  #include "llstatusbar.h"  const S32 MINIMUM_PRICE_FOR_LISTING = 50;	// L$ @@ -1173,6 +1174,12 @@ BOOL LLPanelClassifiedInfo::postBuild()  	childSetAction("show_on_map_btn", boost::bind(&LLPanelClassifiedInfo::onMapClick, this));  	childSetAction("teleport_btn", boost::bind(&LLPanelClassifiedInfo::onTeleportClick, this)); +	mScrollingPanel = getChild<LLPanel>("scroll_content_panel"); +	mScrollContainer = getChild<LLScrollContainer>("profile_scroll"); + +	mScrollingPanelMinHeight = mScrollContainer->getScrolledViewRect().getHeight(); +	mScrollingPanelWidth = mScrollingPanel->getRect().getWidth(); +  	return TRUE;  } @@ -1186,6 +1193,26 @@ void LLPanelClassifiedInfo::setEditClassifiedCallback(const commit_callback_t& c  	getChild<LLButton>("edit_btn")->setClickedCallback(cb);  } +void LLPanelClassifiedInfo::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */) +{ +	LLPanel::reshape(width, height, called_from_parent); + +	if (!mScrollContainer || !mScrollingPanel) +		return; + +	static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0); + +	S32 scroll_height = mScrollContainer->getRect().getHeight(); +	if (mScrollingPanelMinHeight >= scroll_height) +	{ +		mScrollingPanel->reshape(mScrollingPanelWidth, mScrollingPanelMinHeight); +	} +	else +	{ +		mScrollingPanel->reshape(mScrollingPanelWidth + scrollbar_size, scroll_height); +	} +} +  void LLPanelClassifiedInfo::onOpen(const LLSD& key)  {  	LLUUID avatar_id = key["avatar_id"]; diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h index e46806f576..9e33e55b88 100644 --- a/indra/newview/llpanelclassified.h +++ b/indra/newview/llpanelclassified.h @@ -55,6 +55,7 @@ class LLTextEditor;  class LLTextureCtrl;  class LLUICtrl;  class LLMessageSystem; +class LLScrollContainer;  // *TODO deprecated, should be removed.  // New class implemented in ticket EXT-2095 @@ -253,6 +254,8 @@ public:  	void setEditClassifiedCallback(const commit_callback_t& cb); +	/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); +  protected:  	LLPanelClassifiedInfo(); @@ -277,6 +280,12 @@ private:  	LLVector3d mPosGlobal;  	LLUUID mParcelId;  	bool mInfoLoaded; + +	LLScrollContainer*		mScrollContainer; +	LLPanel*				mScrollingPanel; + +	S32 mScrollingPanelMinHeight; +	S32 mScrollingPanelWidth;  };  class LLPanelClassifiedEdit : public LLPanelClassifiedInfo diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index ce4078409a..706787e824 100644 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -102,8 +102,10 @@ LLPanelGroup::LLPanelGroup()  LLPanelGroup::~LLPanelGroup()  {  	LLGroupMgr::getInstance()->removeObserver(this); -	if(LLVoiceClient::getInstance()) +	if(LLVoiceClient::instanceExists()) +	{  		LLVoiceClient::getInstance()->removeObserver(this); +	}  }  void LLPanelGroup::onOpen(const LLSD& key) @@ -335,7 +337,7 @@ void LLPanelGroup::update(LLGroupChange gc)  		childSetToolTip("group_name",gdatap->mName);  		LLGroupData agent_gdatap; -		bool is_member = gAgent.getGroupData(mID,agent_gdatap); +		bool is_member = gAgent.getGroupData(mID,agent_gdatap) || gAgent.isGodlike();  		bool join_btn_visible = !is_member && gdatap->mOpenEnrollment;  		mButtonJoin->setVisible(join_btn_visible); @@ -464,7 +466,7 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)  		}  		LLGroupData agent_gdatap; -		bool is_member = gAgent.getGroupData(mID,agent_gdatap); +		bool is_member = gAgent.getGroupData(mID,agent_gdatap) || gAgent.isGodlike();  		tab_roles->setVisible(is_member);  		tab_notices->setVisible(is_member); diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index 516020797d..c2a6828837 100644 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -653,6 +653,9 @@ void LLPanelGroupNotices::setGroupID(const LLUUID& id)  	LLGroupDropTarget* target = getChild<LLGroupDropTarget> ("drop_target");  	target->setPanel (this);  	target->setGroup (mGroupID); + +	if(mViewMessage)  +		mViewMessage->clear();  	activate();  } diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index 8e305a5674..c34f0633b9 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -112,8 +112,10 @@ void LLPanelChatControlPanel::updateButtons(bool is_call_started)  LLPanelChatControlPanel::~LLPanelChatControlPanel()  {  	mVoiceChannelStateChangeConnection.disconnect(); -	if(LLVoiceClient::getInstance()) +	if(LLVoiceClient::instanceExists()) +	{  		LLVoiceClient::getInstance()->removeObserver(this); +	}  }  BOOL LLPanelChatControlPanel::postBuild() diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 36fab86280..d2a518a06a 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -463,8 +463,10 @@ LLPanelPeople::~LLPanelPeople()  	delete mFriendListUpdater;  	delete mRecentListUpdater; -	if(LLVoiceClient::getInstance()) +	if(LLVoiceClient::instanceExists()) +	{  		LLVoiceClient::getInstance()->removeObserver(this); +	}  	LLView::deleteViewByHandle(mGroupPlusMenuHandle);  	LLView::deleteViewByHandle(mNearbyViewSortMenuHandle); diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp index d452ef2228..a88a242fbe 100644 --- a/indra/newview/llscriptfloater.cpp +++ b/indra/newview/llscriptfloater.cpp @@ -88,7 +88,7 @@ bool LLScriptFloater::toggle(const LLUUID& notification_id)  		else  		{  			floater->setVisible(TRUE); -			floater->setFocus(TRUE); +			floater->setFocus(FALSE);  		}  	}  	// create and show new floater @@ -107,6 +107,9 @@ LLScriptFloater* LLScriptFloater::show(const LLUUID& notification_id)  	floater->setNotificationId(notification_id);  	floater->createForm(notification_id); +	//LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445) +	floater->setAutoFocus(FALSE); +  	if(LLScriptFloaterManager::OBJ_SCRIPT == LLScriptFloaterManager::getObjectType(notification_id))  	{  		floater->setSavePosition(true); @@ -117,7 +120,8 @@ LLScriptFloater* LLScriptFloater::show(const LLUUID& notification_id)  		floater->dockToChiclet(true);  	} -	LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, TRUE); +	//LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445) +	LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, FALSE);  	return floater;  } diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index fa07278cb9..83f773fadc 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -200,10 +200,6 @@  #include "lldxhardware.h"  #endif -#if (LL_LINUX || LL_SOLARIS) && LL_GTK -#include <glib/gspawn.h> -#endif -  //  // exported globals  // diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index 257afabdcc..0b6bd4b401 100644 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -223,17 +223,6 @@ void LLURLDispatcherImpl::regionNameCallback(U64 region_handle, const std::strin  	S32 z = 0;  	LLURLSimString::parse(sim_string, ®ion_name, &x, &y, &z); -	// Invalid location? EXT-5380 -	if (!region_handle) -	{ -		if(!region_name.empty() && !LLStringOps::isDigit(region_name.c_str()[0]))// it is no sense to search an empty region_name or when the  region_name  starts with digits -		{ -			// may be an user types incorrect region name, let's help him to find a correct one  -			LLFloaterReg::showInstance("search", LLSD().with("category", "places").with("id", LLSD(region_name))); -		} -		//*TODO: add notification about invalid region_name  -		return; -	}  	LLVector3 local_pos;  	local_pos.mV[VX] = (F32)x;  	local_pos.mV[VY] = (F32)y; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 6a1fb7d6ff..deb7e8c038 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -6897,7 +6897,8 @@ class LLToolsEditLinkedParts : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ -		BOOL select_individuals = gSavedSettings.getBOOL("EditLinkedParts"); +		BOOL select_individuals = !gSavedSettings.getBOOL("EditLinkedParts"); +		gSavedSettings.setBOOL( "EditLinkedParts", select_individuals );  		if (select_individuals)  		{  			LLSelectMgr::getInstance()->demoteSelectionToIndividuals(); diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 9984cfcf5d..e1aafc447f 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -680,6 +680,7 @@ with the same filename but different name    <texture name="silhouette.j2c" use_mips="true" />    <texture name="foot_shadow.j2c" use_mips="true" />    <texture name="cloud-particle.j2c" use_mips="true" /> +  <texture name="transparent.j2c" use_mips="true" />    <!--WARNING OLD ART BELOW *do not use*-->    <texture name="icn_chatbar.tga" /> diff --git a/indra/newview/skins/default/xui/en/floater_script.xml b/indra/newview/skins/default/xui/en/floater_script.xml index 984c4fcf1d..663899d4b3 100644 --- a/indra/newview/skins/default/xui/en/floater_script.xml +++ b/indra/newview/skins/default/xui/en/floater_script.xml @@ -10,7 +10,7 @@   top="0"   can_dock="true"   can_minimize="true" - visible="true"  + visible="false"    width="520"   can_resize="false"   min_width="350" diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index c5200be7a9..0fd73f9b6a 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -5210,14 +5210,14 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th     icon="notify.tga"     name="FriendshipAcceptedByMe"     type="offer"> -Friend request accepted. +Friendship offer accepted.    </notification>    <notification     icon="notify.tga"     name="FriendshipDeclinedByMe"     type="offer"> -Friend request declined. +Friendship offer declined.    </notification>    <notification diff --git a/indra/newview/skins/default/xui/en/panel_edit_classified.xml b/indra/newview/skins/default/xui/en/panel_edit_classified.xml index cc09835049..d31e7d2ed8 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_classified.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml @@ -61,11 +61,11 @@       background_visible="false"       height="600"       left="0" -     width="295"> +     width="285">      <texture_picker       follows="left|top|right"       height="197" -     width="286" +     width="272"       layout="topleft"       top="10"       left="11" @@ -92,7 +92,7 @@           top="215"           name="Name:"           text_color="white" -         width="290"> +         width="280">              Title:          </text>          <line_editor @@ -106,7 +106,7 @@           name="classified_name"           prevalidate_callback="ascii"           text_color="black" -         width="290" /> +         width="273" />          <text           type="string"           length="1" @@ -119,13 +119,13 @@           top_pad="20"           name="description_label"           text_color="white" -         width="290"> +         width="280">              Description:          </text>          <text_editor           follows="left|top|right"           height="100" -         width="290" +         width="273"           hide_scrollbar="false"           layout="topleft"           left="10" @@ -146,7 +146,7 @@           name="location_label"           text_color="white"           top_pad="20" -         width="290"> +         width="280">              Location:          </text>          <text @@ -159,7 +159,7 @@           name="classified_location"           right="-10"           top_pad="2" -         width="290" +         width="280"           word_wrap="true">              loading...          </text> diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml index 41e53be29e..f913c58cc9 100644 --- a/indra/newview/skins/default/xui/en/panel_group_general.xml +++ b/indra/newview/skins/default/xui/en/panel_group_general.xml @@ -1,9 +1,8 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel   label="General" - follows="all"   height="604" - width="303" + width="304"   class="panel_group_general"   name="general_tab">      <panel.string @@ -26,7 +25,7 @@ Hover your mouse over the options for more help.        top="0"        left="0"        height="129" -      width="313" +      width="304"        layout="topleft">      <texture_picker       follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml index b196d8eeb7..4e57b428bd 100644 --- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml @@ -81,80 +81,129 @@ background_visible="true"       width="292"       border_size="0">     <layout_panel -         bg_alpha_color="DkGray2" -         bg_opaque_color="DkGray2" - background_visible="true" - background_opaque="true" -      name="group_accordions" -      follows="all" -      layout="topleft" -      auto_resize="true" -      > +       bg_alpha_color="DkGray2" +       bg_opaque_color="DkGray2" +       background_visible="true" +       background_opaque="true" +       name="group_accordions" +       follows="all" +       layout="topleft" +       auto_resize="true">     <accordion       left="0"       top="0" -           single_expansion="true" -             follows="all" -             layout="topleft" -             name="groups_accordion"> -             <accordion_tab +     single_expansion="true" +     follows="all" +     layout="topleft" +     name="groups_accordion"> +         <accordion_tab              expanded="true"              layout="topleft"              name="group_general_tab"              title="General"> -            <panel -             border="false" -             class="panel_group_general" -             filename="panel_group_general.xml" -             layout="topleft" -             left="0" -             follows="all" -             help_topic="group_general_tab" -             name="group_general_tab_panel" -             top="0" /> +               <scroll_container +                 color="DkGray2" +                 follows="all" +                 layout="topleft" +                 left="0" +                 name="profile_scroll" +                 opaque="true" +                 height="604" +                 width="304" +                 top="0"> +                   <panel +                      border="false" +                      class="panel_group_general" +                      filename="panel_group_general.xml" +                      layout="topleft" +                      left="0" +                      follows="left|top|right" +                      help_topic="group_general_tab" +                      name="group_general_tab_panel" +                      top="0" /> +			   </scroll_container>           </accordion_tab>           <accordion_tab              expanded="false"              layout="topleft"              name="group_roles_tab"              title="Roles"> -            <panel -            border="false" -            class="panel_group_roles" -             filename="panel_group_roles.xml" -             layout="topleft" -             left="0" -             name="group_roles_tab_panel" -             top="0" /> +               <scroll_container +                 color="DkGray2" +                 follows="all" +                 layout="topleft" +                 left="0" +                 name="profile_scroll" +                 opaque="true" +                 height="680" +                 width="304" +                 top="0"> + +                <panel +                   border="false" +                   class="panel_group_roles" +                   filename="panel_group_roles.xml" +                   follows="left|top|right" +                   layout="topleft" +                   left="0" +                   name="group_roles_tab_panel" +                   top="0" /> +                </scroll_container>           </accordion_tab>           <accordion_tab -                 expanded="false" +            expanded="false" +            layout="topleft" +            name="group_notices_tab" +            title="Notices"> +               <scroll_container +                 color="DkGray2" +                 follows="all"                   layout="topleft" -                 name="group_notices_tab" -                 title="Notices"> -        <panel -        border="false" -         class="panel_group_notices" -         filename="panel_group_notices.xml" -         layout="topleft" -         left="0" -         help_topic="group_notices_tab" -         name="group_notices_tab_panel" -         top="0" /> +                 left="0" +                 name="profile_scroll" +                 opaque="true" +                 height="530" +                 width="304" +                 top="0"> + +                <panel +                    border="false" +                    class="panel_group_notices" +                    filename="panel_group_notices.xml" +                    follows="left|top|right" +                    layout="topleft" +                    left="0" +                    help_topic="group_notices_tab" +                    name="group_notices_tab_panel" +                    top="0" /> +               </scroll_container>           </accordion_tab> -        <accordion_tab -                 expanded="false" +         <accordion_tab +             expanded="false" +             layout="topleft" +             name="group_land_tab" +             title="Land/Assets"> +               <scroll_container +                 color="DkGray2" +                 follows="all"                   layout="topleft" -                 name="group_land_tab" -                 title="Land/Assets"> -        <panel -        border="false" -         class="panel_group_land_money" -         filename="panel_group_land_money.xml" -         layout="topleft" -         left="0" -         name="group_land_tab_panel" -         top="0" /> +                 left="0" +                 name="profile_scroll" +                 opaque="true" +                 height="500" +                 width="304" +                 top="0"> + +                 <panel +					 border="false" +                     class="panel_group_land_money" +                     filename="panel_group_land_money.xml" +                     follows="left|top|right" +                     layout="topleft" +                     left="0" +                     name="group_land_tab_panel" +                     top="0" /> +               </scroll_container>           </accordion_tab>           </accordion>     </layout_panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml index 38b0f234d5..7996a89e72 100644 --- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml @@ -1,14 +1,13 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel   border="false" - follows="all"   height="500"   label="Land & L$"   layout="topleft"   left="0"   name="land_money_tab"   top="0" - width="313"> + width="304">      <panel.string       name="help_text">     A warning appears until the Total Land in Use is less than or = to the Total Contribution. diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml index 5f46ad7860..731b3c119c 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml @@ -1,13 +1,12 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel - follows="all"   height="530"   label="Notices"   layout="topleft"   left="0"   name="notices_tab"   top="0" - width="313"> + width="304">      <panel.string       name="help_text">          Notices let you send a message and an optionally attached item. @@ -44,7 +43,7 @@ Maximum 200 per group daily       right="-1"       name="notice_list"       top_pad="0" -     width="313"> +     width="304">          <scroll_list.columns           label=""           name="icon" diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index 7557e2cc5e..19c0da4f08 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -1,13 +1,12 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel - follows="all"   height="680"   label="Members & Roles"   layout="topleft"   left="0"   top="0"   name="roles_tab" - width="313"> + width="304">      <panel.string       name="default_needs_apply_text">          There are unsaved changes @@ -31,7 +30,7 @@       tab_height="22"       tab_min_width="90"       top="0" -     width="313"> +     width="304">          <panel           border="false"           follows="all" diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml index 2b361c0628..088f098f85 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml @@ -9,7 +9,7 @@   top="21"   width="310">      <string name="min_width"> -        188 +        216      </string>      <string name="max_width">          320 diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml index 86eaa79587..cc60b97f92 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml @@ -64,7 +64,7 @@  	<panel  	  background_visible="false"  	  follows="bottom|left" -	  height="50" +	  height="73"  	  layout="topleft"  	  left="9"  	  visible="true" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index c371b19fc5..c9752cf913 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -316,7 +316,7 @@       height="20"       layout="topleft"       left="25" -     name="Listen from" +     name="voice_chat_settings"       width="200"       top="210">  	  Voice Chat Settings diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index d72e175bc4..412485e03f 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -284,10 +284,11 @@               width="300" />              <expandable_text              follows="all" -            height="113" +            height="103"              layout="topleft"              left="7"              name="sl_groups" +            textbox.max_length="512"              top_pad="0"              translate="false"              width="290" diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml index 4a163fc1e3..8d6b0c1cfe 100644 --- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml +++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml @@ -16,17 +16,17 @@ label_pad_left - padding to the left of tab button labels                 tab_bottom_image_unselected="Toolbar_Left_Off"                 tab_bottom_image_selected="Toolbar_Left_Selected"                 tab_left_image_unselected="SegmentedBtn_Left_Disabled" -               tab_left_image_selected="SegmentedBtn_Left_Off"/> +               tab_left_image_selected="SegmentedBtn_Left_Selected_Over"/>    <middle_tab tab_top_image_unselected="TabTop_Middle_Off"                 tab_top_image_selected="TabTop_Middle_Selected"                 tab_bottom_image_unselected="Toolbar_Middle_Off"                 tab_bottom_image_selected="Toolbar_Middle_Selected"                 tab_left_image_unselected="SegmentedBtn_Left_Disabled" -               tab_left_image_selected="SegmentedBtn_Left_Off"/> +               tab_left_image_selected="SegmentedBtn_Left_Selected_Over"/>    <last_tab tab_top_image_unselected="TabTop_Right_Off"                 tab_top_image_selected="TabTop_Right_Selected"                 tab_bottom_image_unselected="Toolbar_Right_Off"                 tab_bottom_image_selected="Toolbar_Right_Selected"                 tab_left_image_unselected="SegmentedBtn_Left_Disabled" -               tab_left_image_selected="SegmentedBtn_Left_Off"/> +               tab_left_image_selected="SegmentedBtn_Left_Selected_Over"/>  </tab_container> diff --git a/indra/newview/skins/default/xui/pl/floater_about.xml b/indra/newview/skins/default/xui/pl/floater_about.xml index 29a5aca90d..29a5aca90d 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_about.xml +++ b/indra/newview/skins/default/xui/pl/floater_about.xml diff --git a/indra/newview/skins/default/xui/pl/floater_about_land.xml b/indra/newview/skins/default/xui/pl/floater_about_land.xml index d456ea26b4..d456ea26b4 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_about_land.xml +++ b/indra/newview/skins/default/xui/pl/floater_about_land.xml diff --git a/indra/newview/skins/default/xui/pl/floater_animation_preview.xml b/indra/newview/skins/default/xui/pl/floater_animation_preview.xml index 0524b8ade3..0524b8ade3 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/pl/floater_animation_preview.xml diff --git a/indra/newview/skins/default/xui/pl/floater_auction.xml b/indra/newview/skins/default/xui/pl/floater_auction.xml index 37e35ed1e9..37e35ed1e9 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_auction.xml +++ b/indra/newview/skins/default/xui/pl/floater_auction.xml diff --git a/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml b/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml index 8c09f7294c..8c09f7294c 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml diff --git a/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml b/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml index dce2330807..dce2330807 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml diff --git a/indra/newview/skins/default/xui/pl/floater_build_options.xml b/indra/newview/skins/default/xui/pl/floater_build_options.xml index f538be218c..f538be218c 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_build_options.xml +++ b/indra/newview/skins/default/xui/pl/floater_build_options.xml diff --git a/indra/newview/skins/default/xui/pl/floater_bumps.xml b/indra/newview/skins/default/xui/pl/floater_bumps.xml index 10f9d73284..10f9d73284 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_bumps.xml +++ b/indra/newview/skins/default/xui/pl/floater_bumps.xml diff --git a/indra/newview/skins/default/xui/pl/floater_buy_contents.xml b/indra/newview/skins/default/xui/pl/floater_buy_contents.xml index ebe1c9dfd8..ebe1c9dfd8 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/pl/floater_buy_contents.xml diff --git a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml index 5e59482883..5e59482883 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml diff --git a/indra/newview/skins/default/xui/pl/floater_buy_land.xml b/indra/newview/skins/default/xui/pl/floater_buy_land.xml index 648888828b..648888828b 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/pl/floater_buy_land.xml diff --git a/indra/newview/skins/default/xui/pl/floater_buy_object.xml b/indra/newview/skins/default/xui/pl/floater_buy_object.xml index bad7982228..bad7982228 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/pl/floater_buy_object.xml diff --git a/indra/newview/skins/default/xui/pl/floater_camera.xml b/indra/newview/skins/default/xui/pl/floater_camera.xml index 5957018144..5957018144 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_camera.xml +++ b/indra/newview/skins/default/xui/pl/floater_camera.xml diff --git a/indra/newview/skins/default/xui/pl/floater_choose_group.xml b/indra/newview/skins/default/xui/pl/floater_choose_group.xml index 72b6617094..72b6617094 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_choose_group.xml +++ b/indra/newview/skins/default/xui/pl/floater_choose_group.xml diff --git a/indra/newview/skins/default/xui/pl/floater_color_picker.xml b/indra/newview/skins/default/xui/pl/floater_color_picker.xml index 904a2cc270..904a2cc270 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/pl/floater_color_picker.xml diff --git a/indra/newview/skins/default/xui/pl/floater_critical.xml b/indra/newview/skins/default/xui/pl/floater_critical.xml index 8221a4e1bd..8221a4e1bd 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_critical.xml +++ b/indra/newview/skins/default/xui/pl/floater_critical.xml diff --git a/indra/newview/skins/default/xui/pl/floater_customize.xml b/indra/newview/skins/default/xui/pl/floater_customize.xml index 0c01d15faf..0c01d15faf 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_customize.xml +++ b/indra/newview/skins/default/xui/pl/floater_customize.xml diff --git a/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml index 6671bb853e..6671bb853e 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml diff --git a/indra/newview/skins/default/xui/pl/floater_device_settings.xml b/indra/newview/skins/default/xui/pl/floater_device_settings.xml index e79478731d..e79478731d 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_device_settings.xml +++ b/indra/newview/skins/default/xui/pl/floater_device_settings.xml diff --git a/indra/newview/skins/default/xui/pl/floater_env_settings.xml b/indra/newview/skins/default/xui/pl/floater_env_settings.xml index e197d94b27..e197d94b27 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_env_settings.xml +++ b/indra/newview/skins/default/xui/pl/floater_env_settings.xml diff --git a/indra/newview/skins/default/xui/pl/floater_gesture.xml b/indra/newview/skins/default/xui/pl/floater_gesture.xml index 4685eb6afe..4685eb6afe 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_gesture.xml +++ b/indra/newview/skins/default/xui/pl/floater_gesture.xml diff --git a/indra/newview/skins/default/xui/pl/floater_god_tools.xml b/indra/newview/skins/default/xui/pl/floater_god_tools.xml index a3ccffac03..a3ccffac03 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/pl/floater_god_tools.xml diff --git a/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml b/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml index 39695a67b6..39695a67b6 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml diff --git a/indra/newview/skins/default/xui/pl/floater_hud.xml b/indra/newview/skins/default/xui/pl/floater_hud.xml index ff2d702132..ff2d702132 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_hud.xml +++ b/indra/newview/skins/default/xui/pl/floater_hud.xml diff --git a/indra/newview/skins/default/xui/pl/floater_im.xml b/indra/newview/skins/default/xui/pl/floater_im.xml index 67c9d13496..67c9d13496 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_im.xml +++ b/indra/newview/skins/default/xui/pl/floater_im.xml diff --git a/indra/newview/skins/default/xui/pl/floater_image_preview.xml b/indra/newview/skins/default/xui/pl/floater_image_preview.xml index 27f898a66b..27f898a66b 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/pl/floater_image_preview.xml diff --git a/indra/newview/skins/default/xui/pl/floater_inspect.xml b/indra/newview/skins/default/xui/pl/floater_inspect.xml index c98e0541d8..c98e0541d8 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_inspect.xml +++ b/indra/newview/skins/default/xui/pl/floater_inspect.xml diff --git a/indra/newview/skins/default/xui/pl/floater_inventory.xml b/indra/newview/skins/default/xui/pl/floater_inventory.xml index 157be76c4d..157be76c4d 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_inventory.xml +++ b/indra/newview/skins/default/xui/pl/floater_inventory.xml diff --git a/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml index 665172dd49..665172dd49 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml diff --git a/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml index 9204262304..9204262304 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml diff --git a/indra/newview/skins/default/xui/pl/floater_joystick.xml b/indra/newview/skins/default/xui/pl/floater_joystick.xml index 22ac458b85..22ac458b85 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_joystick.xml +++ b/indra/newview/skins/default/xui/pl/floater_joystick.xml diff --git a/indra/newview/skins/default/xui/pl/floater_lagmeter.xml b/indra/newview/skins/default/xui/pl/floater_lagmeter.xml index 69d563bdba..69d563bdba 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/pl/floater_lagmeter.xml diff --git a/indra/newview/skins/default/xui/pl/floater_land_holdings.xml b/indra/newview/skins/default/xui/pl/floater_land_holdings.xml index 13e6a8b16d..13e6a8b16d 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/pl/floater_land_holdings.xml diff --git a/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml index 8120ff8c77..8120ff8c77 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml diff --git a/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml b/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml index 5601aa4464..5601aa4464 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml diff --git a/indra/newview/skins/default/xui/pl/floater_media_browser.xml b/indra/newview/skins/default/xui/pl/floater_media_browser.xml index 74210c75e5..74210c75e5 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/pl/floater_media_browser.xml diff --git a/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml b/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml index 88a878af72..88a878af72 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml diff --git a/indra/newview/skins/default/xui/pl/floater_moveview.xml b/indra/newview/skins/default/xui/pl/floater_moveview.xml index e28cfd589d..e28cfd589d 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_moveview.xml +++ b/indra/newview/skins/default/xui/pl/floater_moveview.xml diff --git a/indra/newview/skins/default/xui/pl/floater_mute_object.xml b/indra/newview/skins/default/xui/pl/floater_mute_object.xml index 8055617371..8055617371 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_mute_object.xml +++ b/indra/newview/skins/default/xui/pl/floater_mute_object.xml diff --git a/indra/newview/skins/default/xui/pl/floater_my_friends.xml b/indra/newview/skins/default/xui/pl/floater_my_friends.xml index 0bcf6ba4d5..0bcf6ba4d5 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_my_friends.xml +++ b/indra/newview/skins/default/xui/pl/floater_my_friends.xml diff --git a/indra/newview/skins/default/xui/pl/floater_openobject.xml b/indra/newview/skins/default/xui/pl/floater_openobject.xml index fbbed0f11d..fbbed0f11d 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_openobject.xml +++ b/indra/newview/skins/default/xui/pl/floater_openobject.xml diff --git a/indra/newview/skins/default/xui/pl/floater_pay.xml b/indra/newview/skins/default/xui/pl/floater_pay.xml index dfb1b6616c..dfb1b6616c 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_pay.xml +++ b/indra/newview/skins/default/xui/pl/floater_pay.xml diff --git a/indra/newview/skins/default/xui/pl/floater_pay_object.xml b/indra/newview/skins/default/xui/pl/floater_pay_object.xml index 376f517aaa..376f517aaa 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/pl/floater_pay_object.xml diff --git a/indra/newview/skins/default/xui/pl/floater_post_process.xml b/indra/newview/skins/default/xui/pl/floater_post_process.xml index 6bd91f97b1..6bd91f97b1 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_post_process.xml +++ b/indra/newview/skins/default/xui/pl/floater_post_process.xml diff --git a/indra/newview/skins/default/xui/pl/floater_postcard.xml b/indra/newview/skins/default/xui/pl/floater_postcard.xml index 8f4018924d..8f4018924d 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_postcard.xml +++ b/indra/newview/skins/default/xui/pl/floater_postcard.xml diff --git a/indra/newview/skins/default/xui/pl/floater_preferences.xml b/indra/newview/skins/default/xui/pl/floater_preferences.xml index 2be663283f..2be663283f 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_preferences.xml +++ b/indra/newview/skins/default/xui/pl/floater_preferences.xml diff --git a/indra/newview/skins/default/xui/pl/floater_preview_animation.xml b/indra/newview/skins/default/xui/pl/floater_preview_animation.xml index 7139c470a4..7139c470a4 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_preview_animation.xml +++ b/indra/newview/skins/default/xui/pl/floater_preview_animation.xml diff --git a/indra/newview/skins/default/xui/pl/floater_preview_classified.xml b/indra/newview/skins/default/xui/pl/floater_preview_classified.xml index eae9ba2690..eae9ba2690 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_preview_classified.xml +++ b/indra/newview/skins/default/xui/pl/floater_preview_classified.xml diff --git a/indra/newview/skins/default/xui/pl/floater_preview_event.xml b/indra/newview/skins/default/xui/pl/floater_preview_event.xml index 9fc0ff4da6..9fc0ff4da6 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_preview_event.xml +++ b/indra/newview/skins/default/xui/pl/floater_preview_event.xml diff --git a/indra/newview/skins/default/xui/pl/floater_preview_gesture.xml b/indra/newview/skins/default/xui/pl/floater_preview_gesture.xml index 1c7a3f6631..1c7a3f6631 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/pl/floater_preview_gesture.xml diff --git a/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml b/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml index b9f80490ab..b9f80490ab 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml diff --git a/indra/newview/skins/default/xui/pl/floater_preview_sound.xml b/indra/newview/skins/default/xui/pl/floater_preview_sound.xml index 656b9bec38..656b9bec38 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_preview_sound.xml +++ b/indra/newview/skins/default/xui/pl/floater_preview_sound.xml diff --git a/indra/newview/skins/default/xui/pl/floater_preview_texture.xml b/indra/newview/skins/default/xui/pl/floater_preview_texture.xml index 8bcd800411..8bcd800411 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/pl/floater_preview_texture.xml diff --git a/indra/newview/skins/default/xui/pl/floater_region_info.xml b/indra/newview/skins/default/xui/pl/floater_region_info.xml index ca3c1391db..ca3c1391db 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_region_info.xml +++ b/indra/newview/skins/default/xui/pl/floater_region_info.xml diff --git a/indra/newview/skins/default/xui/pl/floater_report_abuse.xml b/indra/newview/skins/default/xui/pl/floater_report_abuse.xml index 18ce1b230f..18ce1b230f 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/pl/floater_report_abuse.xml diff --git a/indra/newview/skins/default/xui/pl/floater_script_debug.xml b/indra/newview/skins/default/xui/pl/floater_script_debug.xml index 714a600262..714a600262 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_script_debug.xml +++ b/indra/newview/skins/default/xui/pl/floater_script_debug.xml diff --git a/indra/newview/skins/default/xui/pl/floater_script_preview.xml b/indra/newview/skins/default/xui/pl/floater_script_preview.xml index e3e72e15a3..e3e72e15a3 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/pl/floater_script_preview.xml diff --git a/indra/newview/skins/default/xui/pl/floater_script_queue.xml b/indra/newview/skins/default/xui/pl/floater_script_queue.xml index 7655f5fcac..7655f5fcac 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/pl/floater_script_queue.xml diff --git a/indra/newview/skins/default/xui/pl/floater_script_search.xml b/indra/newview/skins/default/xui/pl/floater_script_search.xml index 255ab4264c..255ab4264c 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_script_search.xml +++ b/indra/newview/skins/default/xui/pl/floater_script_search.xml diff --git a/indra/newview/skins/default/xui/pl/floater_select_key.xml b/indra/newview/skins/default/xui/pl/floater_select_key.xml index 194a6da1bd..194a6da1bd 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_select_key.xml +++ b/indra/newview/skins/default/xui/pl/floater_select_key.xml diff --git a/indra/newview/skins/default/xui/pl/floater_sell_land.xml b/indra/newview/skins/default/xui/pl/floater_sell_land.xml index a306ec2c34..a306ec2c34 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/pl/floater_sell_land.xml diff --git a/indra/newview/skins/default/xui/pl/floater_settings_debug.xml b/indra/newview/skins/default/xui/pl/floater_settings_debug.xml index f87e2edecc..f87e2edecc 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/pl/floater_settings_debug.xml diff --git a/indra/newview/skins/default/xui/pl/floater_snapshot.xml b/indra/newview/skins/default/xui/pl/floater_snapshot.xml index c807087170..c807087170 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/pl/floater_snapshot.xml diff --git a/indra/newview/skins/default/xui/pl/floater_sound_preview.xml b/indra/newview/skins/default/xui/pl/floater_sound_preview.xml index 0826508fd6..0826508fd6 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_sound_preview.xml +++ b/indra/newview/skins/default/xui/pl/floater_sound_preview.xml diff --git a/indra/newview/skins/default/xui/pl/floater_telehub.xml b/indra/newview/skins/default/xui/pl/floater_telehub.xml index 9f564452a9..9f564452a9 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_telehub.xml +++ b/indra/newview/skins/default/xui/pl/floater_telehub.xml diff --git a/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml index 48366e2b64..48366e2b64 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml diff --git a/indra/newview/skins/default/xui/pl/floater_tools.xml b/indra/newview/skins/default/xui/pl/floater_tools.xml index e898c283c5..e898c283c5 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_tools.xml +++ b/indra/newview/skins/default/xui/pl/floater_tools.xml diff --git a/indra/newview/skins/default/xui/pl/floater_top_objects.xml b/indra/newview/skins/default/xui/pl/floater_top_objects.xml index e7299b0abb..e7299b0abb 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/pl/floater_top_objects.xml diff --git a/indra/newview/skins/default/xui/pl/floater_tos.xml b/indra/newview/skins/default/xui/pl/floater_tos.xml index b9a146df22..b9a146df22 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_tos.xml +++ b/indra/newview/skins/default/xui/pl/floater_tos.xml diff --git a/indra/newview/skins/default/xui/pl/floater_url_entry.xml b/indra/newview/skins/default/xui/pl/floater_url_entry.xml index fc170d8d1b..fc170d8d1b 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_url_entry.xml +++ b/indra/newview/skins/default/xui/pl/floater_url_entry.xml diff --git a/indra/newview/skins/default/xui/pl/floater_water.xml b/indra/newview/skins/default/xui/pl/floater_water.xml index 7333633c1d..7333633c1d 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_water.xml +++ b/indra/newview/skins/default/xui/pl/floater_water.xml diff --git a/indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml index 2d4582392c..2d4582392c 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml +++ b/indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml diff --git a/indra/newview/skins/default/xui/pl/floater_windlight_options.xml b/indra/newview/skins/default/xui/pl/floater_windlight_options.xml index 86ef9300da..86ef9300da 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/pl/floater_windlight_options.xml diff --git a/indra/newview/skins/default/xui/pl/floater_world_map.xml b/indra/newview/skins/default/xui/pl/floater_world_map.xml index 36e3b0651b..36e3b0651b 100644..100755 --- a/indra/newview/skins/default/xui/pl/floater_world_map.xml +++ b/indra/newview/skins/default/xui/pl/floater_world_map.xml diff --git a/indra/newview/skins/default/xui/pl/menu_inventory.xml b/indra/newview/skins/default/xui/pl/menu_inventory.xml index 75c84c275d..75c84c275d 100644..100755 --- a/indra/newview/skins/default/xui/pl/menu_inventory.xml +++ b/indra/newview/skins/default/xui/pl/menu_inventory.xml diff --git a/indra/newview/skins/default/xui/pl/menu_login.xml b/indra/newview/skins/default/xui/pl/menu_login.xml index 5084b59397..5084b59397 100644..100755 --- a/indra/newview/skins/default/xui/pl/menu_login.xml +++ b/indra/newview/skins/default/xui/pl/menu_login.xml diff --git a/indra/newview/skins/default/xui/pl/menu_slurl.xml b/indra/newview/skins/default/xui/pl/menu_slurl.xml index 719959df6a..719959df6a 100644..100755 --- a/indra/newview/skins/default/xui/pl/menu_slurl.xml +++ b/indra/newview/skins/default/xui/pl/menu_slurl.xml diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml index 2a5842e553..2a5842e553 100644..100755 --- a/indra/newview/skins/default/xui/pl/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml diff --git a/indra/newview/skins/default/xui/pl/mime_types.xml b/indra/newview/skins/default/xui/pl/mime_types.xml index c90d5761e6..c90d5761e6 100644..100755 --- a/indra/newview/skins/default/xui/pl/mime_types.xml +++ b/indra/newview/skins/default/xui/pl/mime_types.xml diff --git a/indra/newview/skins/default/xui/pl/panel_audio_device.xml b/indra/newview/skins/default/xui/pl/panel_audio_device.xml index fc3b3776f0..fc3b3776f0 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_audio_device.xml +++ b/indra/newview/skins/default/xui/pl/panel_audio_device.xml diff --git a/indra/newview/skins/default/xui/pl/panel_friends.xml b/indra/newview/skins/default/xui/pl/panel_friends.xml index b6df36f199..b6df36f199 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_friends.xml +++ b/indra/newview/skins/default/xui/pl/panel_friends.xml diff --git a/indra/newview/skins/default/xui/pl/panel_group_general.xml b/indra/newview/skins/default/xui/pl/panel_group_general.xml index d09ff72226..d09ff72226 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_group_general.xml +++ b/indra/newview/skins/default/xui/pl/panel_group_general.xml diff --git a/indra/newview/skins/default/xui/pl/panel_group_invite.xml b/indra/newview/skins/default/xui/pl/panel_group_invite.xml index 12d48279ad..12d48279ad 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/pl/panel_group_invite.xml diff --git a/indra/newview/skins/default/xui/pl/panel_group_land_money.xml b/indra/newview/skins/default/xui/pl/panel_group_land_money.xml index dbfa8e3122..dbfa8e3122 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/pl/panel_group_land_money.xml diff --git a/indra/newview/skins/default/xui/pl/panel_group_notices.xml b/indra/newview/skins/default/xui/pl/panel_group_notices.xml index 1c19571ec0..1c19571ec0 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/pl/panel_group_notices.xml diff --git a/indra/newview/skins/default/xui/pl/panel_group_roles.xml b/indra/newview/skins/default/xui/pl/panel_group_roles.xml index dd46b4aeaa..dd46b4aeaa 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/pl/panel_group_roles.xml diff --git a/indra/newview/skins/default/xui/pl/panel_groups.xml b/indra/newview/skins/default/xui/pl/panel_groups.xml index 9df90fc797..9df90fc797 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_groups.xml +++ b/indra/newview/skins/default/xui/pl/panel_groups.xml diff --git a/indra/newview/skins/default/xui/pl/panel_login.xml b/indra/newview/skins/default/xui/pl/panel_login.xml index cec7e34da5..cec7e34da5 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_login.xml +++ b/indra/newview/skins/default/xui/pl/panel_login.xml diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml index 7195c30f20..7195c30f20 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml index 5599c21686..5599c21686 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml index 97b4975f29..97b4975f29 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml index ddd4c736d6..ddd4c736d6 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml index e3cdaae840..e3cdaae840 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml index 1e2289b496..1e2289b496 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml index f9b5d221a5..f9b5d221a5 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml diff --git a/indra/newview/skins/default/xui/pl/panel_region_covenant.xml b/indra/newview/skins/default/xui/pl/panel_region_covenant.xml index f20387dd25..f20387dd25 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_region_covenant.xml +++ b/indra/newview/skins/default/xui/pl/panel_region_covenant.xml diff --git a/indra/newview/skins/default/xui/pl/panel_region_debug.xml b/indra/newview/skins/default/xui/pl/panel_region_debug.xml index fe7b554a13..fe7b554a13 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/pl/panel_region_debug.xml diff --git a/indra/newview/skins/default/xui/pl/panel_region_estate.xml b/indra/newview/skins/default/xui/pl/panel_region_estate.xml index 4275f3f647..4275f3f647 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/pl/panel_region_estate.xml diff --git a/indra/newview/skins/default/xui/pl/panel_region_general.xml b/indra/newview/skins/default/xui/pl/panel_region_general.xml index 20296dac71..20296dac71 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_region_general.xml +++ b/indra/newview/skins/default/xui/pl/panel_region_general.xml diff --git a/indra/newview/skins/default/xui/pl/panel_region_terrain.xml b/indra/newview/skins/default/xui/pl/panel_region_terrain.xml index b206616e34..b206616e34 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/pl/panel_region_terrain.xml diff --git a/indra/newview/skins/default/xui/pl/panel_region_texture.xml b/indra/newview/skins/default/xui/pl/panel_region_texture.xml index d24579fc75..d24579fc75 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_region_texture.xml +++ b/indra/newview/skins/default/xui/pl/panel_region_texture.xml diff --git a/indra/newview/skins/default/xui/pl/panel_scrolling_param.xml b/indra/newview/skins/default/xui/pl/panel_scrolling_param.xml index 70a6e39412..70a6e39412 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_scrolling_param.xml +++ b/indra/newview/skins/default/xui/pl/panel_scrolling_param.xml diff --git a/indra/newview/skins/default/xui/pl/panel_status_bar.xml b/indra/newview/skins/default/xui/pl/panel_status_bar.xml index 9226e67dff..9226e67dff 100644..100755 --- a/indra/newview/skins/default/xui/pl/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/pl/panel_status_bar.xml diff --git a/indra/newview/skins/default/xui/pl/role_actions.xml b/indra/newview/skins/default/xui/pl/role_actions.xml index 5711eacf2f..5711eacf2f 100644..100755 --- a/indra/newview/skins/default/xui/pl/role_actions.xml +++ b/indra/newview/skins/default/xui/pl/role_actions.xml diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index e8dcfac02d..e8dcfac02d 100644..100755 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml diff --git a/indra/newview/skins/default/xui/pl/teleport_strings.xml b/indra/newview/skins/default/xui/pl/teleport_strings.xml index 906978effe..906978effe 100644..100755 --- a/indra/newview/skins/default/xui/pl/teleport_strings.xml +++ b/indra/newview/skins/default/xui/pl/teleport_strings.xml diff --git a/indra/newview/skins/default/xui/pl/xui_version.xml b/indra/newview/skins/default/xui/pl/xui_version.xml index 0e777751d3..0e777751d3 100644..100755 --- a/indra/newview/skins/default/xui/pl/xui_version.xml +++ b/indra/newview/skins/default/xui/pl/xui_version.xml  | 
