diff options
Diffstat (limited to 'indra/newview')
50 files changed, 744 insertions, 319 deletions
| diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 43aea78775..6e648485fd 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1922,9 +1922,7 @@ if (WINDOWS)        add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts)      endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) -    add_dependencies(${VIEWER_BINARY_NAME} -      SLPlugin -    ) +    add_dependencies(${VIEWER_BINARY_NAME} SLPlugin)      # sets the 'working directory' for debugging from visual studio.      # Condition for version can be moved to requirements once build agents will be updated (see TOOL-3865) @@ -2274,7 +2272,7 @@ endif (INSTALL)  # Note that the conventional VIEWER_SYMBOL_FILE is set by ../../build.sh  if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIEWER_SYMBOL_FILE) -  if (BUGSPLAT_DB) +  if (USE_BUGSPLAT)      # BugSplat symbol-file generation      if (WINDOWS)        # Just pack up a tarball containing only the .pdb file for the @@ -2358,7 +2356,7 @@ if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIE      if (LINUX)        # TBD      endif (LINUX) -  endif (BUGSPLAT_DB) +  endif (USE_BUGSPLAT)    # for both Bugsplat and Breakpad    add_dependencies(llpackage generate_symbols) diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml index 4e186292f7..3100baf943 100644 --- a/indra/newview/app_settings/cmd_line.xml +++ b/indra/newview/app_settings/cmd_line.xml @@ -207,14 +207,6 @@      <map>        <key>map-to</key>        <string>NoAudio</string> -    </map>     - -    <key>noinvlib</key> -    <map> -      <key>desc</key> -      <string>Do not request the inventory library.</string> -      <key>map-to</key> -      <string>NoInventoryLibrary</string>      </map>      <key>nonotifications</key> diff --git a/indra/newview/app_settings/key_bindings.xml b/indra/newview/app_settings/key_bindings.xml index 1a5157838c..55babc88bc 100644 --- a/indra/newview/app_settings/key_bindings.xml +++ b/indra/newview/app_settings/key_bindings.xml @@ -1,5 +1,5 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<keys> +<keys xml_version="1">    <first_person>      <binding key="A" mask="NONE" command="slide_left"/>      <binding key="D" mask="NONE" command="slide_right"/> @@ -17,22 +17,13 @@      <binding key="PGDN" mask="NONE" command="push_down"/>      <binding key="HOME" mask="NONE" command="toggle_fly"/> -    <binding key="PAD_LEFT" mask="NONE" command="slide_left"/> -    <binding key="PAD_RIGHT" mask="NONE" command="slide_right"/> -    <binding key="PAD_UP" mask="NONE" command="push_forward"/> -    <binding key="PAD_DOWN" mask="NONE" command="push_backward"/> -    <binding key="PAD_PGUP" mask="NONE" command="jump"/> -    <binding key="PAD_PGDN" mask="NONE" command="push_down"/> -    <binding key="PAD_HOME" mask="NONE" command="toggle_fly"/> -    <binding key="PAD_CENTER" mask="NONE" command="stop_moving"/> -    <binding key="PAD_ENTER" mask="NONE" command="start_chat"/> -    <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/> -      <binding key="SPACE" mask="NONE" command="stop_moving"/>      <binding key="ENTER" mask="NONE" command="start_chat"/>      <binding key="DIVIDE" mask="NONE" command="start_gesture"/>      <binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/> + +    <binding key="" mask="NONE" mouse="LMB" command="script_trigger_lbutton"/>    </first_person>    <third_person>      <binding key="A" mask="NONE" command="turn_left"/> @@ -60,19 +51,6 @@      <binding key="PGDN" mask="NONE" command="push_down"/>      <binding key="HOME" mask="NONE" command="toggle_fly"/> -    <binding key="PAD_LEFT" mask="NONE" command="turn_left"/> -    <binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/> -    <binding key="PAD_RIGHT" mask="NONE" command="turn_right"/> -    <binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/> -    <binding key="PAD_UP" mask="NONE" command="push_forward"/> -    <binding key="PAD_DOWN" mask="NONE" command="push_backward"/> -    <binding key="PAD_PGUP" mask="NONE" command="jump"/> -    <binding key="PAD_PGDN" mask="NONE" command="push_down"/> -    <binding key="PAD_HOME" mask="NONE" command="toggle_fly"/> -    <binding key="PAD_CENTER" mask="NONE" command="stop_moving"/> -    <binding key="PAD_ENTER" mask="NONE" command="start_chat"/> -    <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/> -      <!--Camera controls in third person on Alt-->      <binding key="LEFT" mask="ALT" command="spin_around_cw"/>      <binding key="RIGHT" mask="ALT" command="spin_around_ccw"/> @@ -88,15 +66,6 @@      <binding key="E" mask="ALT" command="spin_over"/>      <binding key="C" mask="ALT" command="spin_under"/> -    <binding key="PAD_LEFT" mask="ALT" command="spin_around_cw"/> -    <binding key="PAD_RIGHT" mask="ALT" command="spin_around_ccw"/> -    <binding key="PAD_UP" mask="ALT" command="move_forward"/> -    <binding key="PAD_DOWN" mask="ALT" command="move_backward"/> -    <binding key="PAD_PGUP" mask="ALT" command="spin_over"/> -    <binding key="PAD_PGDN" mask="ALT" command="spin_under"/> -    <binding key="PAD_ENTER" mask="ALT" command="start_chat"/> -    <binding key="PAD_DIVIDE" mask="ALT" command="start_gesture"/> -      <!--mimic alt zoom behavior with keyboard only-->      <binding key="W" mask="CTL_ALT" command="spin_over"/>      <binding key="S" mask="CTL_ALT" command="spin_under"/> @@ -104,9 +73,6 @@      <binding key="UP" mask="CTL_ALT" command="spin_over"/>      <binding key="DOWN" mask="CTL_ALT" command="spin_under"/> -    <binding key="PAD_UP" mask="CTL_ALT" command="spin_over"/> -    <binding key="PAD_DOWN" mask="CTL_ALT" command="spin_under"/> -      <!--Therefore pan on Alt-Shift-->      <binding key="A" mask="CTL_ALT_SHIFT" command="pan_left"/>      <binding key="D" mask="CTL_ALT_SHIFT" command="pan_right"/> @@ -118,14 +84,10 @@      <binding key="UP" mask="CTL_ALT_SHIFT" command="pan_up"/>      <binding key="DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/> -    <binding key="PAD_LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/> -    <binding key="PAD_RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/> -    <binding key="PAD_UP" mask="CTL_ALT_SHIFT" command="pan_up"/> -    <binding key="PAD_DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/> -    <binding key="PAD_ENTER" mask="CTL_ALT_SHIFT" command="start_chat"/> -    <binding key="PAD_DIVIDE" mask="CTL_ALT_SHIFT" command="start_gesture"/> -      <binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/> +    <binding key="" mask="NONE" mouse="LMB" command="walk_to"/> + +    <binding key="" mask="NONE" mouse="LMB" command="script_trigger_lbutton"/>    </third_person>    <sitting>      <binding key="A" mask="ALT" command="spin_around_cw"/> @@ -167,16 +129,6 @@      <binding key="PGUP" mask="NONE" command="spin_over_sitting"/>      <binding key="PGDN" mask="NONE" command="spin_under_sitting"/> -    <binding key="PAD_LEFT" mask="NONE" command="spin_around_cw_sitting"/> -    <binding key="PAD_RIGHT" mask="NONE" command="spin_around_ccw_sitting"/> -    <binding key="PAD_UP" mask="NONE" command="move_forward_sitting"/> -    <binding key="PAD_DOWN" mask="NONE" command="move_backward_sitting"/> -    <binding key="PAD_PGUP" mask="NONE" command="spin_over_sitting"/> -    <binding key="PAD_PGDN" mask="NONE" command="spin_under_sitting"/> -    <binding key="PAD_CENTER" mask="NONE" command="stop_moving"/> -    <binding key="PAD_ENTER" mask="NONE" command="start_chat"/> -    <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/> -      <!--these are for passing controls when sitting on vehicles-->      <binding key="A" mask="SHIFT" command="slide_left"/>      <binding key="D" mask="SHIFT" command="slide_right"/> @@ -192,15 +144,6 @@      <binding key="PGUP" mask="SHIFT" command="spin_over_sitting"/>      <binding key="PGDN" mask="SHIFT" command="spin_under_sitting"/> -    <binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/> -    <binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/> -    <binding key="PAD_UP" mask="SHIFT" command="move_forward_sitting"/> -    <binding key="PAD_DOWN" mask="SHIFT" command="move_backward_sitting"/> -    <binding key="PAD_PGUP" mask="SHIFT" command="spin_over_sitting"/> -    <binding key="PAD_PGDN" mask="SHIFT" command="spin_under_sitting"/>  -    <binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/> -    <binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/> -      <!--pan on Alt-Shift-->      <binding key="A" mask="CTL_ALT_SHIFT" command="pan_left"/>      <binding key="D" mask="CTL_ALT_SHIFT" command="pan_right"/> @@ -212,17 +155,12 @@      <binding key="UP" mask="CTL_ALT_SHIFT" command="pan_up"/>      <binding key="DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/> -    <binding key="PAD_LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/> -    <binding key="PAD_RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/> -    <binding key="PAD_UP" mask="CTL_ALT_SHIFT" command="pan_up"/> -    <binding key="PAD_DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/> -    <binding key="PAD_ENTER" mask="CTL_ALT_SHIFT" command="start_chat"/> -    <binding key="PAD_DIVIDE" mask="CTL_ALT_SHIFT" command="start_gesture"/> -      <binding key="ENTER" mask="NONE" command="start_chat"/>      <binding key="DIVIDE" mask="NONE" command="start_gesture"/>      <binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/> + +    <binding key="" mask="NONE" mouse="LMB" command="script_trigger_lbutton"/>    </sitting>    <edit_avatar>      <!--Avatar editing camera controls--> @@ -240,15 +178,9 @@      <binding key="PGDN" mask="NONE" command="edit_avatar_spin_under"/>      <binding key="ENTER" mask="NONE" command="start_chat"/>      <binding key="DIVIDE" mask="NONE" command="start_gesture"/> -    <binding key="PAD_LEFT" mask="NONE" command="edit_avatar_spin_cw"/> -    <binding key="PAD_RIGHT" mask="NONE" command="edit_avatar_spin_ccw"/> -    <binding key="PAD_UP" mask="NONE" command="edit_avatar_move_forward"/> -    <binding key="PAD_DOWN" mask="NONE" command="edit_avatar_move_backward"/> -    <binding key="PAD_PGUP" mask="NONE" command="edit_avatar_spin_over"/> -    <binding key="PAD_PGDN" mask="NONE" command="edit_avatar_spin_under"/> -    <binding key="PAD_ENTER" mask="NONE" command="start_chat"/> -    <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>      <binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/> + +    <binding key="" mask="NONE" mouse="LMB" command="script_trigger_lbutton"/>    </edit_avatar>  </keys> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 6c36fa6f09..fa699f9dbd 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -4758,7 +4758,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string> +      <string>https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string>      </map>      <key>GuidebookURL</key>      <map> @@ -5895,17 +5895,6 @@        <key>Value</key>        <integer>0</integer>      </map> -    <key>LoginAsGod</key> -    <map> -      <key>Comment</key> -      <string>Attempt to login with god powers (Linden accounts only)</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map>      <key>LoginLocation</key>      <map>        <key>Comment</key> @@ -7066,7 +7055,7 @@      <key>NoInventoryLibrary</key>      <map>        <key>Comment</key> -      <string>Do not request inventory library.</string> +      <string>(Deprecated) Do not request inventory library.</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 9cae1dd930..d5d0d044c0 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -1988,7 +1988,8 @@ void LLAgent::propagate(const F32 dt)  //-----------------------------------------------------------------------------  void LLAgent::updateAgentPosition(const F32 dt, const F32 yaw_radians, const S32 mouse_x, const S32 mouse_y)  { -	if (mMoveTimer.getStarted() && mMoveTimer.getElapsedTimeF32() > gSavedSettings.getF32("NotMovingHintTimeout")) +    static LLCachedControl<F32> hint_timeout(gSavedSettings, "NotMovingHintTimeout"); +	if (mMoveTimer.getStarted() && mMoveTimer.getElapsedTimeF32() > hint_timeout)  	{  		LLFirstUse::notMoving();  	} @@ -2159,7 +2160,8 @@ void LLAgent::endAnimationUpdateUI()  		LLNavigationBar::getInstance()->setVisible(TRUE && gSavedSettings.getBOOL("ShowNavbarNavigationPanel"));  		gStatusBar->setVisibleForMouselook(true); -		if (gSavedSettings.getBOOL("ShowMiniLocationPanel")) +        static LLCachedControl<bool> show_mini_location_panel(gSavedSettings, "ShowMiniLocationPanel"); +		if (show_mini_location_panel)  		{  			LLPanelTopInfoBar::getInstance()->setVisible(TRUE);  		} @@ -3901,10 +3903,6 @@ bool LLAgent::teleportCore(bool is_local)  	// yet if the teleport will succeed.  Look in   	// process_teleport_location_reply -	// close the map panel so we can see our destination. -	// we don't close search floater, see EXT-5840. -	LLFloaterReg::hideInstance("world_map"); -  	// hide land floater too - it'll be out of date  	LLFloaterReg::hideInstance("about_land"); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 254bf05d05..0c4874ef11 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -5319,14 +5319,18 @@ void LLAppViewer::disconnectViewer()  	}  	// save inventory if appropriate -	gInventory.cache(gInventory.getRootFolderID(), gAgent.getID()); -	if (gInventory.getLibraryRootFolderID().notNull() -		&& gInventory.getLibraryOwnerID().notNull()) -	{ -		gInventory.cache( -			gInventory.getLibraryRootFolderID(), -			gInventory.getLibraryOwnerID()); -	} +    if (gInventory.isInventoryUsable() +        && gAgent.getID().notNull()) // Shouldn't be null at this stage +    { +        gInventory.cache(gInventory.getRootFolderID(), gAgent.getID()); +        if (gInventory.getLibraryRootFolderID().notNull() +            && gInventory.getLibraryOwnerID().notNull()) +        { +            gInventory.cache( +                gInventory.getLibraryRootFolderID(), +                gInventory.getLibraryOwnerID()); +        } +    }  	saveNameCache();  	if (LLExperienceCache::instanceExists()) diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h index 82b6b0c77c..ab52bf15f9 100644 --- a/indra/newview/llappviewerwin32.h +++ b/indra/newview/llappviewerwin32.h @@ -51,8 +51,8 @@ protected:  	bool initHardwareTest() override; // Win32 uses DX9 to test hardware.  	bool initParseCommandLine(LLCommandLineParser& clp) override; -	virtual bool beingDebugged(); -	virtual bool restoreErrorTrap(); +	bool beingDebugged() override; +	bool restoreErrorTrap() override;  	bool sendURLToOtherInstance(const std::string& url) override; diff --git a/indra/newview/llavatarrenderinfoaccountant.cpp b/indra/newview/llavatarrenderinfoaccountant.cpp index ca83afb5ab..04dbf03e31 100644 --- a/indra/newview/llavatarrenderinfoaccountant.cpp +++ b/indra/newview/llavatarrenderinfoaccountant.cpp @@ -345,6 +345,8 @@ void LLAvatarRenderInfoAccountant::idle()  				&& regionp->capabilitiesReceived())  			{  				// each of these is further governed by and resets its own timer +                // Note: We can have multiple regions, each launches up to two coroutines, +                // it likely is expensive  				sendRenderInfoToRegion(regionp);  				getRenderInfoFromRegion(regionp);  			} diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp index 6d20b23e9f..43e39d3073 100644 --- a/indra/newview/llcallingcard.cpp +++ b/indra/newview/llcallingcard.cpp @@ -645,7 +645,8 @@ void LLAvatarTracker::processChange(LLMessageSystem* msg)  		{  			if(mBuddyInfo.find(agent_id) != mBuddyInfo.end())  			{ -				if((mBuddyInfo[agent_id]->getRightsGrantedFrom() ^  new_rights) & LLRelationship::GRANT_MODIFY_OBJECTS) +                if (((mBuddyInfo[agent_id]->getRightsGrantedFrom() ^  new_rights) & LLRelationship::GRANT_MODIFY_OBJECTS) +                    && !gAgent.isDoNotDisturb())  				{  					LLSD args;  					args["NAME"] = LLSLURL("agent", agent_id, "displayname").getSLURLString(); diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index fee85d50bd..20fa6d490b 100644 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -96,10 +96,14 @@ LLConversationViewSession::~LLConversationViewSession()  {  	mActiveVoiceChannelConnection.disconnect(); -	if(LLVoiceClient::instanceExists() && mVoiceClientObserver) -	{ -		LLVoiceClient::getInstance()->removeObserver(mVoiceClientObserver); -	} +    if (mVoiceClientObserver) +    { +        if (LLVoiceClient::instanceExists()) +        { +            LLVoiceClient::getInstance()->removeObserver(mVoiceClientObserver); +        } +        delete mVoiceClientObserver; +    }  	mFlashTimer->unset();  } @@ -255,7 +259,12 @@ BOOL LLConversationViewSession::postBuild()  			mIsInActiveVoiceChannel = true;  			if(LLVoiceClient::instanceExists())  			{ -				LLNearbyVoiceClientStatusObserver* mVoiceClientObserver = new LLNearbyVoiceClientStatusObserver(this); +                if (mVoiceClientObserver) +                { +                    LLVoiceClient::getInstance()->removeObserver(mVoiceClientObserver); +                    delete mVoiceClientObserver; +                } +				mVoiceClientObserver = new LLNearbyVoiceClientStatusObserver(this);  				LLVoiceClient::getInstance()->addObserver(mVoiceClientObserver);  			}  			break; diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 4ee08e869a..91b0e40aa9 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -615,12 +615,12 @@ void LLDrawPoolAlpha::renderEmissives(U32 mask, std::vector<LLDrawInfo*>& emissi  void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass)  { -    BOOL batch_fullbrights = gSavedSettings.getBOOL("RenderAlphaBatchFullbrights"); -    BOOL batch_emissives   = gSavedSettings.getBOOL("RenderAlphaBatchEmissives"); -	BOOL initialized_lighting = FALSE; -	BOOL light_enabled = TRUE; +    static LLCachedControl<bool> batch_fullbrights(gSavedSettings, "RenderAlphaBatchFullbrights"); +    static LLCachedControl<bool> batch_emissives(gSavedSettings, "RenderAlphaBatchEmissives"); +	bool initialized_lighting = FALSE; +	bool light_enabled = TRUE; -	BOOL use_shaders = gPipeline.canUseVertexShaders(); +	bool use_shaders = gPipeline.canUseVertexShaders();  	for (LLCullResult::sg_iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)  	{ diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp index aa426cd785..3d1a292ba2 100644 --- a/indra/newview/lldrawpoolwater.cpp +++ b/indra/newview/lldrawpoolwater.cpp @@ -574,18 +574,8 @@ void LLDrawPoolWater::shade2(bool edge, LLGLSLShader* shader, const LLColor3& li  	shader->uniform3fv(LLShaderMgr::WATER_EYEVEC, 1, LLViewerCamera::getInstance()->getOrigin().mV);  	shader->uniform3fv(LLShaderMgr::WATER_SPECULAR, 1, light_diffuse.mV);  	shader->uniform1f(LLShaderMgr::WATER_SPECULAR_EXP, light_exp); -    if (LLEnvironment::instance().isCloudScrollPaused()) -    { -        static const std::array<F32, 2> zerowave{ {0.0f, 0.0f} }; -         -        shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR1, 1, zerowave.data()); -        shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR2, 1, zerowave.data()); -    } -    else -    { -        shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR1, 1, pwater->getWave1Dir().mV); -        shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR2, 1, pwater->getWave2Dir().mV); -    } +    shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR1, 1, pwater->getWave1Dir().mV); +    shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR2, 1, pwater->getWave2Dir().mV);  	shader->uniform3fv(LLShaderMgr::WATER_LIGHT_DIR, 1, light_dir.mV);  	shader->uniform3fv(LLShaderMgr::WATER_NORM_SCALE, 1, pwater->getNormalScale().mV); diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index 3b192ff81b..1c69b9d60b 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -453,18 +453,18 @@ void LLFloaterCamera::setMode(ECameraControlMode mode)  void LLFloaterCamera::switchMode(ECameraControlMode mode)  { -	setMode(mode); -  	switch (mode)  	{  	case CAMERA_CTRL_MODE_PRESETS:  	case CAMERA_CTRL_MODE_PAN:  		sFreeCamera = false; +		setMode(mode); // depends onto sFreeCamera  		clear_camera_tool();  		break;  	case CAMERA_CTRL_MODE_FREE_CAMERA:  		sFreeCamera = true; +		setMode(mode);  		activate_camera_tool();  		break; diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index c4e0dd483f..6e326ff3cf 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -582,8 +582,7 @@ void LLFloaterGesture::onCopyPasteAction(const LLSD& command)  			LLInventoryItem* item = gInventory.getItem(*it);  			if(item  && item->getInventoryType() == LLInventoryType::IT_GESTURE)  			{ -				LLWString item_name = utf8str_to_wstring(item->getName()); -				LLClipboard::instance().addToClipboard(item_name, 0, item_name.size()); +				LLClipboard::instance().addToClipboard(*it);  			}  		}  	} diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 43dc304c10..34499ac170 100644 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -384,7 +384,7 @@ void LLFloaterIMSessionTab::draw()  void LLFloaterIMSessionTab::enableDisableCallBtn()  { -    if (LLVoiceClient::instanceExists()) +    if (LLVoiceClient::instanceExists() && mVoiceButton)      {          mVoiceButton->setEnabled(              mSessionID.notNull() diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 1fc734ae39..9064a65d05 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -2399,7 +2399,16 @@ void LLPanelPreference::saveSettings()  		{  			view_stack.push_back(*iter);  		} -	}	 +	} + +    if (LLStartUp::getStartupState() == STATE_STARTED) +    { +        LLControlVariable* control = gSavedPerAccountSettings.getControl("VoiceCallsFriendsOnly"); +        if (control) +        { +            mSavedValues[control] = control->getValue(); +        } +    }  }  void LLPanelPreference::showMultipleViewersWarning(LLUICtrl* checkbox, const LLSD& value) diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index 779542cfcc..2e1fbb09e0 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -169,15 +169,6 @@ void LLFloaterSearch::search(const SearchQuery &p)  	// add the search query string  	subs["QUERY"] = LLURI::escape(p.query); -	// add the permissions token that login.cgi gave us -	// We use "search_token", and fallback to "auth_token" if not present. -	LLSD search_token = LLLoginInstance::getInstance()->getResponse("search_token"); -	if (search_token.asString().empty()) -	{ -		search_token = LLLoginInstance::getInstance()->getResponse("auth_token"); -	} -	subs["AUTH_TOKEN"] = search_token.asString(); -  	// add the user's preferred maturity (can be changed via prefs)  	std::string maturity;  	if (gAgent.prefersAdult()) diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 27197f0b06..6ca134ecd3 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -56,6 +56,7 @@  #include "llscrolllistctrl.h"  #include "llslurl.h"  #include "lltextbox.h" +#include "lltoolbarview.h"  #include "lltracker.h"  #include "lltrans.h"  #include "llviewerinventory.h"	// LLViewerInventoryItem @@ -87,6 +88,9 @@ static const F32 MAP_ZOOM_TIME = 0.2f;  // Currently (01/26/09), this value allows the whole grid to be visible in a 1024x1024 window.  static const S32 MAX_VISIBLE_REGIONS = 512; + +const S32 HIDE_BEACON_PAD = 133; +  // It would be more logical to have this inside the method where it is used but to compile under gcc this  // struct has to be here.  struct SortRegionNames @@ -1642,3 +1646,101 @@ void LLFloaterWorldMap::onFocusLost()  	LLWorldMapView* map_panel = (LLWorldMapView*)gFloaterWorldMap->mPanel;  	map_panel->mPanning = FALSE;  } + +LLPanelHideBeacon::LLPanelHideBeacon() : +	mHideButton(NULL) +{ +} + +// static +LLPanelHideBeacon* LLPanelHideBeacon::getInstance() +{ +	static LLPanelHideBeacon* panel = getPanelHideBeacon(); +	return panel; +} + + +BOOL LLPanelHideBeacon::postBuild() +{ +	mHideButton = getChild<LLButton>("hide_beacon_btn"); +	mHideButton->setCommitCallback(boost::bind(&LLPanelHideBeacon::onHideButtonClick, this)); + +	gViewerWindow->setOnWorldViewRectUpdated(boost::bind(&LLPanelHideBeacon::updatePosition, this)); + +	return TRUE; +} + +//virtual +void LLPanelHideBeacon::draw() +{ +	if (!LLTracker::isTracking(NULL)) +	{ +		return; +	} +	updatePosition();  +	LLPanel::draw(); +} + +//virtual +void LLPanelHideBeacon::setVisible(BOOL visible) +{ +	if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK) visible = false; + +	if (visible) +	{ +		updatePosition(); +	} + +	LLPanel::setVisible(visible); +} + + +//static +LLPanelHideBeacon* LLPanelHideBeacon::getPanelHideBeacon() +{ +	LLPanelHideBeacon* panel = new LLPanelHideBeacon(); +	panel->buildFromFile("panel_hide_beacon.xml"); + +	LL_INFOS() << "Build LLPanelHideBeacon panel" << LL_ENDL; + +	panel->updatePosition(); +	return panel; +} + +void LLPanelHideBeacon::onHideButtonClick() +{ +	LLFloaterWorldMap* instance = LLFloaterWorldMap::getInstance(); +	if (instance) +	{ +		instance->onClearBtn(); +	} +} + +/** +* Updates position of the panel (similar to Stand & Stop Flying panel). +*/ +void LLPanelHideBeacon::updatePosition() +{ +	S32 bottom_tb_center = 0; +	if (LLToolBar* toolbar_bottom = gToolBarView->getToolbar(LLToolBarEnums::TOOLBAR_BOTTOM)) +	{ +		bottom_tb_center = toolbar_bottom->getRect().getCenterX(); +	} + +	S32 left_tb_width = 0; +	if (LLToolBar* toolbar_left = gToolBarView->getToolbar(LLToolBarEnums::TOOLBAR_LEFT)) +	{ +		left_tb_width = toolbar_left->getRect().getWidth(); +	} + +	if (gToolBarView != NULL && gToolBarView->getToolbar(LLToolBarEnums::TOOLBAR_LEFT)->hasButtons()) +	{ +		S32 x_pos = bottom_tb_center - getRect().getWidth() / 2 - left_tb_width; +		setOrigin( x_pos + HIDE_BEACON_PAD, 0); +	} +	else  +	{ +		S32 x_pos = bottom_tb_center - getRect().getWidth() / 2; +		setOrigin( x_pos + HIDE_BEACON_PAD, 0); +	} +} diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h index 97e99297cf..30cf1b9910 100644 --- a/indra/newview/llfloaterworldmap.h +++ b/indra/newview/llfloaterworldmap.h @@ -107,7 +107,8 @@ public:  	// teleport to the tracked item, if there is one  	void			teleport();  	void			onChangeMaturity(); -	 + +	void			onClearBtn();  	//Slapp instigated avatar tracking  	void			avatarTrackFromSlapp( const LLUUID& id );  @@ -124,7 +125,6 @@ protected:  	void			onComboTextEntry( );  	void			onSearchTextEntry( ); -	void			onClearBtn();  	void			onClickTeleportBtn();  	void			onShowTargetBtn();  	void			onShowAgentBtn(); @@ -199,5 +199,25 @@ private:  extern LLFloaterWorldMap* gFloaterWorldMap; + +class LLPanelHideBeacon : public LLPanel +{ +public: +	static LLPanelHideBeacon* getInstance(); + +	LLPanelHideBeacon(); +	/*virtual*/ BOOL postBuild(); +	/*virtual*/ void setVisible(BOOL visible); +	/*virtual*/ void draw(); + +private: +	static LLPanelHideBeacon* getPanelHideBeacon(); +	void onHideButtonClick(); +	void updatePosition(); + +	LLButton* mHideButton; + +}; +  #endif diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index 9f2119281d..bd881f8e7a 100644 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -910,7 +910,7 @@ void LLGestureMgr::stepGesture(LLMultiGesture* gesture)  			else if (gesture->mWaitTimer.getElapsedTimeF32() > MAX_WAIT_ANIM_SECS)  			{  				// we've waited too long for an animation -				LL_INFOS() << "Waited too long for animations to stop, continuing gesture." +				LL_INFOS("GestureMgr") << "Waited too long for animations to stop, continuing gesture."  					<< LL_ENDL;  				gesture->mWaitingAnimations = FALSE;  				gesture->mCurrentStep++; @@ -1097,6 +1097,34 @@ void LLGestureMgr::onLoadComplete(const LLUUID& asset_uuid,  				self.setFetchID(item_id);  				self.startFetch();  			} + +            item_map_t::iterator it = self.mActive.find(item_id); +            if (it == self.mActive.end()) +            { +                // Gesture is supposed to be present, active, but NULL +                LL_DEBUGS("GestureMgr") << "Gesture " << item_id << " not found in active list" << LL_ENDL; +            } +            else +            { +                LLMultiGesture* old_gesture = (*it).second; +                if (old_gesture) +                { +                    LL_DEBUGS("GestureMgr") << "Received dupplicate " << item_id << " callback" << LL_ENDL; +                    // In case somebody managest to activate, deactivate and +                    // then activate gesture again, before asset finishes loading. +                    // LLLoadInfo will have a different pointer, asset storage will +                    // see it as a different request, resulting in two callbacks. + +                    // deactivateSimilarGestures() did not turn this one off +                    // because of matching item_id +                    self.stopGesture(old_gesture); + +                    self.mActive.erase(item_id); +                    delete old_gesture; +                    old_gesture = NULL; +                } +            } +  			self.mActive[item_id] = gesture;  			// Everything has been successful.  Add to the active list. @@ -1131,9 +1159,23 @@ void LLGestureMgr::onLoadComplete(const LLUUID& asset_uuid,  		}  		else  		{ -			LL_WARNS() << "Unable to load gesture" << LL_ENDL; - -			self.mActive.erase(item_id); +			LL_WARNS("GestureMgr") << "Unable to load gesture" << LL_ENDL; + +            item_map_t::iterator it = self.mActive.find(item_id); +            if (it != self.mActive.end()) +            { +                LLMultiGesture* old_gesture = (*it).second; +                if (old_gesture) +                { +                    // Shouldn't happen, just in case +                    LL_WARNS("GestureMgr") << "Gesture " << item_id << " existed when it shouldn't" << LL_ENDL; + +                    self.stopGesture(old_gesture); +                    delete old_gesture; +                    old_gesture = NULL; +                } +                self.mActive.erase(item_id); +            }  			delete gesture;  			gesture = NULL; @@ -1151,9 +1193,23 @@ void LLGestureMgr::onLoadComplete(const LLUUID& asset_uuid,  			LLDelayedGestureError::gestureFailedToLoad( item_id );  		} -		LL_WARNS() << "Problem loading gesture: " << status << LL_ENDL; -		 -		LLGestureMgr::instance().mActive.erase(item_id);			 +		LL_WARNS("GestureMgr") << "Problem loading gesture: " << status << LL_ENDL; +         +        item_map_t::iterator it = self.mActive.find(item_id); +        if (it != self.mActive.end()) +        { +            LLMultiGesture* old_gesture = (*it).second; +            if (old_gesture) +            { +                // Shouldn't happen, just in case +                LL_WARNS("GestureMgr") << "Gesture " << item_id << " existed when it shouldn't" << LL_ENDL; + +                self.stopGesture(old_gesture); +                delete old_gesture; +                old_gesture = NULL; +            } +            self.mActive.erase(item_id); +        }  	}  } diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index 9dca509262..e7bc2a9268 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -196,7 +196,7 @@ LLFetchLeaveGroupData* gFetchLeaveGroupData = NULL;  // static  void LLGroupActions::search()  { -	LLFloaterReg::showInstance("search", LLSD().with("category", "groups")); +	LLFloaterReg::showInstance("search");  }  // static diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index b4fc832596..ea22750c1f 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -340,12 +340,26 @@ const LLViewerInventoryCategory* LLInventoryModel::getFirstDescendantOf(const LL  bool LLInventoryModel::getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const  {  	LLInventoryObject *object = getObject(object_id); -	while (object && object->getParentUUID().notNull()) -	{ -		LLInventoryObject *parent_object = getObject(object->getParentUUID()); +    if (!object) +    { +        LL_WARNS(LOG_INV) << "Unable to trace topmost ancestor, initial object " << object_id << " does not exist" << LL_ENDL; +        return false; +    } + +    std::set<LLUUID> object_ids{ object_id }; // loop protection +    while (object->getParentUUID().notNull()) +    { +        LLUUID parent_id = object->getParentUUID(); +        if (object_ids.find(parent_id) != object_ids.end()) +        { +            LL_WARNS(LOG_INV) << "Detected a loop on an object " << parent_id << " when searching for ancestor of " << object_id << LL_ENDL; +            return false; +        } +        object_ids.insert(parent_id); +        LLInventoryObject *parent_object = getObject(parent_id);  		if (!parent_object)  		{ -			LL_WARNS(LOG_INV) << "unable to trace topmost ancestor, missing item for uuid " << object->getParentUUID() << LL_ENDL; +			LL_WARNS(LOG_INV) << "unable to trace topmost ancestor of " << object_id << ", missing item for uuid " << parent_id << LL_ENDL;  			return false;  		}  		object = parent_object; @@ -2947,42 +2961,69 @@ bool LLInventoryModel::saveToFile(const std::string& filename,  	LL_INFOS(LOG_INV) << "saving inventory to: (" << filename << ")" << LL_ENDL; -	llofstream fileXML(filename.c_str()); -	if (!fileXML.is_open()) -	{ -		LL_WARNS(LOG_INV) << "unable to save inventory to: " << filename << LL_ENDL; -		return false; -	} +    try +    { +        llofstream fileXML(filename.c_str()); +        if (!fileXML.is_open()) +        { +            LL_WARNS(LOG_INV) << "Failed to open file. Unable to save inventory to: " << filename << LL_ENDL; +            return false; +        } -	LLSD cache_ver; -	cache_ver["inv_cache_version"] = sCurrentInvCacheVersion; +        LLSD cache_ver; +        cache_ver["inv_cache_version"] = sCurrentInvCacheVersion; -	fileXML << LLSDOStreamer<LLSDNotationFormatter>(cache_ver) << std::endl; +        if (fileXML.fail()) +        { +            LL_WARNS(LOG_INV) << "Failed to write cache version to file. Unable to save inventory to: " << filename << LL_ENDL; +            return false; +        } -	S32 count = categories.size(); -	S32 cat_count = 0; -	S32 i; -	for(i = 0; i < count; ++i) -	{ -		LLViewerInventoryCategory* cat = categories[i]; -		if(cat->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN) -		{ -			fileXML << LLSDOStreamer<LLSDNotationFormatter>(cat->exportLLSD()) << std::endl; -			cat_count++; -		} -	} +        fileXML << LLSDOStreamer<LLSDNotationFormatter>(cache_ver) << std::endl; -	S32 it_count = items.size(); -	for(i = 0; i < it_count; ++i) -	{ -		fileXML << LLSDOStreamer<LLSDNotationFormatter>(items[i]->asLLSD()) << std::endl; -	} +        S32 count = categories.size(); +        S32 cat_count = 0; +        S32 i; +        for (i = 0; i < count; ++i) +        { +            LLViewerInventoryCategory* cat = categories[i]; +            if (cat->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN) +            { +                fileXML << LLSDOStreamer<LLSDNotationFormatter>(cat->exportLLSD()) << std::endl; +                cat_count++; +            } + +            if (fileXML.fail()) +            { +                LL_WARNS(LOG_INV) << "Failed to write a folder to file. Unable to save inventory to: " << filename << LL_ENDL; +                return false; +            } +        } -	fileXML.close(); +        S32 it_count = items.size(); +        for (i = 0; i < it_count; ++i) +        { +            fileXML << LLSDOStreamer<LLSDNotationFormatter>(items[i]->asLLSD()) << std::endl; -	LL_INFOS(LOG_INV) << "Inventory saved: " << cat_count << " categories, " << it_count << " items." << LL_ENDL; +            if (fileXML.fail()) +            { +                LL_WARNS(LOG_INV) << "Failed to write an item to file. Unable to save inventory to: " << filename << LL_ENDL; +                return false; +            } +        } -	return true; +        fileXML.close(); + +        LL_INFOS(LOG_INV) << "Inventory saved: " << cat_count << " categories, " << it_count << " items." << LL_ENDL; +    } +    catch (...) +    { +        LOG_UNHANDLED_EXCEPTION(""); +        LL_INFOS(LOG_INV) << "Failed to save inventory to: (" << filename << ")" << LL_ENDL; +        return false; +    } + +    return true;  }  // message handling functionality diff --git a/indra/newview/llkeyconflict.cpp b/indra/newview/llkeyconflict.cpp index b5ac94b1cd..d3ba18525b 100644 --- a/indra/newview/llkeyconflict.cpp +++ b/indra/newview/llkeyconflict.cpp @@ -411,8 +411,16 @@ void LLKeyConflictHandler::loadFromSettings(ESourceMode load_mode)          filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename_default);          if (!gDirUtilp->fileExists(filename) || !loadFromSettings(load_mode, filename, &mControlsMap))          { -            // mind placeholders -            mControlsMap.insert(mDefaultsMap.begin(), mDefaultsMap.end()); +            // Mind placeholders +            // Do not use mControlsMap.insert(mDefaultsMap) since mControlsMap has +            // placeholders that won't be added over(to) by insert. +            // Or instead move generatePlaceholders call to be after copying +            control_map_t::iterator iter = mDefaultsMap.begin(); +            while (iter != mDefaultsMap.end()) +            { +                mControlsMap[iter->first].mKeyBind = iter->second.mKeyBind; +                iter++; +            }          }      }      mLoadMode = load_mode; @@ -575,6 +583,8 @@ void LLKeyConflictHandler::saveToSettings(bool temporary)                  break;              } +            keys.xml_version.set(keybindings_xml_version, true); +              if (temporary)              {                  // write to temporary xml and use it for gViewerInput @@ -667,13 +677,19 @@ void LLKeyConflictHandler::resetToDefault(const std::string &control_name, U32 i      {          return;      } +    LLKeyConflict &type_data = mControlsMap[control_name]; +    if (!type_data.mAssignable) +    { +        return; +    }      LLKeyData data = getDefaultControl(control_name, index); -    if (data != mControlsMap[control_name].getKeyData(index)) +    if (data != type_data.getKeyData(index))      {          // reset controls that might have been switched to our current control          removeConflicts(data, mControlsMap[control_name].mConflictMask);          mControlsMap[control_name].setKeyData(data, index); +        mHasUnsavedChanges = true;      }  } @@ -730,9 +746,9 @@ void LLKeyConflictHandler::resetToDefault(const std::string &control_name)      resetToDefaultAndResolve(control_name, false);  } -void LLKeyConflictHandler::resetToDefaults(ESourceMode mode) +void LLKeyConflictHandler::resetToDefaultsAndResolve()  { -    if (mode == MODE_SAVED_SETTINGS) +    if (mLoadMode == MODE_SAVED_SETTINGS)      {          control_map_t::iterator iter = mControlsMap.begin();          control_map_t::iterator end = mControlsMap.end(); @@ -745,8 +761,16 @@ void LLKeyConflictHandler::resetToDefaults(ESourceMode mode)      else      {          mControlsMap.clear(); -        generatePlaceholders(mode); + +        // Set key combinations. +        // Copy from mDefaultsMap before doing generatePlaceholders, otherwise +        // insert() will fail to add some keys into pre-existing values from +        // generatePlaceholders()          mControlsMap.insert(mDefaultsMap.begin(), mDefaultsMap.end()); + +        // Set conflict masks and mark functions (un)assignable +        generatePlaceholders(mLoadMode); +      }      mHasUnsavedChanges = true; @@ -756,7 +780,7 @@ void LLKeyConflictHandler::resetToDefaults()  {      if (!empty())      { -        resetToDefaults(mLoadMode); +        resetToDefaultsAndResolve();      }      else      { @@ -766,7 +790,7 @@ void LLKeyConflictHandler::resetToDefaults()          // 3. We are loading 'current' only to replace it          // but it is reliable and works Todo: consider optimizing.          loadFromSettings(mLoadMode); -        resetToDefaults(mLoadMode); +        resetToDefaultsAndResolve();      }  } @@ -799,7 +823,7 @@ void LLKeyConflictHandler::resetKeyboardBindings()  void LLKeyConflictHandler::generatePlaceholders(ESourceMode load_mode)  { -    // These controls are meant to cause conflicts when user tries to assign same control somewhere else +    // These placeholders are meant to cause conflict resolution when user tries to assign same control somewhere else      // also this can be used to pre-record controls that should not conflict or to assign conflict groups/masks      if (load_mode == MODE_FIRST_PERSON) @@ -859,24 +883,60 @@ void LLKeyConflictHandler::generatePlaceholders(ESourceMode load_mode)          registerTemporaryControl("spin_around_ccw_sitting");          registerTemporaryControl("spin_around_cw_sitting");      } + + +    // Special case, mouse clicks passed to scripts have 'lowest' piority +    // thus do not conflict, everything else has a chance before them +    // also in ML they have highest priority, but only when script-grabbed, +    // thus do not conflict +    // (see AGENT_CONTROL_ML_LBUTTON_DOWN and CONTROL_LBUTTON_DOWN_INDEX) +    LLKeyConflict *type_data = &mControlsMap[script_mouse_handler_name]; +    type_data->mAssignable = true; +    type_data->mConflictMask = U32_MAX - CONFLICT_LMOUSE;  } -bool LLKeyConflictHandler::removeConflicts(const LLKeyData &data, const U32 &conlict_mask) +bool LLKeyConflictHandler::removeConflicts(const LLKeyData &data, U32 conlict_mask)  {      if (conlict_mask == CONFLICT_NOTHING)      {          // Can't conflict          return true;      } + +    if (data.mMouse == CLICK_LEFT +        && data.mMask == MASK_NONE +        && data.mKey == KEY_NONE) +    { +        if ((conlict_mask & CONFLICT_LMOUSE) == 0) +        { +            // Can't conflict +            return true; +        } +        else +        { +            // simplify conflict mask +            conlict_mask = CONFLICT_LMOUSE; +        } +    } +    else +    { +        // simplify conflict mask +        conlict_mask &= ~CONFLICT_LMOUSE; +    } +      std::map<std::string, S32> conflict_list;      control_map_t::iterator cntrl_iter = mControlsMap.begin();      control_map_t::iterator cntrl_end = mControlsMap.end();      for (; cntrl_iter != cntrl_end; ++cntrl_iter)      { +        const U32 cmp_mask = cntrl_iter->second.mConflictMask; +        if ((cmp_mask & conlict_mask) == 0) +        { +            // can't conflict +            continue; +        }          S32 index = cntrl_iter->second.mKeyBind.findKeyData(data); -        if (index >= 0 -            && cntrl_iter->second.mConflictMask != CONFLICT_NOTHING -            && (cntrl_iter->second.mConflictMask & conlict_mask) != 0) +        if (index >= 0)          {              if (cntrl_iter->second.mAssignable)              { diff --git a/indra/newview/llkeyconflict.h b/indra/newview/llkeyconflict.h index 2926ca3aeb..23c1adf1e4 100644 --- a/indra/newview/llkeyconflict.h +++ b/indra/newview/llkeyconflict.h @@ -66,6 +66,7 @@ public:      };      const U32 CONFLICT_NOTHING = 0; +    const U32 CONFLICT_LMOUSE = 0x1 << 1;      // at the moment this just means that key will conflict with everything that is identical      const U32 CONFLICT_ANY = U32_MAX; @@ -128,23 +129,24 @@ public:      // resets current mode to defaults      void resetToDefaults(); -    bool empty() { return mControlsMap.empty(); } +    bool empty() const { return mControlsMap.empty(); }      void clear();      // reloads bindings from last valid user's xml or from default xml      // to keyboard's handler      static void resetKeyboardBindings(); -    bool hasUnsavedChanges() { return mHasUnsavedChanges; } +    bool hasUnsavedChanges() const { return mHasUnsavedChanges; }      void setLoadMode(ESourceMode mode) { mLoadMode = mode; } -    ESourceMode getLoadMode() { return mLoadMode; } +    ESourceMode getLoadMode() const { return mLoadMode; }  private:      void resetToDefaultAndResolve(const std::string &control_name, bool ignore_conflicts); -    void resetToDefaults(ESourceMode mode); +    void resetToDefaultsAndResolve();      // at the moment these kind of control is not savable, but takes part in conflict resolution      void registerTemporaryControl(const std::string &control_name, EMouseClickType mouse_ind, KEY key, MASK mask, U32 conflict_mask); +    // conflict mask 0 means that any conflicts will be ignored      void registerTemporaryControl(const std::string &control_name, U32 conflict_mask = 0);      typedef std::map<std::string, LLKeyConflict> control_map_t; @@ -152,7 +154,7 @@ private:      bool loadFromSettings(const ESourceMode &load_mode, const std::string &filename, control_map_t *destination);      void generatePlaceholders(ESourceMode load_mode); //E.x. non-assignable values      // returns false in case user is trying to reuse control that can't be reassigned -    bool removeConflicts(const LLKeyData &data, const U32 &conlict_mask); +    bool removeConflicts(const LLKeyData &data, U32 conlict_mask);      // removes flags and removes temporary file, returns 'true' if file was removed      bool clearUnsavedChanges(); diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index e81d2cc082..531f0b172d 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -165,13 +165,12 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia  	//requested_options.append("inventory-meat");  	//requested_options.append("inventory-skel-targets");  #if (!defined LL_MINIMIAL_REQUESTED_OPTIONS) -	if(FALSE == gSavedSettings.getBOOL("NoInventoryLibrary")) -	{ -		requested_options.append("inventory-lib-root"); -		requested_options.append("inventory-lib-owner"); -		requested_options.append("inventory-skel-lib"); + +    // Not requesting library will trigger mFatalNoLibraryRootFolder +	requested_options.append("inventory-lib-root"); +	requested_options.append("inventory-lib-owner"); +	requested_options.append("inventory-skel-lib");  	//	requested_options.append("inventory-meat-lib"); -	}  	requested_options.append("initial-outfit");  	requested_options.append("gestures"); diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 5393d0b0b7..9142aadab9 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -1146,6 +1146,11 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)              }              else              { +                // Media might be blocked, waiting for a file, +                // send an empty response to unblock it +                const std::vector<std::string> empty_response; +                self->sendPickFileResponse(empty_response); +                  LLNotificationsUtil::add("MediaFileDownloadUnsupported");              }  		}; diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index 6b50e1f800..fef169cbbc 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -2549,7 +2549,9 @@ void LLModelPreview::lookupLODModelFiles(S32 lod)      std::string lod_filename = mLODFile[LLModel::LOD_HIGH];      std::string ext = ".dae"; -    std::string::size_type i = lod_filename.rfind(ext); +    std::string lod_filename_lower(lod_filename); +    LLStringUtil::toLower(lod_filename_lower); +    std::string::size_type i = lod_filename_lower.rfind(ext);      if (i != std::string::npos)      {          lod_filename.replace(i, lod_filename.size() - ext.size(), getLodSuffix(next_lod) + ext); diff --git a/indra/newview/llpathfindingmanager.cpp b/indra/newview/llpathfindingmanager.cpp index cb4c07a417..852b39f442 100644 --- a/indra/newview/llpathfindingmanager.cpp +++ b/indra/newview/llpathfindingmanager.cpp @@ -61,7 +61,7 @@  #define CAP_SERVICE_NAVMESH_STATUS          "NavMeshGenerationStatus" -#define CAP_SERVICE_OBJECT_LINKSETS         "ObjectNavMeshProperties" +#define CAP_SERVICE_OBJECT_LINKSETS         "RegionObjects"  #define CAP_SERVICE_TERRAIN_LINKSETS        "TerrainNavMeshProperties"  #define CAP_SERVICE_CHARACTERS              "CharacterProperties" diff --git a/indra/newview/llsearchableui.cpp b/indra/newview/llsearchableui.cpp index 1119e80005..620bbdfcdf 100644 --- a/indra/newview/llsearchableui.cpp +++ b/indra/newview/llsearchableui.cpp @@ -132,8 +132,11 @@ void ll::statusbar::SearchableItem::setNotHighlighted( )  	{  		mCtrl->setHighlighted( false ); -		if( mWasHiddenBySearch ) -			mMenu->setVisible( TRUE ); +        if (mWasHiddenBySearch) +        { +            mMenu->setVisible(TRUE); +            mWasHiddenBySearch = false; +        }  	}  } diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 79ef0c075e..4c28288b40 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -2222,10 +2222,6 @@ bool idle_startup()  		// Have the agent start watching the friends list so we can update proxies  		gAgent.observeFriends(); -		if (gSavedSettings.getBOOL("LoginAsGod")) -		{ -			gAgent.requestEnterGodMode(); -		}  		// Start automatic replay if the flag is set.  		if (gSavedSettings.getBOOL("StatsAutoRun") || gAgentPilot.getReplaySession()) diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp index ba328f27c4..6d54a3770c 100644 --- a/indra/newview/lltoolcomp.cpp +++ b/indra/newview/lltoolcomp.cpp @@ -44,6 +44,7 @@  #include "lltoolmgr.h"  #include "lltoolselectrect.h"  #include "lltoolplacer.h" +#include "llviewerinput.h"  #include "llviewermenu.h"  #include "llviewerobject.h"  #include "llviewerwindow.h" @@ -745,7 +746,7 @@ BOOL LLToolCompGun::handleHover(S32 x, S32 y, MASK mask)  BOOL LLToolCompGun::handleMouseDown(S32 x, S32 y, MASK mask)  {   	// if the left button is grabbed, don't put up the pie menu -	if (gAgent.leftButtonGrabbed()) +	if (gAgent.leftButtonGrabbed() && gViewerInput.isLMouseHandlingDefault(MODE_FIRST_PERSON))  	{  		gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN);  		return FALSE; @@ -762,7 +763,7 @@ BOOL LLToolCompGun::handleMouseDown(S32 x, S32 y, MASK mask)  BOOL LLToolCompGun::handleDoubleClick(S32 x, S32 y, MASK mask)  {  	// if the left button is grabbed, don't put up the pie menu -	if (gAgent.leftButtonGrabbed()) +	if (gAgent.leftButtonGrabbed() && gViewerInput.isLMouseHandlingDefault(MODE_FIRST_PERSON))  	{  		gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN);  		return FALSE; @@ -796,7 +797,10 @@ BOOL LLToolCompGun::handleRightMouseDown(S32 x, S32 y, MASK mask)  BOOL LLToolCompGun::handleMouseUp(S32 x, S32 y, MASK mask)  { -	gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_UP); +    if (gViewerInput.isLMouseHandlingDefault(MODE_FIRST_PERSON)) +    { +        gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_UP); +    }  	setCurrentTool( (LLTool*) mGun );  	return TRUE;  } diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp index f01b374db1..7ab079c74d 100644 --- a/indra/newview/lltoolgrab.cpp +++ b/indra/newview/lltoolgrab.cpp @@ -51,6 +51,7 @@  #include "lltoolmgr.h"  #include "lltoolpie.h"  #include "llviewercamera.h" +#include "llviewerinput.h"  #include "llviewerobject.h"  #include "llviewerobjectlist.h"   #include "llviewerregion.h" @@ -140,7 +141,6 @@ BOOL LLToolGrabBase::handleMouseDown(S32 x, S32 y, MASK mask)  		LL_INFOS() << "LLToolGrab handleMouseDown" << LL_ENDL;  	} -	// call the base class to propogate info to sim  	LLTool::handleMouseDown(x, y, mask);  	// leftButtonGrabbed() checks if controls are reserved by scripts, but does not take masks into account @@ -150,6 +150,19 @@ BOOL LLToolGrabBase::handleMouseDown(S32 x, S32 y, MASK mask)  		gViewerWindow->pickAsync(x, y, mask, pickCallback, /*BOOL pick_transparent*/ TRUE);  	}  	mClickedInMouselook = gAgentCamera.cameraMouselook(); + +    if (mClickedInMouselook && gViewerInput.isLMouseHandlingDefault(MODE_FIRST_PERSON)) +    { +        // LLToolCompGun::handleMouseDown handles the event if ML controls are grabed, +        // but LLToolGrabBase is often the end point for mouselook clicks if ML controls +        // are not grabbed and LLToolGrabBase::handleMouseDown consumes the event, +        // so send clicks from here. +        // We are sending specifically CONTROL_LBUTTON_DOWN instead of _ML_ version. +        gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_DOWN); + +        // Todo: LLToolGrabBase probably shouldn't consume the event if there is nothing +        // to grab in Mouselook, it intercepts handling in scanMouse +    }  	return TRUE;  } @@ -953,9 +966,18 @@ void LLToolGrabBase::handleHoverFailed(S32 x, S32 y, MASK mask)  BOOL LLToolGrabBase::handleMouseUp(S32 x, S32 y, MASK mask)  { -	// call the base class to propogate info to sim  	LLTool::handleMouseUp(x, y, mask); +    if (gAgentCamera.cameraMouselook() && gViewerInput.isLMouseHandlingDefault(MODE_FIRST_PERSON)) +    { +        // LLToolCompGun::handleMouseUp handles the event if ML controls are grabed, +        // but LLToolGrabBase is often the end point for mouselook clicks if ML controls +        // are not grabbed and LToolGrabBase::handleMouseUp consumes the event, +        // so send clicks from here. +        // We are sending specifically CONTROL_LBUTTON_UP instead of _ML_ version. +        gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_UP); +    } +  	if( hasMouseCapture() )  	{  		setMouseCapture( FALSE ); diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index b4736841d6..43deac60d9 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -394,8 +394,9 @@ BOOL LLToolPie::handleLeftClickPick()  		gFocusMgr.setKeyboardFocus(NULL);  	} -	BOOL touchable = (object && object->flagHandleTouch())  -					 || (parent && parent->flagHandleTouch()); +    bool touchable = object +                     && (object->getClickAction() != CLICK_ACTION_DISABLED) +                     && (object->flagHandleTouch() || (parent && parent->flagHandleTouch()));  	// Switch to grab tool if physical or triggerable  	if (object &&  @@ -656,6 +657,12 @@ bool LLToolPie::teleportToClickedLocation()      LLViewerObject* objp = mHoverPick.getObject();      LLViewerObject* parentp = objp ? objp->getRootEdit() : NULL; +    if (objp && (objp->getAvatar() == gAgentAvatarp || objp == gAgentAvatarp)) // ex: nametag +    { +        // Don't teleport to self, teleporting to other avatars is fine +        return false; +    } +      bool is_in_world = mHoverPick.mObjectID.notNull() && objp && !objp->isHUDAttachment();      bool is_land = mHoverPick.mPickType == LLPickInfo::PICK_LAND;      bool pos_non_zero = !mHoverPick.mPosGlobal.isExactlyZero(); @@ -750,7 +757,7 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)  	else if (!mMouseOutsideSlop   		&& mMouseButtonDown  		// disable camera steering if click on land is not used for moving -		&& gViewerInput.isMouseBindUsed(CLICK_LEFT)) +		&& gViewerInput.isMouseBindUsed(CLICK_LEFT, MASK_NONE, MODE_THIRD_PERSON))  	{  		S32 delta_x = x - mMouseDownX;  		S32 delta_y = y - mMouseDownY; diff --git a/indra/newview/llviewerinput.cpp b/indra/newview/llviewerinput.cpp index 94ec534732..43b9cd90bd 100644 --- a/indra/newview/llviewerinput.cpp +++ b/indra/newview/llviewerinput.cpp @@ -816,13 +816,20 @@ bool toggle_enable_media(EKeystate s)  bool walk_to(EKeystate s)  { -    if (KEYSTATE_DOWN != s) return true; +    if (KEYSTATE_DOWN != s) +    { +        // teleport/walk is usually on mouseclick, mouseclick needs +        // to let AGENT_CONTROL_LBUTTON_UP happen if teleport didn't, +        // so return false, but if it causes issues, do some kind of +        // "return !has_teleported" +        return false; +    }      return LLToolPie::getInstance()->walkToClickedLocation();  }  bool teleport_to(EKeystate s)  { -    if (KEYSTATE_DOWN != s) return true; +    if (KEYSTATE_DOWN != s) return false;      return LLToolPie::getInstance()->teleportToClickedLocation();  } @@ -850,7 +857,47 @@ bool voice_follow_key(EKeystate s)      return false;  } -bool agen_control_lbutton_handle(EKeystate s) +bool script_trigger_lbutton(EKeystate s) +{ +    // Check for script overriding/expecting left mouse button. +    // Note that this does not pass event further and depends onto mouselook. +    // Checks CONTROL_ML_LBUTTON_DOWN_INDEX for mouselook, +    // CONTROL_LBUTTON_DOWN_INDEX for normal camera +    if (gAgent.leftButtonGrabbed()) +    { +        bool mouselook = gAgentCamera.cameraMouselook(); +        switch (s) +        { +        case KEYSTATE_DOWN: +            if (mouselook) +            { +                gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN); +            } +            else +            { +                gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_DOWN); +            } +            return true; +        case KEYSTATE_UP: +            if (mouselook) +            { +                gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_UP); +            } +            else +            { +                gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_UP); +            } +            return true; +        default: +            break; +        } +    } +    return false; +} + +// Used by scripts, for overriding/handling left mouse button +// see mControlsTakenCount +bool agent_control_lbutton_handle(EKeystate s)  {      switch (s)      { @@ -922,6 +969,7 @@ REGISTER_KEYBOARD_ACTION("teleport_to", teleport_to);  REGISTER_KEYBOARD_ACTION("walk_to", walk_to);  REGISTER_KEYBOARD_GLOBAL_ACTION("toggle_voice", toggle_voice);  REGISTER_KEYBOARD_GLOBAL_ACTION("voice_follow_key", voice_follow_key); +REGISTER_KEYBOARD_ACTION(script_mouse_handler_name, script_trigger_lbutton);  #undef REGISTER_KEYBOARD_ACTION  LLViewerInput::LLViewerInput() @@ -1193,6 +1241,20 @@ BOOL LLViewerInput::bindMouse(const S32 mode, const EMouseClickType mouse, const      typedef boost::function<bool(EKeystate)> function_t;      function_t function = NULL; +    if (mouse == CLICK_LEFT +        && mask == MASK_NONE +        && function_name == script_mouse_handler_name) +    { +        // Special case +        // Left click has script overrides and by default +        // is handled via agent_control_lbutton as last option +        // In case of mouselook and present overrides it has highest +        // priority even over UI and is handled in LLToolCompGun::handleMouseDown +        // so just mark it as having default handler +        mLMouseDefaultHandling[mode] = true; +        return TRUE; +    } +      LLKeybindFunctionData* result = LLKeyboardActionRegistry::getValue(function_name);      if (result)      { @@ -1269,7 +1331,8 @@ LLViewerInput::Keys::Keys()  :	first_person("first_person"),  	third_person("third_person"),  	sitting("sitting"), -	edit_avatar("edit_avatar") +	edit_avatar("edit_avatar"), +	xml_version("xml_version", 0)  {}  void LLViewerInput::resetBindings() @@ -1280,6 +1343,7 @@ void LLViewerInput::resetBindings()          mGlobalMouseBindings[i].clear();          mKeyBindings[i].clear();          mMouseBindings[i].clear(); +        mLMouseDefaultHandling[i] = false;      }  } @@ -1298,6 +1362,65 @@ S32 LLViewerInput::loadBindingsXML(const std::string& filename)  		binding_count += loadBindingMode(keys.third_person, MODE_THIRD_PERSON);  		binding_count += loadBindingMode(keys.sitting, MODE_SITTING);  		binding_count += loadBindingMode(keys.edit_avatar, MODE_EDIT_AVATAR); + +        // verify version +        if (keys.xml_version < 1) +        { +            // updating from a version that was not aware of LMouse bindings +            for (S32 i = 0; i < MODE_COUNT; i++) +            { +                mLMouseDefaultHandling[i] = true; +            } + +            // fix missing values +            KeyBinding mouse_binding; +            mouse_binding.key = ""; +            mouse_binding.mask = "NONE"; +            mouse_binding.mouse = "LMB"; +            mouse_binding.command = script_mouse_handler_name; + +            if (keys.third_person.isProvided()) +            { +                keys.third_person.bindings.add(mouse_binding); +            } + +            if (keys.first_person.isProvided()) +            { +                keys.first_person.bindings.add(mouse_binding); +            } + +            if (keys.sitting.isProvided()) +            { +                keys.sitting.bindings.add(mouse_binding); +            } + +            if (keys.edit_avatar.isProvided()) +            { +                keys.edit_avatar.bindings.add(mouse_binding); +            } + +            // fix version +            keys.xml_version.set(keybindings_xml_version, true); + +            // Write the resulting XML to file +            LLXMLNodePtr output_node = new LLXMLNode("keys", false); +            LLXUIParser write_parser; +            write_parser.writeXUI(output_node, keys); + +            if (!output_node->isNull()) +            { +                // file in app_settings is supposed to be up to date +                // this is only for the file from user_settings +                LL_INFOS("ViewerInput") << "Updating file " << filename << " to a newer version" << LL_ENDL; +                LLFILE *fp = LLFile::fopen(filename, "w"); +                if (fp != NULL) +                { +                    LLXMLNode::writeHeaderToFile(fp); +                    output_node->writeToFile(fp); +                    fclose(fp); +                } +            } +        }  	}  	return binding_count;  } @@ -1469,17 +1592,6 @@ bool LLViewerInput::scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level)      bool res = scanKey(mKeyBindings[mode], mKeyBindings[mode].size(), key, mask, key_down, key_up, key_level, repeat); -    if (!res && agent_control_lbutton.canHandle(CLICK_NONE, key, mask)) -    { -        if (key_down && !repeat) -        { -            res = agen_control_lbutton_handle(KEYSTATE_DOWN); -        } -        if (key_up) -        { -            res = agen_control_lbutton_handle(KEYSTATE_UP); -        } -    }      return res;  } @@ -1603,29 +1715,36 @@ bool LLViewerInput::scanMouse(EMouseClickType click, EMouseState state) const      bool res = false;      S32 mode = getMode();      MASK mask = gKeyboard->currentMask(TRUE); - -    // By default mouse clicks require exact mask -    // Todo: support for mIgnoreMasks because some functions like teleports -    // expect to be canceled, but for voice it's prefered to ignore mask.      res = scanMouse(mMouseBindings[mode], mMouseBindings[mode].size(), click, mask, state, false); -    // no user defined actions found or those actions can't handle the key/button, handle control if nessesary -    if (!res && agent_control_lbutton.canHandle(click, KEY_NONE, mask)) + +    // No user defined actions found or those actions can't handle the key/button, +    // so handle CONTROL_LBUTTON if nessesary. +    // +    // Default handling for MODE_FIRST_PERSON is in LLToolCompGun::handleMouseDown, +    // and sends AGENT_CONTROL_ML_LBUTTON_DOWN, but it only applies if ML controls +    // are leftButtonGrabbed(), send a normal click otherwise. + +    if (!res +        && mLMouseDefaultHandling[mode] +        && (mode != MODE_FIRST_PERSON || !gAgent.leftButtonGrabbed()) +        && (click == CLICK_LEFT || click == CLICK_DOUBLELEFT) +        )      {          switch (state)          {          case MOUSE_STATE_DOWN: -            agen_control_lbutton_handle(KEYSTATE_DOWN); +            agent_control_lbutton_handle(KEYSTATE_DOWN);              res = true;              break;          case MOUSE_STATE_CLICK:              // might not work best with some functions,              // but some function need specific states too specifically -            agen_control_lbutton_handle(KEYSTATE_DOWN); -            agen_control_lbutton_handle(KEYSTATE_UP); +            agent_control_lbutton_handle(KEYSTATE_DOWN); +            agent_control_lbutton_handle(KEYSTATE_UP);              res = true;              break;          case MOUSE_STATE_UP: -            agen_control_lbutton_handle(KEYSTATE_UP); +            agent_control_lbutton_handle(KEYSTATE_UP);              res = true;              break;          default: @@ -1655,7 +1774,7 @@ void LLViewerInput::scanMouse()      }  } -bool LLViewerInput::isMouseBindUsed(const EMouseClickType mouse, const MASK mask, const S32 mode) +bool LLViewerInput::isMouseBindUsed(const EMouseClickType mouse, const MASK mask, const S32 mode) const  {      S32 size = mMouseBindings[mode].size();      for (S32 index = 0; index < size; index++) diff --git a/indra/newview/llviewerinput.h b/indra/newview/llviewerinput.h index ca70ac76bf..52e95e2168 100644 --- a/indra/newview/llviewerinput.h +++ b/indra/newview/llviewerinput.h @@ -31,6 +31,8 @@  #include "llinitparam.h"  const S32 MAX_KEY_BINDINGS = 128; // was 60 +const S32 keybindings_xml_version = 1; +const std::string script_mouse_handler_name = "script_trigger_lbutton";  class LLNamedFunction  { @@ -100,7 +102,7 @@ public:  							third_person,  							sitting,  							edit_avatar; - +		Optional<S32> xml_version; // 'xml', because 'version' appears to be reserved  		Keys();  	}; @@ -131,7 +133,8 @@ public:      BOOL            handleMouse(LLWindow *window_impl, LLCoordGL pos, MASK mask, EMouseClickType clicktype, BOOL down);      void            scanMouse(); -    bool            isMouseBindUsed(const EMouseClickType mouse, const MASK mask = MASK_NONE, const S32 mode = MODE_THIRD_PERSON); +    bool            isMouseBindUsed(const EMouseClickType mouse, const MASK mask, const S32 mode) const; +    bool            isLMouseHandlingDefault(const S32 mode) const { return mLMouseDefaultHandling[mode]; }  private:      bool            scanKey(const std::vector<LLKeyboardBinding> &binding, @@ -171,6 +174,7 @@ private:      // to send what we think function wants based on collection of bools (mKeyRepeated, mKeyLevel, mKeyDown)      std::vector<LLKeyboardBinding>	mKeyBindings[MODE_COUNT];      std::vector<LLMouseBinding>		mMouseBindings[MODE_COUNT]; +    bool							mLMouseDefaultHandling[MODE_COUNT]; // Due to having special priority      // keybindings that do not consume event and are handled earlier, before floaters      std::vector<LLKeyboardBinding>	mGlobalKeyBindings[MODE_COUNT]; diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 07190d0538..29c926ca64 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -3198,10 +3198,6 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla  		case LLViewerMediaObserver::MEDIA_EVENT_FILE_DOWNLOAD:  		{  			LL_DEBUGS("Media") << "Media event - file download requested - filename is " << plugin->getFileDownloadFilename() << LL_ENDL; - -            //unblock media plugin -            const std::vector<std::string> empty_response; -            plugin->sendPickFileResponse(empty_response);  		}  		break; diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 27fbf39673..2fb760ed17 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -3008,12 +3008,12 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)  	capabilityNames.append("ObjectAnimation");  	capabilityNames.append("ObjectMedia");  	capabilityNames.append("ObjectMediaNavigate"); -	capabilityNames.append("ObjectNavMeshProperties");  	capabilityNames.append("ParcelPropertiesUpdate");  	capabilityNames.append("ParcelVoiceInfoRequest");  	capabilityNames.append("ProductInfoRequest");  	capabilityNames.append("ProvisionVoiceAccountRequest");  	capabilityNames.append("ReadOfflineMsgs"); // Requires to respond reliably: AcceptFriendship, AcceptGroupInvite, DeclineFriendship, DeclineGroupInvite +	capabilityNames.append("RegionObjects");  	capabilityNames.append("RemoteParcelRequest");  	capabilityNames.append("RenderMaterials");  	capabilityNames.append("RequestTextureDownload"); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 050fb454ad..9334fa5c76 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2291,6 +2291,9 @@ void LLViewerWindow::initWorldUI()  	LLPanelStandStopFlying* panel_stand_stop_flying	= LLPanelStandStopFlying::getInstance();  	panel_ssf_container->addChild(panel_stand_stop_flying); +	LLPanelHideBeacon* panel_hide_beacon = LLPanelHideBeacon::getInstance(); +	panel_ssf_container->addChild(panel_hide_beacon); +  	panel_ssf_container->setVisible(TRUE);  	LLMenuOptionPathfindingRebakeNavmesh::getInstance()->initialize(); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 5d994058c2..d421b3b1f6 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1323,7 +1323,8 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)  {      LL_RECORD_BLOCK_TIME(FTM_AVATAR_EXTENT_UPDATE); -    S32 box_detail = gSavedSettings.getS32("AvatarBoundingBoxComplexity"); +    static LLCachedControl<S32> box_detail_cache(gSavedSettings, "AvatarBoundingBoxComplexity"); +    S32 box_detail = box_detail_cache;      if (getOverallAppearance() != AOA_NORMAL)      {          if (isControlAvatar()) @@ -2532,10 +2533,11 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)  	{  		LL_INFOS() << "Warning!  Idle on dead avatar" << LL_ENDL;  		return; -	}	 +	} +	static LLCachedControl<bool> disable_all_render_types(gSavedSettings, "DisableAllRenderTypes");  	if (!(gPipeline.hasRenderType(mIsControlAvatar ? LLPipeline::RENDER_TYPE_CONTROL_AV : LLPipeline::RENDER_TYPE_AVATAR)) -		&& !(gSavedSettings.getBOOL("DisableAllRenderTypes")) && !isSelf()) +		&& !disable_all_render_types && !isSelf())  	{  		return;  	} @@ -2676,7 +2678,8 @@ void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)  	// Don't render the user's own voice visualizer when in mouselook, or when opening the mic is disabled.  	if(isSelf())  	{ -		if(gAgentCamera.cameraMouselook() || gSavedSettings.getBOOL("VoiceDisableMic")) +        static LLCachedControl<bool> voice_disable_mic(gSavedSettings, "VoiceDisableMic"); +		if(gAgentCamera.cameraMouselook() || voice_disable_mic)  		{  			render_visualizer = false;  		} @@ -3145,11 +3148,14 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)  	}  	const F32 time_visible = mTimeVisible.getElapsedTimeF32(); -	const F32 NAME_SHOW_TIME = gSavedSettings.getF32("RenderNameShowTime");	// seconds -	const F32 FADE_DURATION = gSavedSettings.getF32("RenderNameFadeDuration"); // seconds -	BOOL visible_avatar = isVisible() || mNeedsAnimUpdate; -	BOOL visible_chat = gSavedSettings.getBOOL("UseChatBubbles") && (mChats.size() || mTyping); -	BOOL render_name =	visible_chat || + +    static LLCachedControl<F32> NAME_SHOW_TIME(gSavedSettings, "RenderNameShowTime"); // seconds +    static LLCachedControl<F32> FADE_DURATION(gSavedSettings, "RenderNameFadeDuration"); // seconds +    static LLCachedControl<bool> use_chat_bubbles(gSavedSettings, "UseChatBubbles"); + +	bool visible_avatar = isVisible() || mNeedsAnimUpdate; +	bool visible_chat = use_chat_bubbles && (mChats.size() || mTyping); +	bool render_name =	visible_chat ||  		(visible_avatar &&  		 ((sRenderName == RENDER_NAME_ALWAYS) ||  		  (sRenderName == RENDER_NAME_FADE && time_visible < NAME_SHOW_TIME))); @@ -3157,10 +3163,11 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)  	// draw if we're specifically hiding our own name.  	if (isSelf())  	{ +        static LLCachedControl<bool> render_name_show_self(gSavedSettings, "RenderNameShowSelf"); +        static LLCachedControl<S32> name_tag_mode(gSavedSettings, "AvatarNameTagMode");  		render_name = render_name  			&& !gAgentCamera.cameraMouselook() -			&& (visible_chat || (gSavedSettings.getBOOL("RenderNameShowSelf")  -								 && gSavedSettings.getS32("AvatarNameTagMode") )); +			&& (visible_chat || (render_name_show_self && name_tag_mode));  	}  	if ( !render_name ) @@ -3175,7 +3182,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)  		return;  	} -	BOOL new_name = FALSE; +	bool new_name = FALSE;  	if (visible_chat != mVisibleChat)  	{  		mVisibleChat = visible_chat; @@ -3240,7 +3247,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)  	idleUpdateNameTagAlpha(new_name, alpha);  } -void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) +void LLVOAvatar::idleUpdateNameTagText(bool new_name)  {  	LLNameValue *title = getNVPair("Title");  	LLNameValue* firstname = getNVPair("FirstName"); @@ -3550,7 +3557,7 @@ void LLVOAvatar::idleUpdateNameTagPosition(const LLVector3& root_pos_last)  	mNameText->setPositionAgent(name_position);				  } -void LLVOAvatar::idleUpdateNameTagAlpha(BOOL new_name, F32 alpha) +void LLVOAvatar::idleUpdateNameTagAlpha(bool new_name, F32 alpha)  {  	llassert(mNameText); @@ -3693,7 +3700,8 @@ void LLVOAvatar::updateAppearanceMessageDebugText()  		{  			debug_line += llformat(" - cof: %d req: %d rcv:%d",  								   curr_cof_version, last_request_cof_version, last_received_cof_version); -			if (gSavedSettings.getBOOL("DebugForceAppearanceRequestFailure")) +			static LLCachedControl<bool> debug_force_failure(gSavedSettings, "DebugForceAppearanceRequestFailure"); +			if (debug_force_failure)  			{  				debug_line += " FORCING ERRS";  			} @@ -5927,7 +5935,8 @@ BOOL LLVOAvatar::processSingleAnimationStateChange( const LLUUID& anim_id, BOOL  					//}  					//else  					{ -						LLUUID sound_id = LLUUID(gSavedSettings.getString("UISndTyping")); +                        static LLCachedControl<std::string> ui_snd_string(gSavedSettings, "UISndTyping"); +						LLUUID sound_id = LLUUID(ui_snd_string);  						gAudiop->triggerSound(sound_id, getID(), 1.0f, LLAudioEngine::AUDIO_TYPE_SFX, char_pos_global);  					}  				} @@ -5995,7 +6004,7 @@ void LLVOAvatar::resetAnimations()  // animations.  LLUUID LLVOAvatar::remapMotionID(const LLUUID& id)  { -	BOOL use_new_walk_run = gSavedSettings.getBOOL("UseNewWalkRun"); +    static LLCachedControl<bool> use_new_walk_run(gSavedSettings, "UseNewWalkRun");  	LLUUID result = id;  	// start special case female walk for female avatars @@ -8183,7 +8192,8 @@ BOOL LLVOAvatar::isFullyLoaded() const  bool LLVOAvatar::isTooComplex() const  {  	bool too_complex; -	bool render_friend =  (LLAvatarTracker::instance().isBuddy(getID()) && gSavedSettings.getBOOL("AlwaysRenderFriends")); +    static LLCachedControl<bool> always_render_friends(gSavedSettings, "AlwaysRenderFriends"); +	bool render_friend =  (LLAvatarTracker::instance().isBuddy(getID()) && always_render_friends);  	if (isSelf() || render_friend || mVisuallyMuteSetting == AV_ALWAYS_RENDER)  	{ @@ -9036,7 +9046,8 @@ void LLVOAvatar::parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMe  	// Parse visual params, if any.  	S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_VisualParam); -	bool drop_visual_params_debug = gSavedSettings.getBOOL("BlockSomeAvatarAppearanceVisualParams") && (ll_rand(2) == 0); // pretend that ~12% of AvatarAppearance messages arrived without a VisualParam block, for testing +    static LLCachedControl<bool> block_some_avatars(gSavedSettings, "BlockSomeAvatarAppearanceVisualParams"); +	bool drop_visual_params_debug = block_some_avatars && (ll_rand(2) == 0); // pretend that ~12% of AvatarAppearance messages arrived without a VisualParam block, for testing  	if( num_blocks > 1 && !drop_visual_params_debug)  	{  		//LL_DEBUGS("Avatar") << avString() << " handle visual params, num_blocks " << num_blocks << LL_ENDL; @@ -9141,10 +9152,12 @@ bool resolve_appearance_version(const LLAppearanceMessageContents& contents, S32  void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  {  	LL_DEBUGS("Avatar") << "starts" << LL_ENDL; -	 -	bool enable_verbose_dumps = gSavedSettings.getBOOL("DebugAvatarAppearanceMessage"); + +    static LLCachedControl<bool> enable_verbose_dumps(gSavedSettings, "DebugAvatarAppearanceMessage"); +    static LLCachedControl<bool> block_avatar_appearance_messages(gSavedSettings, "BlockAvatarAppearanceMessages"); +  	std::string dump_prefix = getFullname() + "_" + (isSelf()?"s":"o") + "_"; -	if (gSavedSettings.getBOOL("BlockAvatarAppearanceMessages")) +	if (block_avatar_appearance_messages)  	{  		LL_WARNS() << "Blocking AvatarAppearance message" << LL_ENDL;  		return; diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 74ef589ca4..96a8372188 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -284,9 +284,9 @@ public:  	void 			idleUpdateLoadingEffect();  	void 			idleUpdateWindEffect();  	void 			idleUpdateNameTag(const LLVector3& root_pos_last); -	void			idleUpdateNameTagText(BOOL new_name); +	void			idleUpdateNameTagText(bool new_name);  	void			idleUpdateNameTagPosition(const LLVector3& root_pos_last); -	void			idleUpdateNameTagAlpha(BOOL new_name, F32 alpha); +	void			idleUpdateNameTagAlpha(bool new_name, F32 alpha);  	LLColor4		getNameTagColor(bool is_friend);  	void			clearNameTag();  	static void		invalidateNameTag(const LLUUID& agent_id); @@ -908,7 +908,7 @@ public:  	void	   		startTyping() { mTyping = TRUE; mTypingTimer.reset(); }  	void			stopTyping() { mTyping = FALSE; }  private: -	BOOL			mVisibleChat; +	bool			mVisibleChat;  	//--------------------------------------------------------------------  	// Lip synch morphs diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 77f756a123..d75a4fd42d 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -71,6 +71,8 @@  #include "llmediaentry.h"  #include "llmediadataclient.h"  #include "llmeshrepository.h" +#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llagent.h"  #include "llviewermediafocus.h"  #include "lldatapacker.h" @@ -2960,6 +2962,17 @@ void LLVOVolume::mediaEvent(LLViewerMediaImpl *impl, LLPluginClassMedia* plugin,  			}  		}  		break; + +        case LLViewerMediaObserver::MEDIA_EVENT_FILE_DOWNLOAD: +        { +            // Media might be blocked, waiting for a file, +            // send an empty response to unblock it +            const std::vector<std::string> empty_response; +            plugin->sendPickFileResponse(empty_response); + +            LLNotificationsUtil::add("MediaFileDownloadUnsupported"); +        } +        break;  		default:  		break; diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp index b8f1ec35f6..c4d873dd22 100644 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -199,19 +199,16 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url,  	// find the grid  	std::string current_grid = LLGridManager::getInstance()->getGridId();  	std::transform(current_grid.begin(), current_grid.end(), current_grid.begin(), ::tolower); -	if (current_grid == "agni") +    if (current_grid == "damballah")  	{ -		substitution["GRID"] = "secondlife.com"; -	} -	else if (current_grid == "damballah") -	{ -		// Staging grid has its own naming scheme. -		substitution["GRID"] = "secondlife-staging.com"; -	} -	else -	{ -		substitution["GRID"] = llformat("%s.lindenlab.com", current_grid.c_str()); -	} +      // Staging grid has its own naming scheme. +      substitution["GRID"] = "secondlife-staging.com"; +    } +    else +    { +        substitution["GRID"] = "secondlife.com"; +    } +  	// expand all of the substitution strings and escape the url  	std::string expanded_url = url;  	LLStringUtil::format(expanded_url, substitution); diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index fb3fc55a94..81511ac555 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -1199,6 +1199,16 @@ public:              return;          } +        if (gDisconnected) +        { +            return; +        } + +        if (!LLWorld::instanceExists()) +        { +            return; +        } +  		if (!input["body"].has("agent-id") ||  			!input["body"].has("sim-ip-and-port") ||  			!input["body"].has("seed-capability")) @@ -1207,8 +1217,13 @@ public:              return;  		} -		LLHost sim(input["body"]["sim-ip-and-port"].asString()); -	 +        LLHost sim(input["body"]["sim-ip-and-port"].asString()); +        if (sim.isInvalid()) +        { +            LL_WARNS() << "Got EstablishAgentCommunication with invalid host" << LL_ENDL; +            return; +        } +  		LLViewerRegion* regionp = LLWorld::getInstance()->getRegion(sim);  		if (!regionp)  		{ @@ -1217,7 +1232,7 @@ public:  			return;  		}  		LL_DEBUGS("CrossingCaps") << "Calling setSeedCapability from LLEstablishAgentCommunication::post. Seed cap == " -				<< input["body"]["seed-capability"] << LL_ENDL; +				<< input["body"]["seed-capability"] << " for region " << regionp->getRegionID() << LL_ENDL;  		regionp->setSeedCapability(input["body"]["seed-capability"]);  	}  }; diff --git a/indra/newview/skins/default/xui/en/control_table_contents_media.xml b/indra/newview/skins/default/xui/en/control_table_contents_media.xml index ce5d3556b6..43e8d730cd 100644 --- a/indra/newview/skins/default/xui/en/control_table_contents_media.xml +++ b/indra/newview/skins/default/xui/en/control_table_contents_media.xml @@ -73,4 +73,14 @@           name="lst_action"           value="Start Gesture" />      </rows> +    <rows +     name="script_trigger_lbutton" +     value="script_trigger_lbutton"> +        <columns +         column="lst_action" +         font="SansSerif" +         halign="left" +         name="lst_action" +         value="Interact (Script LMB)" /> +    </rows>  </contents> diff --git a/indra/newview/skins/default/xui/en/floater_associate_listing.xml b/indra/newview/skins/default/xui/en/floater_associate_listing.xml index e019ed58dd..0f7ed24103 100644 --- a/indra/newview/skins/default/xui/en/floater_associate_listing.xml +++ b/indra/newview/skins/default/xui/en/floater_associate_listing.xml @@ -20,9 +20,10 @@       name="message">          Listing ID:      </text> +    <!--listing_id is a positive S32-->      <line_editor       type="string" -     length="1" +     max_length_bytes="10"       follows="top|right"       font="SansSerif"       height="20" diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 2007abefd7..d4ccfd55ff 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -2309,6 +2309,7 @@ Please try again later.    <notification     icon="notifytip.tga"     name="LandmarkCreated" +   log_to_chat="false"     type="notifytip">  You have added "[LANDMARK_NAME]" to your [FOLDER_NAME] folder.    </notification> diff --git a/indra/newview/skins/default/xui/en/panel_hide_beacon.xml b/indra/newview/skins/default/xui/en/panel_hide_beacon.xml new file mode 100644 index 0000000000..cb22719cef --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_hide_beacon.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + height="25" + layout="topleft" + name="panel_hide_beacon" + mouse_opaque="false" + visible="true" + width="133"> +    <button +     follows="left|bottom" +     height="19" +     label="Hide beacon" +     layout="topleft" +     left="10" +     name="hide_beacon_btn" +     tool_tip="Stop tracking and hide beacon" +     top="2" +     visible="true" +     width="113" /> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index 2ea20570b1..42a34d171a 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -28,7 +28,7 @@       height="15"       increment="0.025"       initial_value="0.5" -     label="Master volume" +     label="All volume"  	   label_width="120"       layout="topleft"       left="0" @@ -386,7 +386,7 @@       left="25"       name="voice_chat_settings"       width="200" -     top_pad="7"> +     top_pad="16">  	  Voice Chat Settings      </text>      <text diff --git a/indra/newview/skins/default/xui/en/panel_toolbar_view.xml b/indra/newview/skins/default/xui/en/panel_toolbar_view.xml index f5c559fe1d..a3348f28c7 100644 --- a/indra/newview/skins/default/xui/en/panel_toolbar_view.xml +++ b/indra/newview/skins/default/xui/en/panel_toolbar_view.xml @@ -95,7 +95,7 @@                 tab_stop="false"                 name="state_management_buttons_container"                 visible="false" -               width="200"/> +               width="350"/>        </layout_panel>         <layout_panel name="right_toolbar_panel"                      auto_resize="false" diff --git a/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml index 2034409111..b4eb1ade94 100644 --- a/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml +++ b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml @@ -19,7 +19,7 @@       height="15"       increment="0.025"       initial_value="0.5" -     label="Master" +     label="All"       label_width="60"       left="10"       width="160" | 
