diff options
Diffstat (limited to 'indra/newview')
23 files changed, 185 insertions, 18 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 744c876c37..6b339a69d9 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -46,6 +46,9 @@ include(VisualLeakDetector) #include(VulkanGltf) include(ZLIBNG) include(LLPrimitive) +if (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64) + include(UnixInstall) +endif () if (ENABLE_MEDIA_PLUGINS) include(LibVLCPlugin) @@ -1500,6 +1503,7 @@ if (NOT (DARWIN OR WINDOWS)) llappviewerlinux.cpp PROPERTIES COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" + COMPILE_FLAGS "-DAPP_PLUGIN_DIR=\\\"${INSTALL_LIBRARY_DIR}\\\"" ) #LIST(APPEND viewer_SOURCE_FILES llappviewerlinux_api_dbus.cpp) if (NOT CMAKE_CXX_COMPILER_ID MATCHES AppleClang) @@ -1759,10 +1763,33 @@ if (PACKAGE) CACHE STRING "Viewer major.minor.patch.revision versions.") set(VIEWER_PACKAGE_COMMENT "A fork of the Second Life viewer") set(VIEWER_PACKAGE_DESCRIPTION "An entrance to virtual empires in only megabytes. A shelter for the metaverse refugees, especially those from less supported operating systems.") - set(VIEWER_PACKAGE_DOMAIN_NAME ${VIEWER_BINARY_NAME}.net) + string(TOLOWER ${VIEWER_BINARY_NAME} DOMAIN_NAME) + set(VIEWER_PACKAGE_DOMAIN_NAME ${DOMAIN_NAME}.net) endif () -if (CMAKE_COMMAND MATCHES /usr/bin/cmake OR WINDOWS) +if (CMAKE_COMMAND MATCHES /usr/bin/cmake) + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} POST_BUILD + COMMAND sed + ARGS -e '/Linden Lab.*/d' ${CMAKE_HOME_DIRECTORY}/../doc/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/following residents.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/along with.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/^$$/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/\t.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/^ .*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sort + ARGS -R contributions.txt -o ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND paste + ARGS -s -d, ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt + COMMAND sed + ARGS -i 's/,/, /g' ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt + ) +elseif (WINDOWS) add_custom_command( TARGET ${VIEWER_BINARY_NAME} POST_BUILD COMMAND sed @@ -1982,9 +2009,9 @@ if (WINDOWS) set(CPACK_NSIS_PACKAGE_NAME ${VIEWER_BINARY_NAME}) set(CPACK_NSIS_HELP_LINK https://${VIEWER_PACKAGE_DOMAIN_NAME}) set(CPACK_NSIS_URL_INFO_ABOUT https://${VIEWER_PACKAGE_DOMAIN_NAME}) - set(CPACK_NSIS_CONTACT $ENV{USER}@${VIEWER_PACKAGE_DOMAIN_NAME}) + set(CPACK_NSIS_CONTACT $ENV{USERNAME}@${VIEWER_PACKAGE_DOMAIN_NAME}) set(CPACK_NSIS_WELCOME_TITLE "Welcome to ${VIEWER_BINARY_NAME}!") - set(CPACK_NSIS_MENU_LINKS Megapahit.exe "Megapahit Viewer") + set(CPACK_NSIS_MENU_LINKS ${VIEWER_BINARY_NAME}.exe "${VIEWER_BINARY_NAME} Viewer") set(CPACK_PACKAGE_INSTALL_DIRECTORY ${VIEWER_BINARY_NAME}) if (FALSE) @@ -2109,10 +2136,6 @@ if (NOT (CMAKE_SYSTEM_NAME MATCHES FreeBSD OR ($ENV{MSYSTEM_CARCH} MATCHES aarch target_link_libraries(${VIEWER_BINARY_NAME} llwebrtc ) endif () -if ($ENV{MSYSTEM_CARCH} MATCHES aarch64) - target_link_libraries(${VIEWER_BINARY_NAME} clog) -endif () - if (ENABLE_MEDIA_PLUGINS) target_link_libraries(${VIEWER_BINARY_NAME} ll::libvlc ) if (DARWIN OR LINUX) @@ -2292,7 +2315,7 @@ if (LINUX) set(CPACK_RPM_PACKAGE_REQUIRES "apr-util, boost-fiber, boost-program-options, boost-regex, boost-thread, boost-url, expat, fltk, mesa-libGLU, hunspell, libnghttp2, openjpeg2, SDL2, vlc-libs, vlc-plugins-base, libvorbis" CACHE STRING "RPM package requirements.") else () - set(CPACK_RPM_PACKAGE_REQUIRES "libapr-util1-0, libboost_fiber1_88_0, libboost_program_options1_88_0, libboost_regex1_88_0, libboost_thread1_88_0, libboost_url1_88_0, libboost_url1_88_0-x86-64-v3, expat, libfltk1_3, libGLU1, libhunspell-1_7-0, libnghttp2-14, openjpeg2, libSDL2-2_0-0, libvlc5, vlc-codecs, libvorbis0" + set(CPACK_RPM_PACKAGE_REQUIRES "libapr-util1-0, libboost_fiber1_88_0, libboost_program_options1_88_0, libboost_regex1_88_0, libboost_thread1_88_0, libboost_url1_88_0, libboost_url1_88_0-x86-64-v3, libpng16-16 expat, libfltk1_3, libGLU1, libhunspell-1_7-0, libnghttp2-14, openjpeg2, libSDL2-2_0-0, libvlc5, vlc-codecs, libvorbis0" CACHE STRING "RPM package requirements.") endif () endif () diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 2161dbe19e..f7b48d25f2 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -386,6 +386,10 @@ LLAgent::LLAgent() : mbRunning(false), mbTeleportKeepsLookAt(false), + mAllowedToStand(true), + mAllowedToSit(true), + mSitObjectID(LLUUID::null), + mAgentAccess(new LLAgentAccess(gSavedSettings)), mGodLevelChangeSignal(), mCanEditParcel(false), @@ -969,7 +973,11 @@ bool LLAgent::isSitting() void LLAgent::standUp() { - setControlFlags(AGENT_CONTROL_STAND_UP); + if (mAllowedToStand) + { + setControlFlags(AGENT_CONTROL_STAND_UP); + mSitObjectID = LLUUID::null; + } } void LLAgent::changeParcels() @@ -1343,7 +1351,7 @@ LLVector3d LLAgent::getPosGlobalFromAgent(const LLVector3 &pos_agent) const void LLAgent::sitDown() { - setControlFlags(AGENT_CONTROL_SIT_ON_GROUND); + if (mAllowedToSit) setControlFlags(AGENT_CONTROL_SIT_ON_GROUND); } diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index c1d3c6c14b..b475782946 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -446,6 +446,16 @@ public: void standUp(); /// @brief ground-sit at agent's current position void sitDown(); + bool isAllowedToStand() const { return mAllowedToStand; } + void setAllowedToStand(bool allow) { mAllowedToStand = allow; } + bool isAllowedToSit() const { return mAllowedToSit; } + void setAllowedToSit(bool allow) { mAllowedToSit = allow; } + const LLUUID& getSitObjectID() const { return mSitObjectID; } + void setSitObjectID(const LLUUID& objectID) { mSitObjectID = objectID; } +private: + bool mAllowedToStand; + bool mAllowedToSit; + LLUUID mSitObjectID; //-------------------------------------------------------------------- // Do Not Disturb diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index c1e8f38c51..376eeca9fd 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -126,7 +126,11 @@ int main( int argc, char **argv ) // install unexpected exception handler gOldTerminateHandler = std::set_terminate(exceptionTerminateHandler); +#ifdef __aarch64__ + setenv("LD_PRELOAD", APP_PLUGIN_DIR"/libcef.so", 1); +#else unsetenv( "LD_PRELOAD" ); // <FS:ND/> Get rid of any preloading, we do not want this to happen during startup of plugins. +#endif bool ok = viewer_app_ptr->init(); if(!ok) diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 3e51a900ce..67a44cfb27 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -31,7 +31,9 @@ #endif #include "llwin32headers.h" +#if !LL_SDL #include "llwindowwin32.h" // *FIX: for setting gIconResource. +#endif #include "llappviewerwin32.h" @@ -423,7 +425,9 @@ int APIENTRY WINMAIN(HINSTANCE hInstance, DWORD heap_enable_lfh_error[MAX_HEAPS]; S32 num_heaps = 0; +#if !LL_SDL LLWindowWin32::setDPIAwareness(); +#endif #if WINDOWS_CRT_MEM_CHECKS && !INCLUDE_VLD _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); // dump memory leaks on exit @@ -452,8 +456,10 @@ int APIENTRY WINMAIN(HINSTANCE hInstance, #endif #endif +#if !LL_SDL // *FIX: global gIconResource = MAKEINTRESOURCE(IDI_LL_ICON); +#endif LLAppViewerWin32* viewer_app_ptr = new LLAppViewerWin32(ll_convert_wide_to_string(pCmdLine).c_str()); diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index a8ceaffde8..df515389c5 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -538,7 +538,7 @@ void LLPanelStandStopFlying::setStandStopFlyingMode(EStandStopFlyingMode mode) LLFirstUse::sit(); LLFirstUse::notMoving(false); } - panel->mStandButton->setVisible(SSFM_STAND == mode); + panel->mStandButton->setVisible((SSFM_STAND == mode) & gAgent.isAllowedToStand()); panel->mStopFlyingButton->setVisible(SSFM_STOP_FLYING == mode); //visibility of it should be updated after updating visibility of the buttons diff --git a/indra/newview/llmoveview.h b/indra/newview/llmoveview.h index 3690245e1d..208e1e80f1 100644 --- a/indra/newview/llmoveview.h +++ b/indra/newview/llmoveview.h @@ -143,6 +143,7 @@ public: static void clearStandStopFlyingMode(EStandStopFlyingMode mode); /*virtual*/ bool postBuild(); /*virtual*/ void setVisible(bool visible); + void setVisibleStandButton(bool visible) { mStandButton->setVisible(visible); } // *HACK: due to hard enough to have this control aligned with "Move" button while resizing // let update its position in each frame diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 63527d8594..c3bb8ef4c4 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -4506,7 +4506,7 @@ void handle_object_sit(LLViewerObject* object, const LLVector3& offset) { // get object selection offset - if (object && object->getPCode() == LL_PCODE_VOLUME) + if (gAgent.isAllowedToSit() && object && object->getPCode() == LL_PCODE_VOLUME) { gMessageSystem->newMessageFast(_PREHASH_AgentRequestSit); @@ -7700,6 +7700,7 @@ bool enable_detach(const LLSD&) // Only enable detach if all faces of object are selected if (!object || !object->isAttachment() || + object->isLocked() || !LLSelectMgr::getInstance()->getSelection()->contains(object,SELECT_ALL_TES )) { return false; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index b35be7d385..47d7d42bf7 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -4212,6 +4212,8 @@ void process_avatar_sit_response(LLMessageSystem *mesgsys, void **user_data) { LL_WARNS("Messaging") << "Received sit approval for unknown object " << sitObjectID << LL_ENDL; } + + gAgent.setSitObjectID(sitObjectID); } void process_clear_follow_cam_properties(LLMessageSystem *mesgsys, void **user_data) diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 8d90187e91..d64c0aa0d5 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -310,6 +310,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe mAttachmentItemID(LLUUID::null), mLastUpdateType(OUT_UNKNOWN), mLastUpdateCached(false), + mLocked(false), mCachedMuteListUpdateTime(0), mCachedOwnerInMuteList(false), mRiggedAttachedWarned(false) diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 2b52ea2076..972f8cf846 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -974,10 +974,14 @@ public: LLJointRiggingInfoTab mJointRiggingInfoTab; + bool isLocked() const { return mLocked; } + void setLocked(bool locked) { mLocked = locked; } + private: LLUUID mAttachmentItemID; // ItemID of the associated object is in user inventory. EObjectUpdateType mLastUpdateType; bool mLastUpdateCached; + bool mLocked; public: // reflection probe state diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 5c84346917..2b02d5165f 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -3848,7 +3848,7 @@ void LLViewerWindow::updateLayout() void LLViewerWindow::updateMouseDelta() { -#if LL_WINDOWS +#if LL_WINDOWS && !LL_SDL LLCoordCommon delta; mWindow->getCursorDelta(&delta); S32 dx = delta.mX; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index a6d50af025..7ea70a781b 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1191,7 +1191,7 @@ void LLVOAvatar::initClass() LLControlAvatar::sRegionChangedSlot = gAgent.addRegionChangedCallback(&LLControlAvatar::onRegionChanged); - sCloudTexture = LLViewerTextureManager::getFetchedTextureFromFile("cloud-particle.j2c"); + sCloudTexture = LLViewerTextureManager::getFetchedTextureFromFile("cloud-particle.png"); } diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index e39328fdd6..c6ba135f3e 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -93,6 +93,11 @@ namespace Rlv Version = 0, VersionNew, VersionNum, + GetSitID, + Sit, + SitGround, + Unsit, + Detach, GetCommand, Count, diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 6c4b439105..67739ec72f 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -28,8 +28,11 @@ #include "llviewerprecompiledheaders.h" #include "llagent.h" #include "llstartup.h" +#include "llmoveview.h" #include "llviewercontrol.h" +#include "llviewermenu.h" #include "llviewerobject.h" +#include "llviewerobjectlist.h" #include "rlvcommon.h" #include "rlvhandler.h" @@ -109,6 +112,9 @@ ECmdRet RlvHandler::processCommand(std::reference_wrapper<const RlvCommand> rlvC switch (rlvCmd.get().getParamType()) { case EParamType::Reply: + case EParamType::Force: + case EParamType::Remove: + case EParamType::Add: eRet = rlvCmd.get().processCommand(); break; case EParamType::Unknown: @@ -222,4 +228,78 @@ ECmdRet ReplyHandler<EBehaviour::VersionNum>::onCommand(const RlvCommand& rlvCmd return ECmdRet::Succeeded; } +template<> template<> +ECmdRet ReplyHandler<EBehaviour::GetSitID>::onCommand(const RlvCommand& rlvCmd, std::string& strReply) +{ + if (gAgent.isSitting()) + gAgent.getSitObjectID().toString(strReply); + else + strReply = "00000000-0000-0000-0000-000000000000"; + return ECmdRet::Succeeded; +} + +// Force + +ECmdRet CommandHandlerBaseImpl<EParamType::Force>::processCommand(const RlvCommand& rlvCmd, ForceHandlerFunc* pHandler) +{ + return (*pHandler)(rlvCmd); +} + +template<> template<> +ECmdRet ForceHandler<EBehaviour::Sit>::onCommand(const RlvCommand& rlvCmd) +{ + handle_object_sit(LLUUID{rlvCmd.getOption()}); + return ECmdRet::Succeeded; +} + +template<> template<> +ECmdRet ForceHandler<EBehaviour::SitGround>::onCommand(const RlvCommand& rlvCmd) +{ + gAgent.sitDown(); + return ECmdRet::Succeeded; +} + +template<> template<> +ECmdRet ForceHandler<EBehaviour::Unsit>::onCommand(const RlvCommand& rlvCmd) +{ + gAgent.standUp(); + return ECmdRet::Succeeded; +} + +// AddRem + +ECmdRet CommandHandlerBaseImpl<EParamType::AddRem>::processCommand(const RlvCommand& rlvCmd, BhvrHandlerFunc* pHandler, BhvrToggleHandlerFunc* pToggleHandler) +{ + auto param = rlvCmd.getParam(); + bool toggle = false; + if (param == "y") + toggle = true; + else if (param != "n") + return ECmdRet::FailedParam; + return (*pHandler)(rlvCmd, toggle); +} + +template<> template<> +ECmdRet BehaviourToggleHandler<EBehaviour::Sit>::onCommand(const RlvCommand& rlvCmd, bool& toggle) +{ + gAgent.setAllowedToSit(toggle); + return ECmdRet::Succeeded; +} + +template<> template<> +ECmdRet BehaviourToggleHandler<EBehaviour::Unsit>::onCommand(const RlvCommand& rlvCmd, bool& toggle) +{ + gAgent.setAllowedToStand(toggle); + if (gAgent.isSitting()) + LLPanelStandStopFlying::getInstance()->setVisibleStandButton(toggle); + return ECmdRet::Succeeded; +} + +template<> template<> +ECmdRet BehaviourToggleHandler<EBehaviour::Detach>::onCommand(const RlvCommand& rlvCmd, bool& toggle) +{ + gObjectList.findObject(rlvCmd.getObjectID())->setLocked(!toggle); + return ECmdRet::Succeeded; +} + // ============================================================================ diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index 7cb1473c8c..b4abbc04f3 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -50,10 +50,21 @@ BehaviourDictionary::BehaviourDictionary() // Reply-only // addEntry(new ReplyProcessor<EBehaviour::GetCommand>("getcommand")); + addEntry(new ReplyProcessor<EBehaviour::GetSitID>("getsitid")); addEntry(new ReplyProcessor<EBehaviour::Version, VersionReplyHandler>("version")); addEntry(new ReplyProcessor<EBehaviour::VersionNew, VersionReplyHandler>("versionnew")); addEntry(new ReplyProcessor<EBehaviour::VersionNum>("versionnum")); + // Force + addEntry(new ForceProcessor<EBehaviour::Sit>("sit")); + addEntry(new ForceProcessor<EBehaviour::SitGround>("sitground")); + addEntry(new ForceProcessor<EBehaviour::Unsit>("unsit")); + + // AddRem + addEntry(new BehaviourProcessor<EBehaviour::Sit>("sit")); + addEntry(new BehaviourProcessor<EBehaviour::Unsit>("unsit")); + addEntry(new BehaviourProcessor<EBehaviour::Detach>("detach")); + // Populate mString2InfoMap (the tuple <behaviour, type> should be unique) for (const BehaviourInfo* bhvr_info_p : mBhvrInfoList) { diff --git a/indra/newview/skins/contrast/textures/cloud-particle.j2c b/indra/newview/skins/contrast/textures/cloud-particle.j2c Binary files differdeleted file mode 100644 index 6c03bf6d05..0000000000 --- a/indra/newview/skins/contrast/textures/cloud-particle.j2c +++ /dev/null diff --git a/indra/newview/skins/contrast/textures/cloud-particle.png b/indra/newview/skins/contrast/textures/cloud-particle.png Binary files differnew file mode 100644 index 0000000000..f2080ddb9f --- /dev/null +++ b/indra/newview/skins/contrast/textures/cloud-particle.png diff --git a/indra/newview/skins/contrast/textures/textures.xml b/indra/newview/skins/contrast/textures/textures.xml index f824816183..1fe1ff333a 100644 --- a/indra/newview/skins/contrast/textures/textures.xml +++ b/indra/newview/skins/contrast/textures/textures.xml @@ -796,7 +796,7 @@ with the same filename but different name <texture name="script_error.j2c" use_mips="true" /> <texture name="silhouette.j2c" use_mips="true" /> <texture name="foot_shadow.j2c" use_mips="true" /> - <texture name="cloud-particle.j2c" use_mips="true" /> + <texture name="cloud-particle.png" use_mips="true" /> <texture name="transparent.j2c" use_mips="true" /> <!--WARNING OLD ART BELOW *do not use*--> diff --git a/indra/newview/skins/default/textures/cloud-particle.j2c b/indra/newview/skins/default/textures/cloud-particle.j2c Binary files differdeleted file mode 100644 index 6c03bf6d05..0000000000 --- a/indra/newview/skins/default/textures/cloud-particle.j2c +++ /dev/null diff --git a/indra/newview/skins/default/textures/cloud-particle.png b/indra/newview/skins/default/textures/cloud-particle.png Binary files differnew file mode 100644 index 0000000000..f2080ddb9f --- /dev/null +++ b/indra/newview/skins/default/textures/cloud-particle.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index f824816183..1fe1ff333a 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -796,7 +796,7 @@ with the same filename but different name <texture name="script_error.j2c" use_mips="true" /> <texture name="silhouette.j2c" use_mips="true" /> <texture name="foot_shadow.j2c" use_mips="true" /> - <texture name="cloud-particle.j2c" use_mips="true" /> + <texture name="cloud-particle.png" use_mips="true" /> <texture name="transparent.j2c" use_mips="true" /> <!--WARNING OLD ART BELOW *do not use*--> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index 5041fb4878..f1a38dc894 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -55,13 +55,24 @@ width="350" /> <check_box + control_name="ShowSelectionBeam" + height="16" + enabled="true" + label="Show selection particle beam when selecting or interacting with objects" + layout="topleft" + left="30" + name="selection_beam_visibility" + top_pad="15" + width="350" /> + + <check_box height="16" enabled="false" label="Only friends and groups know I'm online" layout="topleft" left="30" name="online_visibility" - top_pad="30" + top_pad="15" width="350" /> <check_box |