diff --git a/indra/llcommon/llstl.h b/indra/llcommon/llstl.h index 105b69d34..9f49fcbf5 100644 --- a/indra/llcommon/llstl.h +++ b/indra/llcommon/llstl.h @@ -203,7 +203,6 @@ inline T* get_ptr_in_map(const std::map& inmap, const K& key) template inline bool is_in_map(const std::map& inmap, const K& key) { - typedef typename std::map::const_iterator map_iter; if(inmap.find(key) == inmap.end()) { return false; diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index fb18720b3..61f8f21bc 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -15151,6 +15151,17 @@ This should be as low as possible, but too low may break functionality Value 0 + UseTypingBubbles + + Comment + Show typing indicator in avatar nametags + Persist + 1 + Type + Boolean + Value + 0 + UseDebugMenus Comment diff --git a/indra/newview/ascentprefschat.cpp b/indra/newview/ascentprefschat.cpp index 599ab0c66..f24724279 100644 --- a/indra/newview/ascentprefschat.cpp +++ b/indra/newview/ascentprefschat.cpp @@ -329,6 +329,7 @@ void LLPrefsAscentChat::refreshValues() mHideTypingNotification = gSavedSettings.getBOOL("AscentHideTypingNotification"); mShowGroupNameInChatIM = gSavedSettings.getBOOL("OptionShowGroupNameInChatIM"); mShowDisplayNameChanges = gSavedSettings.getBOOL("ShowDisplayNameChanges"); + mUseTypingBubbles = gSavedSettings.getBOOL("UseTypingBubbles"); mPlayTypingSound = gSavedSettings.getBOOL("PlayTypingSound"); mHideNotificationsInChat = gSavedSettings.getBOOL("HideNotificationsInChat"); mEnableMUPose = gSavedSettings.getBOOL("AscentAllowMUpose"); @@ -545,6 +546,7 @@ void LLPrefsAscentChat::cancel() gSavedSettings.setBOOL("AscentHideTypingNotification", mHideTypingNotification); gSavedSettings.setBOOL("OptionShowGroupNameInChatIM", mShowGroupNameInChatIM); gSavedSettings.setBOOL("ShowDisplayNameChanges", mShowDisplayNameChanges); + gSavedSettings.setBOOL("UseTypingBubbles", mUseTypingBubbles); gSavedSettings.setBOOL("PlayTypingSound", mPlayTypingSound); gSavedSettings.setBOOL("HideNotificationsInChat", mHideNotificationsInChat); gSavedSettings.setBOOL("AscentAllowMUpose", mEnableMUPose); diff --git a/indra/newview/ascentprefschat.h b/indra/newview/ascentprefschat.h index 291645b42..04fa1a69c 100644 --- a/indra/newview/ascentprefschat.h +++ b/indra/newview/ascentprefschat.h @@ -66,6 +66,7 @@ protected: BOOL mHideTypingNotification; BOOL mShowGroupNameInChatIM; bool mShowDisplayNameChanges; + bool mUseTypingBubbles; BOOL mPlayTypingSound; BOOL mHideNotificationsInChat; BOOL mEnableMUPose; diff --git a/indra/newview/hippogridmanager.cpp b/indra/newview/hippogridmanager.cpp index df5a6ebbc..93168da88 100644 --- a/indra/newview/hippogridmanager.cpp +++ b/indra/newview/hippogridmanager.cpp @@ -58,6 +58,7 @@ HippoGridInfo::HippoGridInfo(const std::string& gridName) : mAutoUpdate(false), mMaxAgentGroups(-1), mCurrencySymbol("OS$"), + mCurrencyText("OS Dollars"), mRealCurrencySymbol("US$"), mDirectoryFee(30), mUPCSupported(false) @@ -90,6 +91,7 @@ void HippoGridInfo::setPlatform(Platform platform) if (mPlatform == PLATFORM_SECONDLIFE) { mCurrencySymbol = "L$"; + mCurrencyText = "Linden Dollars"; } } @@ -221,6 +223,11 @@ void HippoGridInfo::setCurrencySymbol(const std::string& sym) mCurrencySymbol = sym.substr(0, 3); } +void HippoGridInfo::setCurrencyText(const std::string& text) +{ + mCurrencyText = text; +} + void HippoGridInfo::setRealCurrencySymbol(const std::string& sym) { mRealCurrencySymbol = sym.substr(0, 3); diff --git a/indra/newview/hippogridmanager.h b/indra/newview/hippogridmanager.h index 92ddd95b4..9562d563f 100644 --- a/indra/newview/hippogridmanager.h +++ b/indra/newview/hippogridmanager.h @@ -61,6 +61,7 @@ public: int getMaxAgentGroups() const { return mMaxAgentGroups; } const std::string& getCurrencySymbol() const { return mCurrencySymbol; } + const std::string& getCurrencyText() const { return mCurrencyText; } const std::string& getRealCurrencySymbol() const { return mRealCurrencySymbol; } std::string getUploadFee() const; std::string getGroupCreationFee() const; @@ -87,6 +88,7 @@ public: bool getUPCSupported(); void setCurrencySymbol(const std::string& sym); + void setCurrencyText(const std::string& text); void setRealCurrencySymbol(const std::string& sym); void setDirectoryFee(int fee); bool supportsInvLinks(); @@ -124,6 +126,7 @@ private: int mMaxAgentGroups; std::string mCurrencySymbol; + std::string mCurrencyText; std::string mRealCurrencySymbol; int mDirectoryFee; std::string mGridMessage; diff --git a/indra/newview/linux_tools/client-readme-voice.txt b/indra/newview/linux_tools/client-readme-voice.txt index 23a42f484..aa04a5704 100644 --- a/indra/newview/linux_tools/client-readme-voice.txt +++ b/indra/newview/linux_tools/client-readme-voice.txt @@ -4,14 +4,20 @@ Second Life - Linux Voice Support README WHAT IS IT? -=-=-=-=-=- -Linux Voice Support is a new feature in testing which allows users -of the Linux Second Life client to participate in voice-chat with other -residents and groups inside Second Life, with an appropriate -headset/microphone. +Linux Voice Support is a feature in testing which allows users of the Linux +Second Life client to participate in voice-chat with other residents and +groups inside Second Life, with an appropriate headset/microphone. Linux Voice Support is currently EXPERIMENTAL and is known to still have some compatibility issues. +SINGULARITY MULTI-VOICE +-=-=-=-=-=-=-=-=-=-=-=- +Singularity multi-voice is an experimental feature that allows you to run multiple +SLVoice daemons at the same time, in order to do this, the debug setting VoiceMultiInstance +must be TRUE, this allows multiple instances of the viewer to run concurrently and +each connect to voice. + REQUIREMENTS -=-=-=-=-=-= @@ -29,6 +35,13 @@ systems: * Fedora Core 6 with (unknown) audio chipset * Ubuntu 8.04 (Hardy) with (unknown) audio chipset +TESTING YOUR SETTINGS +-=-=-=-=-=-=-=-=-=-=- + +* The Second Life region 'Voice Echo Canyon' is a great place for testing +your hardware settings and quality - it will 'echo' your voice back to you +when you speak. + KNOWN PROBLEMS -=-=-=-=-=-=-= @@ -41,12 +54,12 @@ TROUBLESHOOTING PROBLEM 1: I don't see a white dot over the head of my avatar or other Voice-using avatars. SOLUTION: -a. Ensure that 'Enable voice chat' is enabled in the Voice Chat - preferences window and that you are in a voice-enabled area (you - will see a blue headphone icon in the SL menu-bar). +a. Ensure that 'Enable voice chat' is enabled in the 'Voice Chat' section of the + Preferences window, and that you are in a voice-enabled area + (you will see a blue headphone icon in the SL menu-bar). b. If the above does not help, exit Second Life and ensure that any remaining 'SLVoice' processes (as reported by 'ps', 'top' or similar) - are killed. + are killed before restarting. PROBLEM 2: I have a white dot over my head but I never see (or hear!) anyone except myself listed in the Active Speakers dialog when I'm sure that other @@ -65,12 +78,13 @@ c. Update to the latest version of ALSA manually. For a guide, see the PROBLEM 3: I can hear other people, but they cannot hear me. SOLUTION: -a. Ensure that you have the 'Talk' button activated while you are trying to - speak. +a. Ensure that you have the 'Talk' button (at the bottom of the Second Life + window)activated while you are trying to speak. b. Ensure that your microphone jack is inserted into the correct socket of your sound card, where appropriate. -c. Use your system mixer-setting program or the 'alsamixer' program to ensure - that microphone input is set as the active input source and is not muted. +c. Use your system mixer-setting program (such as the PulseAudio 'volume + control' applet or the ALSA 'alsamixer' program) to ensure that microphone + input is set as the active input source and is not muted. d. Verify that audio input works in other applications, i.e. Audacity PROBLEM 4: Other people just hear bursts of loud noise when I speak. diff --git a/indra/newview/linux_tools/client-readme.txt b/indra/newview/linux_tools/client-readme.txt index 99c973f7e..f9f60c833 100644 --- a/indra/newview/linux_tools/client-readme.txt +++ b/indra/newview/linux_tools/client-readme.txt @@ -15,7 +15,7 @@ Life itself - please see . 5.3. Blank window after minimizing it 5.4. Audio 5.5. 'Alt' key for camera controls doesn't work - 5.6. In-world streaming movie/music playback + 5.6. In-world streaming movie, music and Flash playback 6. Advanced Troubleshooting 6.1. Audio 6.2. OpenGL @@ -75,10 +75,11 @@ Life Linux client is very similar to that for Windows, as detailed at: 3. INSTALLING & RUNNING -=-=-=-=-=-=-=-=-=-=-=- -The Second Life Linux client entirely runs out of the directory you have -unpacked it into - no installation step is required. +The Singularity Linux client can entirely run from the directory you have +unpacked it into - no installation step is required. If you wish to +perform a separate installation step anyway, you may run './install.sh' -Run ./secondlife from the installation directory to start Second Life. +Run ./singularity from the installation directory to start Singularity. For in-world MOVIE and MUSIC PLAYBACK, you will need (32-bit) GStreamer 0.10 installed on your system. This is optional - it is not required for general @@ -168,12 +169,15 @@ SOLUTION:- Some window managers eat the Alt key for their own purposes; you example, the 'Windows' key!) which will allow the Alt key to function properly with mouse actions in Second Life and other applications. -PROBLEM 6:- In-world movie and/or music playback doesn't work for me. +PROBLEM 6:- In-world movie, music, or Flash playback doesn't work for me. SOLUTION:- You need to have a working installation of GStreamer 0.10; this is usually an optional package for most versions of Linux. If you have installed GStreamer 0.10 and you can play some music/movies but not others then you need to install a wider selection of GStreamer plugins, either - from your vendor or an appropriate third party. + from your vendor (i.e. the 'Ugly' plugins) or an appropriate third party. + For Flash playback, you need to have Flash 10 installed for your normal + web browser (for example, Firefox). PulseAudio is required for Flash + volume control / muting to fully function inside Second Life. 6. ADVANCED TROUBLESHOOTING diff --git a/indra/newview/linux_tools/install.sh b/indra/newview/linux_tools/install.sh new file mode 100644 index 000000000..86d020671 --- /dev/null +++ b/indra/newview/linux_tools/install.sh @@ -0,0 +1,106 @@ +#!/bin/bash + +# Install Singularity Viewer. This script can install the viewer both +# system-wide and for an individual user. + +VT102_STYLE_NORMAL='\E[0m' +VT102_COLOR_RED='\E[31m' + +SCRIPTSRC=`readlink -f "$0" || echo "$0"` +RUN_PATH=`dirname "${SCRIPTSRC}" || echo .` +tarball_path=${RUN_PATH} + +function prompt() +{ + local prompt=$1 + local input + + echo -n "$prompt" + + while read input; do + case $input in + [Yy]* ) + return 1 + ;; + [Nn]* ) + return 0 + ;; + * ) + echo "Please enter yes or no." + echo -n "$prompt" + esac + done +} + +function die() +{ + warn $1 + exit 1 +} + +function warn() +{ + echo -n -e $VT102_COLOR_RED + echo $1 + echo -n -e $VT102_STYLE_NORMAL +} + +function homedir_install() +{ + warn "You are not running as a privileged user, so you will only be able" + warn "to install Singularity Viewer in your home directory. If you" + warn "would like to install Singularity Viewer system-wide, please run" + warn "this script as the root user, or with the 'sudo' command." + echo + + prompt "Proceed with the installation? [Y/N]: " + if [[ $? == 0 ]]; then + exit 0 + fi + + install_to_prefix "$HOME/.singularity-install" + $HOME/.singularity-install/refresh_desktop_app_entry.sh +} + +function root_install() +{ + local default_prefix="/opt/singularity-install" + + echo -n "Enter the desired installation directory [${default_prefix}]: "; + read + if [[ "$REPLY" = "" ]] ; then + local install_prefix=$default_prefix + else + local install_prefix=$REPLY + fi + + install_to_prefix "$install_prefix" + + mkdir -p /usr/local/share/applications + ${install_prefix}/refresh_desktop_app_entry.sh +} + +function install_to_prefix() +{ + test -e "$1" && backup_previous_installation "$1" + mkdir -p "$1" || die "Failed to create installation directory!" + + echo " - Installing to $1" + + cp -a "${tarball_path}"/* "$1/" || die "Failed to complete the installation!" +} + +function backup_previous_installation() +{ + local backup_dir="$1".backup-$(date -I) + echo " - Backing up previous installation to $backup_dir" + + mv "$1" "$backup_dir" || die "Failed to create backup of existing installation!" +} + + +if [ "$UID" == "0" ]; then + root_install +else + homedir_install +fi diff --git a/indra/newview/linux_tools/refresh_desktop_app_entry.sh b/indra/newview/linux_tools/refresh_desktop_app_entry.sh new file mode 100644 index 000000000..9412c840c --- /dev/null +++ b/indra/newview/linux_tools/refresh_desktop_app_entry.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +SCRIPTSRC=`readlink -f "$0" || echo "$0"` +RUN_PATH=`dirname "${SCRIPTSRC}" || echo .` + +install_prefix=${RUN_PATH} + +function install_desktop_entry() +{ + local installation_prefix="$1" + local desktop_entries_dir="$2" + + local desktop_entry="\ +[Desktop Entry]\n\ +Name=Singularity\n\ +Comment=Client for Online Virtual Worlds, such as Second Life\n\ +Exec=${installation_prefix}/singularity\n\ +Icon=${installation_prefix}/singularity_icon.png\n\ +Terminal=false\n\ +Type=Application\n\ +Categories=Application;Network;\n\ +StartupNotify=true\n\ +X-Desktop-File-Install-Version=3.0" + + echo " - Installing menu entries in ${desktop_entries_dir}" + mkdir -vp "${desktop_entries_dir}" + echo -e $desktop_entry > "${desktop_entries_dir}/singularity-viewer.desktop" || "Failed to install application menu!" +} + +if [ "$UID" == "0" ]; then + # system-wide + install_desktop_entry "$install_prefix" /usr/local/share/applications +else + # user-specific + install_desktop_entry "$install_prefix" "$HOME/.local/share/applications" +fi diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index e406e3c71..ff7fc48ae 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -4,10 +4,10 @@ ## These options are for self-assisted troubleshooting during this beta ## testing phase; you should not usually need to touch them. -## - Avoids using any OpenAL audio driver. -#export LL_BAD_OPENAL_DRIVER=x ## - Avoids using any FMOD Ex audio driver. #export LL_BAD_FMODEX_DRIVER=x +## - Avoids using any OpenAL audio driver. +#export LL_BAD_OPENAL_DRIVER=x ## - Avoids using any FMOD audio driver. #export LL_BAD_FMOD_DRIVER=x @@ -20,7 +20,6 @@ ## - Avoids using the FMOD or FMOD Ex ESD audio driver. #export LL_BAD_FMOD_ESD=x - ## - Avoids the optional OpenGL extensions which have proven most problematic ## on some hardware. Disabling this option may cause BETTER PERFORMANCE but ## may also cause CRASHES and hangs on some unstable combinations of drivers @@ -109,6 +108,10 @@ cd "${RUN_PATH}" # Re-register the secondlife:// protocol handler every launch, for now. ./register_secondlifeprotocol.sh + +# Re-register the application with the desktop system every launch, for now. +./refresh_desktop_app_entry.sh + ## Before we mess with LD_LIBRARY_PATH, save the old one to restore for ## subprocesses that care. export SAVED_LD_LIBRARY_PATH="${LD_LIBRARY_PATH}" @@ -147,16 +150,11 @@ fi export SL_CMD='$LL_WRAPPER bin/$VIEWER_BINARY' export SL_OPT="`cat gridargs.dat` $@" -# Run the program +# Run the program. eval ${SL_ENV} ${SL_CMD} ${SL_OPT} || LL_RUN_ERR=runerr # Handle any resulting errors -if [ -n "$LL_RUN_ERR" ]; then - LL_RUN_ERR_MSG="" - if [ "$LL_RUN_ERR" = "runerr" ]; then - # generic error running the binary - echo '*** Bad shutdown. ***' - - - fi +if [ -n "$LL_RUN_ERR" = "runerr" ]; then + # generic error running the binary + echo '*** Bad shutdown. ***' fi diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 77a0558f1..de8da30e6 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -3,10 +3,9 @@ * @brief Processes responses received for asset upload requests. * * $LicenseInfo:firstyear=2007&license=viewergpl$ - * + * Second Life Viewer Source Code * Copyright (c) 2007-2009, Linden Research, Inc. * - * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -53,7 +52,6 @@ #include "llviewerobject.h" #include "llviewercontrol.h" #include "llviewerobjectlist.h" -#include "llviewermenufile.h" #include "llviewertexlayer.h" #include "llviewerwindow.h" #include "lltrans.h" @@ -255,6 +253,7 @@ void LLAssetUploadResponder::result(const LLSD& content) lldebugs << "LLAssetUploadResponder::result from capabilities" << llendl; std::string state = content["state"]; + if (state == "upload") { uploadUpload(content); @@ -343,6 +342,7 @@ void LLNewAgentInventoryResponder::error(U32 statusNum, const std::string& reaso //LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, LLUUID(), FALSE); } + //virtual void LLNewAgentInventoryResponder::uploadFailure(const LLSD& content) { @@ -351,6 +351,7 @@ void LLNewAgentInventoryResponder::uploadFailure(const LLSD& content) (*mCallBack)(false, mUserData); } LLAssetUploadResponder::uploadFailure(content); + //LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, content["new_asset"], FALSE); } @@ -397,10 +398,14 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content) // continue uploading for bulk uploads - if (!gUploadQueue.empty()) + /* Singu Note: sUploadQueue was never getting populated, anywhere! Therefore, this entire block never was reached. + ** I have condensed it to here in the hopes it may one day see use. Apparently, it came in with Siana's prep work + ** for mesh upload (697dd7e9298282590f8cf858a58335f70302532b), but we never needed it. + static std::deque sUploadQueue; + if (!sUploadQueue.empty()) { - std::string next_file = gUploadQueue.front(); - gUploadQueue.pop_front(); + std::string next_file = sUploadQueue.front(); + sUploadQueue.pop_front(); if (next_file.empty()) return; std::string name = gDirUtilp->getBaseFileName(next_file, true); @@ -448,6 +453,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content) expected_upload_cost, userdata); } + */ } LLSendTexLayerResponder::LLSendTexLayerResponder(const LLSD& post_data, @@ -698,6 +704,7 @@ void LLUpdateTaskInventoryResponder::uploadComplete(const LLSD& content) } } + ///////////////////////////////////////////////////// // LLNewAgentInventoryVariablePriceResponder::Impl // ///////////////////////////////////////////////////// @@ -1165,3 +1172,4 @@ void LLNewAgentInventoryVariablePriceResponder::showConfirmationDialog( boost::intrusive_ptr(this))); } } + diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index d01185294..1d4c39294 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -772,7 +772,7 @@ void LLPanelPermissions::refresh() { childSetEnabled("checkbox allow export", false); if (!gHippoGridManager->getCurrentGrid()->isSecondLife()) - childSetVisible("checkbox allow export", false); + childSetVisible("checkbox allow export", true); } if (has_change_sale_ability && (owner_mask_on & PERM_TRANSFER)) diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 44a0a45db..d276909d3 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -1002,6 +1002,7 @@ bool idle_startup() if(!gHippoGridManager->getConnectedGrid()->isSecondLife()) { LLTrans::setDefaultArg("[CURRENCY]",gHippoGridManager->getConnectedGrid()->getCurrencySymbol()); //replace [CURRENCY] with OS$, not L$ for instance. + LLTrans::setDefaultArg("[CURRENCY_TEXT]",gHippoGridManager->getConnectedGrid()->getCurrencyText()); //replace [CURRENCYTEXT] with OS DOllars, not Linden Dollars for instance. LLTrans::setDefaultArg("[SECOND_LIFE]", gHippoGridManager->getConnectedGrid()->getGridName()); LLTrans::setDefaultArg("[SECOND_LIFE_GRID]", gHippoGridManager->getConnectedGrid()->getGridName() + " Grid"); LLTrans::setDefaultArg("[GRID_OWNER]", gHippoGridManager->getConnectedGrid()->getGridOwner()); @@ -4378,6 +4379,8 @@ bool process_login_success_response(std::string& password) if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setSearchUrl(tmp); tmp = response["currency"].asString(); if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setCurrencySymbol(tmp); + tmp = response["currency_text"].asString(); + if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setCurrencyText(tmp); tmp = response["real_currency"].asString(); if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setRealCurrencySymbol(tmp); tmp = response["directory_fee"].asString(); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 5d3f97dc9..7492ea725 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -3,10 +3,9 @@ * @brief "File" menu in the main menu bar. * * $LicenseInfo:firstyear=2002&license=viewergpl$ - * + * Second Life Viewer Source Code * Copyright (c) 2002-2009, Linden Research, Inc. * - * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -64,11 +63,9 @@ #include "lltrans.h" #include "llfloaterbuycurrency.h" // -#include "llselectmgr.h" +#include "floaterlocalassetbrowse.h" #include "llassettype.h" #include "llinventorytype.h" -#include "llbvhloader.h" -#include "lllocalinventory.h" // // linden libraries @@ -90,12 +87,9 @@ #include #include "hippogridmanager.h" -#include "importtracker.h" using namespace LLOldEvents; -std::deque gUploadQueue; - typedef LLMemberListener view_listener_t; @@ -512,6 +506,15 @@ class LLFileMinimizeAllWindows : public view_listener_t return true; } }; + +class LLFileLocalAssetBrowser : public view_listener_t +{ + bool handleEvent(LLPointer, const LLSD&) + { + FloaterLocalAssetBrowser::show(0); + return true; + } +}; // class LLFileSavePreview : public view_listener_t @@ -610,20 +613,6 @@ class LLFileTakeSnapshotToDisk : public view_listener_t } }; -class LLFileLogOut : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - std::string command(gDirUtilp->getExecutableDir() + gDirUtilp->getDirDelimiter() + gDirUtilp->getExecutableFilename()); - gSavedSettings.setBOOL("ShowConsoleWindow", FALSE); - gViewerWindow->getWindow()->ShellEx(command); - gSavedSettings.setBOOL("ShowConsoleWindow", FALSE); - LLAppViewer::instance()->userQuit(); - gSavedSettings.setBOOL("ShowConsoleWindow", FALSE); - return true; - } -}; - class LLFileQuit : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -706,7 +695,7 @@ void upload_new_resource(const std::string& src_filename, std::string name, "No file extension for the file: '%s'\nPlease make sure the file has a correct file extension", short_name.c_str()); args["FILE"] = short_name; - upload_error(error_message, "NofileExtension", filename, args); + upload_error(error_message, "NoFileExtension", filename, args); return; } else if (codec == IMG_CODEC_J2C) @@ -1002,16 +991,10 @@ void temp_upload_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt perms->setMaskEveryone(PERM_ALL); perms->setMaskGroup(PERM_ALL); perms->setMaskNext(PERM_ALL); - - LLUUID destination = gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE); - BOOL bUseSystemInventory = (gSavedSettings.getBOOL("AscentUseSystemFolder") && gSavedSettings.getBOOL("AscentSystemTemporary")); - if (bUseSystemInventory) - { - destination = gSystemFolderAssets; - } + LLViewerInventoryItem* item = new LLViewerInventoryItem( item_id, - destination, + gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE), *perms, uuid, (LLAssetType::EType)data->mAssetInfo.mType, @@ -1021,16 +1004,10 @@ void temp_upload_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt LLSaleInfo::DEFAULT, 0, time_corrected()); - if (bUseSystemInventory) - { - LLLocalInventory::addItem(item); - } - else - { - item->updateServer(TRUE); - gInventory.updateItem(item); - gInventory.notifyObservers(); - } + + item->updateServer(TRUE); + gInventory.updateItem(item); + gInventory.notifyObservers(); } else { @@ -1139,40 +1116,44 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt data = NULL; } -static LLAssetID upload_new_resource_prep(const LLTransactionID& tid, - LLAssetType::EType asset_type, - LLInventoryType::EType& inventory_type, - std::string& name, - const std::string& display_name, - std::string& description) +static LLAssetID upload_new_resource_prep( + const LLTransactionID& tid, + LLAssetType::EType asset_type, + LLInventoryType::EType& inventory_type, + std::string& name, + const std::string& display_name, + std::string& description) { LLAssetID uuid = generate_asset_id_for_new_upload(tid); increase_new_upload_stats(asset_type); - assign_defaults_and_show_upload_message(asset_type, - inventory_type, - name, - display_name, - description); + assign_defaults_and_show_upload_message( + asset_type, + inventory_type, + name, + display_name, + description); return uuid; } -LLSD generate_new_resource_upload_capability_body(LLAssetType::EType asset_type, - const std::string& name, - const std::string& desc, - LLFolderType::EType destination_folder_type, - LLInventoryType::EType inv_type, - U32 next_owner_perms, - U32 group_perms, - U32 everyone_perms) +LLSD generate_new_resource_upload_capability_body( + LLAssetType::EType asset_type, + const std::string& name, + const std::string& desc, + LLFolderType::EType destination_folder_type, + LLInventoryType::EType inv_type, + U32 next_owner_perms, + U32 group_perms, + U32 everyone_perms) { LLSD body; - body["folder_id"] = gInventory.findCategoryUUIDForType(destination_folder_type == LLFolderType::FT_NONE ? - LLFolderType::assetTypeToFolderType(asset_type) : - destination_folder_type); + body["folder_id"] = gInventory.findCategoryUUIDForType( + destination_folder_type == LLFolderType::FT_NONE ? + LLFolderType::assetTypeToFolderType(asset_type) : + destination_folder_type); body["asset_type"] = LLAssetType::lookup(asset_type); body["inventory_type"] = LLInventoryType::lookup(inv_type); @@ -1185,28 +1166,36 @@ LLSD generate_new_resource_upload_capability_body(LLAssetType::EType asset_type, return body; } -bool upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type, - std::string name, - std::string desc, S32 compression_info, - LLFolderType::EType destination_folder_type, - LLInventoryType::EType inv_type, - U32 next_owner_perms, - U32 group_perms, - U32 everyone_perms, - const std::string& display_name, - LLAssetStorage::LLStoreAssetCallback callback, - S32 expected_upload_cost, - void *userdata, - void (*callback2)(bool, void*)) +bool upload_new_resource( + const LLTransactionID &tid, + LLAssetType::EType asset_type, + std::string name, + std::string desc, + S32 compression_info, + LLFolderType::EType destination_folder_type, + LLInventoryType::EType inv_type, + U32 next_owner_perms, + U32 group_perms, + U32 everyone_perms, + const std::string& display_name, + LLAssetStorage::LLStoreAssetCallback callback, + S32 expected_upload_cost, + void *userdata, + void (*callback2)(bool, void*)) { if(gDisconnected) { return false; } - - LLAssetID uuid = upload_new_resource_prep(tid, asset_type, inv_type, - name, display_name, desc); + LLAssetID uuid = + upload_new_resource_prep( + tid, + asset_type, + inv_type, + name, + display_name, + desc); llinfos << "*** Uploading: " << "\nType: " << LLAssetType::lookup(asset_type) << "\nUUID: " << uuid @@ -1226,6 +1215,7 @@ bool upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty // { llinfos << "New Agent Inventory via capability" << llendl; + LLSD body; body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type); body["asset_type"] = LLAssetType::lookup(asset_type); @@ -1237,8 +1227,15 @@ bool upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty body["everyone_mask"] = LLSD::Integer(everyone_perms); body["expected_upload_cost"] = LLSD::Integer(expected_upload_cost); - LLHTTPClient::post(url, body, - new LLNewAgentInventoryResponder(body, uuid, asset_type, callback2, userdata)); + LLHTTPClient::post( + url, + body, + new LLNewAgentInventoryResponder( + body, + uuid, + asset_type, + callback2, + userdata)); } else { @@ -1284,12 +1281,14 @@ bool upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty { asset_callback = callback; } - gAssetStorage->storeAssetData(data->mAssetInfo.mTransactionID, data->mAssetInfo.mType, - asset_callback, - (void*)data, - temporary, - TRUE, - temporary); + gAssetStorage->storeAssetData( + data->mAssetInfo.mTransactionID, + data->mAssetInfo.mType, + asset_callback, + (void*)data, + temporary, + TRUE, + temporary); } // Return true when a call to a callback function will follow. @@ -1340,6 +1339,7 @@ void assign_defaults_and_show_upload_message(LLAssetType::EType asset_type, } LLStringUtil::stripNonprintable(name); LLStringUtil::stripNonprintable(description); + if (name.empty()) { name = "(No Name)"; @@ -1355,6 +1355,7 @@ void assign_defaults_and_show_upload_message(LLAssetType::EType asset_type, LLUploadDialog::modalUploadDialog(upload_message); } + void init_menu_file() { (new LLFileUploadImage())->registerListener(gMenuHolder, "File.UploadImage"); @@ -1368,13 +1369,13 @@ void init_menu_file() (new LLFileEnableCloseAllWindows())->registerListener(gMenuHolder, "File.EnableCloseAllWindows"); // (new LLFileMinimizeAllWindows())->registerListener(gMenuHolder, "File.MinimizeAllWindows"); + (new LLFileLocalAssetBrowser())->registerListener(gMenuHolder, "File.LocalAssetBrowser"); // (new LLFileSavePreview())->registerListener(gMenuHolder, "File.SavePreview"); (new LLFileSavePreviewPNG())->registerListener(gMenuHolder, "File.SavePreviewPNG"); (new LLFileTakeSnapshot())->registerListener(gMenuHolder, "File.TakeSnapshot"); (new LLFileTakeSnapshotToDisk())->registerListener(gMenuHolder, "File.TakeSnapshotToDisk"); (new LLFileQuit())->registerListener(gMenuHolder, "File.Quit"); - (new LLFileLogOut())->registerListener(gMenuHolder, "File.LogOut"); (new LLFileEnableUpload())->registerListener(gMenuHolder, "File.EnableUpload"); (new LLFileEnableUploadModel())->registerListener(gMenuHolder, "File.EnableUploadModel"); diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h index 426a5a4bf..65ff1a425 100644 --- a/indra/newview/llviewermenufile.h +++ b/indra/newview/llviewermenufile.h @@ -48,8 +48,6 @@ class NewResourceItemCallback : public LLInventoryCallback class LLTransactionID; -extern std::deque gUploadQueue; - void init_menu_file(); void upload_new_resource(const std::string& src_filename, diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 63068994a..d930cec27 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -1238,6 +1238,7 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam } if (gSavedSettings.getBOOL("ShowInInventory") && + objects.size() == 1 && item != NULL && asset_type != LLAssetType::AT_CALLINGCARD && item->getInventoryType() != LLInventoryType::IT_ATTACHMENT && !from_name.empty()) diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 1044f1f59..843c9ad81 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2830,14 +2830,17 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last) static const LLCachedControl NAME_SHOW_TIME("RenderNameShowTime",10); // seconds static const LLCachedControl FADE_DURATION("RenderNameFadeDuration",1); // seconds static const LLCachedControl use_chat_bubbles("UseChatBubbles",false); + static const LLCachedControl use_typing_bubbles("UseTypingBubbles"); static const LLCachedControl render_name_hide_self("RenderNameHideSelf",false); static const LLCachedControl allow_nameplate_override ("CCSAllowNameplateOverride", true); -// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.0b +// [RLVa:KB] - Checked: 2010-04-04 (RLVa-1.2.2a) | Added: RLVa-0.2.0b bool fRlvShowNames = gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES); // [/RLVa:KB] BOOL visible_avatar = isVisible() || mNeedsAnimUpdate; BOOL visible_chat = use_chat_bubbles && (mChats.size() || mTyping); + bool visible_typing = use_typing_bubbles && mTyping; BOOL render_name = visible_chat || + visible_typing || (visible_avatar && // [RLVa:KB] - Checked: 2010-04-04 (RLVa-1.2.2a) | Added: RLVa-1.0.0h ( (!fRlvShowNames) || (RlvSettings::getShowNameTags()) ) && @@ -2871,6 +2874,11 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last) mVisibleChat = visible_chat; new_name = TRUE; } + if (visible_typing != mVisibleTyping) + { + mVisibleTyping = visible_typing; + new_name = true; + } // [RLVa:KB] - Checked: 2010-04-04 (RLVa-1.2.2a) | Added: RLVa-0.2.0b if (fRlvShowNames) @@ -2895,7 +2903,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last) if (mAppAngle > 5.f) { const F32 START_FADE_TIME = NAME_SHOW_TIME - FADE_DURATION; - if (!visible_chat && sRenderName == RENDER_NAME_FADE && time_visible > START_FADE_TIME) + if (!visible_chat && !visible_typing && sRenderName == RENDER_NAME_FADE && time_visible > START_FADE_TIME) { alpha = 1.f - (time_visible - START_FADE_TIME) / FADE_DURATION; } @@ -3271,7 +3279,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) new_name = TRUE; } - if (mVisibleChat) + if (mVisibleChat || mVisibleTyping) { mNameText->setFont(LLFontGL::getFontSansSerif()); mNameText->setTextAlignment(LLHUDNameTag::ALIGN_TEXT_LEFT); @@ -3281,6 +3289,8 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) mNameText->clearString(); LLColor4 new_chat = gColors.getColor( "AvatarNameColor" ); + if (mVisibleChat) + { LLColor4 normal_chat = lerp(new_chat, LLColor4(0.8f, 0.8f, 0.8f, 1.f), 0.7f); LLColor4 old_chat = lerp(normal_chat, LLColor4(0.6f, 0.6f, 0.6f, 1.f), 0.7f); if (mTyping && mChats.size() >= MAX_BUBBLE_CHAT_UTTERANCES) @@ -3320,6 +3330,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) mNameText->addLine(chat_iter->mText, old_chat, style); } } + } mNameText->setVisibleOffScreen(TRUE); if (mTyping) @@ -3351,7 +3362,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) void LLVOAvatar::addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font) { llassert(mNameText); - if (mVisibleChat) + if (mVisibleChat || mVisibleTyping) { mNameText->addLabel(line); } diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index b4f8f12f0..90d9bcd62 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -814,6 +814,7 @@ public: void stopTyping() { mTyping = FALSE; mIdleTimer.reset();} private: BOOL mVisibleChat; + bool mVisibleTyping; //-------------------------------------------------------------------- // Lip synch morphs diff --git a/indra/newview/skins/default/xui/en-us/floater_chat_history.xml b/indra/newview/skins/default/xui/en-us/floater_chat_history.xml index 6686a2ce8..08f266608 100644 --- a/indra/newview/skins/default/xui/en-us/floater_chat_history.xml +++ b/indra/newview/skins/default/xui/en-us/floater_chat_history.xml @@ -1,6 +1,6 @@ - + Connecting to in-world Voice Chat... Connected Voice not available at your current location @@ -23,10 +23,10 @@ Teleport you Control your camera Override your default animations - - - - + + + + Gestures @@ -34,8 +34,8 @@