diff options
Diffstat (limited to 'indra')
56 files changed, 579 insertions, 298 deletions
| diff --git a/indra/llcommon/llprocess.cpp b/indra/llcommon/llprocess.cpp index 23936f0526..97a38ea992 100644 --- a/indra/llcommon/llprocess.cpp +++ b/indra/llcommon/llprocess.cpp @@ -272,6 +272,14 @@ public:  					boost::bind(&ReadPipeImpl::tick, this, _1));  	} +    ~ReadPipeImpl() +    { +        if (mConnection.connected()) +        { +            mConnection.disconnect(); +        } +    } +  	// Much of the implementation is simply connecting the abstract virtual  	// methods with implementation data concealed from the base class.  	virtual std::istream& get_istream() { return mStream; } diff --git a/indra/llfilesystem/lldiskcache.cpp b/indra/llfilesystem/lldiskcache.cpp index 6de99dfbff..4b7363c8e5 100644 --- a/indra/llfilesystem/lldiskcache.cpp +++ b/indra/llfilesystem/lldiskcache.cpp @@ -35,7 +35,6 @@  #include "llassettype.h"  #include "lldir.h"  #include <boost/filesystem.hpp> -#include <boost/range/iterator_range.hpp>  #include <chrono>  #include "lldiskcache.h" @@ -100,19 +99,20 @@ void LLDiskCache::purge()  #endif      if (boost::filesystem::is_directory(cache_path, ec) && !ec.failed())      { -        for (auto& entry : boost::make_iterator_range(boost::filesystem::directory_iterator(cache_path, ec), {})) +        boost::filesystem::directory_iterator iter(cache_path, ec); +        while (iter != boost::filesystem::directory_iterator() && !ec.failed())          { -            if (boost::filesystem::is_regular_file(entry, ec) && !ec.failed()) +            if (boost::filesystem::is_regular_file(*iter, ec) && !ec.failed())              { -                if (entry.path().string().find(mCacheFilenamePrefix) != std::string::npos) +                if ((*iter).path().string().find(mCacheFilenamePrefix) != std::string::npos)                  { -                    uintmax_t file_size = boost::filesystem::file_size(entry, ec); +                    uintmax_t file_size = boost::filesystem::file_size(*iter, ec);                      if (ec.failed())                      {                          continue;                      } -                    const std::string file_path = entry.path().string(); -                    const std::time_t file_time = boost::filesystem::last_write_time(entry, ec); +                    const std::string file_path = (*iter).path().string(); +                    const std::time_t file_time = boost::filesystem::last_write_time(*iter, ec);                      if (ec.failed())                      {                          continue; @@ -121,6 +121,7 @@ void LLDiskCache::purge()                      file_info.push_back(file_info_t(file_time, { file_size, file_path }));                  }              } +            iter.increment(ec);          }      } @@ -348,19 +349,21 @@ void LLDiskCache::clearCache()  #endif      if (boost::filesystem::is_directory(cache_path, ec) && !ec.failed())      { -        for (auto& entry : boost::make_iterator_range(boost::filesystem::directory_iterator(cache_path, ec), {})) +        boost::filesystem::directory_iterator iter(cache_path, ec); +        while (iter != boost::filesystem::directory_iterator() && !ec.failed())          { -            if (boost::filesystem::is_regular_file(entry, ec) && !ec.failed()) +            if (boost::filesystem::is_regular_file(*iter, ec) && !ec.failed())              { -                if (entry.path().string().find(mCacheFilenamePrefix) != std::string::npos) +                if ((*iter).path().string().find(mCacheFilenamePrefix) != std::string::npos)                  { -                    boost::filesystem::remove(entry, ec); +                    boost::filesystem::remove(*iter, ec);                      if (ec.failed())                      { -                        LL_WARNS() << "Failed to delete cache file " << entry << ": " << ec.message() << LL_ENDL; +                        LL_WARNS() << "Failed to delete cache file " << *iter << ": " << ec.message() << LL_ENDL;                      }                  }              } +            iter.increment(ec);          }      }  } @@ -379,20 +382,22 @@ void LLDiskCache::removeOldVFSFiles()  #endif      if (boost::filesystem::is_directory(cache_path, ec) && !ec.failed())      { -        for (auto& entry : boost::make_iterator_range(boost::filesystem::directory_iterator(cache_path, ec), {})) +        boost::filesystem::directory_iterator iter(cache_path, ec); +        while (iter != boost::filesystem::directory_iterator() && !ec.failed())          { -            if (boost::filesystem::is_regular_file(entry, ec) && !ec.failed()) +            if (boost::filesystem::is_regular_file(*iter, ec) && !ec.failed())              { -                if ((entry.path().string().find(CACHE_FORMAT) != std::string::npos) || -                    (entry.path().string().find(DB_FORMAT) != std::string::npos)) +                if (((*iter).path().string().find(CACHE_FORMAT) != std::string::npos) || +                    ((*iter).path().string().find(DB_FORMAT) != std::string::npos))                  { -                    boost::filesystem::remove(entry, ec); +                    boost::filesystem::remove(*iter, ec);                      if (ec.failed())                      { -                        LL_WARNS() << "Failed to delete cache file " << entry << ": " << ec.message() << LL_ENDL; +                        LL_WARNS() << "Failed to delete cache file " << *iter << ": " << ec.message() << LL_ENDL;                      }                  }              } +            iter.increment(ec);          }      }  } @@ -418,19 +423,21 @@ uintmax_t LLDiskCache::dirFileSize(const std::string dir)  #endif      if (boost::filesystem::is_directory(dir_path, ec) && !ec.failed())      { -        for (auto& entry : boost::make_iterator_range(boost::filesystem::directory_iterator(dir_path, ec), {})) +        boost::filesystem::directory_iterator iter(dir_path, ec); +        while (iter != boost::filesystem::directory_iterator() && !ec.failed())          { -            if (boost::filesystem::is_regular_file(entry, ec) && !ec.failed()) +            if (boost::filesystem::is_regular_file(*iter, ec) && !ec.failed())              { -                if (entry.path().string().find(mCacheFilenamePrefix) != std::string::npos) +                if ((*iter).path().string().find(mCacheFilenamePrefix) != std::string::npos)                  { -                    uintmax_t file_size = boost::filesystem::file_size(entry, ec); +                    uintmax_t file_size = boost::filesystem::file_size(*iter, ec);                      if (!ec.failed())                      {                          total_file_size += file_size;                      }                  }              } +            iter.increment(ec);          }      } diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp index 1fbbad06d4..756d0b5db8 100644 --- a/indra/llplugin/llpluginprocessparent.cpp +++ b/indra/llplugin/llpluginprocessparent.cpp @@ -162,6 +162,11 @@ LLPluginProcessParent::~LLPluginProcessParent()      {   // If we are quitting, the network sockets will already have been destroyed.          killSockets();      } + +    if (mPolling.connected()) +    { +        mPolling.disconnect(); +    }  }  /*static*/ diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index d413fab270..2303cd24b7 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -759,11 +759,13 @@ void LLFloater::closeFloater(bool app_quitting)          }  		// now close dependent floater -		for(handle_set_iter_t dependent_it = mDependents.begin(); -			dependent_it != mDependents.end(); ) +		while(mDependents.size() > 0)  		{ +            handle_set_iter_t dependent_it = mDependents.begin();  			LLFloater* floaterp = dependent_it->get(); -            dependent_it = mDependents.erase(dependent_it); +            // normally removeDependentFloater will do this, but in +            // case floaterp is somehow invalid or orphaned, erase now +            mDependents.erase(dependent_it);              if (floaterp)              {                  floaterp->mDependeeHandle = LLHandle<LLFloater>(); diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 1547a4ba5c..6a9070634c 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -206,6 +206,7 @@ bool LLUrlEntryBase::isWikiLinkCorrect(const std::string &labeled_url) const      {          return (chr == L'\u02D0') // "Modifier Letter Colon"              || (chr == L'\uFF1A') // "Fullwidth Colon" +            || (chr == L'\u2236') // "Ratio"              || (chr == L'\uFE55'); // "Small Colon"      },          L'\u003A'); // Colon diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index c9d7013a11..23f3dca3fb 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -169,7 +169,7 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL  	for (it = mUrlEntry.begin(); it != mUrlEntry.end(); ++it)  	{  		//Skip for url entry icon if content is not trusted -		if(!is_content_trusted && (mUrlEntryIcon == *it)) +		if((mUrlEntryIcon == *it) && ((text.find("Hand") != std::string::npos) || !is_content_trusted))  		{  			continue;  		} diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm index 57c3d86295..690fe058db 100644 --- a/indra/llwindow/llwindowmacosx-objc.mm +++ b/indra/llwindow/llwindowmacosx-objc.mm @@ -215,6 +215,7 @@ NSWindowRef createNSWindow(int x, int y, int width, int height)  													  styleMask:NSTitledWindowMask | NSResizableWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSTexturedBackgroundWindowMask backing:NSBackingStoreBuffered defer:NO];  	[window makeKeyAndOrderFront:nil];  	[window setAcceptsMouseMovedEvents:TRUE]; +    [window setRestorable:FALSE]; // Viewer manages state from own settings  	return window;  } diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 41f3042ace..6f67b131d1 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -3904,42 +3904,48 @@ void LLWindowWin32::allowLanguageTextInput(LLPreeditor *preeditor, BOOL b)  	sLanguageTextInputAllowed = b; -	if ( sLanguageTextInputAllowed ) -	{ -		// Allowing: Restore the previous IME status, so that the user has a feeling that the previous  -		// text input continues naturally.  Be careful, however, the IME status is meaningful only during the user keeps  -		// using same Input Locale (aka Keyboard Layout). -		if (sWinIMEOpened && GetKeyboardLayout(0) == sWinInputLocale) -		{ -			HIMC himc = LLWinImm::getContext(mWindowHandle); -			LLWinImm::setOpenStatus(himc, TRUE); -			LLWinImm::setConversionStatus(himc, sWinIMEConversionMode, sWinIMESentenceMode); -			LLWinImm::releaseContext(mWindowHandle, himc); -		} -	} -	else -	{ -		// Disallowing: Turn off the IME so that succeeding key events bypass IME and come to us directly. -		// However, do it after saving the current IME  status.  We need to restore the status when -		//   allowing language text input again. -		sWinInputLocale = GetKeyboardLayout(0); -		sWinIMEOpened = LLWinImm::isIME(sWinInputLocale); -		if (sWinIMEOpened) -		{ -			HIMC himc = LLWinImm::getContext(mWindowHandle); -			sWinIMEOpened = LLWinImm::getOpenStatus(himc); -			if (sWinIMEOpened) -			{ -				LLWinImm::getConversionStatus(himc, &sWinIMEConversionMode, &sWinIMESentenceMode); +    if (sLanguageTextInputAllowed) +    { +        mWindowThread->post([=]() +        { +            // Allowing: Restore the previous IME status, so that the user has a feeling that the previous  +            // text input continues naturally.  Be careful, however, the IME status is meaningful only during the user keeps  +            // using same Input Locale (aka Keyboard Layout). +            if (sWinIMEOpened && GetKeyboardLayout(0) == sWinInputLocale) +            { +                HIMC himc = LLWinImm::getContext(mWindowHandle); +                LLWinImm::setOpenStatus(himc, TRUE); +                LLWinImm::setConversionStatus(himc, sWinIMEConversionMode, sWinIMESentenceMode); +                LLWinImm::releaseContext(mWindowHandle, himc); +            } +        }); +    } +    else +    { +        mWindowThread->post([=]() +        { +            // Disallowing: Turn off the IME so that succeeding key events bypass IME and come to us directly. +            // However, do it after saving the current IME  status.  We need to restore the status when +            //   allowing language text input again. +            sWinInputLocale = GetKeyboardLayout(0); +            sWinIMEOpened = LLWinImm::isIME(sWinInputLocale); +            if (sWinIMEOpened) +            { +                HIMC himc = LLWinImm::getContext(mWindowHandle); +                sWinIMEOpened = LLWinImm::getOpenStatus(himc); +                if (sWinIMEOpened) +                { +                    LLWinImm::getConversionStatus(himc, &sWinIMEConversionMode, &sWinIMESentenceMode); -				// We need both ImmSetConversionStatus and ImmSetOpenStatus here to surely disable IME's  -				// keyboard hooking, because Some IME reacts only on the former and some other on the latter... -				LLWinImm::setConversionStatus(himc, IME_CMODE_NOCONVERSION, sWinIMESentenceMode); -				LLWinImm::setOpenStatus(himc, FALSE); -			} -			LLWinImm::releaseContext(mWindowHandle, himc); - 		} -	} +                    // We need both ImmSetConversionStatus and ImmSetOpenStatus here to surely disable IME's  +                    // keyboard hooking, because Some IME reacts only on the former and some other on the latter... +                    LLWinImm::setConversionStatus(himc, IME_CMODE_NOCONVERSION, sWinIMESentenceMode); +                    LLWinImm::setOpenStatus(himc, FALSE); +                } +                LLWinImm::releaseContext(mWindowHandle, himc); +            } +        }); +    }  }  void LLWindowWin32::fillCandidateForm(const LLCoordGL& caret, const LLRect& bounds,  @@ -4136,6 +4142,10 @@ void LLWindowWin32::handleStartCompositionMessage()  void LLWindowWin32::handleCompositionMessage(const U32 indexes)  { +    if (!mPreeditor) +    { +        return; +    }  	BOOL needs_update = FALSE;  	LLWString result_string;  	LLWString preedit_string; @@ -4434,7 +4444,7 @@ BOOL LLWindowWin32::handleImeRequests(WPARAM request, LPARAM param, LRESULT *res  				LLWString context = find_context(wtext, preedit, preedit_length, &context_offset);  				preedit -= context_offset;  				preedit_length = llmin(preedit_length, (S32)context.length() - preedit); -				if (preedit_length && preedit >= 0) +				if (preedit_length > 0 && preedit >= 0)  				{  					// IMR_DOCUMENTFEED may be called when we have an active preedit.  					// We should pass the context string *excluding* the preedit string. diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 8d2e3905d1..77131efd75 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -133,7 +133,6 @@ LLAgentCamera::LLAgentCamera() :  	mCameraFOVZoomFactor(0.f),  	mCameraCurrentFOVZoomFactor(0.f),  	mCameraFocusOffset(), -	mCameraFOVDefault(DEFAULT_FIELD_OF_VIEW),  	mCameraCollidePlane(), @@ -155,7 +154,6 @@ LLAgentCamera::LLAgentCamera() :  	mFocusObject(NULL),  	mFocusObjectDist(0.f),  	mFocusObjectOffset(), -	mFocusDotRadius( 0.1f ),			// meters  	mTrackFocusObject(TRUE),  	mAtKey(0), // Either 1, 0, or -1... indicates that movement-key is pressed @@ -2361,6 +2359,11 @@ void LLAgentCamera::changeCameraToCustomizeAvatar()  	gAgent.standUp(); // force stand up  	gViewerWindow->getWindow()->resetBusyCount(); +    if (LLSelectMgr::getInstance()->getSelection()->isAttachment()) +    { +        LLSelectMgr::getInstance()->deselectAll(); +    } +  	if (gFaceEditToolset)  	{  		LLToolMgr::getInstance()->setCurrentToolset(gFaceEditToolset); diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h index 89680f95dc..d27cdb0c5c 100644 --- a/indra/newview/llagentcamera.h +++ b/indra/newview/llagentcamera.h @@ -152,7 +152,6 @@ private:  	F32				mTargetCameraDistance;			// Target camera offset from avatar  	F32				mCameraFOVZoomFactor;			// Amount of fov zoom applied to camera when zeroing in on an object  	F32				mCameraCurrentFOVZoomFactor;	// Interpolated fov zoom -	F32				mCameraFOVDefault;				// Default field of view that is basis for FOV zoom effect  	LLVector4		mCameraCollidePlane;			// Colliding plane for camera  	F32				mCameraZoomFraction;			// Mousewheel driven fraction of zoom  	LLVector3		mCameraPositionAgent;			// Camera position in agent coordinates @@ -167,7 +166,6 @@ private:  	// Follow  	//--------------------------------------------------------------------  public: -	void			setUsingFollowCam(bool using_follow_cam);  	bool 			isfollowCamLocked();  private:  	LLFollowCam 	mFollowCam; 			// Ventrella @@ -233,7 +231,6 @@ private:  	LLPointer<LLViewerObject> mFocusObject;  	F32				mFocusObjectDist;  	LLVector3		mFocusObjectOffset; -	F32				mFocusDotRadius; 				// Meters  	BOOL			mTrackFocusObject;  	//-------------------------------------------------------------------- diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp index 3410a37890..c19ad2ae6f 100644 --- a/indra/newview/llagentui.cpp +++ b/indra/newview/llagentui.cpp @@ -53,7 +53,16 @@ void LLAgentUI::buildSLURL(LLSLURL& slurl, const bool escaped /*= true*/)        LLViewerRegion *regionp = gAgent.getRegion();        if (regionp)        { -		  return_slurl = LLSLURL(regionp->getName(), gAgent.getPositionGlobal()); +          // Make sure coordinates are within current region +          LLVector3d global_pos = gAgent.getPositionGlobal(); +          LLVector3d region_origin = regionp->getOriginGlobal(); +          // -1 otherwise slurl will fmod 256 to 0. +          // And valid slurl range is supposed to be 0..255 +          F64 max_val = REGION_WIDTH_METERS - 1; +          global_pos.mdV[VX] = llclamp(global_pos[VX], region_origin[VX], region_origin[VX] + max_val); +          global_pos.mdV[VY] = llclamp(global_pos[VY], region_origin[VY], region_origin[VY] + max_val); + +          return_slurl = LLSLURL(regionp->getName(), global_pos);        }  	slurl = return_slurl;  } diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index c9f5f62c41..283794209f 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -5480,7 +5480,8 @@ void LLAppViewer::disconnectViewer()      {          gInventory.cache(gInventory.getRootFolderID(), gAgent.getID());          if (gInventory.getLibraryRootFolderID().notNull() -            && gInventory.getLibraryOwnerID().notNull()) +            && gInventory.getLibraryOwnerID().notNull() +            && !mSecondInstance) // agent is unique, library isn't          {              gInventory.cache(                  gInventory.getLibraryRootFolderID(), diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index c4c88d304c..e6b6b10408 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -78,7 +78,9 @@ static S32 cube_channel = -1;  static S32 diffuse_channel = -1;  static S32 bump_channel = -1; -#define LL_BUMPLIST_MULTITHREADED 0 // TODO -- figure out why this doesn't work +// Enabled after changing LLViewerTexture::mNeedsCreateTexture to an +// LLAtomicBool; this should work just fine, now. HB +#define LL_BUMPLIST_MULTITHREADED 1  // static  diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index 0186c4aebe..2422596f60 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -428,13 +428,18 @@ void LLFloaterAvatarPicker::findCoro(std::string url, LLUUID queryID, std::strin      if (status || (status == LLCore::HttpStatus(HTTP_BAD_REQUEST)))      { -        LLFloaterAvatarPicker* floater = -            LLFloaterReg::findTypedInstance<LLFloaterAvatarPicker>("avatar_picker", name); -        if (floater) -        { -            result.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS); -            floater->processResponse(queryID, result); -        } +        result.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS); +    } +    else +    { +        result["failure_reason"] = status.toString(); +    } + +    LLFloaterAvatarPicker* floater = +        LLFloaterReg::findTypedInstance<LLFloaterAvatarPicker>("avatar_picker", name); +    if (floater) +    { +        floater->processResponse(queryID, result);      }  } @@ -672,59 +677,67 @@ void LLFloaterAvatarPicker::processResponse(const LLUUID& query_id, const LLSD&  	{  		LLScrollListCtrl* search_results = getChild<LLScrollListCtrl>("SearchResults"); -		LLSD agents = content["agents"]; - -		// clear "Searching" label on first results -		search_results->deleteAllItems(); - -		LLSD item; -		LLSD::array_const_iterator it = agents.beginArray(); -		for ( ; it != agents.endArray(); ++it) -		{ -			const LLSD& row = *it; -			if (row["id"].asUUID() != gAgent.getID() || !mExcludeAgentFromSearchResults) -			{ -				item["id"] = row["id"]; -				LLSD& columns = item["columns"]; -				columns[0]["column"] = "name"; -				columns[0]["value"] = row["display_name"]; -				columns[1]["column"] = "username"; -				columns[1]["value"] = row["username"]; -				search_results->addElement(item); - -				// add the avatar name to our list -				LLAvatarName avatar_name; -				avatar_name.fromLLSD(row); -				sAvatarNameMap[row["id"].asUUID()] = avatar_name; -			} -		} +        // clear "Searching" label on first results +        search_results->deleteAllItems(); -		if (search_results->isEmpty()) -		{ -			std::string name = "'" + getChild<LLUICtrl>("Edit")->getValue().asString() + "'"; -			LLSD item; -			item["id"] = LLUUID::null; -			item["columns"][0]["column"] = "name"; -			item["columns"][0]["value"] = name; -			item["columns"][1]["column"] = "username"; -			item["columns"][1]["value"] = getString("not_found_text"); -			search_results->addElement(item); -			search_results->setEnabled(false); -			getChildView("ok_btn")->setEnabled(false); -		} -		else -		{ -			getChildView("ok_btn")->setEnabled(true); -			search_results->setEnabled(true); -			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); -		} +        if (content.has("failure_reason")) +        { +            getChild<LLScrollListCtrl>("SearchResults")->setCommentText(content["failure_reason"].asString()); +            getChildView("ok_btn")->setEnabled(false); +        } +        else +        { +            LLSD agents = content["agents"]; + +            LLSD item; +            LLSD::array_const_iterator it = agents.beginArray(); +            for (; it != agents.endArray(); ++it) +            { +                const LLSD& row = *it; +                if (row["id"].asUUID() != gAgent.getID() || !mExcludeAgentFromSearchResults) +                { +                    item["id"] = row["id"]; +                    LLSD& columns = item["columns"]; +                    columns[0]["column"] = "name"; +                    columns[0]["value"] = row["display_name"]; +                    columns[1]["column"] = "username"; +                    columns[1]["value"] = row["username"]; +                    search_results->addElement(item); + +                    // add the avatar name to our list +                    LLAvatarName avatar_name; +                    avatar_name.fromLLSD(row); +                    sAvatarNameMap[row["id"].asUUID()] = avatar_name; +                } +            } + +            if (search_results->isEmpty()) +            { +                std::string name = "'" + getChild<LLUICtrl>("Edit")->getValue().asString() + "'"; +                LLSD item; +                item["id"] = LLUUID::null; +                item["columns"][0]["column"] = "name"; +                item["columns"][0]["value"] = name; +                item["columns"][1]["column"] = "username"; +                item["columns"][1]["value"] = getString("not_found_text"); +                search_results->addElement(item); +                search_results->setEnabled(false); +                getChildView("ok_btn")->setEnabled(false); +            } +            else +            { +                getChildView("ok_btn")->setEnabled(true); +                search_results->setEnabled(true); +                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/llfloateravatarrendersettings.cpp b/indra/newview/llfloateravatarrendersettings.cpp index b8f854feb3..8b28f6941e 100644 --- a/indra/newview/llfloateravatarrendersettings.cpp +++ b/indra/newview/llfloateravatarrendersettings.cpp @@ -89,6 +89,7 @@ BOOL LLFloaterAvatarRenderSettings::postBuild()      LLFloater::postBuild();      mAvatarSettingsList = getChild<LLNameListCtrl>("render_settings_list");      mAvatarSettingsList->setRightMouseDownCallback(boost::bind(&LLFloaterAvatarRenderSettings::onAvatarListRightClick, this, _1, _2, _3)); +    mAvatarSettingsList->setAlternateSort();      getChild<LLFilterEditor>("people_filter_input")->setCommitCallback(boost::bind(&LLFloaterAvatarRenderSettings::onFilterEdit, this, _2));  	return TRUE; @@ -138,8 +139,8 @@ void LLFloaterAvatarRenderSettings::updateList()              item_params.columns.add().value(av_name.getCompleteName()).column("name");              std::string setting = getString(iter->second == 1 ? "av_never_render" : "av_always_render");              item_params.columns.add().value(setting).column("setting"); -            std::string timestamp = createTimestamp(LLRenderMuteList::getInstance()->getVisualMuteDate(iter->first)); -            item_params.columns.add().value(timestamp).column("timestamp"); +            S32 mute_date = LLRenderMuteList::getInstance()->getVisualMuteDate(iter->first); +            item_params.columns.add().value(createTimestamp(mute_date)).column("timestamp").alt_value(std::to_string(mute_date));              mAvatarSettingsList->addNameItemRow(item_params);          }      } diff --git a/indra/newview/llfloaterdisplayname.cpp b/indra/newview/llfloaterdisplayname.cpp index 3b0c67415a..19bc865d8b 100644 --- a/indra/newview/llfloaterdisplayname.cpp +++ b/indra/newview/llfloaterdisplayname.cpp @@ -47,6 +47,7 @@ public:  	virtual ~LLFloaterDisplayName() { }  	/*virtual*/	BOOL	postBuild();  	void onSave(); +	void onReset();  	void onCancel();  	/*virtual*/ void onOpen(const LLSD& key); @@ -101,6 +102,7 @@ void LLFloaterDisplayName::onOpen(const LLSD& key)  BOOL LLFloaterDisplayName::postBuild()  { +	getChild<LLUICtrl>("reset_btn")->setCommitCallback(boost::bind(&LLFloaterDisplayName::onReset, this));	  	getChild<LLUICtrl>("cancel_btn")->setCommitCallback(boost::bind(&LLFloaterDisplayName::onCancel, this));	  	getChild<LLUICtrl>("save_btn")->setCommitCallback(boost::bind(&LLFloaterDisplayName::onSave, this));	 @@ -156,6 +158,20 @@ void LLFloaterDisplayName::onCancel()  	setVisible(false);  } +void LLFloaterDisplayName::onReset() +{ +    LLAvatarName av_name; +    if (!LLAvatarNameCache::get(gAgent.getID(), &av_name)) +    { +        return; +    } +    getChild<LLUICtrl>("display_name_editor")->setValue(av_name.getCompleteName()); + +    getChild<LLUICtrl>("display_name_confirm")->clear(); +    getChild<LLUICtrl>("display_name_confirm")->setFocus(TRUE); +} + +  void LLFloaterDisplayName::onSave()  {  	std::string display_name_utf8 = getChild<LLUICtrl>("display_name_editor")->getValue().asString(); diff --git a/indra/newview/llhudnametag.cpp b/indra/newview/llhudnametag.cpp index 952fbf8e4b..ab6a64157c 100644 --- a/indra/newview/llhudnametag.cpp +++ b/indra/newview/llhudnametag.cpp @@ -56,7 +56,6 @@ const F32 HORIZONTAL_PADDING = 16.f;  const F32 VERTICAL_PADDING = 12.f;  const F32 LINE_PADDING = 3.f;			// aka "leading"  const F32 BUFFER_SIZE = 2.f; -const F32 HUD_TEXT_MAX_WIDTH = 190.f;  const S32 NUM_OVERLAP_ITERATIONS = 10;  const F32 POSITION_DAMPING_TC = 0.2f;  const F32 MAX_STABLE_CAMERA_VELOCITY = 0.1f; @@ -67,6 +66,8 @@ const F32 LOD_2_SCREEN_COVERAGE = 0.40f;  std::set<LLPointer<LLHUDNameTag> > LLHUDNameTag::sTextObjects;  std::vector<LLPointer<LLHUDNameTag> > LLHUDNameTag::sVisibleTextObjects;  BOOL LLHUDNameTag::sDisplayText = TRUE ; +const F32 LLHUDNameTag::NAMETAG_MAX_WIDTH = 298.f; +const F32 LLHUDNameTag::HUD_TEXT_MAX_WIDTH = 190.f;  bool llhudnametag_further_away::operator()(const LLPointer<LLHUDNameTag>& lhs, const LLPointer<LLHUDNameTag>& rhs) const  { @@ -414,7 +415,8 @@ void LLHUDNameTag::addLine(const std::string &text_utf8,  						const LLColor4& color,  						const LLFontGL::StyleFlags style,  						const LLFontGL* font, -						const bool use_ellipses) +						const bool use_ellipses, +						F32 max_pixels)  {  	LLWString wline = utf8str_to_wstring(text_utf8);  	if (!wline.empty()) @@ -431,7 +433,7 @@ void LLHUDNameTag::addLine(const std::string &text_utf8,  		tokenizer tokens(wline, sep);  		tokenizer::iterator iter = tokens.begin(); -        const F32 max_pixels = HUD_TEXT_MAX_WIDTH; +        max_pixels = llmin(max_pixels, NAMETAG_MAX_WIDTH);          while (iter != tokens.end())          {              U32 line_length = 0; @@ -488,7 +490,7 @@ void LLHUDNameTag::setLabel(const std::string &label_utf8)  	addLabel(label_utf8);  } -void LLHUDNameTag::addLabel(const std::string& label_utf8) +void LLHUDNameTag::addLabel(const std::string& label_utf8, F32 max_pixels)  {  	LLWString wstr = utf8string_to_wstring(label_utf8);  	if (!wstr.empty()) @@ -502,13 +504,15 @@ void LLHUDNameTag::addLabel(const std::string& label_utf8)  		tokenizer tokens(wstr, sep);  		tokenizer::iterator iter = tokens.begin(); +        max_pixels = llmin(max_pixels, NAMETAG_MAX_WIDTH); +  		while (iter != tokens.end())  		{  			U32 line_length = 0;  			do	  			{  				S32 segment_length = mFontp->maxDrawableChars(iter->substr(line_length).c_str(),  -					HUD_TEXT_MAX_WIDTH, wstr.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE); +                    max_pixels, wstr.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE);  				LLHUDTextSegment segment(iter->substr(line_length, segment_length), LLFontGL::NORMAL, mColor, mFontp);  				mLabelSegments.push_back(segment);  				line_length += segment_length; @@ -695,7 +699,7 @@ void LLHUDNameTag::updateSize()  		const LLFontGL* fontp = iter->mFont;  		height += fontp->getLineHeight();  		height += LINE_PADDING; -		width = llmax(width, llmin(iter->getWidth(fontp), HUD_TEXT_MAX_WIDTH)); +		width = llmax(width, llmin(iter->getWidth(fontp), NAMETAG_MAX_WIDTH));  		++iter;  	} @@ -709,7 +713,7 @@ void LLHUDNameTag::updateSize()  	while (iter != mLabelSegments.end())  	{  		height += mFontp->getLineHeight(); -		width = llmax(width, llmin(iter->getWidth(mFontp), HUD_TEXT_MAX_WIDTH)); +		width = llmax(width, llmin(iter->getWidth(mFontp), NAMETAG_MAX_WIDTH));  		++iter;  	} diff --git a/indra/newview/llhudnametag.h b/indra/newview/llhudnametag.h index 7577dd5de6..361e4d4f4b 100644 --- a/indra/newview/llhudnametag.h +++ b/indra/newview/llhudnametag.h @@ -85,6 +85,9 @@ public:  		ALIGN_VERT_CENTER  	} EVertAlignment; +    static const F32 NAMETAG_MAX_WIDTH; // 298px, made to fit 31 M's +    static const F32 HUD_TEXT_MAX_WIDTH; // 190px +  public:  	// Set entire string, eliminating existing lines  	void setString(const std::string& text_utf8); @@ -92,11 +95,17 @@ public:  	void clearString();  	// Add text a line at a time, allowing custom formatting -	void addLine(const std::string &text_utf8, const LLColor4& color, const LLFontGL::StyleFlags style = LLFontGL::NORMAL, const LLFontGL* font = NULL, const bool use_ellipses = false); +	void addLine( +        const std::string &text_utf8, +        const LLColor4& color, +        const LLFontGL::StyleFlags style = LLFontGL::NORMAL, +        const LLFontGL* font = NULL, +        const bool use_ellipses = false, +        F32 max_pixels = HUD_TEXT_MAX_WIDTH);  	// For bubble chat, set the part above the chat text  	void setLabel(const std::string& label_utf8); -	void addLabel(const std::string& label_utf8); +	void addLabel(const std::string& label_utf8, F32 max_pixels = HUD_TEXT_MAX_WIDTH);  	// Sets the default font for lines with no font specified  	void setFont(const LLFontGL* font); diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 3607e49b4a..5039e15047 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -41,6 +41,7 @@  #include "llstring.h"  #include "lltextutil.h"  #include "lltrans.h" +#include "lltranslate.h"  #include "lluictrlfactory.h"  #include "llfloaterimsessiontab.h"  #include "llagent.h" @@ -510,6 +511,31 @@ void chatterBoxInvitationCoro(std::string url, LLUUID sessionId, LLIMMgr::EInvit  } +void translateSuccess(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text,  +                    bool log2file, std::string originalMsg, std::string expectLang, std::string translation, const std::string detected_language) +{ +    std::string message_txt(utf8_text); +    // filter out non-interesting responses   +    if (!translation.empty() +        && ((detected_language.empty()) || (expectLang != detected_language)) +        && (LLStringUtil::compareInsensitive(translation, originalMsg) != 0)) +    { +        message_txt += " (" + LLTranslate::removeNoTranslateTags(translation) + ")"; +    } + +    LLIMModel::getInstance()->processAddingMessage(session_id, from, from_id, message_txt, log2file); +} + +void translateFailure(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text, +                    bool log2file, int status, const std::string err_msg) +{ +    std::string message_txt(utf8_text); +    std::string msg = LLTrans::getString("TranslationFailed", LLSD().with("[REASON]", err_msg)); +    LLStringUtil::replaceString(msg, "\n", " "); // we want one-line error messages +    message_txt += " (" + msg + ")"; + +    LLIMModel::getInstance()->processAddingMessage(session_id, from, from_id, message_txt, log2file); +}  LLIMModel::LLIMModel()   { @@ -1189,39 +1215,57 @@ bool LLIMModel::logToFile(const std::string& file_name, const std::string& from,  	}  } -bool LLIMModel::proccessOnlineOfflineNotification( +void LLIMModel::proccessOnlineOfflineNotification(  	const LLUUID& session_id,   	const std::string& utf8_text)  {  	// Add system message to history -	return addMessage(session_id, SYSTEM_FROM, LLUUID::null, utf8_text); +	addMessage(session_id, SYSTEM_FROM, LLUUID::null, utf8_text);  } -bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,  -						   const std::string& utf8_text, bool log2file, bool is_region_msg) {  +void LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,  +						   const std::string& utf8_text, bool log2file /* = true */, bool is_region_msg /* = false */) { + +    if (gSavedSettings.getBOOL("TranslateChat") && (from != SYSTEM_FROM)) +    { +        const std::string from_lang = ""; // leave empty to trigger autodetect +        const std::string to_lang = LLTranslate::getTranslateLanguage(); + +        LLTranslate::translateMessage(from_lang, to_lang, utf8_text, +            boost::bind(&translateSuccess, session_id, from, from_id, utf8_text, log2file, utf8_text, from_lang, _1, _2), +            boost::bind(&translateFailure, session_id, from, from_id, utf8_text, log2file, _1, _2)); +    } +    else +    { +        processAddingMessage(session_id, from, from_id, utf8_text, log2file, is_region_msg); +    } +} -	LLIMSession* session = addMessageSilently(session_id, from, from_id, utf8_text, log2file, is_region_msg); -	if (!session) return false; +void LLIMModel::processAddingMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, +    const std::string& utf8_text, bool log2file /* = true */, bool is_region_msg /* = false */) +{ +    LLIMSession* session = addMessageSilently(session_id, from, from_id, utf8_text, log2file, is_region_msg); +    if (!session) return; -	//good place to add some1 to recent list -	//other places may be called from message history. -	if( !from_id.isNull() && -		( session->isP2PSessionType() || session->isAdHocSessionType() ) ) -		LLRecentPeople::instance().add(from_id); +    //good place to add some1 to recent list +    //other places may be called from message history. +    if( !from_id.isNull() && +        ( session->isP2PSessionType() || session->isAdHocSessionType() ) ) +        LLRecentPeople::instance().add(from_id); -	// notify listeners -	LLSD arg; -	arg["session_id"] = session_id; -	arg["num_unread"] = session->mNumUnread; -	arg["participant_unread"] = session->mParticipantUnreadMessageCount; -	arg["message"] = utf8_text; -	arg["from"] = from; -	arg["from_id"] = from_id; -	arg["time"] = LLLogChat::timestamp(false); -	arg["session_type"] = session->mSessionType; -	mNewMsgSignal(arg); +    // notify listeners +    LLSD arg; +    arg["session_id"] = session_id; +    arg["num_unread"] = session->mNumUnread; +    arg["participant_unread"] = session->mParticipantUnreadMessageCount; +    arg["message"] = utf8_text; +    arg["from"] = from; +    arg["from_id"] = from_id; +    arg["time"] = LLLogChat::timestamp(false); +    arg["session_type"] = session->mSessionType; +    arg["is_region_msg"] = is_region_msg; -	return true; +    mNewMsgSignal(arg);  }  LLIMModel::LLIMSession* LLIMModel::addMessageSilently(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,  diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 326e8f22e3..5e99cc7fca 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -208,7 +208,8 @@ public:  	 * and also saved into a file if log2file is specified.  	 * It sends new message signal for each added message.  	 */ -	bool addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& other_participant_id, const std::string& utf8_text, bool log2file = true, bool is_region_msg = false); +	void addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text, bool log2file = true, bool is_region_msg = false); +    void processAddingMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text, bool log2file = true, bool is_region_msg = false);  	/**  	 * Similar to addMessage(...) above but won't send a signal about a new message added @@ -219,7 +220,7 @@ public:  	/**  	 * Add a system message to an IM Model  	 */ -	bool proccessOnlineOfflineNotification(const LLUUID& session_id, const std::string& utf8_text); +	void proccessOnlineOfflineNotification(const LLUUID& session_id, const std::string& utf8_text);  	/**  	 * Get a session's name.  diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index af1c93f383..67240ac7e7 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -529,7 +529,11 @@ BOOL get_is_item_worn(const LLUUID& id)  	const LLViewerInventoryItem* item = gInventory.getItem(id);  	if (!item)  		return FALSE; - +     +    if (item->getIsLinkType() && !gInventory.getItem(item->getLinkedUUID())) +    { +        return FALSE; +    }  	// Consider the item as worn if it has links in COF.  	if (LLAppearanceMgr::instance().isLinkedInCOF(id))  	{ @@ -787,7 +791,7 @@ void show_item_original(const LLUUID& item_uuid)          LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();          if (main_inventory)          { -            main_inventory->resetFilters(); +            main_inventory->resetAllItemsFilters();          }          reset_inventory_filter(); @@ -795,6 +799,7 @@ void show_item_original(const LLUUID& item_uuid)          {              LLFloaterReg::toggleInstanceOrBringToFront("inventory");          } +        sidepanel_inventory->showInventoryPanel();          const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX);          if (gInventory.isObjectDescendentOf(gInventory.getLinkedItemID(item_uuid), inbox_id)) @@ -2650,7 +2655,12 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root      }      else      { -        std::copy(selected_uuid_set.begin(), selected_uuid_set.end(), std::back_inserter(ids)); +        for (std::set<LLFolderViewItem*>::iterator it = selected_items.begin(), end_it = selected_items.end(); +            it != end_it; +            ++it) +        { +            ids.push_back(static_cast<LLFolderViewModelItemInventory*>((*it)->getViewModelItem())->getUUID()); +        }      }      // Check for actions that get handled in bulk @@ -2711,7 +2721,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root      }      else if ("ungroup_folder_items" == action)      { -        if (selected_uuid_set.size() == 1) +        if (ids.size() == 1)          {              LLInventoryCategory* inv_cat = gInventory.getCategory(*ids.begin());              if (!inv_cat || LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType())) diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index b0d6f9d9c3..0784a010bf 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1636,6 +1636,9 @@ void LLInventoryModel::deleteObject(const LLUUID& id, bool fix_broken_links, boo  		LL_WARNS(LOG_INV) << "Deleting non-existent object [ id: " << id << " ] " << LL_ENDL;  		return;  	} + +    //collect the links before removing the item from mItemMap +    LLInventoryModel::item_array_t links = collectLinksTo(id);  	LL_DEBUGS(LOG_INV) << "Deleting inventory object " << id << LL_ENDL;  	mLastItem = NULL; @@ -1693,7 +1696,7 @@ void LLInventoryModel::deleteObject(const LLUUID& id, bool fix_broken_links, boo  	// update is getting broken link info separately.  	if (fix_broken_links && !is_link_type)  	{ -		updateLinkedObjectsFromPurge(id); +        rebuildLinkItems(links);  	}  	obj = nullptr; // delete obj  	if (do_notify_observers) @@ -1702,26 +1705,25 @@ void LLInventoryModel::deleteObject(const LLUUID& id, bool fix_broken_links, boo  	}  } -void LLInventoryModel::updateLinkedObjectsFromPurge(const LLUUID &baseobj_id) +void LLInventoryModel::rebuildLinkItems(LLInventoryModel::item_array_t& items)  { -	LLInventoryModel::item_array_t item_array = collectLinksTo(baseobj_id); - -	// REBUILD is expensive, so clear the current change list first else -	// everything else on the changelist will also get rebuilt. -	if (item_array.size() > 0) -	{ -		notifyObservers(); -		for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin(); -			iter != item_array.end(); -			iter++) -		{ -			const LLViewerInventoryItem *linked_item = (*iter); -			const LLUUID &item_id = linked_item->getUUID(); -			if (item_id == baseobj_id) continue; -			addChangedMask(LLInventoryObserver::REBUILD, item_id); -		} -		notifyObservers(); -	} +    // REBUILD is expensive, so clear the current change list first else +    // everything else on the changelist will also get rebuilt. +    if (items.size() > 0) +    { +        notifyObservers(); +        for (LLInventoryModel::item_array_t::const_iterator iter = items.begin(); +            iter != items.end(); +            iter++) +        { +            const LLViewerInventoryItem *linked_item = (*iter); +            if (linked_item) +            { +                addChangedMask(LLInventoryObserver::REBUILD, linked_item->getUUID()); +            } +        } +        notifyObservers(); +    }  }  // Add/remove an observer. If the observer is destroyed, be sure to @@ -1951,18 +1953,20 @@ void LLInventoryModel::cache(  		items,  		INCLUDE_TRASH,  		can_cache); -	std::string inventory_filename = getInvCacheAddres(agent_id); -	saveToFile(inventory_filename, categories, items); -	std::string gzip_filename(inventory_filename); +    // Use temporary file to avoid potential conflicts with other +    // instances (even a 'read only' instance unzips into a file) +    std::string temp_file = gDirUtilp->getTempFilename(); +	saveToFile(temp_file, categories, items); +    std::string gzip_filename = getInvCacheAddres(agent_id);  	gzip_filename.append(".gz"); -	if(gzip_file(inventory_filename, gzip_filename)) +	if(gzip_file(temp_file, gzip_filename))  	{ -		LL_DEBUGS(LOG_INV) << "Successfully compressed " << inventory_filename << LL_ENDL; -		LLFile::remove(inventory_filename); +		LL_DEBUGS(LOG_INV) << "Successfully compressed " << temp_file << " to " << gzip_filename << LL_ENDL; +		LLFile::remove(temp_file);  	}  	else  	{ -		LL_WARNS(LOG_INV) << "Unable to compress " << inventory_filename << LL_ENDL; +		LL_WARNS(LOG_INV) << "Unable to compress " << temp_file << " into " << gzip_filename << LL_ENDL;  	}  } @@ -3035,6 +3039,7 @@ bool LLInventoryModel::saveToFile(const std::string& filename,                  return false;              }          } +        fileXML.flush();          fileXML.close(); diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index c4133ff9bb..685c2c0fe5 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -445,7 +445,7 @@ public:  	void checkTrashOverflow();  protected: -	void updateLinkedObjectsFromPurge(const LLUUID& baseobj_id); +    void rebuildLinkItems(LLInventoryModel::item_array_t& items);  	//--------------------------------------------------------------------  	// Reorder diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index 406c8b89d0..4a9b471a47 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -363,7 +363,7 @@ void LLInventoryModelBackgroundFetch::bulkFetch()  	//If there are items in mFetchQueue, we want to check the time since the last bulkFetch was   	//sent.  If it exceeds our retry time, go ahead and fire off another batch.    	LLViewerRegion * region(gAgent.getRegion()); -	if (! region || gDisconnected) +	if (! region || gDisconnected || LLApp::isExiting())  	{  		return;  	} diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index c065c76dca..8029486d6f 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -1627,6 +1627,7 @@ void LLInventoryPanel::purgeSelectedItems()      if (inventory_selected.empty()) return;      LLSD args;      S32 count = inventory_selected.size(); +    std::vector<LLUUID> selected_items;      for (std::set<LLFolderViewItem*>::const_iterator it = inventory_selected.begin(), end_it = inventory_selected.end();          it != end_it;          ++it) @@ -1636,27 +1637,23 @@ void LLInventoryPanel::purgeSelectedItems()          LLInventoryModel::item_array_t items;          gInventory.collectDescendents(item_id, cats, items, LLInventoryModel::INCLUDE_TRASH);          count += items.size() + cats.size(); +        selected_items.push_back(item_id);      }      args["COUNT"] = count; -    LLNotificationsUtil::add("PurgeSelectedItems", args, LLSD(), boost::bind(&LLInventoryPanel::callbackPurgeSelectedItems, this, _1, _2)); +    LLNotificationsUtil::add("PurgeSelectedItems", args, LLSD(), boost::bind(callbackPurgeSelectedItems, _1, _2, selected_items));  } -void LLInventoryPanel::callbackPurgeSelectedItems(const LLSD& notification, const LLSD& response) +// static +void LLInventoryPanel::callbackPurgeSelectedItems(const LLSD& notification, const LLSD& response, const std::vector<LLUUID> inventory_selected)  { -    if (!mFolderRoot.get()) return; -      S32 option = LLNotificationsUtil::getSelectedOption(notification, response);      if (option == 0)      { -        const std::set<LLFolderViewItem*> inventory_selected = mFolderRoot.get()->getSelectionList();          if (inventory_selected.empty()) return; -        std::set<LLFolderViewItem*>::const_iterator it = inventory_selected.begin(); -        const std::set<LLFolderViewItem*>::const_iterator it_end = inventory_selected.end(); -        for (; it != it_end; ++it) +        for (auto it : inventory_selected)          { -            LLUUID item_id = static_cast<LLFolderViewModelItemInventory*>((*it)->getViewModelItem())->getUUID(); -            remove_inventory_object(item_id, NULL); +            remove_inventory_object(it, NULL);          }      }  } diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index 552c61b915..2c782a5ea7 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -260,7 +260,7 @@ public:      // Clean up stuff when the folder root gets deleted      void clearFolderRoot(); -    void callbackPurgeSelectedItems(const LLSD& notification, const LLSD& response); +    static void callbackPurgeSelectedItems(const LLSD& notification, const LLSD& response, const std::vector<LLUUID> inventory_selected);  protected:  	void openStartFolderOrMyInventory(); // open the first level of inventory diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 9df3a8e31a..b14fdbf38e 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -1103,6 +1103,18 @@ void LLPanelLogin::onRememberPasswordCheck(void*)      if (sInstance)      {          gSavedSettings.setBOOL("UpdateRememberPasswordSetting", TRUE); + +        LLPointer<LLCredential> cred; +        bool remember_user, remember_password; +        getFields(cred, remember_user, remember_password); + +        std::string grid(LLGridManager::getInstance()->getGridId()); +        std::string user_id(cred->userID()); +        if (!remember_password) +        { +            gSecAPIHandler->removeFromProtectedMap("mfa_hash", grid, user_id); +            gSecAPIHandler->syncProtectedMap(); +        }      }  } diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 81acb1c8b4..744d49ff57 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -410,6 +410,18 @@ void LLPanelMainInventory::resetFilters()  	setFilterTextFromFilter();  } +void LLPanelMainInventory::resetAllItemsFilters() +{ +    LLFloaterInventoryFinder *finder = getFinder(); +    getAllItemsPanel()->getFilter().resetDefault(); +    if (finder) +    { +        finder->updateElementsFromFilter(); +    } + +    setFilterTextFromFilter(); +} +  void LLPanelMainInventory::setSortBy(const LLSD& userdata)  {  	U32 sort_order_mask = getActivePanel()->getSortOrder(); diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index 257bce930c..7aae5a0b3c 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -96,6 +96,7 @@ public:  	void toggleFindOptions();      void resetFilters(); +    void resetAllItemsFilters();  protected:  	// diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp index 416857bd30..8380394f2c 100644 --- a/indra/newview/llpanelmediasettingsgeneral.cpp +++ b/indra/newview/llpanelmediasettingsgeneral.cpp @@ -39,6 +39,7 @@  #include "llagent.h"  #include "llviewerwindow.h"  #include "llviewermedia.h" +#include "llvovolume.h"  #include "llsdutil.h"  #include "llselectmgr.h"  #include "llbutton.h" @@ -452,10 +453,17 @@ bool LLPanelMediaSettingsGeneral::navigateHomeSelectedFace(bool only_if_current_  					{  						viewer_media_t media_impl =  							LLViewerMedia::getInstance()->getMediaImplFromTextureID(object->getTE(face)->getMediaData()->getMediaID()); -						if(media_impl) -						{ +                        if (media_impl) +                        {                              media_impl->setPriority(LLPluginClassMedia::PRIORITY_NORMAL);                              media_impl->navigateHome(); + +                            if (!only_if_current_is_empty) +                            { +                                LLSD media_data; +                                media_data[LLMediaEntry::CURRENT_URL_KEY] = std::string(); +                                object->getTE(face)->mergeIntoMediaData(media_data); +                            }  							return true;  						}  					} @@ -471,6 +479,23 @@ bool LLPanelMediaSettingsGeneral::navigateHomeSelectedFace(bool only_if_current_  	LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection();  	selected_objects->getSelectedTEValue( &functor_navigate_media, all_face_media_navigated ); +    if (all_face_media_navigated) +    { +        struct functor_sync_to_server : public LLSelectedObjectFunctor +        { +            virtual bool apply(LLViewerObject* object) +            { +                LLVOVolume *volume = dynamic_cast<LLVOVolume*>(object); +                if (volume) +                { +                    volume->sendMediaDataUpdate(); +                } +                return true; +            } +        } sendfunc; +        selected_objects->applyToObjects(&sendfunc); +    } +  	// Note: we don't update the 'current URL' field until the media data itself changes  	return all_face_media_navigated; diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp index 07f46c5fbe..4e94895a3e 100644 --- a/indra/newview/lltoolfocus.cpp +++ b/indra/newview/lltoolfocus.cpp @@ -75,6 +75,7 @@ LLToolCamera::LLToolCamera()  	mOutsideSlopX(FALSE),  	mOutsideSlopY(FALSE),  	mValidClickPoint(FALSE), +    mClickPickPending(false),  	mValidSelection(FALSE),  	mMouseSteering(FALSE),  	mMouseUpX(0), @@ -127,6 +128,11 @@ BOOL LLToolCamera::handleMouseDown(S32 x, S32 y, MASK mask)  	mValidClickPoint = FALSE; +    // Sometimes Windows issues down and up events near simultaneously +    // without giving async pick a chance to trigged +    // Ex: mouse from numlock emulation +    mClickPickPending = true; +  	// If mouse capture gets ripped away, claim we moused up  	// at the point we moused down. JC  	mMouseUpX = x; @@ -142,13 +148,15 @@ BOOL LLToolCamera::handleMouseDown(S32 x, S32 y, MASK mask)  void LLToolCamera::pickCallback(const LLPickInfo& pick_info)  { -	if (!LLToolCamera::getInstance()->hasMouseCapture()) +    LLToolCamera* camera = LLToolCamera::getInstance(); +	if (!camera->mClickPickPending)  	{  		return;  	} +    camera->mClickPickPending = false; -	LLToolCamera::getInstance()->mMouseDownX = pick_info.mMousePt.mX; -	LLToolCamera::getInstance()->mMouseDownY = pick_info.mMousePt.mY; +    camera->mMouseDownX = pick_info.mMousePt.mX; +    camera->mMouseDownY = pick_info.mMousePt.mY;  	gViewerWindow->moveCursorToCenter(); @@ -158,7 +166,7 @@ void LLToolCamera::pickCallback(const LLPickInfo& pick_info)  	// Check for hit the sky, or some other invalid point  	if (!hit_obj && pick_info.mPosGlobal.isExactlyZero())  	{ -		LLToolCamera::getInstance()->mValidClickPoint = FALSE; +        camera->mValidClickPoint = FALSE;  		return;  	} @@ -168,7 +176,7 @@ void LLToolCamera::pickCallback(const LLPickInfo& pick_info)  		LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();  		if (!selection->getObjectCount() || selection->getSelectType() != SELECT_TYPE_HUD)  		{ -			LLToolCamera::getInstance()->mValidClickPoint = FALSE; +            camera->mValidClickPoint = FALSE;  			return;  		}  	} @@ -192,7 +200,7 @@ void LLToolCamera::pickCallback(const LLPickInfo& pick_info)  		if( !good_customize_avatar_hit )  		{ -			LLToolCamera::getInstance()->mValidClickPoint = FALSE; +            camera->mValidClickPoint = FALSE;  			return;  		} @@ -237,7 +245,7 @@ void LLToolCamera::pickCallback(const LLPickInfo& pick_info)  	} -	LLToolCamera::getInstance()->mValidClickPoint = TRUE; +    camera->mValidClickPoint = TRUE;  	if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgentCamera.getCameraMode() )  	{ @@ -284,32 +292,36 @@ BOOL LLToolCamera::handleMouseUp(S32 x, S32 y, MASK mask)  	if (hasMouseCapture())  	{ -		if (mValidClickPoint) -		{ -			if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgentCamera.getCameraMode() ) -			{ -				LLCoordGL mouse_pos; -				LLVector3 focus_pos = gAgent.getPosAgentFromGlobal(gAgentCamera.getFocusGlobal()); -				BOOL success = LLViewerCamera::getInstance()->projectPosAgentToScreen(focus_pos, mouse_pos); -				if (success) -				{ -					LLUI::getInstance()->setMousePositionScreen(mouse_pos.mX, mouse_pos.mY); -				} -			} -			else if (mMouseSteering) -			{ -				LLUI::getInstance()->setMousePositionScreen(mMouseDownX, mMouseDownY); -			} -			else -			{ -				gViewerWindow->moveCursorToCenter(); -			} -		} -		else -		{ -			// not a valid zoomable object -			LLUI::getInstance()->setMousePositionScreen(mMouseDownX, mMouseDownY); -		} +        // Do not move camera if we haven't gotten a pick +        if (!mClickPickPending) +        { +            if (mValidClickPoint) +            { +                if (CAMERA_MODE_CUSTOMIZE_AVATAR == gAgentCamera.getCameraMode()) +                { +                    LLCoordGL mouse_pos; +                    LLVector3 focus_pos = gAgent.getPosAgentFromGlobal(gAgentCamera.getFocusGlobal()); +                    BOOL success = LLViewerCamera::getInstance()->projectPosAgentToScreen(focus_pos, mouse_pos); +                    if (success) +                    { +                        LLUI::getInstance()->setMousePositionScreen(mouse_pos.mX, mouse_pos.mY); +                    } +                } +                else if (mMouseSteering) +                { +                    LLUI::getInstance()->setMousePositionScreen(mMouseDownX, mMouseDownY); +                } +                else +                { +                    gViewerWindow->moveCursorToCenter(); +                } +            } +            else +            { +                // not a valid zoomable object +                LLUI::getInstance()->setMousePositionScreen(mMouseDownX, mMouseDownY); +            } +        }  		// calls releaseMouse() internally  		setMouseCapture(FALSE); diff --git a/indra/newview/lltoolfocus.h b/indra/newview/lltoolfocus.h index cfc235b6c2..6615193318 100644 --- a/indra/newview/lltoolfocus.h +++ b/indra/newview/lltoolfocus.h @@ -65,6 +65,7 @@ protected:  	BOOL	mOutsideSlopX;  	BOOL	mOutsideSlopY;  	BOOL	mValidClickPoint; +    bool	mClickPickPending;  	BOOL	mValidSelection;  	BOOL	mMouseSteering;  	S32		mMouseUpX;	// needed for releaseMouse() diff --git a/indra/newview/llviewerassetupload.cpp b/indra/newview/llviewerassetupload.cpp index 232b52a3f9..13491114b9 100644 --- a/indra/newview/llviewerassetupload.cpp +++ b/indra/newview/llviewerassetupload.cpp @@ -704,7 +704,7 @@ LLUUID LLBufferedAssetUploadInfo::finishUpload(LLSD &result)  LLScriptAssetUpload::LLScriptAssetUpload(LLUUID itemId, std::string buffer, invnUploadFinish_f finish):      LLBufferedAssetUploadInfo(itemId, LLAssetType::AT_LSL_TEXT, buffer, finish),      mExerienceId(), -    mTargetType(LSL2), +    mTargetType(MONO),      mIsRunning(false)  {  } @@ -725,7 +725,7 @@ LLSD LLScriptAssetUpload::generatePostBody()      if (getTaskId().isNull())      {          body["item_id"] = getItemId(); -        body["target"] = "lsl2"; +        body["target"] = "mono";      }      else      { diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index e930b58111..efc4ded79e 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -815,7 +815,10 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent)  	{  		virtual bool apply(LLViewerObject* objectp)  		{ -			objectp->boostTexturePriority(); +            if (objectp) +            { +                objectp->boostTexturePriority(); +            }  			return true;  		}  	} func; diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index a4fbbb3e78..df3db9bb1d 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -509,6 +509,7 @@ void send_viewer_stats(bool include_preferences)      system["cpu_sse"] = gSysCPU.getSSEVersions();  	system["address_size"] = ADDRESS_SIZE;  	system["os_bitness"] = LLOSInfo::instance().getOSBitness(); +	system["hardware_concurrency"] = (LLSD::Integer) std::thread::hardware_concurrency();  	unsigned char MACAddress[MAC_ADDRESS_BYTES];  	LLUUID::getNodeID(MACAddress);  	std::string macAddressString = llformat("%02x-%02x-%02x-%02x-%02x-%02x", diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index e3ac56d0d3..8a11c5cf8f 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1118,7 +1118,7 @@ void LLViewerFetchedTexture::init(bool firstinit)  	mLoadedCallbackDesiredDiscardLevel = S8_MAX;  	mPauseLoadedCallBacks = FALSE; -	mNeedsCreateTexture = FALSE; +	mNeedsCreateTexture = false;  	mIsRawImageValid = FALSE;  	mRawDiscardLevel = INVALID_DISCARD_LEVEL; @@ -1400,12 +1400,12 @@ void LLViewerFetchedTexture::addToCreateTexture()  	{  		//just update some variables, not to create a real GL texture.  		createGLTexture(mRawDiscardLevel, mRawImage, 0, FALSE); -		mNeedsCreateTexture = FALSE; +		mNeedsCreateTexture = false;  		destroyRawImage();  	}  	else if(!force_update && getDiscardLevel() > -1 && getDiscardLevel() <= mRawDiscardLevel)  	{ -		mNeedsCreateTexture = FALSE; +		mNeedsCreateTexture = false;  		destroyRawImage();  	}  	else @@ -1441,7 +1441,7 @@ void LLViewerFetchedTexture::addToCreateTexture()  						mRawDiscardLevel += i;  						if(mRawDiscardLevel >= getDiscardLevel() && getDiscardLevel() > 0)  						{ -							mNeedsCreateTexture = FALSE; +							mNeedsCreateTexture = false;  							destroyRawImage();  							return;  						} @@ -1473,7 +1473,7 @@ BOOL LLViewerFetchedTexture::preCreateTexture(S32 usename/*= 0*/)          destroyRawImage();          return FALSE;      } -    mNeedsCreateTexture = FALSE; +    mNeedsCreateTexture = false;      if (mRawImage.isNull())      { @@ -1609,14 +1609,14 @@ void LLViewerFetchedTexture::postCreateTexture()          destroyRawImage();      } -    mNeedsCreateTexture = FALSE; +    mNeedsCreateTexture = false;  }  void LLViewerFetchedTexture::scheduleCreateTexture()  {      if (!mNeedsCreateTexture)      { -        mNeedsCreateTexture = TRUE; +        mNeedsCreateTexture = true;          if (preCreateTexture())          {  #if LL_IMAGEGL_THREAD_CHECK @@ -1630,7 +1630,7 @@ void LLViewerFetchedTexture::scheduleCreateTexture()                  memcpy(data_copy, data, size);              }  #endif -            mNeedsCreateTexture = TRUE; +            mNeedsCreateTexture = true;              auto mainq = LLImageGLThread::sEnabled ? mMainQueue.lock() : nullptr;              if (mainq)              { diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index b953d7006b..2f5e0d01df 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -27,6 +27,7 @@  #ifndef LL_LLVIEWERTEXTURE_H					  #define LL_LLVIEWERTEXTURE_H +#include "llatomic.h"  #include "llgltexture.h"  #include "lltimer.h"  #include "llframetimer.h" @@ -528,7 +529,9 @@ protected:  	LLFrameTimer mStopFetchingTimer;	// Time since mDecodePriority == 0.f.  	BOOL  mInImageList;				// TRUE if image is in list (in which case don't reset priority!) -	BOOL  mNeedsCreateTexture;	 +	// This needs to be atomic, since it is written both in the main thread +	// and in the GL image worker thread... HB +	LLAtomicBool  mNeedsCreateTexture;	  	BOOL   mForSculpt ; //a flag if the texture is used as sculpt data.  	BOOL   mIsFetched ; //is loaded from remote or from cache, not generated locally. diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 176528cb56..17299b6c61 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3528,14 +3528,15 @@ void LLVOAvatar::idleUpdateNameTagText(bool new_name)  void LLVOAvatar::addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font, const bool use_ellipses)  { +    // extra width (NAMETAG_MAX_WIDTH) is for names only, not for chat  	llassert(mNameText);  	if (mVisibleChat)  	{ -		mNameText->addLabel(line); +		mNameText->addLabel(line, LLHUDNameTag::NAMETAG_MAX_WIDTH);  	}  	else  	{ -		mNameText->addLine(line, color, (LLFontGL::StyleFlags)style, font, use_ellipses); +		mNameText->addLine(line, color, (LLFontGL::StyleFlags)style, font, use_ellipses, LLHUDNameTag::NAMETAG_MAX_WIDTH);  	}      mNameIsSet |= !line.empty();  } diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 13d6966723..d00ac5db76 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1775,20 +1775,17 @@ void LLPipeline::unlinkDrawable(LLDrawable *drawable)  void LLPipeline::removeMutedAVsLights(LLVOAvatar* muted_avatar)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; -    light_set_t::iterator iter = gPipeline.mNearbyLights.begin(); - -    while (iter != gPipeline.mNearbyLights.end()) -    { -        if (iter->drawable->getVObj()->isAttachment() && iter->drawable->getVObj()->getAvatar() == muted_avatar) -        { -            gPipeline.mLights.erase(iter->drawable); -            iter = gPipeline.mNearbyLights.erase(iter); -        } -        else -        { -            iter++; -        } -    } +	for (light_set_t::iterator iter = gPipeline.mNearbyLights.begin(); +		 iter != gPipeline.mNearbyLights.end(); iter++) +	{ +        const LLViewerObject *vobj = iter->drawable->getVObj(); +        if (vobj && vobj->getAvatar() +            && vobj->isAttachment() && vobj->getAvatar() == muted_avatar) +		{ +			gPipeline.mLights.erase(iter->drawable); +			gPipeline.mNearbyLights.erase(iter); +		} +	}  }  U32 LLPipeline::addObject(LLViewerObject *vobj) diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml index a4dfde66bc..f6208e11a5 100644 --- a/indra/newview/skins/default/xui/de/floater_tools.xml +++ b/indra/newview/skins/default/xui/de/floater_tools.xml @@ -40,7 +40,7 @@  		Klicken und ziehen, um Land auszuwählen  	</floater.string>  	<floater.string name="status_selectcount"> -		[OBJ_COUNT] Objekte ausgewählt, Auswirkung auf Land [LAND_IMPACT] +		[OBJ_COUNT] Objekte ausgewählt, Auswirkung auf Land [LAND_IMPACT] [secondlife:///app/openfloater/object_weights ?]  	</floater.string>  	<floater.string name="status_remaining_capacity">  		Verbleibende Kapazität [LAND_CAPACITY]. diff --git a/indra/newview/skins/default/xui/en/floater_display_name.xml b/indra/newview/skins/default/xui/en/floater_display_name.xml index 3c8f415860..f3431da858 100644 --- a/indra/newview/skins/default/xui/en/floater_display_name.xml +++ b/indra/newview/skins/default/xui/en/floater_display_name.xml @@ -56,7 +56,7 @@        max_length_chars="31"        height="20"        top_pad="5" -      left="50" /> +      left_delta="0" />  	<text         top_pad="15"         left="25" @@ -72,23 +72,33 @@        max_length_chars="31"        height="20"        top_pad="5" -      left="50" /> +      left_delta="0" /> +    <button +     label="Reset" +     layout="topleft" +     font="SansSerif" +     width="120" +     height="23" +     top_pad="40" +     left_delta="0" +     name="reset_btn" +     tool_tip="Use Username as a Display Name" />      <button       height="23"       label="Save"       layout="topleft"       font="SansSerif" -     left="35" +     left_pad="35"       name="save_btn"       tool_tip="Save your new Display Name"  -     top_pad="40" +     top_delta="0"       width="120" />      <button       height="23"       label="Cancel"       font="SansSerif"       layout="topleft" -     left_pad="125" +     left_pad="5"       name="cancel_btn"       width="120" />  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml index 45e16c59ae..850e1be372 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml @@ -323,7 +323,6 @@          follows="left|top"          decimal_digits="0"          increment="1" -        control_name="Edit Cost"          name="Edit Cost"          label="Price:"          label_width="100" diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index ade79b8884..d9b0ac0060 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -1140,7 +1140,6 @@ even though the user gets a free copy.        decimal_digits="0"        increment="1"        left_pad="0" -      control_name="Edit Cost"        name="Edit Cost"        label="L$"        label_width="15" diff --git a/indra/newview/skins/default/xui/en/menu_participant_view.xml b/indra/newview/skins/default/xui/en/menu_participant_view.xml index 7ea87ee05c..b9750284cd 100644 --- a/indra/newview/skins/default/xui/en/menu_participant_view.xml +++ b/indra/newview/skins/default/xui/en/menu_participant_view.xml @@ -90,7 +90,7 @@           parameter="conversation_log" />      </menu_item_check>      <menu_item_separator layout="topleft" /> -    <menu_item_check name="Translate_chat" label="Translate Nearby chat"> +    <menu_item_check name="Translate_chat" label="Translate chat">          <menu_item_check.on_click           function="IMFloaterContainer.Action"            parameter="Translating.Toggle" /> diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml index 2316beeb36..4c566dc60a 100644 --- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml +++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml @@ -92,10 +92,7 @@     label="Reset"     left_delta="233"      name="current_url_reset_btn"  -   width="110" >  -   <button.commit_callback -	     function="Media.ResetCurrentUrl"/> -  </button> +   width="110"/>    <check_box      bottom_delta="-25"      enabled="true"  diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index 9a68479d05..35d14251c7 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -450,7 +450,6 @@          follows="left|top"          decimal_digits="0"          increment="1" -        control_name="Edit Cost"          name="Edit Cost"          label="Price: L$"          label_width="75" @@ -461,8 +460,72 @@          max_val="999999999"          top_pad="10"          tool_tip="Object cost." /> -    </panel> - +      <text +        type="string" +        length="1" +        follows="left|top" +        height="10" +        layout="topleft" +        left="10" +        name="BaseMaskDebug" +        text_color="White" +        top_pad="30" +        width="130"> +        B: +      </text> +      <text +        type="string" +        length="1" +        follows="left|top" +        height="10" +        layout="topleft" +        left_delta="60" +        name="OwnerMaskDebug" +        text_color="White" +        top_delta="0" +        width="270"> +        O: +      </text> +      <text +        type="string" +        length="1" +        follows="left|top" +        height="10" +        layout="topleft" +        left_delta="60" +        name="GroupMaskDebug" +        text_color="White" +        top_delta="0" +        width="210"> +        G: +      </text> +      <text +        type="string" +        length="1" +        follows="left|top" +        height="10" +        layout="topleft" +        left_delta="60" +        name="EveryoneMaskDebug" +        text_color="White" +        top_delta="0" +        width="150"> +        E: +      </text> +      <text +       type="string" +       length="1" +       follows="left|top" +       height="10" +       layout="topleft" +       left_delta="60" +       name="NextMaskDebug" +       text_color="White" +       top_delta="0" +       width="90"> +        N: +      </text> +    </panel>       </scroll_container>    <panel      height="30" diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml index 1c9d750aa6..0b32215964 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml @@ -454,7 +454,6 @@          increment="1"          top_pad="10"          left="120" -        control_name="Edit Cost"          name="Edit Cost"          label="Price: L$"          label_width="73"				 diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml index 6fce98472d..ffa85a2f04 100644 --- a/indra/newview/skins/default/xui/es/floater_tools.xml +++ b/indra/newview/skins/default/xui/es/floater_tools.xml @@ -25,7 +25,7 @@  		Pulsa y arrastra para seleccionar el terreno.  	</floater.string>  	<floater.string name="status_selectcount"> -		[OBJ_COUNT] objetos seleccionados, impacto en el terreno [LAND_IMPACT] +		[OBJ_COUNT] objetos seleccionados, impacto en el terreno [LAND_IMPACT] [secondlife:///app/openfloater/object_weights ?]  	</floater.string>  	<floater.string name="status_remaining_capacity">  		Capacidad restante [LAND_CAPACITY]. diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml index 9597d38dca..c161f3f530 100644 --- a/indra/newview/skins/default/xui/fr/floater_tools.xml +++ b/indra/newview/skins/default/xui/fr/floater_tools.xml @@ -40,7 +40,7 @@  		Cliquez et faites glisser pour sélectionner le terrain.  	</floater.string>  	<floater.string name="status_selectcount"> -		[OBJ_COUNT] objets sélectionnés, impact sur le terrain [LAND_IMPACT] +		[OBJ_COUNT] objets sélectionnés, impact sur le terrain [LAND_IMPACT] [secondlife:///app/openfloater/object_weights ?]  	</floater.string>  	<floater.string name="status_remaining_capacity">  		Capacité restante [LAND_CAPACITY]. diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml index a21ae9a485..f98a2da277 100644 --- a/indra/newview/skins/default/xui/it/floater_tools.xml +++ b/indra/newview/skins/default/xui/it/floater_tools.xml @@ -40,7 +40,7 @@  		Clicca e trascina per selezionare il terreno  	</floater.string>  	<floater.string name="status_selectcount"> -		[OBJ_COUNT] oggetti selezionati, impatto terreno [LAND_IMPACT] +		[OBJ_COUNT] oggetti selezionati, impatto terreno [LAND_IMPACT] [secondlife:///app/openfloater/object_weights ?]  	</floater.string>  	<floater.string name="status_remaining_capacity">  		Capacità restante [LAND_CAPACITY]. diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml index aec0dbdb55..13f766698e 100644 --- a/indra/newview/skins/default/xui/ja/floater_tools.xml +++ b/indra/newview/skins/default/xui/ja/floater_tools.xml @@ -40,7 +40,7 @@  		土地をクリックし、ドラッグして選択  	</floater.string>  	<floater.string name="status_selectcount"> -		選択されているオブジェクトは [OBJ_COUNT] 個、土地の負荷は [LAND_IMPACT] +		選択されているオブジェクトは [OBJ_COUNT] 個、土地の負荷は [LAND_IMPACT] [secondlife:///app/openfloater/object_weights 詳細]  	</floater.string>  	<floater.string name="status_remaining_capacity">  		残りの許容数 [LAND_CAPACITY]。 diff --git a/indra/newview/skins/default/xui/pl/floater_tools.xml b/indra/newview/skins/default/xui/pl/floater_tools.xml index 5e2ed4a351..8932a86fd1 100644 --- a/indra/newview/skins/default/xui/pl/floater_tools.xml +++ b/indra/newview/skins/default/xui/pl/floater_tools.xml @@ -40,7 +40,7 @@  		Kliknij i przeciągnij, aby zaznaczyć teren  	</floater.string>  	<floater.string name="status_selectcount"> -		[OBJ_COUNT] zaznaczonych obiektów, wpływ na strefę: [LAND_IMPACT] +		[OBJ_COUNT] zaznaczonych obiektów, wpływ na strefę: [LAND_IMPACT] [secondlife:///app/openfloater/object_weights ?]  	</floater.string>  	<floater.string name="status_remaining_capacity">  		Pojemność pozostała: [LAND_CAPACITY]. diff --git a/indra/newview/skins/default/xui/pt/floater_tools.xml b/indra/newview/skins/default/xui/pt/floater_tools.xml index 0882f485a6..c0eab171c8 100644 --- a/indra/newview/skins/default/xui/pt/floater_tools.xml +++ b/indra/newview/skins/default/xui/pt/floater_tools.xml @@ -40,7 +40,7 @@  		Clicar e arrastar para selecionar a terra  	</floater.string>  	<floater.string name="status_selectcount"> -		[OBJ_COUNT] objetos selecionados, impacto no terreno [LAND_IMPACT] +		[OBJ_COUNT] objetos selecionados, impacto no terreno [LAND_IMPACT] [secondlife:///app/openfloater/object_weights ?]  	</floater.string>  	<floater.string name="status_remaining_capacity">  		Capacidade restante [LAND_CAPACITY]. diff --git a/indra/newview/skins/default/xui/ru/floater_tools.xml b/indra/newview/skins/default/xui/ru/floater_tools.xml index 82ee3c49ae..44f54aabb6 100644 --- a/indra/newview/skins/default/xui/ru/floater_tools.xml +++ b/indra/newview/skins/default/xui/ru/floater_tools.xml @@ -40,7 +40,7 @@  		Щелкните и перетащите для выделения земли  	</floater.string>  	<floater.string name="status_selectcount"> -		Выбрано объектов: [OBJ_COUNT], влияние на землю [LAND_IMPACT] +		Выбрано объектов: [OBJ_COUNT], влияние на землю [LAND_IMPACT] [secondlife:///app/openfloater/object_weights ?]  	</floater.string>  	<floater.string name="status_remaining_capacity">  		Остаток емкости [LAND_CAPACITY]. diff --git a/indra/newview/skins/default/xui/tr/floater_tools.xml b/indra/newview/skins/default/xui/tr/floater_tools.xml index d6b9a4a533..d48a617e38 100644 --- a/indra/newview/skins/default/xui/tr/floater_tools.xml +++ b/indra/newview/skins/default/xui/tr/floater_tools.xml @@ -40,7 +40,7 @@  		Araziyi seçmek için tıklayın ve sürükleyin  	</floater.string>  	<floater.string name="status_selectcount"> -		[OBJ_COUNT] nesne seçili, [LAND_IMPACT] arazi etkisi +		[OBJ_COUNT] nesne seçili, [LAND_IMPACT] arazi etkisi [secondlife:///app/openfloater/object_weights Ek bilgi]  	</floater.string>  	<floater.string name="status_remaining_capacity">  		Kalan kapasite [LAND_CAPACITY]. diff --git a/indra/newview/skins/default/xui/zh/floater_tools.xml b/indra/newview/skins/default/xui/zh/floater_tools.xml index 539c7454f1..f83b058ce1 100644 --- a/indra/newview/skins/default/xui/zh/floater_tools.xml +++ b/indra/newview/skins/default/xui/zh/floater_tools.xml @@ -40,7 +40,7 @@  		按住並拖曳,可以選取土地  	</floater.string>  	<floater.string name="status_selectcount"> -		選取了 [OBJ_COUNT] 個物件,土地衝擊量 [LAND_IMPACT] +		選取了 [OBJ_COUNT] 個物件,土地衝擊量 [LAND_IMPACT] [secondlife:///app/openfloater/object_weights 詳情]  	</floater.string>  	<floater.string name="status_remaining_capacity">  		剩餘容納量 [LAND_CAPACITY]。 | 
