diff options
Diffstat (limited to 'indra')
28 files changed, 201 insertions, 66 deletions
| diff --git a/indra/cmake/BuildVersion.cmake b/indra/cmake/BuildVersion.cmake index c494355746..0094e313c7 100755 --- a/indra/cmake/BuildVersion.cmake +++ b/indra/cmake/BuildVersion.cmake @@ -22,12 +22,12 @@ if (NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/n                   OUTPUT_VARIABLE VIEWER_VERSION_REVISION                   OUTPUT_STRIP_TRAILING_WHITESPACE                   ) -              if (DEFINED VIEWER_VERSION_REVISION) +              if ("${VIEWER_VERSION_REVISION}" MATCHES "^[0-9]+$")                   message("Revision (from hg) ${VIEWER_VERSION_REVISION}") -              else (DEFINED VIEWER_VERSION_REVISION) +              else ("${VIEWER_VERSION_REVISION}" MATCHES "^[0-9]+$")                   set(VIEWER_VERSION_REVISION 0 )                   message("Revision not set, repository not found, using ${VIEWER_VERSION_REVISION}") -              endif (DEFINED VIEWER_VERSION_REVISION) +              endif ("${VIEWER_VERSION_REVISION}" MATCHES "^[0-9]+$")             else (DEFINED MERCURIAL)                set(VIEWER_VERSION_REVISION 0)                message("Revision not set, 'hg' not found (${MERCURIAL}), using ${VIEWER_VERSION_REVISION}") diff --git a/indra/llaudio/llaudioengine_fmodex.cpp b/indra/llaudio/llaudioengine_fmodex.cpp index fe6dedcd03..45fc3186f4 100644 --- a/indra/llaudio/llaudioengine_fmodex.cpp +++ b/indra/llaudio/llaudioengine_fmodex.cpp @@ -104,6 +104,9 @@ bool LLAudioEngine_FMODEX::init(const S32 num_channels, void* userdata)  	//if(Check_FMOD_Error(result, "FMOD::Memory_Initialize"))  	//	return false; +	// turn off non-error log spam to fmod.log (TODO: why do we even have an fmod.log if we don't link against log lib?) +	FMOD::Debug_SetLevel(FMOD_DEBUG_LEVEL_ERROR); +  	result = FMOD::System_Create(&mSystem);  	if(Check_FMOD_Error(result, "FMOD::System_Create"))  		return false; diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 95b1d536fe..3a4a8facc2 100755 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -337,6 +337,7 @@ if (LL_TESTS)    LL_ADD_INTEGRATION_TEST(reflection "" "${test_libs}")    LL_ADD_INTEGRATION_TEST(stringize "" "${test_libs}")    LL_ADD_INTEGRATION_TEST(lleventdispatcher "" "${test_libs}") +  LL_ADD_INTEGRATION_TEST(lleventcoro "" "${test_libs};${BOOST_CONTEXT_LIBRARY}")    LL_ADD_INTEGRATION_TEST(llprocess "" "${test_libs}")    LL_ADD_INTEGRATION_TEST(llleap "" "${test_libs}")    LL_ADD_INTEGRATION_TEST(llstreamqueue "" "${test_libs}") diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp index 9122704306..a629f71d4b 100755 --- a/indra/llcommon/llcoros.cpp +++ b/indra/llcommon/llcoros.cpp @@ -39,7 +39,12 @@  #include "llerror.h"  #include "stringize.h" -LLCoros::LLCoros() +LLCoros::LLCoros(): +    // MAINT-2724: default coroutine stack size too small on Windows. +    // Previously we used +    // boost::context::guarded_stack_allocator::default_stacksize(); +    // empirically this is 64KB on Windows and Linux. Try quadrupling. +    mStackSize(256*1024)  {      // Register our cleanup() method for "mainloop" ticks      LLEventPumps::instance().obtain("mainloop").listen( @@ -125,6 +130,12 @@ std::string LLCoros::getNameByID(const void* self_id) const      return "";  } +void LLCoros::setStackSize(S32 stacksize) +{ +    LL_INFOS("LLCoros") << "Setting coroutine stack size to " << stacksize << LL_ENDL; +    mStackSize = stacksize; +} +  /*****************************************************************************  *   MUST BE LAST  *****************************************************************************/ diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h index 03df406b68..01ee11da1a 100755 --- a/indra/llcommon/llcoros.h +++ b/indra/llcommon/llcoros.h @@ -125,7 +125,7 @@ public:      template <typename CALLABLE>      std::string launch(const std::string& prefix, const CALLABLE& callable)      { -        return launchImpl(prefix, new coro(callable)); +        return launchImpl(prefix, new coro(callable, mStackSize));      }      /** @@ -152,6 +152,9 @@ public:      /// getName() by self.get_id()      std::string getNameByID(const void* self_id) const; +    /// for delayed initialization +    void setStackSize(S32 stacksize); +  private:      friend class LLSingleton<LLCoros>;      LLCoros(); @@ -159,6 +162,7 @@ private:      std::string generateDistinctName(const std::string& prefix) const;      bool cleanup(const LLSD&); +    S32 mStackSize;      typedef boost::ptr_map<std::string, coro> CoroMap;      CoroMap mCoros;  }; diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index 0c32679744..22c8681983 100755 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -52,6 +52,23 @@ std::string ll_safe_string(const char* in, S32 maxlen)  	return std::string();  } +bool is_char_hex(char hex) +{ +	if((hex >= '0') && (hex <= '9')) +	{ +		return true; +	} +	else if((hex >= 'a') && (hex <='f')) +	{ +		return true; +	} +	else if((hex >= 'A') && (hex <='F')) +	{ +		return true; +	} +	return false; // uh - oh, not hex any more... +} +  U8 hex_as_nybble(char hex)  {  	if((hex >= '0') && (hex <= '9')) diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 119efc7957..f9702868c8 100755 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -470,6 +470,7 @@ inline std::string chop_tail_copy(   * @brief This translates a nybble stored as a hex value from 0-f back   * to a nybble in the low order bits of the return byte.   */ +LL_COMMON_API bool is_char_hex(char hex);  LL_COMMON_API U8 hex_as_nybble(char hex);  /** diff --git a/indra/llcommon/lluri.cpp b/indra/llcommon/lluri.cpp index 21456a599b..37f5b3d6a3 100755 --- a/indra/llcommon/lluri.cpp +++ b/indra/llcommon/lluri.cpp @@ -129,11 +129,30 @@ std::string LLURI::unescape(const std::string& str)  		{  			++it;  			if(it == end) break; -			U8 c = hex_as_nybble(*it++); -			c = c << 4; -			if (it == end) break; -			c |= hex_as_nybble(*it); -			ostr.put((char)c); + +			if(is_char_hex(*it)) +			{ +				U8 c = hex_as_nybble(*it++); + +				c = c << 4; +				if (it == end) break; + +				if(is_char_hex(*it)) +				{ +					c |= hex_as_nybble(*it); +					ostr.put((char)c); +				} +				else +				{ +					ostr.put((char)c); +					ostr.put(*it); +				} +			} +			else +			{ +				ostr.put('%'); +				ostr.put(*it); +			}  		}  		else  		{ diff --git a/indra/llcommon/tests/lleventcoro_test.cpp b/indra/llcommon/tests/lleventcoro_test.cpp index 8d12529613..5ebde1a31d 100755 --- a/indra/llcommon/tests/lleventcoro_test.cpp +++ b/indra/llcommon/tests/lleventcoro_test.cpp @@ -78,6 +78,7 @@  #include "../test/lltut.h"  #include "llsd.h" +#include "llsdutil.h"  #include "llevents.h"  #include "tests/wrapllerrs.h"  #include "stringize.h" @@ -108,7 +109,7 @@ match_substring(BidirectionalIterator begin,  		BidirectionalIterator end,   		std::string xmatch,  		BOOST_DEDUCED_TYPENAME coroutine<BidirectionalIterator(void)>::self& self) {  -  BidirectionalIterator begin_ = begin; +//BidirectionalIterator begin_ = begin;    for(; begin != end; ++begin)       if(match(begin, end, xmatch)) {        self.yield(begin); @@ -213,7 +214,7 @@ namespace tut              BEGIN              {                  result = postAndWait(self, -                                     LLSD().insert("value", 17), // request event +                                     LLSDMap("value", 17),       // request event                                       immediateAPI.getPump(),     // requestPump                                       "reply1",                   // replyPump                                       "reply");                   // request["reply"] = name @@ -226,7 +227,7 @@ namespace tut              BEGIN              {                  LLEventWithID pair = ::postAndWait2(self, -                                                    LLSD().insert("value", 18), +                                                    LLSDMap("value", 18),                                                      immediateAPI.getPump(),                                                      "reply2",                                                      "error2", @@ -244,7 +245,7 @@ namespace tut              BEGIN              {                  LLEventWithID pair = ::postAndWait2(self, -                                                    LLSD().insert("value", 18).insert("fail", LLSD()), +                                                    LLSDMap("value", 18)("fail", LLSD()),                                                      immediateAPI.getPump(),                                                      "reply2",                                                      "error2", @@ -273,7 +274,7 @@ namespace tut              BEGIN              {                  LLCoroEventPump waiter; -                result = waiter.postAndWait(self, LLSD().insert("value", 17), +                result = waiter.postAndWait(self, LLSDMap("value", 17),                                              immediateAPI.getPump(), "reply");              }              END @@ -365,7 +366,7 @@ namespace tut              BEGIN              {                  LLCoroEventPumps waiter; -                LLEventWithID pair(waiter.postAndWait(self, LLSD().insert("value", 23), +                LLEventWithID pair(waiter.postAndWait(self, LLSDMap("value", 23),                                                        immediateAPI.getPump(), "reply", "error"));                  result = pair.first;                  which  = pair.second; @@ -379,7 +380,7 @@ namespace tut              {                  LLCoroEventPumps waiter;                  LLEventWithID pair( -                    waiter.postAndWait(self, LLSD().insert("value", 23).insert("fail", LLSD()), +                    waiter.postAndWait(self, LLSDMap("value", 23)("fail", LLSD()),                                         immediateAPI.getPump(), "reply", "error"));                  result = pair.first;                  which  = pair.second; @@ -392,7 +393,7 @@ namespace tut              BEGIN              {                  LLCoroEventPumps waiter; -                result = waiter.postAndWaitWithException(self, LLSD().insert("value", 8), +                result = waiter.postAndWaitWithException(self, LLSDMap("value", 8),                                                           immediateAPI.getPump(), "reply", "error");              }              END @@ -406,7 +407,7 @@ namespace tut                  try                  {                      result = waiter.postAndWaitWithException(self, -                        LLSD().insert("value", 9).insert("fail", LLSD()), +                        LLSDMap("value", 9)("fail", LLSD()),                          immediateAPI.getPump(), "reply", "error");                      debug("no exception");                  } @@ -424,7 +425,7 @@ namespace tut              BEGIN              {                  LLCoroEventPumps waiter; -                result = waiter.postAndWaitWithLog(self, LLSD().insert("value", 30), +                result = waiter.postAndWaitWithLog(self, LLSDMap("value", 30),                                                     immediateAPI.getPump(), "reply", "error");              }              END @@ -439,7 +440,7 @@ namespace tut                  try                  {                      result = waiter.postAndWaitWithLog(self, -                        LLSD().insert("value", 31).insert("fail", LLSD()), +                        LLSDMap("value", 31)("fail", LLSD()),                          immediateAPI.getPump(), "reply", "error");                      debug("no exception");                  } @@ -796,4 +797,18 @@ namespace tut          ensure("no result", result.isUndefined());          ensure_contains("got error", threw, "32");      } +} + +/*==========================================================================*| +#include <boost/context/guarded_stack_allocator.hpp> + +namespace tut +{ +    template<> template<> +    void object::test<23>() +    { +        set_test_name("stacksize"); +        std::cout << "default_stacksize: " << boost::context::guarded_stack_allocator::default_stacksize() << '\n'; +    }  } // namespace tut +|*==========================================================================*/ diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 7f04c92b27..40f828ed47 100755 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -1179,10 +1179,10 @@ LLScrollListItem* LLScrollListCtrl::addSeparator(EAddPosition pos)  // Selects first enabled item of the given name.  // Returns false if item not found.  // Calls getItemByLabel in order to combine functionality -BOOL LLScrollListCtrl::selectItemByLabel(const std::string& label, BOOL case_sensitive) +BOOL LLScrollListCtrl::selectItemByLabel(const std::string& label, BOOL case_sensitive, S32 column/* = 0*/)  {  	deselectAllItems(TRUE); 	// ensure that no stale items are selected, even if we don't find a match -	LLScrollListItem* item = getItemByLabel(label, case_sensitive); +	LLScrollListItem* item = getItemByLabel(label, case_sensitive, column);  	bool found = NULL != item;  	if(found) diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h index 8fa06cc499..9b361c39d7 100755 --- a/indra/llui/llscrolllistctrl.h +++ b/indra/llui/llscrolllistctrl.h @@ -241,7 +241,7 @@ public:  	// one of which can be selected at a time.  	virtual LLScrollListItem* addSimpleElement(const std::string& value, EAddPosition pos = ADD_BOTTOM, const LLSD& id = LLSD()); -	BOOL			selectItemByLabel( const std::string& item, BOOL case_sensitive = TRUE );		// FALSE if item not found +	BOOL			selectItemByLabel( const std::string& item, BOOL case_sensitive = TRUE, S32 column = 0 );		// FALSE if item not found  	BOOL			selectItemByPrefix(const std::string& target, BOOL case_sensitive = TRUE);  	BOOL			selectItemByPrefix(const LLWString& target, BOOL case_sensitive = TRUE);  	LLScrollListItem*  getItemByLabel( const std::string& item, BOOL case_sensitive = TRUE, S32 column = 0 ); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 391e6fd005..bf216b32d4 100755 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1923,6 +1923,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)  	registrar.add("Url.Teleport", boost::bind(&LLUrlAction::teleportToLocation, url));  	registrar.add("Url.ShowProfile", boost::bind(&LLUrlAction::showProfile, url));  	registrar.add("Url.AddFriend", boost::bind(&LLUrlAction::addFriend, url)); +	registrar.add("Url.SendIM", boost::bind(&LLUrlAction::sendIM, url));  	registrar.add("Url.ShowOnMap", boost::bind(&LLUrlAction::showLocationOnMap, url));  	registrar.add("Url.CopyLabel", boost::bind(&LLUrlAction::copyLabelToClipboard, url));  	registrar.add("Url.CopyUrl", boost::bind(&LLUrlAction::copyURLToClipboard, url)); @@ -3207,14 +3208,14 @@ S32	LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 lin  	LLWString offsetString(text.c_str() + segment_offset + mStart);  	if(getLength() < segment_offset + mStart) -	{ -		llerrs << "getLength() < segment_offset + mStart\t getLength()\t" << getLength() << "\tsegment_offset:\t"  +	{  +		llinfos << "getLength() < segment_offset + mStart\t getLength()\t" << getLength() << "\tsegment_offset:\t"   						<< segment_offset << "\tmStart:\t" << mStart << "\tsegments\t" << mEditor.mSegments.size() << "\tmax_chars\t" << max_chars << llendl;  	}  	if(offsetString.length() + 1 < max_chars)  	{ -		llerrs << "offsetString.length() + 1 < max_chars\t max_chars:\t" << max_chars << "\toffsetString.length():\t" << offsetString.length() +		llinfos << "offsetString.length() + 1 < max_chars\t max_chars:\t" << max_chars << "\toffsetString.length():\t" << offsetString.length() << " getLength() : "  			<< getLength() << "\tsegment_offset:\t" << segment_offset << "\tmStart:\t" << mStart << "\tsegments\t" << mEditor.mSegments.size() << llendl;  	} diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 5e553fcd16..d1c4bcb24b 100755 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -2767,10 +2767,8 @@ void LLTextEditor::updatePreedit(const LLWString &preedit_string,  	}  	segment_vec_t segments; -    LLStyleConstSP sp(new LLStyle(getStyleParams())); -	segments.push_back(new LLNormalTextSegment(sp, 0, mPreeditWString.length(), *this)); -     -    insertStringNoUndo(insert_preedit_at, mPreeditWString, &segments);  +	//pass empty segments to let "insertStringNoUndo" make new LLNormalTextSegment and insert it, if needed. +	insertStringNoUndo(insert_preedit_at, mPreeditWString, &segments);   	mPreeditStandouts = preedit_standouts; diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 6e0bb161af..227644f14f 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1247,8 +1247,12 @@ set(viewer_HEADER_FILES  source_group("CMake Rules" FILES ViewerInstall.cmake) +# the viewer_version.txt file created here is for passing to viewer_manifest +# the summary.json file is created for the benefit of the TeamCity builds, where +#   it is used to provide descriptive information to the build results page  add_custom_target(generate_viewer_version ALL -                  COMMAND echo "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}" > ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt +                  COMMAND printf '${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}' > ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt +                  COMMAND printf '{"Type":"viewer","Version":"${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}"}' > ${CMAKE_BINARY_DIR}/summary.json                    COMMENT Generating viewer_version.txt for manifest processing                    ) diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 444877d48f..65afb3b886 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -3.5.3 +3.5.4 diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f22dd576c3..411e5f9005 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1905,6 +1905,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>CoroutineStackSize</key> +    <map> +      <key>Comment</key> +      <string>Size (in bytes) for each coroutine stack</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>262144</integer> +    </map>      <key>CreateToolCopyCenters</key>      <map>        <key>Comment</key> @@ -12600,6 +12611,17 @@        <key>Value</key>        <string>update</string>      </map> +    <key>UpdaterWillingToTest</key> +    <map> +      <key>Comment</key> +      <string>Whether or not the updater should offer test candidate upgrades.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <string>1</string> +    </map>      <key>UploadBakedTexOld</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 45a990f65f..fdc2cdb78d 100755 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -117,6 +117,7 @@  #include "llleap.h"  #include "stringize.h" +#include "llcoros.h"  // Third party library includes  #include <boost/bind.hpp> @@ -755,6 +756,7 @@ bool LLAppViewer::init()  	//set the max heap size.  	initMaxHeapSize() ; +	LLCoros::instance().setStackSize(gSavedSettings.getS32("CoroutineStackSize"));  	LLPrivateMemoryPoolManager::initClass((BOOL)gSavedSettings.getBOOL("MemoryPrivatePoolEnabled"), (U32)gSavedSettings.getU32("MemoryPrivatePoolSize")*1024*1024) ; @@ -2810,6 +2812,16 @@ bool LLAppViewer::initConfiguration()  	loadColorSettings(); +	// Let anyone else who cares know that we've populated our settings +	// variables. +	for (LLControlGroup::key_iter ki(LLControlGroup::beginKeys()), kend(LLControlGroup::endKeys()); +		 ki != kend; ++ki) +	{ +		// For each named instance of LLControlGroup, send an event saying +		// we've initialized an LLControlGroup instance by that name. +		LLEventPumps::instance().obtain("LLControlGroup").post(LLSDMap("init", *ki)); +	} +  	return true; // Config was successful.  } diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp index ee55b8fe80..27caedf472 100755 --- a/indra/newview/llconversationmodel.cpp +++ b/indra/newview/llconversationmodel.cpp @@ -363,18 +363,19 @@ void LLConversationItemSession::buildContextMenu(LLMenuGL& menu, U32 flags)      lldebugs << "LLConversationItemParticipant::buildContextMenu()" << llendl;      menuentry_vec_t items;      menuentry_vec_t disabled_items; - +    if(flags & ITEM_IN_MULTI_SELECTION) +    { +    	items.push_back(std::string("close_selected_conversations")); +    }      if(this->getType() == CONV_SESSION_1_ON_1)      {          items.push_back(std::string("close_conversation")); -        items.push_back(std::string("close_all_conversations"));          items.push_back(std::string("separator_disconnect_from_voice"));          buildParticipantMenuOptions(items, flags);      }      else if(this->getType() == CONV_SESSION_GROUP)      {          items.push_back(std::string("close_conversation")); -        items.push_back(std::string("close_all_conversations"));          addVoiceOptions(items);          items.push_back(std::string("chat_history"));          items.push_back(std::string("separator_chat_history")); @@ -385,7 +386,6 @@ void LLConversationItemSession::buildContextMenu(LLMenuGL& menu, U32 flags)      else if(this->getType() == CONV_SESSION_AD_HOC)      {          items.push_back(std::string("close_conversation")); -        items.push_back(std::string("close_all_conversations"));          addVoiceOptions(items);          items.push_back(std::string("chat_history"));      } diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index 113aa9a8f2..c0afb72cff 100755 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -513,6 +513,7 @@ void LLFloaterAvatarPicker::find()  			url += "/";  		}  		url += "?page_size=100&names="; +		std::replace(text.begin(), text.end(), '.', ' ');  		url += LLURI::escape(text);  		llinfos << "avatar picker " << url << llendl;  		LLHTTPClient::get(url, new LLAvatarPickerResponder(mQueryID, getKey().asString())); @@ -748,7 +749,12 @@ void LLFloaterAvatarPicker::processResponse(const LLUUID& query_id, const LLSD&  		{  			getChildView("ok_btn")->setEnabled(true);  			search_results->setEnabled(true); -			search_results->selectFirstItem(); +			search_results->sortByColumnIndex(1, TRUE); +			std::string text = getChild<LLUICtrl>("Edit")->getValue().asString(); +			if (!search_results->selectItemByLabel(text, TRUE, 1)) +			{ +				search_results->selectFirstItem(); +			}			  			onList();  			search_results->setFocus(TRUE);  		} diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 01278e0637..918c85b07e 100755 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -981,7 +981,7 @@ void LLFloaterIMContainer::setSortOrder(const LLConversationSort& order)  	gSavedSettings.setU32("ConversationSortOrder", (U32)order);  } -void LLFloaterIMContainer::getSelectedUUIDs(uuid_vec_t& selected_uuids) +void LLFloaterIMContainer::getSelectedUUIDs(uuid_vec_t& selected_uuids, bool participant_uuids/* = true*/)  {      const std::set<LLFolderViewItem*> selectedItems = mConversationsRoot->getSelectionList(); @@ -994,7 +994,7 @@ void LLFloaterIMContainer::getSelectedUUIDs(uuid_vec_t& selected_uuids)          conversationItem = static_cast<LLConversationItem *>((*it)->getViewModelItem());  		//When a one-on-one conversation exists, retrieve the participant id from the conversation floater -		if(conversationItem->getType() == LLConversationItem::CONV_SESSION_1_ON_1) +		if(conversationItem->getType() == LLConversationItem::CONV_SESSION_1_ON_1 && participant_uuids)  		{  			LLFloaterIMSession * conversation_floaterp = LLFloaterIMSession::findInstance(conversationItem->getUUID());  			LLUUID participant_id = conversation_floaterp->getOtherParticipantUUID(); @@ -1149,9 +1149,10 @@ void LLFloaterIMContainer::doToSelectedConversation(const std::string& command,          {              LLFloater::onClickClose(conversationFloater);          } -        else if("close_all_conversations" == command) +        else if("close_selected_conversations" == command)          { -        	closeAllConversations(); +        	getSelectedUUIDs(selectedIDS,false); +        	closeSelectedConversations(selectedIDS);          }          else if("open_voice_conversation" == command)          { @@ -2117,6 +2118,22 @@ void LLFloaterIMContainer::closeAllConversations()  		LLFloater::onClickClose(conversationFloater);  	}  } + +void LLFloaterIMContainer::closeSelectedConversations(const uuid_vec_t& ids) +{ +	for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it) +	{ +		//We don't need to close Nearby chat, so skip it +		if (*it != LLUUID()) +		{ +			LLFloaterIMSession *conversationFloater = LLFloaterIMSession::findInstance(*it); +			if(conversationFloater) +			{ +				LLFloater::onClickClose(conversationFloater); +			} +		} +	} +}  void LLFloaterIMContainer::closeFloater(bool app_quitting/* = false*/)  {  	if(app_quitting) diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h index 5121e902cb..5cd92beed1 100755 --- a/indra/newview/llfloaterimcontainer.h +++ b/indra/newview/llfloaterimcontainer.h @@ -119,6 +119,7 @@ public:  	virtual BOOL handleKeyHere(KEY key, MASK mask );  	/*virtual*/ void closeFloater(bool app_quitting = false);      void closeAllConversations(); +    void closeSelectedConversations(const uuid_vec_t& ids);  	/*virtual*/ BOOL isFrontmost(); @@ -151,7 +152,7 @@ private:  	void setSortOrderParticipants(const LLConversationFilter::ESortOrderType order);  	void setSortOrder(const LLConversationSort& order); -    void getSelectedUUIDs(uuid_vec_t& selected_uuids); +    void getSelectedUUIDs(uuid_vec_t& selected_uuids, bool participant_uuids = true);      const LLConversationItem * getCurSelectedViewModelItem();      void getParticipantUUIDs(uuid_vec_t& selected_uuids);      void doToSelected(const LLSD& userdata); diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp index 7e472466ed..d3351fac2e 100755 --- a/indra/newview/llfloaterimnearbychat.cpp +++ b/indra/newview/llfloaterimnearbychat.cpp @@ -639,10 +639,7 @@ void LLFloaterIMNearbyChat::addMessage(const LLChat& chat,bool archive,const LLS  void LLFloaterIMNearbyChat::onChatBoxCommit()  { -	if (mInputEditor->getText().length() > 0) -	{ -		sendChat(CHAT_TYPE_NORMAL); -	} +	sendChat(CHAT_TYPE_NORMAL);  	gAgent.stopTyping();  } diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 892038722d..ba96c5ee24 100755 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -299,7 +299,8 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg)  	if ("openconversations" == user_preferences  		|| ON_TOP == conversations_floater_status  		|| ("toast" == user_preferences && ON_TOP != conversations_floater_status) -		|| ("flash" == user_preferences && CLOSED == conversations_floater_status) +		|| ("flash" == user_preferences && (CLOSED == conversations_floater_status +				 	 	 	 	 	 	|| NOT_ON_TOP == conversations_floater_status))  		|| is_dnd_msg)  	{  		if(!LLMuteList::getInstance()->isMuted(participant_id)) @@ -3042,10 +3043,9 @@ void LLIMMgr::inviteToSession(  	{  		bool isRejectGroupCall = (gSavedSettings.getBOOL("VoiceCallsRejectGroup") && (notify_box_type == "VoiceInviteGroup"));  		bool isRejectNonFriendCall = (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL)); -		bool isRejectDoNotDisturb = (gAgent.isDoNotDisturb() && !hasSession(session_id)); -		if	(isRejectGroupCall || isRejectNonFriendCall || isRejectDoNotDisturb) +		if	(isRejectGroupCall || isRejectNonFriendCall || gAgent.isDoNotDisturb())  		{ -			if (isRejectDoNotDisturb && !isRejectGroupCall && !isRejectNonFriendCall) +			if (gAgent.isDoNotDisturb() && !isRejectGroupCall && !isRejectNonFriendCall)  			{  				LLSD args;  				addSystemMessage(session_id, "you_auto_rejected_call", args); diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 17311dd75e..b47fe9d4b1 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1215,8 +1215,8 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat  				mLODReqQ.push(req);  				LLMeshRepository::sLODProcessing++;  			} +			mPendingLOD.erase(iter);  		} -		mPendingLOD.erase(iter);  	}  	return true; diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index e92bd766ca..1a3add2bfb 100755 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -423,9 +423,18 @@ void LLNotificationWellWindow::onItemClick(LLSysWellItem* item)  void LLNotificationWellWindow::onItemClose(LLSysWellItem* item)  {  	LLUUID id = item->getID(); -	removeItemByID(id); +	  	if(mChannel) +	{ +		// removeItemByID() is invoked from killToastByNotificationID() and item will removed;  		mChannel->killToastByNotificationID(id); +	} +	else +	{ +		// removeItemByID() should be called one time for each item to remove it from notification well +		removeItemByID(id); +	} +  }  void LLNotificationWellWindow::onAdd( LLNotificationPtr notify ) diff --git a/indra/newview/skins/default/xui/en/menu_conversation.xml b/indra/newview/skins/default/xui/en/menu_conversation.xml index 7494309315..b3d28788da 100755 --- a/indra/newview/skins/default/xui/en/menu_conversation.xml +++ b/indra/newview/skins/default/xui/en/menu_conversation.xml @@ -11,13 +11,7 @@       layout="topleft"       name="close_conversation">          <on_click function="Avatar.DoToSelected" parameter="close_conversation"/> -	 </menu_item_call> -	 <menu_item_call -     label="Close All conversations" -     layout="topleft" -     name="close_all_conversations"> -        <on_click function="Avatar.DoToSelected" parameter="close_all_conversations"/> -	 </menu_item_call> +	 </menu_item_call>	        <menu_item_call       label="Open voice conversation"       layout="topleft" @@ -31,6 +25,12 @@          <on_click function="Avatar.DoToSelected" parameter="disconnect_from_voice"/>      </menu_item_call>	  	<menu_item_separator layout="topleft" name="separator_disconnect_from_voice"/>	 +	<menu_item_call +     label="Close Selected" +     layout="topleft" +     name="close_selected_conversations"> +        <on_click function="Avatar.DoToSelected" parameter="close_selected_conversations"/> +	 </menu_item_call>      <menu_item_call       label="View Profile"       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index 2fb6a9fd40..dd4533ae74 100755 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -237,8 +237,7 @@      enabled="true"      follows="left|top"      height="14" -    initial_value="true" -    control_name="UpdateWillingToTest" +    control_name="UpdaterWillingToTest"      label="Willing to update to release candidates"      left_delta="0"      mouse_opaque="true" diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index bc473f6d62..2578c81224 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -154,10 +154,8 @@ class ViewerManifest(LLManifest):              # Files in the newview/ directory              self.path("gpu_table.txt") - -            # The summary.json file gets left in the base checkout dir by -            # build.sh. It's only created for a build.sh build. -            if not self.path2basename(os.path.join(os.pardir, os.pardir), "summary.json"): +            # The summary.json file gets left in the build directory by newview/CMakeLists.txt. +            if not self.path2basename(os.pardir, "summary.json"):                  print "No summary.json file"      def grid(self): | 
