Merge Firestorm LGPL tip

master
Ansariel 2016-02-13 16:29:21 +01:00
commit 824a1b359e
686 changed files with 14680 additions and 20883 deletions

View File

@ -27,9 +27,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>0890dfd190d37071c18e83aabb2f2216</string>
<string>11f68fef2c94128237baf110bf6e4ee6</string>
<key>url</key>
<string>http://downloads.phoenixviewer.com/slplugin_x86-4.7.6.48379-darwin-201601091057-r1.tar.bz2</string>
<string>http://downloads.phoenixviewer.com/slplugin_x86-4.7.6.48584-darwin-201601201757-r2.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@ -675,9 +675,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>10f4a24948b129e342e908609e65dd66</string>
<string>cba1feed7f6bb671d791a517fddf205a</string>
<key>url</key>
<string>file:///opt/firestorm/fmodex-44456-darwin-201508061336-r22.tar.bz2</string>
<string>file:///opt/firestorm/fmodex-44461-darwin-201601300040-r23.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@ -687,9 +687,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>2e1b76fa4f9b42679ca5e97c57d1006b</string>
<string>9b090869508fabee82dc53cae977fb99</string>
<key>url</key>
<string>file:///opt/firestorm/fmodex-44456-linux-201508111340-r22.tar.bz2</string>
<string>file:///opt/firestorm/fmodex-44461-linux-201601282301-r23.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@ -699,9 +699,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>5108a6a9d2f77f6bc1a0a44e7288dc97</string>
<string>5b1b5ce866afd2a74e445af1fffe6a8b</string>
<key>url</key>
<string>file:///c:/cygwin/opt/firestorm/fmodex-44456-windows-201508061143-r22.tar.bz2</string>
<string>file:///c:/cygwin/opt/firestorm/fmodex-44461-windows-201601282252-r23.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@ -1725,11 +1725,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>dfe9f826fd4a25878d7c002076a0c85e</string>
<string>82779518d3079508ecdafe708e003aaf</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://downloads.phoenixviewer.com/llceflib-1.5.1.309177-darwin-309177-fs.tar.bz2</string>
<string>http://downloads.phoenixviewer.com/llceflib-1.5.3.201601201743-r174-darwin-201601201743-r174.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@ -1739,11 +1739,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>b7e6e8cf0ad6a16d7da56e524d6a33a4</string>
<string>7d12fe9dff388d237615f7158315d1cb</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://downloads.phoenixviewer.com/llceflib-1.0-windows-201601151441-r42.tar.bz2</string>
<string>http://downloads.phoenixviewer.com/llceflib-1.0-windows-201602081454-r54.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@ -1753,11 +1753,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>03fd572a7536d96fe34272fd30b34bac</string>
<string>cb4f8508b0212056c7a67967d668467f</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://downloads.phoenixviewer.com/llceflib-1.0-linux-201601151414-r42.tar.bz2</string>
<string>http://downloads.phoenixviewer.com/llceflib-1.0-linux-201602081446-r54.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@ -3486,6 +3486,7 @@
<array>
<string>--fmodex</string>
<string>--kdu</string>
<string>--quicktime</string>
<string>--version</string>
<string>--platform win32</string>
</array>
@ -3522,6 +3523,7 @@
<array>
<string>--fmodex</string>
<string>--kdu</string>
<string>--quicktime</string>
<string>--version</string>
<string>--platform win32</string>
</array>

View File

@ -10,6 +10,7 @@
# WINDOWS - Windows
set(NDTARGET_ARCH "x86" CACHE STRING "Build 64 or 32 bit viewer. Defaults to 32 bit.")
set(ND_USE_OPENJPEG2 OFF CACHE BOOL "Use OpenJPEG 2.1 instead of 1.4. Default off.")
if( ${NDTARGET_ARCH} STREQUAL "x64" )
set( ND_BUILD64BIT_ARCH ON )
@ -38,11 +39,11 @@ set(INCREMENTAL_LINK OFF CACHE BOOL "Use incremental linking on win32 builds (en
# <FS:ND> When building for Linux x64 we enable building the media plugins, in all other cases we use the prebuild 32 bit packages
# set(ENABLE_MEDIA_PLUGINS ON CACHE BOOL "Turn off building media plugins if they are imported by third-party library mechanism")
if (ND_BUILD64BIT_ARCH AND ${CMAKE_SYSTEM_NAME} MATCHES "Windows" )
if (ND_BUILD64BIT_ARCH AND (${CMAKE_SYSTEM_NAME} MATCHES "Windows" OR ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") )
set( ENABLE_MEDIA_PLUGINS OFF CACHE FORCE "Build with media plugins" )
else (ND_BUILD64BIT_ARCH AND ${CMAKE_SYSTEM_NAME} MATCHES "Windows" )
else (ND_BUILD64BIT_ARCH AND (${CMAKE_SYSTEM_NAME} MATCHES "Windows" OR ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") )
set(ENABLE_MEDIA_PLUGINS ON CACHE BOOL "Turn off building media plugins if they are imported by third-party library mechanism")
endif (ND_BUILD64BIT_ARCH AND ${CMAKE_SYSTEM_NAME} MATCHES "Windows" )
endif (ND_BUILD64BIT_ARCH AND (${CMAKE_SYSTEM_NAME} MATCHES "Windows" OR ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") )
# </FS:ND>
if(LIBS_CLOSED_DIR)

View File

@ -15,7 +15,7 @@ if (NOT USESYSTEMLIBS)
# use_prebuilt_binary( slplugin_x86 )
use_prebuilt_binary( wix )
elseif( DARWIN )
# use_prebuilt_binary( slplugin_x86 )
use_prebuilt_binary( slplugin_x86 )
endif()
endif( ND_BUILD64BIT_ARCH )
endif(NOT USESYSTEMLIBS)

View File

@ -237,7 +237,6 @@ set(llcommon_HEADER_FILES
SET( llcommon_ND_SOURCE_FILES
nd/ndexceptions.cpp
nd/ndfile.cpp
nd/ndintrin.cpp
nd/ndlogthrottle.cpp
nd/ndetw.cpp
@ -245,7 +244,6 @@ SET( llcommon_ND_SOURCE_FILES
SET( llcommon_ND_HEADER_FILES
nd/ndboolswitch.h
nd/ndexceptions.h
nd/ndfile.h
nd/ndintrin.h
nd/ndlocks.h
nd/ndlogthrottle.h

View File

@ -32,19 +32,12 @@
#include "llthreadlocalstorage.h"
apr_pool_t *gAPRPoolp = NULL; // Global APR memory pool
// <FS:ND> moved LLAPRFile into a namespace, so we can toggle the implementation without much fuss
//LLVolatileAPRPool *LLAPRFile::sAPRFilePoolp = NULL ; //global volatile APR memory pool.
LLVolatileAPRPool *ll::apr::LLAPRFile::sAPRFilePoolp = NULL ; //global volatile APR memory pool.
// </FS:ND>
LLVolatileAPRPool *LLAPRFile::sAPRFilePoolp = NULL ; //global volatile APR memory pool.
apr_thread_mutex_t *gLogMutexp = NULL;
apr_thread_mutex_t *gCallStacksLogMutexp = NULL;
const S32 FULL_VOLATILE_APR_POOL = 1024 ; //number of references to LLVolatileAPRPool
std::string ndConvertFilename( std::string const &aFilename ); // <FS:ND/> Porper UTF-8 filename handling under windows.
bool gAPRInitialized = false;
void ll_init_apr()
@ -61,13 +54,9 @@ void ll_init_apr()
apr_thread_mutex_create(&gCallStacksLogMutexp, APR_THREAD_MUTEX_UNNESTED, gAPRPoolp);
}
// if(!LLAPRFile::sAPRFilePoolp)
// {
// LLAPRFile::sAPRFilePoolp = new LLVolatileAPRPool(FALSE) ;
// }
if(!ll::apr::LLAPRFile::sAPRFilePoolp)
if(!LLAPRFile::sAPRFilePoolp)
{
ll::apr::LLAPRFile::sAPRFilePoolp = new LLVolatileAPRPool(FALSE) ;
LLAPRFile::sAPRFilePoolp = new LLVolatileAPRPool(FALSE) ;
}
LLThreadLocalPointerBase::initAllThreadLocalStorage();
@ -110,15 +99,10 @@ void ll_cleanup_apr()
apr_pool_destroy(gAPRPoolp);
gAPRPoolp = NULL;
}
// if (LLAPRFile::sAPRFilePoolp)
// {
// delete LLAPRFile::sAPRFilePoolp ;
// LLAPRFile::sAPRFilePoolp = NULL ;
// }
if (ll::apr::LLAPRFile::sAPRFilePoolp)
if (LLAPRFile::sAPRFilePoolp)
{
delete ll::apr::LLAPRFile::sAPRFilePoolp ;
ll::apr::LLAPRFile::sAPRFilePoolp = NULL ;
delete LLAPRFile::sAPRFilePoolp ;
LLAPRFile::sAPRFilePoolp = NULL ;
}
apr_terminate();
}
@ -322,7 +306,7 @@ bool ll_apr_warn_status(apr_status_t status)
if(APR_SUCCESS == status) return false;
char buf[MAX_STRING]; /* Flawfinder: ignore */
apr_strerror(status, buf, sizeof(buf));
LL_WARNS("APR") << "APR status " << status << ": " << buf << LL_ENDL;
LL_WARNS("APR") << "APR: " << buf << LL_ENDL;
return true;
}
@ -334,7 +318,7 @@ bool ll_apr_warn_status(apr_status_t status, apr_dso_handle_t *handle)
// stores the output in a fixed 255-character internal buffer. (*sigh*)
char buf[MAX_STRING]; /* Flawfinder: ignore */
apr_dso_error(handle, buf, sizeof(buf));
LL_WARNS("APR") << "APR status " << status << ": " << buf << LL_ENDL;
LL_WARNS("APR") << "APR: " << buf << LL_ENDL;
return result;
}
@ -348,7 +332,6 @@ void ll_apr_assert_status(apr_status_t status, apr_dso_handle_t *handle)
llassert(! ll_apr_warn_status(status, handle));
}
namespace ll { namespace apr {
//---------------------------------------------------------------------
//
// LLAPRFile functions
@ -398,13 +381,7 @@ apr_status_t LLAPRFile::open(const std::string& filename, apr_int32_t flags, LLV
llassert_always(!mCurrentFilePoolp) ;
apr_pool_t* apr_pool = pool ? pool->getVolatileAPRPool() : NULL ;
// <FS:ND> Convert filenames with UTF-8 charaters into a shortfilename (8.3) if running under windows
// s = apr_file_open(&mFile, filename.c_str(), flags, APR_OS_DEFAULT, getAPRFilePool(apr_pool));
s = apr_file_open(&mFile, ndConvertFilename(filename).c_str(), flags, APR_OS_DEFAULT, getAPRFilePool(apr_pool));
// </FS:ND>
s = apr_file_open(&mFile, filename.c_str(), flags, APR_OS_DEFAULT, getAPRFilePool(apr_pool));
if (s != APR_SUCCESS || !mFile)
{
@ -452,7 +429,7 @@ apr_status_t LLAPRFile::open(const std::string& filename, apr_int32_t flags, BOO
llassert_always(!mCurrentFilePoolp) ;
llassert_always(use_global_pool) ; //be aware of using gAPRPoolp.
s = apr_file_open(&mFile, ndConvertFilename(filename).c_str(), flags, APR_OS_DEFAULT, gAPRPoolp);
s = apr_file_open(&mFile, filename.c_str(), flags, APR_OS_DEFAULT, gAPRPoolp);
if (s != APR_SUCCESS || !mFile)
{
mFile = NULL ;
@ -555,7 +532,7 @@ apr_file_t* LLAPRFile::open(const std::string& filename, LLVolatileAPRPool* pool
pool = pool ? pool : LLAPRFile::sAPRFilePoolp ;
s = apr_file_open(&file_handle, ndConvertFilename(filename).c_str(), flags, APR_OS_DEFAULT, pool->getVolatileAPRPool());
s = apr_file_open(&file_handle, filename.c_str(), flags, APR_OS_DEFAULT, pool->getVolatileAPRPool());
if (s != APR_SUCCESS || !file_handle)
{
ll_apr_warn_status(s);
@ -705,13 +682,8 @@ bool LLAPRFile::remove(const std::string& filename, LLVolatileAPRPool* pool)
if (s != APR_SUCCESS)
{
if (!APR_STATUS_IS_ENOENT(s))
{
// We only care about the error if it's not because
// the file doesn't exist.
ll_apr_warn_status(s);
LL_WARNS("APR") << " Attempting to remove filename: " << filename << LL_ENDL;
}
ll_apr_warn_status(s);
LL_WARNS("APR") << " Attempting to remove filename: " << filename << LL_ENDL;
return false;
}
return true;
@ -742,7 +714,7 @@ bool LLAPRFile::isExist(const std::string& filename, LLVolatileAPRPool* pool, ap
apr_status_t s;
pool = pool ? pool : LLAPRFile::sAPRFilePoolp ;
s = apr_file_open(&apr_file, ndConvertFilename(filename).c_str(), flags, APR_OS_DEFAULT, pool->getVolatileAPRPool());
s = apr_file_open(&apr_file, filename.c_str(), flags, APR_OS_DEFAULT, pool->getVolatileAPRPool());
if (s != APR_SUCCESS || !apr_file)
{
@ -765,7 +737,7 @@ S32 LLAPRFile::size(const std::string& filename, LLVolatileAPRPool* pool)
apr_status_t s;
pool = pool ? pool : LLAPRFile::sAPRFilePoolp ;
s = apr_file_open(&apr_file, ndConvertFilename(filename).c_str(), APR_READ, APR_OS_DEFAULT, pool->getVolatileAPRPool());
s = apr_file_open(&apr_file, filename.c_str(), APR_READ, APR_OS_DEFAULT, pool->getVolatileAPRPool());
if (s != APR_SUCCESS || !apr_file)
{
@ -837,10 +809,9 @@ void LLAPRFile::flush()
apr_file_flush( mFile );
}
// </FS:ND>
} }
// <FS:ND> Special case for UTF-8 filenames under windows. As we cannot pass UTF-16 filenames into apr use a shortfilename, those are always ASCII
// </FS:ND>
namespace nd { namespace aprhelper {
std::string ndConvertFilename( std::string const &aFilename )
{
#ifdef LL_WINDOWS
@ -848,15 +819,15 @@ std::string ndConvertFilename( std::string const &aFilename )
std::string::const_iterator itr = std::find_if( aFilename.begin(), aFilename.end(), [&]( char const & aVal ){ return aVal < 0; } );
if( aFilename.end() == itr )
return aFilename;
wchar_t aShort[ MAX_PATH ] = {0};
DWORD nRes = ::GetShortPathNameW( utf8str_to_utf16str( aFilename ).c_str(), aShort, _countof( aShort ) );
if( nRes == 0 || nRes >= _countof( aShort ) )
return aFilename;
return utf16str_to_utf8str( aShort );
#else
return aFilename;
#endif
}
// </FS:ND>
}}

View File

@ -204,8 +204,6 @@ typedef LLAtomic32<S32> LLAtomicS32;
#define LL_APR_RPB (APR_READ|APR_WRITE|APR_BINARY) // "r+b"
#define LL_APR_WPB (APR_CREATE|APR_TRUNCATE|APR_READ|APR_WRITE|APR_BINARY) // "w+b"
namespace ll { namespace apr {
//
//apr_file manager
//which: 1)only keeps one file open;
@ -218,6 +216,7 @@ namespace ll { namespace apr {
// 1, a temporary pool passed to an APRFile function, which is used within this function and only once.
// 2, a global pool.
//
class LL_COMMON_API LLAPRFile : boost::noncopyable
{
// make this non copyable since a copy closes the file
@ -279,10 +278,11 @@ public:
//*******************************************************************************************************************************
};
} }
#include "nd/ndfile.h"
//typedef ll::apr::LLAPRFile LLAPRFile;
typedef nd::apr::ndFile LLAPRFile;
namespace nd
{
namespace aprhelper
{
std::string LL_COMMON_API ndConvertFilename( std::string const &aFilename );
}
}
#endif // LL_LLAPR_H

View File

@ -507,6 +507,40 @@ LLProcessPtr LLProcess::create(const LLSDOrParams& params)
}
}
// <FS:ND> Annoying preload hack to make tcmalloc in libcef.so play nicely.
std::string installPreloadHack( std::string const &preload )
{
std::string strOldPreload;
#ifdef LL_LINUX
if( preload.size() )
{
std::string strPreload = preload;
if( getenv( "LD_PRELOAD" ) )
{
strOldPreload = getenv( "PRELOAD" );
strPreload = ":" + strOldPreload;
}
setenv( "LD_PRELOAD", strPreload.c_str(), 1 );
}
#endif
return strOldPreload;
}
void uninstallPreloadHack( std::string const &preload, std::string const &strOldPreload )
{
#ifdef LL_LINUX
if( preload.empty() )
return;
if( strOldPreload.size() )
setenv( "LD_PRELOAD", strOldPreload.c_str(), 1 );
else
unsetenv( "LD_PRELOAD" );
#endif
}
// </FS:ND>
/// Call an apr function returning apr_status_t. On failure, log warning and
/// throw LLProcessError mentioning the function call that produced that
/// result.
@ -672,15 +706,20 @@ LLProcess::LLProcess(const LLSDOrParams& params):
// terminate with a null pointer
argv.push_back(NULL);
std::string strOldPreload = installPreloadHack( params.preload ); // FS:ND/> Install preload hack (if needed)
// Launch! The NULL would be the environment block, if we were passing
// one. Hand-expand chkapr() macro so we can fill in the actual command
// string instead of the variable names.
if (ll_apr_warn_status(apr_proc_create(&mProcess, argv[0], &argv[0], NULL, procattr,
gAPRPoolp)))
{
uninstallPreloadHack( params.preload, strOldPreload ); // <FS:ND/> Remove preload hack
throw LLProcessError(STRINGIZE(params << " failed"));
}
uninstallPreloadHack( params.preload, strOldPreload ); // <FS:ND/> Remove preload hack
// arrange to call status_callback()
apr_proc_other_child_register(&mProcess, &LLProcess::status_callback, this, mProcess.in,
gAPRPoolp);

View File

@ -227,6 +227,15 @@ public:
* executable name.
*/
Optional<std::string> desc;
/**
<FS:ND> HACK! libcef.so bleeds that intrusive tcmalloc hacks all over the process.
This then causes awesome effects like crashes and memory corruption when the so is loaded dynamically.
We uses this argument to force libcef.so be preloaded, which fixes this.
The other solution would be to recompile CEF twice (x86/x64) for each CEF update. Which I really would like to avoid.
*/
Optional<std::string> preload;
};
typedef LLSDParamAdapter<Params> LLSDOrParams;

View File

@ -1349,7 +1349,18 @@ BOOL gunzip_file(const std::string& srcfile, const std::string& dstfile)
LLFILE *dst = NULL;
S32 bytes = 0;
tmpfile = dstfile + ".t";
src = gzopen(srcfile.c_str(), "rb");
// <FS:ND> Proper UTF8->UTF16 handling for Windows
// src = gzopen(srcfile.c_str(), "rb");
#if LL_WINDOWS
std::string utf8filename = srcfile;
llutf16string utf16filename = utf8str_to_utf16str(utf8filename);
src = gzopen_w(utf16filename.c_str(), "rb");
#else
src = gzopen(srcfile.c_str(), "rb");/* Flawfinder: ignore */
#endif
// </FS:ND>
if (! src) goto err;
dst = LLFile::fopen(tmpfile, "wb"); /* Flawfinder: ignore */
if (! dst) goto err;
@ -1383,7 +1394,18 @@ BOOL gzip_file(const std::string& srcfile, const std::string& dstfile)
LLFILE *src = NULL;
S32 bytes = 0;
tmpfile = dstfile + ".t";
dst = gzopen(tmpfile.c_str(), "wb"); /* Flawfinder: ignore */
// <FS:ND> Proper UTF8->UTF16 handling for Windows
// dst = gzopen(tmpfile.c_str(), "wb"); /* Flawfinder: ignore */
#if LL_WINDOWS
std::string utf8filename = tmpfile;
llutf16string utf16filename = utf8str_to_utf16str(utf8filename);
dst = gzopen_w(utf16filename.c_str(), "wb");
#else
dst = gzopen(tmpfile.c_str(), "wb");/* Flawfinder: ignore */
#endif
// </FS:ND>
if (! dst) goto err;
src = LLFile::fopen(srcfile, "rb"); /* Flawfinder: ignore */
if (! src) goto err;

View File

@ -1,482 +0,0 @@
/**
* $LicenseInfo:firstyear=2013&license=fsviewerlgpl$
* Phoenix Firestorm Viewer Source Code
* Copyright (C) 2013, Nicky Dasmijn
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
* http://www.firestormviewer.org
* $/LicenseInfo$
*/
#include "ndfile.h"
#include "llerror.h"
#include "llfile.h"
#ifdef LL_WINDOWS
#include <io.h>
#else
#include <sys/file.h>
#endif
namespace nd
{
namespace apr
{
ndFile::ndFile()
: mFile(NULL)
{
}
ndFile::ndFile(const std::string& filename, apr_int32_t flags, ndVolatileAPRPool* pool)
: mFile(NULL)
{
open(filename, flags, pool);
}
ndFile::~ndFile()
{
close() ;
}
apr_status_t ndFile::close()
{
FILE *pFile(mFile);
mFile = 0;
return close( pFile, 0 );
}
apr_status_t ndFile::open(const std::string& filename, apr_int32_t flags, ndVolatileAPRPool* pool, S32* sizep)
{
return nd::aprhelper::ndOpenFile( filename, flags, mFile, sizep );
}
apr_status_t ndFile::open(const std::string& filename, apr_int32_t flags, BOOL use_global_pool)
{
return nd::aprhelper::ndOpenFile( filename, flags, mFile );
}
S32 ndFile::read(void *buf, S32 nbytes)
{
if( !mFile )
{
LL_WARNS() << "File is not open, cannot read" << LL_ENDL;
return 0;
}
S32 read = fread(buf, 1, nbytes, mFile );
if( nbytes != read )
{
LL_WARNS() << "Error when reading, wanted " << nbytes << " read " << read << LL_ENDL;
}
return read;
}
S32 ndFile::write(const void *buf, S32 nbytes)
{
if( !mFile )
{
LL_WARNS() << "File is not open, cannot write" << LL_ENDL;
return 0;
}
S32 written = fwrite( buf, 1, nbytes, mFile );
if( nbytes != written )
{
LL_WARNS() << "Error when writing, wanted " << nbytes << " wrote " << written << LL_ENDL;
}
return written;
}
void ndFile::flush()
{
if( mFile )
fflush( mFile );
}
S32 ndFile::seek(apr_seek_where_t where, S32 offset)
{
return ndFile::seek(mFile, where, offset) ;
}
apr_status_t ndFile::close(FILE* file_handle, ndVolatileAPRPool* pool)
{
if( 0 == LLFile::close( file_handle ) )
return APR_SUCCESS;
return APR_OS_START_SYSERR + errno;
}
FILE* ndFile::open(const std::string& filename, ndVolatileAPRPool* pool, apr_int32_t flags)
{
FILE *pFile(0);
if( APR_SUCCESS == nd::aprhelper::ndOpenFile( filename, flags, pFile ) && pFile )
return pFile;
return 0;
}
S32 ndFile::seek(FILE* file_handle, apr_seek_where_t where, S32 offset)
{
if( !file_handle )
return -1;
int seekStatus(0);
if( offset >= 0 )
seekStatus = fseek( file_handle, offset, nd::aprhelper::ndConvertSeekFlags( where ) );
else
seekStatus = fseek( file_handle, 0, SEEK_END );
if( 0 != seekStatus )
{
int err = errno;
LL_WARNS() << "Seek failed with errno " << err << LL_ENDL;
return -1;
}
S32 offsetNew = ftell( file_handle );
if( offset != 0 && SEEK_SET == nd::aprhelper::ndConvertSeekFlags( where ) && offset != offsetNew )
{
LL_WARNS() << "Seek failed, wanted offset " << offset << " got " << offsetNew << LL_ENDL;
}
return offsetNew;
}
S32 ndFile::readEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, ndVolatileAPRPool* pool)
{
FILE* file_handle = open(filename, pool, APR_READ|APR_BINARY);
if (!file_handle)
return 0;
llassert(offset >= 0);
if (offset > 0)
offset = ndFile::seek(file_handle, APR_SET, offset);
apr_size_t bytes_read;
if (offset < 0)
bytes_read = 0;
else
bytes_read = fread(buf, 1, nbytes, file_handle );
close(file_handle, pool);
if( nbytes != bytes_read )
{
LL_WARNS() << "Error when reading, wanted " << nbytes << " read " << bytes_read << " offset " << offset << LL_ENDL;
}
return (S32)bytes_read;
}
S32 ndFile::writeEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, ndVolatileAPRPool* pool)
{
apr_int32_t flags = APR_CREATE|APR_WRITE|APR_BINARY;
if (offset < 0)
{
flags |= APR_APPEND;
offset = 0;
}
FILE* file_handle = open(filename, pool, flags);
if (!file_handle)
return 0;
if (offset > 0)
offset = ndFile::seek(file_handle, APR_SET, offset);
apr_size_t bytes_written;
if (offset < 0)
bytes_written = 0;
else
bytes_written = fwrite(buf, 1, nbytes, file_handle );
ndFile::close(file_handle, pool);
if( nbytes != bytes_written )
LL_WARNS() << "Error when writing, wanted " << nbytes << " wrote " << bytes_written << " offset " << offset << LL_ENDL;
return (S32)bytes_written;
}
bool ndFile::remove(const std::string& filename, ndVolatileAPRPool* pool)
{
return 0 == LLFile::remove( filename );
}
bool ndFile::rename(const std::string& filename, const std::string& newname, ndVolatileAPRPool* pool)
{
return 0 == LLFile::rename( filename, newname );
}
bool ndFile::isExist(const std::string& filename, ndVolatileAPRPool* pool, apr_int32_t flags)
{
llstat oStat;
int nRes = LLFile::stat( filename, &oStat );
if( 0 == nRes )
return S_ISREG( oStat.st_mode );
return false;
}
S32 ndFile::size(const std::string& aFilename, ndVolatileAPRPool* pool)
{
llstat oStat;
int nRes = LLFile::stat( aFilename, &oStat );
if( 0 == nRes )
return oStat.st_size;
return 0;
}
bool ndFile::makeDir(const std::string& dirname, ndVolatileAPRPool* pool)
{
return 0 != LLFile::mkdir( dirname );
}
bool ndFile::removeDir(const std::string& dirname, ndVolatileAPRPool* pool)
{
return 0 == LLFile::rmdir( dirname );
}
}
}
namespace nd
{
namespace aprhelper
{
std::string ndConvertFilename( std::string const &aFilename )
{
#ifdef LL_WINDOWS
// For safety reason (don't change any behaviour) do nothing different if filename is already ASCII
std::string::const_iterator itr = std::find_if( aFilename.begin(), aFilename.end(), [&]( char const & aVal ){ return aVal < 0; } );
if( aFilename.end() == itr )
return aFilename;
wchar_t aShort[ MAX_PATH ] = {0};
DWORD nRes = ::GetShortPathNameW( utf8str_to_utf16str( aFilename ).c_str(), aShort, _countof( aShort ) );
if( nRes == 0 || nRes >= _countof( aShort ) )
return aFilename;
return utf16str_to_utf8str( aShort );
#else
return aFilename;
#endif
}
char const *openR = "r";
char const *openRB = "rb";
char const *openRP = "r+";
char const *openRBP = "rb+";
char const *openW = "w";
char const *openWB = "wb";
char const *openWP = "w+";
char const *openWBP = "wb+";
char const *openA = "a";
char const *openAB = "ab";
char const* ndConvertOpenFlags( apr_int32_t aFlags, std::string const &aFilename )
{
bool isBinary = (aFlags & APR_BINARY);
bool doCreate = (aFlags & APR_CREATE);
bool doTruncate = (aFlags & APR_TRUNCATE);
if( aFlags & APR_READ && aFlags & APR_WRITE )
{
if( doTruncate || !LLFile::isfile( aFilename ) )
{
if( isBinary )
return openWBP;
else
return openWP;
}
else
{
if( isBinary )
return openRBP;
else
return openRP;
}
}
if( aFlags & APR_READ )
{
if( isBinary )
return openRB;
else
return openR;
}
if( aFlags & APR_WRITE )
{
if( ( !doTruncate && LLFile::isfile( aFilename ) ) || !doCreate )
{
if( isBinary )
return openRBP;
else
return openRP;
}
else
{
if( isBinary )
return openWB;
else
return openW;
}
}
if( aFlags & APR_APPEND )
{
if( isBinary )
return openAB;
else
return openA;
}
return openR;
}
apr_status_t ndOpenFile( const std::string& aFilename, apr_int32_t aOpenflags, FILE *&aFileout, S32* aSizeout)
{
aFileout = 0;
if( aSizeout )
*aSizeout = 0;
apr_status_t s = APR_SUCCESS;
FILE *pFile = LLFile::fopen( aFilename, ndConvertOpenFlags( aOpenflags, aFilename ) );
if ( !pFile )
{
s = APR_OS_START_SYSERR + errno;
}
else if (aSizeout)
{
llstat oStat;
int nRes = LLFile::stat( aFilename, &oStat );
if ( 0 == nRes )
*aSizeout = oStat.st_size;
else
{
int err = errno;
LL_WARNS() << "stat for file " << aFilename << " failed with errno " << err << LL_ENDL;
}
}
aFileout = pFile;
return s;
}
}
}
int apr_file_close( FILE *aFile )
{
if( 0 == fclose( aFile ) )
return APR_SUCCESS;
return APR_OS_START_SYSERR+errno;
}
int apr_file_printf( FILE *aFile, char const *aFmt, ... )
{
va_list vaLst;
va_start( vaLst, aFmt );
int nPrinted = vfprintf( aFile, aFmt, vaLst );
va_end( vaLst );
if( nPrinted >= 0 )
return APR_SUCCESS;
return APR_OS_START_SYSERR+errno;
}
int apr_file_eof( FILE *aFile )
{
if( 0 == feof(aFile) )
return APR_SUCCESS;
else
return APR_EOF;
}
int apr_file_gets( char *aBuffer, U32 aMax, FILE *aFile )
{
if( fgets( aBuffer, aMax, aFile ) )
return APR_SUCCESS;
return APR_OS_START_SYSERR + ferror( aFile );
}
int apr_file_lock( FILE *aFile, int aLock )
{
#ifndef LL_WINDOWS
int fd = fileno( aFile );
if( -1 == fd )
return APR_OS_START_SYSERR + errno;
int lockType = LOCK_SH;
if( aLock & APR_FLOCK_EXCLUSIVE )
lockType = LOCK_EX;
if( aLock & APR_FLOCK_NONBLOCK )
lockType |= LOCK_NB;
int nRes;
do
{
nRes = flock( fd, lockType );
}
while( nRes && errno == EINTR );
if( 0 == nRes )
return APR_SUCCESS;
return APR_OS_START_SYSERR + errno;
#else
int fd = _fileno( aFile );
if( -1 == fd )
return APR_OS_START_SYSERR + errno;
HANDLE fHandle = reinterpret_cast<HANDLE>( _get_osfhandle( fd ) );
if( INVALID_HANDLE_VALUE == fHandle )
return APR_OS_START_SYSERR + errno;
DWORD lockType = 0;
if( aLock & APR_FLOCK_NONBLOCK )
lockType |= LOCKFILE_FAIL_IMMEDIATELY;
if( aLock & APR_FLOCK_EXCLUSIVE )
lockType |= LOCKFILE_EXCLUSIVE_LOCK;
OVERLAPPED oOverlapped;
memset( &oOverlapped, 0, sizeof( OVERLAPPED ) );
if( ::LockFileEx( fHandle, lockType, 0, 0, UINT_MAX, &oOverlapped ) )
return APR_SUCCESS;
return APR_OS_START_SYSERR + ::GetLastError();
#endif
}
int apr_file_read( FILE *aFile, void *aBuffer, apr_size_t *aLen )
{
llassert_always( aLen );
U32 nRead = fread( aBuffer, 1, *aLen, aFile );
if( 0 == nRead )
return APR_OS_START_SYSERR + ferror( aFile );
if( aLen )
*aLen = nRead;
return APR_SUCCESS;
}

View File

@ -1,123 +0,0 @@
#ifndef NDAPRFILEREPLACEMENT_H
#define NDAPRFILEREPLACEMENT_H
/**
* $LicenseInfo:firstyear=2013&license=fsviewerlgpl$
* Phoenix Firestorm Viewer Source Code
* Copyright (C) 2013, Nicky Dasmijn
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
* http://www.firestormviewer.org
* $/LicenseInfo$
*/
#include <boost/noncopyable.hpp>
#include <stdio.h>
#if LL_LINUX || LL_SOLARIS
#include <sys/param.h> // Need PATH_MAX in APR headers...
#endif
#include <boost/noncopyable.hpp>
#include "apr_thread_proc.h"
#include "apr_thread_mutex.h"
#include "apr_getopt.h"
#include "apr_signal.h"
#include "apr_atomic.h"
#include "llpreprocessor.h"
#include "llstring.h"
namespace nd
{
namespace apr
{
class LL_COMMON_API ndFile : boost::noncopyable
{
private:
FILE *mFile;
public:
typedef FILE tFiletype;
typedef void ndVolatileAPRPool;
ndFile() ;
ndFile(const std::string& filename, apr_int32_t flags, ndVolatileAPRPool* pool = NULL);
~ndFile() ;
apr_status_t open(const std::string& filename, apr_int32_t flags, ndVolatileAPRPool* pool = NULL, S32* sizep = NULL);
apr_status_t open(const std::string& filename, apr_int32_t flags, BOOL use_global_pool); //use gAPRPoolp.
apr_status_t close() ;
// Returns actual offset, -1 if seek fails
S32 seek(apr_seek_where_t where, S32 offset);
apr_status_t eof() { return feof(mFile)==0?APR_SUCCESS:APR_EOF;}
// Returns bytes read/written, 0 if read/write fails:
S32 read(void* buf, S32 nbytes);
S32 write(const void* buf, S32 nbytes);
void flush();
tFiletype* getFileHandle() {return mFile;}
private:
static FILE* open(const std::string& filename, ndVolatileAPRPool* pool, apr_int32_t flags);
static apr_status_t close(FILE* file, ndVolatileAPRPool* pool) ;
static S32 seek(FILE* file, apr_seek_where_t where, S32 offset);
public:
// returns false if failure:
static bool remove(const std::string& filename, ndVolatileAPRPool* pool = NULL);
static bool rename(const std::string& filename, const std::string& newname, ndVolatileAPRPool* pool = NULL);
static bool isExist(const std::string& filename, ndVolatileAPRPool* pool = NULL, apr_int32_t flags = APR_READ);
static S32 size(const std::string& filename, ndVolatileAPRPool* pool = NULL);
static bool makeDir(const std::string& dirname, ndVolatileAPRPool* pool = NULL);
static bool removeDir(const std::string& dirname, ndVolatileAPRPool* pool = NULL);
// Returns bytes read/written, 0 if read/write fails:
static S32 readEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, ndVolatileAPRPool* pool = NULL);
static S32 writeEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, ndVolatileAPRPool* pool = NULL); // offset<0 means append
//*******************************************************************************************************************************
};
}
}
int LL_COMMON_API apr_file_close( FILE* );
int LL_COMMON_API apr_file_printf( FILE*, char const*, ... );
int LL_COMMON_API apr_file_eof( FILE* );
int LL_COMMON_API apr_file_gets( char*, U32, FILE* );
int LL_COMMON_API apr_file_lock( FILE*, int );
int LL_COMMON_API apr_file_read( FILE*, void*, apr_size_t* );
namespace nd
{
namespace aprhelper
{
std::string LL_COMMON_API ndConvertFilename( std::string const &aFilename );
char const* LL_COMMON_API ndConvertOpenFlags( apr_int32_t, std::string const& );
inline bool ndIsCreateFile( apr_int32_t aFlags) { return APR_CREATE == ( aFlags & (APR_CREATE|APR_TRUNCATE) ); }
inline S32 ndConvertSeekFlags( apr_seek_where_t aWhere ) { return aWhere; }
inline apr_status_t ndOpenFile( const std::string& aFilename, apr_int32_t aOpenflags, FILE *&aFileout, S32* aSizeout = 0);
}
}
#endif

View File

@ -2600,10 +2600,7 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
}
}
F32 wsum = wght.mV[VX] + wght.mV[VY] + wght.mV[VZ] + wght.mV[VW];
// <FS:ND/> FIRE-17341 / BUG-10747 do allow weights of zero, or some rigged mesh will display broken.
// if (wsum <= 0.f)
if (wsum < 0.f)
if (wsum <= 0.f)
{
wght = LLVector4(0.99999f,0.f,0.f,0.f);
}

View File

@ -480,6 +480,14 @@ void LLPluginProcessParent::idle(void)
// Only argument to the launcher is the port number we're listening on
mProcessParams.args.add(stringize(mBoundPort));
#if LL_LINUX
if( mPluginFile.find( "cef" ) != std::string::npos && getenv( "FS_CEF_PRELOAD" ) )
{
mProcessParams.preload = getenv( "FS_CEF_PRELOAD" );
LL_INFOS( "Plugin" ) << "Forcing LD_PRELOAD for " << (std::string)mProcessParams.executable << " with a value of " << (std::string)mProcessParams.preload << LL_ENDL;
}
#endif
if (! (mProcess = LLProcess::create(mProcessParams)))
{
errorState();

View File

@ -673,7 +673,7 @@ U8 const* LLFontManager::loadFont( std::string const &aFilename, long &a_Size)
a_Size = oStat.st_size;
U8 *pBuffer = new U8[ a_Size ];
if( a_Size != nd::apr::ndFile::readEx( aFilename, pBuffer, 0, a_Size ) )
if( a_Size != LLAPRFile::readEx( aFilename, pBuffer, 0, a_Size ) )
{
a_Size = 0;
delete []pBuffer;

View File

@ -130,6 +130,13 @@ void LLGLTexture::setActive()
{
mTextureState = ACTIVE ;
}
// <FS:Ansariel> Try to plug the profile icon memory hole
if (mBoostLevel == BOOST_ICON)
{
setNoDelete();
}
// </FS:Ansariel>
}
//set the texture to stay in memory

View File

@ -724,7 +724,8 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
keyEvent(key_event, key, LLCEFLib::KM_MODIFIER_NONE, native_key_data);
#endif
#elif LL_WINDOWS
//#elif LL_WINDOWS // <FS:ND/> Windows & Linux
#else
std::string event = message_in.getValue("event");
S32 key = message_in.getValueS32("key");
std::string modifiers = message_in.getValue("modifiers");
@ -879,8 +880,7 @@ void MediaPluginCEF::deserializeKeyboardData(LLSD native_key_data, uint32_t& nat
//
void MediaPluginCEF::keyEvent(LLCEFLib::EKeyEvent key_event, int key, LLCEFLib::EKeyboardModifier modifiers_x, LLSD native_key_data = LLSD::emptyMap())
{
#if LL_DARWIN || LL_LINUX
#if LL_DARWIN
if (!native_key_data.has("event_type") ||
!native_key_data.has("event_modifiers") ||
!native_key_data.has("event_keycode") ||
@ -906,7 +906,43 @@ void MediaPluginCEF::keyEvent(LLCEFLib::EKeyEvent key_event, int key, LLCEFLib::
mLLCEFLib->nativeKeyboardEvent(msg, wparam, lparam);
#endif
};
// <FS:ND> Keyboard handling for Linux, code written by Henri Beauchamp
#if LL_LINUX
// The incoming values for 'key' will be the ones from indra_constants.h
std::string utf8_text;
if (key < 128)
{
// Low-ascii characters need to get passed through.
utf8_text = (char)key;
}
// Any special-case handling we want to do for particular keys...
switch ((KEY)key)
{
// ASCII codes for some standard keys
case KEY_BACKSPACE:utf8_text = (char)8;break;
case KEY_TAB:utf8_text = (char)9;break;
case KEY_RETURN:utf8_text = (char)13;break;
case KEY_PAD_RETURN:utf8_text = (char)13;break;
case KEY_ESCAPE:utf8_text = (char)27;break;
default:
break;
}
uint32_t native_scan_code = 0;
uint32_t native_virtual_key = 0;
uint32_t native_modifiers = 0;
deserializeKeyboardData(native_key_data, native_scan_code,
native_virtual_key, native_modifiers);
mLLCEFLib->keyboardEvent(key_event, (uint32_t)key, utf8_text.c_str(),
modifiers_x, native_scan_code, native_virtual_key,
native_modifiers);
#endif
// </FS:ND>
}
void MediaPluginCEF::unicodeInput(const std::string &utf8str, LLCEFLib::EKeyboardModifier modifiers, LLSD native_key_data = LLSD::emptyMap())
{

View File

@ -880,6 +880,7 @@ set(viewer_HEADER_FILES
fsblocklistmenu.h
fschathistory.h
fschatoptionsmenu.h
fsdispatchclassifiedclickthrough.h
fscommon.h
fsconsoleutils.h
fscontactsfriendsmenu.h
@ -2487,8 +2488,12 @@ if (DARWIN)
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
)
add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_cef mac-crash-logger)
add_dependencies(${VIEWER_BINARY_NAME} mac-crash-logger)
# <FS:TS> Allow disabling media plugins for 64-bit building
if (ENABLE_MEDIA_PLUGINS)
add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_cef mac-crash-logger)
else (ENABLE_MEDIA_PLUGINS)
add_dependencies(${VIEWER_BINARY_NAME} SLPlugin mac-crash-logger)
endif (ENABLE_MEDIA_PLUGINS)
if (ENABLE_SIGNING)
set(SIGNING_SETTING "--signature=${SIGNING_IDENTITY}")

View File

@ -415,8 +415,8 @@ void NACLFloaterExploreSounds::blacklistSound()
}
mBlacklistAvatarNameCacheConnections.erase(it);
}
mBlacklistAvatarNameCacheConnections[item.mOwnerID] =
LLAvatarNameCache::get(item.mOwnerID, boost::bind(&NACLFloaterExploreSounds::onBlacklistAvatarNameCacheCallback, this, _1, _2, item.mAssetID, region_name));
LLAvatarNameCache::callback_connection_t cb = LLAvatarNameCache::get(item.mOwnerID, boost::bind(&NACLFloaterExploreSounds::onBlacklistAvatarNameCacheCallback, this, _1, _2, item.mAssetID, region_name));
mBlacklistAvatarNameCacheConnections.insert(std::make_pair(item.mOwnerID, cb));
}
}

View File

@ -5437,6 +5437,17 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>FSUnlinkConfirmEnabled</key>
<map>
<key>Comment</key>
<string>Unlink confirmation dialog functionality enabled?</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>MinObjectsForUnlinkConfirm</key>
<map>
<key>Comment</key>
@ -12107,7 +12118,7 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Comment</key>
<string>Show selection outlines on objects</string>
<key>Persist</key>
<integer>0</integer>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
@ -23835,6 +23846,28 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>1</integer>
</map>
<key>FSSelectLockedOnly</key>
<map>
<key>Comment</key>
<string>Select only objects that are locked</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSDoNotHideMapOnTeleport</key>
<map>
<key>Comment</key>
<string>If enabled, the world map won't be closed when teleporting</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
</map>
</llsd>

View File

@ -172,3 +172,9 @@ class FSViewerManifest:
self.path( "compatibility.manifest", "llceflib_host.exe.manifest" )
self.end_prefix()
def fs_setuid_chromesandbox( self ):
filename = os.path.join( self.get_dst_prefix(), "bin", "chrome-sandbox" )
self.run_command( "chmod 755 %s" % ( filename) ) # Strip sticky bit that might be set (in case the following two commands fail)
self.run_command( "sudo -n chown root:root %s || exit 0" % ( filename) )
self.run_command( "sudo -n chmod 4755 %s || exit 0" % ( filename) )

View File

@ -112,6 +112,10 @@ FSAreaSearch::FSAreaSearch(const LLSD& key) :
mFilterDistance(false),
mFilterDistanceMin(0),
mFilterDistanceMax(999999),
mFilterPermCopy(false),
mFilterPermModify(false),
mFilterPermTransfer(false),
mFilterAgentParcelOnly(false),
mBeaconColor(),
mBeaconTextColor(),
mBeacons(false),
@ -836,6 +840,26 @@ void FSAreaSearch::matchObject(FSObjectProperties& details, LLViewerObject* obje
}
}
if (mFilterAgentParcelOnly && !LLViewerParcelMgr::instance().inAgentParcel(objectp->getPositionGlobal()))
{
return;
}
if (mFilterPermCopy && !(details.owner_mask & PERM_COPY))
{
return;
}
if (mFilterPermModify && !(details.owner_mask & PERM_MODIFY))
{
return;
}
if (mFilterPermTransfer && !(details.owner_mask & PERM_TRANSFER))
{
return;
}
//-----------------------------------------------------------------------
// Find text
//-----------------------------------------------------------------------
@ -2064,6 +2088,18 @@ BOOL FSPanelAreaSearchFilter::postBuild()
mCheckboxMoaP = getChild<LLCheckBoxCtrl>("filter_moap");
mCheckboxMoaP->setCommitCallback(boost::bind(&FSPanelAreaSearchFilter::onCommitCheckbox, this));
mCheckboxPermCopy = getChild<LLCheckBoxCtrl>("filter_perm_copy");
mCheckboxPermCopy->setCommitCallback(boost::bind(&FSPanelAreaSearchFilter::onCommitCheckbox, this));
mCheckboxPermModify = getChild<LLCheckBoxCtrl>("filter_perm_modify");
mCheckboxPermModify->setCommitCallback(boost::bind(&FSPanelAreaSearchFilter::onCommitCheckbox, this));
mCheckboxPermTransfer = getChild<LLCheckBoxCtrl>("filter_perm_transfer");
mCheckboxPermTransfer->setCommitCallback(boost::bind(&FSPanelAreaSearchFilter::onCommitCheckbox, this));
mCheckboxAgentParcelOnly = getChild<LLCheckBoxCtrl>("filter_agent_parcel_only");
mCheckboxAgentParcelOnly->setCommitCallback(boost::bind(&FSPanelAreaSearchFilter::onCommitCheckbox, this));
return LLPanel::postBuild();
}
@ -2124,6 +2160,12 @@ void FSPanelAreaSearchFilter::onCommitCheckbox()
mFSAreaSearch->setExcludeChildPrims(mCheckboxExcludeChildPrim->get());
mFSAreaSearch->setExcludeNeighborRegions(mCheckboxExcludeNeighborRegions->get());
mFSAreaSearch->setFilterPermCopy(mCheckboxPermCopy->get());
mFSAreaSearch->setFilterPermModify(mCheckboxPermModify->get());
mFSAreaSearch->setFilterPermTransfer(mCheckboxPermTransfer->get());
mFSAreaSearch->setFilterAgentParcelOnly(mCheckboxAgentParcelOnly->get());
}
void FSPanelAreaSearchFilter::onCommitSpin()

View File

@ -158,6 +158,12 @@ public:
void setFilterDistanceMin(S32 s) { mFilterDistanceMin = s; }
void setFilterDistanceMax(S32 s) { mFilterDistanceMax = s; }
void setFilterPermCopy(bool b) { mFilterPermCopy = b; }
void setFilterPermModify(bool b) { mFilterPermModify = b; }
void setFilterPermTransfer(bool b) { mFilterPermTransfer = b; }
void setFilterAgentParcelOnly(bool b) { mFilterAgentParcelOnly = b; }
bool isActive() { return mActive; }
private:
@ -243,6 +249,12 @@ private:
bool mFilterClickAction;
U8 mFilterClickActionType;
bool mFilterPermCopy;
bool mFilterPermModify;
bool mFilterPermTransfer;
bool mFilterAgentParcelOnly;
protected:
static void* createPanelList(void* data);
static void* createPanelFind(void* data);
@ -380,6 +392,10 @@ private:
LLCheckBoxCtrl* mCheckboxExcludetemporary;
LLCheckBoxCtrl* mCheckboxExcludeChildPrim;
LLCheckBoxCtrl* mCheckboxExcludeNeighborRegions;
LLCheckBoxCtrl* mCheckboxPermCopy;
LLCheckBoxCtrl* mCheckboxPermModify;
LLCheckBoxCtrl* mCheckboxPermTransfer;
LLCheckBoxCtrl* mCheckboxAgentParcelOnly;
};

View File

@ -399,17 +399,35 @@ public:
mSessionID = chat.mSessionID;
mSourceType = chat.mSourceType;
mType = chat.mChatType; // FS:LO FIRE-1439 - Clickable avatar names on local chat radar crossing reports
mNameStyleParams = style_params;
//*TODO overly defensive thing, source type should be maintained out there
if((chat.mFromID.isNull() && chat.mFromName.empty()) || (chat.mFromName == SYSTEM_FROM && chat.mFromID.isNull()))
{
mSourceType = CHAT_SOURCE_SYSTEM;
}
}
mUserNameFont = style_params.font();
LLTextBox* user_name = getChild<LLTextBox>("user_name");
user_name->setReadOnlyColor(style_params.readonly_color());
user_name->setColor(style_params.color());
// Use the original font defined in panel_chat_header.xml
mNameStyleParams.font.name = "SansSerifSmall";
// To be able to use the group chat moderator options, we use the
// original font style "BOLD" for everything except group chats.
// Group chats have the option to show moderators in bold, so
// we display both display and username in "NORMAL" for now.
static LLCachedControl<bool> fsHighlightGroupMods(gSavedSettings, "FSHighlightGroupMods");
LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(mSessionID);
if (!fsHighlightGroupMods || !session || !session->isGroupSessionType())
{
mNameStyleParams.font.style = "BOLD";
}
mUserNameFont = mNameStyleParams.font();
mUserNameTextBox->setReadOnlyColor(mNameStyleParams.readonly_color());
mUserNameTextBox->setColor(mNameStyleParams.color());
mUserNameTextBox->setFont(mUserNameFont);
// Make sure we use the correct font style for everything after the display name
mNameStyleParams.font.style = style_params.font.style;
if (chat.mFromName.empty()
//|| mSourceType == CHAT_SOURCE_SYSTEM
@ -417,12 +435,20 @@ public:
|| (mSourceType == CHAT_SOURCE_SYSTEM && mType != CHAT_TYPE_RADAR)
|| mAvatarID.isNull())
{
mFrom = LLTrans::getString("CURRENT_GRID");
if(!chat.mFromName.empty() && (mFrom != chat.mFromName))
if (mSourceType == CHAT_SOURCE_UNKNOWN)
{
mFrom += " (" + chat.mFromName + ")";
// Avatar names may come up as CHAT_SOURCE_UNKNOWN - don't append the grid name in that case
mFrom = chat.mFromName;
}
user_name->setValue(mFrom);
else
{
mFrom = LLTrans::getString("SECOND_LIFE"); // Will automatically be substituted!
if (!chat.mFromName.empty() && (mFrom != chat.mFromName))
{
mFrom += " (" + chat.mFromName + ")";
}
}
mUserNameTextBox->setValue(mFrom);
updateMinUserNameWidth();
}
else if ((mSourceType == CHAT_SOURCE_AGENT || (mSourceType == CHAT_SOURCE_SYSTEM && mType == CHAT_TYPE_RADAR))
@ -436,19 +462,19 @@ public:
// Start with blank so sample data from XUI XML doesn't
// flash on the screen
// user_name->setValue( LLSD() );
// fetchAvatarName(chat);
// fetchAvatarName();
// [RLVa:KB] - Checked: 2010-11-01 (RLVa-1.2.2a) | Added: RLVa-1.2.2a
if (!chat.mRlvNamesFiltered)
{
user_name->setValue( LLSD() );
mUserNameTextBox->setValue( LLSD() );
fetchAvatarName();
}
else
{
// If the agent's chat was subject to @shownames=n we should display their anonimized name
mFrom = chat.mFromName;
user_name->setValue(mFrom);
user_name->setToolTip(mFrom);
mUserNameTextBox->setValue(mFrom);
mUserNameTextBox->setToolTip(mFrom);
setToolTip(mFrom);
updateMinUserNameWidth();
}
@ -465,22 +491,21 @@ public:
username_end == (chat.mFromName.length() - 1))
{
mFrom = chat.mFromName.substr(0, username_start);
user_name->setValue(mFrom);
mUserNameTextBox->setValue(mFrom);
}
else
{
// If the agent's chat was subject to @shownames=n we should display their anonimized name
mFrom = chat.mFromName;
user_name->setValue(mFrom);
mUserNameTextBox->setValue(mFrom);
updateMinUserNameWidth();
}
// [/RLVa:KB]
}
else
{
// ...from an object, just use name as given
mFrom = chat.mFromName;
user_name->setValue(mFrom);
mUserNameTextBox->setValue(mFrom);
updateMinUserNameWidth();
}
@ -574,20 +599,17 @@ public:
/*virtual*/ void draw()
{
LLTextBox* user_name = mUserNameTextBox; //getChild<LLTextBox>("user_name");
LLTextBox* time_box = mTimeBoxTextBox; //getChild<LLTextBox>("time_box");
LLRect user_name_rect = user_name->getRect();
LLRect user_name_rect = mUserNameTextBox->getRect();
S32 user_name_width = user_name_rect.getWidth();
S32 time_box_width = time_box->getRect().getWidth();
S32 time_box_width = mTimeBoxTextBox->getRect().getWidth();
if (!time_box->getVisible() && user_name_width > mMinUserNameWidth)
if (!mTimeBoxTextBox->getVisible() && user_name_width > mMinUserNameWidth)
{
user_name_rect.mRight -= time_box_width;
user_name->reshape(user_name_rect.getWidth(), user_name_rect.getHeight());
user_name->setRect(user_name_rect);
mUserNameTextBox->reshape(user_name_rect.getWidth(), user_name_rect.getHeight());
mUserNameTextBox->setRect(user_name_rect);
time_box->setVisible(TRUE);
mTimeBoxTextBox->setVisible(TRUE);
}
LLPanel::draw();
@ -597,8 +619,7 @@ public:
{
if (mUserNameFont)
{
LLTextBox* user_name = getChild<LLTextBox>("user_name");
const LLWString& text = user_name->getWText();
const LLWString& text = mUserNameTextBox->getWText();
mMinUserNameWidth = mUserNameFont->getWidth(text.c_str()) + PADDING;
}
}
@ -629,7 +650,7 @@ protected:
// FS:LO FIRE-1439 - Clickable avatar names on local chat radar crossing reports
if(mAvatarID.notNull() && mSourceType == CHAT_SOURCE_AGENT)
showAvatarContextMenu(x,y);
if(mAvatarID.notNull() && mSourceType == CHAT_SOURCE_OBJECT && SYSTEM_FROM != mFrom)
if(mAvatarID.notNull() && mSourceType == CHAT_SOURCE_OBJECT)
showObjectContextMenu(x,y);
}
@ -650,7 +671,7 @@ protected:
if(menu)
{
bool is_friend = LLAvatarTracker::instance().getBuddyInfo(mAvatarID) != NULL;
bool is_friend = LLAvatarActions::isFriend(mAvatarID);
menu->setItemEnabled("Add Friend", !is_friend);
menu->setItemEnabled("Remove Friend", is_friend);
@ -700,7 +721,7 @@ protected:
void showInfoCtrl()
{
const bool isVisible = !mAvatarID.isNull() && !mFrom.empty() && CHAT_SOURCE_SYSTEM != mSourceType;
const bool isVisible = !mAvatarID.isNull() && !mFrom.empty() && (CHAT_SOURCE_SYSTEM != mSourceType || mType == CHAT_TYPE_RADAR);
// [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.2a) | Added: RLVa-1.2.0f
if (isVisible && mShowInfoCtrl)
// [/RLVa:KB]
@ -720,25 +741,22 @@ protected:
private:
void setTimeField(const LLChat& chat)
{
LLTextBox* time_box = getChild<LLTextBox>("time_box");
LLRect rect_before = mTimeBoxTextBox->getRect();
LLRect rect_before = time_box->getRect();
time_box->setValue(chat.mTimeStr);
mTimeBoxTextBox->setValue(chat.mTimeStr);
// set necessary textbox width to fit all text
time_box->reshapeToFitText();
LLRect rect_after = time_box->getRect();
mTimeBoxTextBox->reshapeToFitText();
LLRect rect_after = mTimeBoxTextBox->getRect();
// move rect to the left to correct position...
S32 delta_pos_x = rect_before.getWidth() - rect_after.getWidth();
S32 delta_pos_y = rect_before.getHeight() - rect_after.getHeight();
time_box->translate(delta_pos_x, delta_pos_y);
mTimeBoxTextBox->translate(delta_pos_x, delta_pos_y);
//... & change width of the name control
LLView* user_name = getChild<LLView>("user_name");
const LLRect& user_rect = user_name->getRect();
user_name->reshape(user_rect.getWidth() + delta_pos_x, user_rect.getHeight());
const LLRect& user_rect = mUserNameTextBox->getRect();
mUserNameTextBox->reshape(user_rect.getWidth() + delta_pos_x, user_rect.getHeight());
}
void fetchAvatarName()
@ -760,9 +778,8 @@ private:
mFrom = av_name.getDisplayName();
LLTextBox* user_name = getChild<LLTextBox>("user_name");
user_name->setValue( LLSD(mFrom) );
user_name->setToolTip( av_name.getUserName() );
mUserNameTextBox->setValue( LLSD(mFrom) );
mUserNameTextBox->setToolTip( av_name.getUserName() );
if (gSavedSettings.getBOOL("NameTagShowUsernames") &&
av_name.useDisplayNames() &&
@ -772,9 +789,9 @@ private:
LLColor4 userNameColor = LLUIColorTable::instance().getColor("EmphasisColor");
style_params_name.color(userNameColor);
style_params_name.font.name("SansSerifSmall");
style_params_name.font.style("NORMAL");
style_params_name.font.style(mNameStyleParams.font.style);
style_params_name.readonly_color(userNameColor);
user_name->appendText(" - " + av_name.getUserNameForDisplay(), false, style_params_name);
mUserNameTextBox->appendText(" - " + av_name.getUserNameForDisplay(), false, style_params_name);
}
setToolTip( av_name.getUserName() );
// name might have changed, update width
@ -787,7 +804,7 @@ protected:
LLUICtrl* mInfoCtrl;
LLUUID mAvatarID;
LLUUID mAvatarID;
LLSD mObjectData;
EChatSourceType mSourceType;
EChatType mType; // FS:LO FIRE-1439 - Clickable avatar names on local chat radar crossing reports
@ -801,7 +818,9 @@ protected:
S32 mMinUserNameWidth;
const LLFontGL* mUserNameFont;
LLTextBox* mUserNameTextBox;
LLTextBox* mTimeBoxTextBox;
LLTextBox* mTimeBoxTextBox;
LLStyle::Params mNameStyleParams;
private:
boost::signals2::connection mAvatarNameCacheConnection;
@ -919,7 +938,7 @@ std::string applyModeratorStyle(U32 moderator_style)
return style;
}
static LLFastTimer::DeclareTimer FTM_APPEND_MESSAGE("Append Chat Message");
static LLTrace::BlockTimerStatHandle FTM_APPEND_MESSAGE("Append Chat Message");
void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LLStyle::Params& input_append_params)
{

View File

@ -0,0 +1,61 @@
/**
* @file fsdispatchclassifiedclickthrough.h
* @brief Dispatcher class for classifiedclickthrough message
*
* $LicenseInfo:firstyear=2016&license=viewerlgpl$
* Phoenix Firestorm Viewer Source Code
* Copyright (c) 2016 Ansariel Hiller @ Second Life
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
* http://www.firestormviewer.org
* $/LicenseInfo$
*/
#ifndef FS_DISPATCHCLASSIFIEDCLICKTHROUGH_H
#define FS_DISPATCHCLASSIFIEDCLICKTHROUGH_H
#include "fspanelclassified.h"
#include "lldispatcher.h"
// "classifiedclickthrough"
// strings[0] = classified_id
// strings[1] = teleport_clicks
// strings[2] = map_clicks
// strings[3] = profile_clicks
class FSDispatchClassifiedClickThrough : public LLDispatchHandler
{
public:
virtual bool operator()(
const LLDispatcher* dispatcher,
const std::string& key,
const LLUUID& invoice,
const sparam_t& strings)
{
if (strings.size() != 4) return false;
LLUUID classified_id(strings[0]);
S32 teleport_clicks = atoi(strings[1].c_str());
S32 map_clicks = atoi(strings[2].c_str());
S32 profile_clicks = atoi(strings[3].c_str());
FSPanelClassifiedInfo::setClickThrough(
classified_id, teleport_clicks, map_clicks, profile_clicks, false);
return true;
}
};
#endif // FS_DISPATCHCLASSIFIEDCLICKTHROUGH_H

View File

@ -660,12 +660,6 @@ void FSFloaterContacts::addFriend(const LLUUID& agent_id)
edit_my_object_column["type"] = "checkbox";
edit_my_object_column["value"] = relationInfo->isRightGrantedTo(LLRelationship::GRANT_MODIFY_OBJECTS);
LLSD& online_their_column = element["columns"][LIST_ONLINE_THEIRS];
online_their_column["column"] = "icon_visible_online_theirs";
online_their_column["type"] = "checkbox";
online_their_column["enabled"] = "";
online_their_column["value"] = relationInfo->isRightGrantedFrom(LLRelationship::GRANT_ONLINE_STATUS);
LLSD& visible_their_map_column = element["columns"][LIST_VISIBLE_MAP_THEIRS];
visible_their_map_column["column"] = "icon_visible_map_theirs";
visible_their_map_column["type"] = "checkbox";
@ -746,7 +740,6 @@ void FSFloaterContacts::updateFriendItem(const LLUUID& agent_id, const LLRelatio
itemp->getColumn(LIST_VISIBLE_ONLINE)->setValue(info->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS));
itemp->getColumn(LIST_VISIBLE_MAP)->setValue(info->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION));
itemp->getColumn(LIST_EDIT_MINE)->setValue(info->isRightGrantedTo(LLRelationship::GRANT_MODIFY_OBJECTS));
itemp->getColumn(LIST_ONLINE_THEIRS)->setValue(info->isRightGrantedFrom(LLRelationship::GRANT_ONLINE_STATUS));
itemp->getColumn(LIST_VISIBLE_MAP_THEIRS)->setValue(info->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION));
itemp->getColumn(LIST_EDIT_THEIRS)->setValue(info->isRightGrantedFrom(LLRelationship::GRANT_MODIFY_OBJECTS));
S32 change_generation = info->getChangeSerialNum();
@ -1170,7 +1163,6 @@ void FSFloaterContacts::onColumnDisplayModeChanged(const std::string& settings_n
else if (p.name.getValue() == "icon_visible_online" ||
p.name.getValue() == "icon_visible_map" ||
p.name.getValue() == "icon_edit_mine" ||
p.name.getValue() == "icon_visible_online_theirs" ||
p.name.getValue() == "icon_visible_map_theirs" ||
p.name.getValue() == "icon_edit_theirs")
{

View File

@ -83,7 +83,6 @@ private:
LIST_VISIBLE_ONLINE,
LIST_VISIBLE_MAP,
LIST_EDIT_MINE,
LIST_ONLINE_THEIRS,
LIST_VISIBLE_MAP_THEIRS,
LIST_EDIT_THEIRS,
LIST_FRIEND_UPDATE_GEN

View File

@ -40,6 +40,7 @@
#include "llagent.h"
#include "llagentpicksinfo.h"
#include "llfloaterreg.h"
#include "llfloatersidepanelcontainer.h"
#include "llfloaterworldmap.h"
#include "llinventoryobserver.h"
#include "lllandmarkactions.h"
@ -50,6 +51,7 @@
#include "llpanellandmarkinfo.h"
#include "llparcel.h"
#include "llteleporthistorystorage.h"
#include "llviewercontrol.h"
#include "llviewermessage.h"
#include "llviewermenu.h"
#include "llviewerparcelmgr.h"
@ -560,6 +562,19 @@ void FSFloaterPlaceDetails::togglePickPanel(BOOL visible)
}
}
// static
void FSFloaterPlaceDetails::showPlaceDetails(const LLSD& key)
{
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", key);
}
else
{
LLFloaterSidePanelContainer::showPanel("places", key);
}
}
/////////////////////////////////
// Button event handlers
/////////////////////////////////

View File

@ -63,6 +63,8 @@ public:
void processParcelDetails(const LLParcelData& parcel_details);
void togglePickPanel(BOOL visible);
static void showPlaceDetails(const LLSD& key);
private:
enum ePlaceDisplayInfo
{

View File

@ -26,48 +26,42 @@
*/
#include "llviewerprecompiledheaders.h"
#include "fsfloaterprofile.h"
// Newview
#include "fspanelprofile.h"
#include "llagent.h" //gAgent
#include "llavatarnamecache.h"
#include "fspanelprofileclassifieds.h"
static const std::string PANEL_PROFILE_VIEW = "panel_profile_view";
FSFloaterProfile::FSFloaterProfile(const LLSD& key)
: LLFloater(key)
, mAvatarId(LLUUID::null)
: LLFloater(key),
mAvatarId(key["id"].asUUID()),
mNameCallbackConnection()
{
}
FSFloaterProfile::~FSFloaterProfile()
{
if (mNameCallbackConnection.connected())
{
mNameCallbackConnection.disconnect();
}
}
void FSFloaterProfile::onOpen(const LLSD& key)
{
LLUUID id;
if(key.has("id"))
FSPanelProfile* panel_profile = findChild<FSPanelProfile>(PANEL_PROFILE_VIEW);
panel_profile->onOpen(mAvatarId);
if (mAvatarId == gAgentID)
{
id = key["id"];
}
if(!id.notNull()) return;
setAvatarId(id);
FSPanelProfile* panel_profile = findChild<FSPanelProfile>(PANEL_PROFILE_VIEW);
panel_profile->onOpen(getAvatarId());
if (getAvatarId() == gAgent.getID())
{
getChild<LLUICtrl>("ok_btn")->setVisible( true );
getChild<LLUICtrl>("cancel_btn")->setVisible( true );
getChild<LLUICtrl>("ok_btn")->setVisible(TRUE);
getChild<LLUICtrl>("cancel_btn")->setVisible(TRUE);
}
// Update the avatar name.
LLAvatarNameCache::get(getAvatarId(), boost::bind(&FSFloaterProfile::onAvatarNameCache, this, _1, _2));
mNameCallbackConnection = LLAvatarNameCache::get(mAvatarId, boost::bind(&FSFloaterProfile::onAvatarNameCache, this, _1, _2));
}
BOOL FSFloaterProfile::postBuild()
@ -80,9 +74,9 @@ BOOL FSFloaterProfile::postBuild()
void FSFloaterProfile::onOKBtn()
{
if (getAvatarId() == gAgent.getID())
if (mAvatarId == gAgentID)
{
FSPanelProfile* panel_profile = findChild<FSPanelProfile>(PANEL_PROFILE_VIEW);
FSPanelProfile* panel_profile = findChild<FSPanelProfile>(PANEL_PROFILE_VIEW);
panel_profile->apply();
}
@ -96,6 +90,7 @@ void FSFloaterProfile::onCancelBtn()
void FSFloaterProfile::onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name)
{
mNameCallbackConnection.disconnect();
setTitle(av_name.getCompleteName());
}

View File

@ -28,10 +28,9 @@
#ifndef FS_FLOATERPROFILE_H
#define FS_FLOATERPROFILE_H
#include "llavatarnamecache.h"
#include "llfloater.h"
class LLAvatarName;
class FSFloaterProfile : public LLFloater
{
LOG_CLASS(FSFloaterProfile);
@ -40,24 +39,14 @@ public:
virtual ~FSFloaterProfile();
/*virtual*/ void onOpen(const LLSD& key);
/*virtual*/ BOOL postBuild();
/**
* Returns avatar ID.
*/
const LLUUID& getAvatarId() const { return mAvatarId; }
protected:
/**
* Sets avatar ID, sets panel as observer of avatar related info replies from server.
*/
void setAvatarId(const LLUUID& avatar_id) { mAvatarId = avatar_id; }
void onOKBtn();
void onCancelBtn();
private:
LLAvatarNameCache::callback_connection_t mNameCallbackConnection;
void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
LLUUID mAvatarId;

View File

@ -52,7 +52,6 @@
#include "llviewernetwork.h"
#include "llviewerregion.h"
#include "llnotificationsutil.h"
#include "lldispatcher.h"
#include "lltrans.h"
#include "message.h"
@ -66,6 +65,7 @@
#include "llfloaterworldmap.h"
#include "fspanelclassified.h"
#include "fspanelprofile.h"
#include "fsdispatchclassifiedclickthrough.h"
#include <string>
#include <boost/tokenizer.hpp>
@ -221,25 +221,6 @@ private:
};
///// Silly Classified Clickthrough Class /////
class FSDispatchClassifiedClickThrough : public LLDispatchHandler
{
public:
virtual bool operator()(const LLDispatcher* dispatcher,
const std::string& key,
const LLUUID& invoice,
const sparam_t& strings)
{
if (strings.size() != 4) return false;
LLUUID classified_id(strings[0]);
S32 teleport_clicks = atoi(strings[1].c_str());
S32 map_clicks = atoi(strings[2].c_str());
S32 profile_clicks = atoi(strings[3].c_str());
FSPanelClassifiedInfo::setClickThrough(classified_id, teleport_clicks, map_clicks, profile_clicks, false);
return true;
}
};
static FSDispatchClassifiedClickThrough sClassifiedClickThrough;
SearchQuery::SearchQuery()

View File

@ -144,6 +144,18 @@ std::string FSLSLPreprocessor::encode(const std::string& script)
//otext += "\n//^ = determine what featureset is supported";
otext += llformat("\n//program_version %s", LLAppViewer::instance()->getWindowTitle().c_str());
time_t utc_time = time_corrected();
std::string timeStr ="["+LLTrans::getString ("TimeMonth")+"]/["
+LLTrans::getString ("TimeDay")+"]/["
+LLTrans::getString ("TimeYear")+"] ["
+LLTrans::getString ("TimeHour")+"]:["
+LLTrans::getString ("TimeMin")+"]:["
+LLTrans::getString("TimeSec")+"]";
LLSD substitution;
substitution["datetime"] = (S32) utc_time;
LLStringUtil::format (timeStr, substitution);
otext += "\n//last_compiled " + timeStr;
otext += "\n";
if (mono)
@ -1379,7 +1391,19 @@ void FSLSLPreprocessor::start_process()
errored = true;
// some preprocessing error
LLStringUtil::format_map_t args;
args["[NAME]"] = name;
args["[ERR_NAME]"] = e.file_name();
args["[LINENUMBER]"] = llformat("%d",e.line_no()-1);
args["[ERR_DESC]"] = e.description();
std::string err = LLTrans::getString("fs_preprocessor_wave_exception", args);
LL_WARNS("FSLSLPreprocessor") << err << LL_ENDL;
display_error(err);
}
catch(boost::wave::cpplexer::lexing_exception const& e)
{
errored = true;
// lexing preprocessing error
LLStringUtil::format_map_t args;
args["[ERR_NAME]"] = e.file_name();
args["[LINENUMBER]"] = llformat("%d",e.line_no()-1);
args["[ERR_DESC]"] = e.description();
std::string err = LLTrans::getString("fs_preprocessor_wave_exception", args);
@ -1391,7 +1415,7 @@ void FSLSLPreprocessor::start_process()
FAILDEBUG
errored = true;
LLStringUtil::format_map_t args;
args["[NAME]"] = std::string(current_position.get_file().c_str());
args["[ERR_NAME]"] = std::string(current_position.get_file().c_str());
args["[LINENUMBER]"] = llformat("%d", current_position.get_line());
args["[ERR_DESC]"] = e.what();
display_error(LLTrans::getString("fs_preprocessor_exception", args));
@ -1401,7 +1425,7 @@ void FSLSLPreprocessor::start_process()
FAILDEBUG
errored = true;
LLStringUtil::format_map_t args;
args["[NAME]"] = std::string(current_position.get_file().c_str());
args["[ERR_NAME]"] = std::string(current_position.get_file().c_str());
args["[LINENUMBER]"] = llformat("%d", current_position.get_line());
std::string err = LLTrans::getString("fs_preprocessor_error", args);
LL_WARNS("FSLSLPreprocessor") << err << LL_ENDL;

View File

@ -32,13 +32,13 @@
#include "fspanelclassified.h"
#include "lldispatcher.h"
#include "llfloaterreg.h"
#include "llhttpclient.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
#include "llparcel.h"
#include "fsdispatchclassifiedclickthrough.h"
#include "llagent.h"
#include "llclassifiedflags.h"
#include "llclassifiedstatsresponder.h"
@ -65,32 +65,6 @@ const S32 MINIMUM_PRICE_FOR_LISTING = 50; // L$
//static
FSPanelClassifiedInfo::panel_list_t FSPanelClassifiedInfo::sAllPanels;
// "classifiedclickthrough"
// strings[0] = classified_id
// strings[1] = teleport_clicks
// strings[2] = map_clicks
// strings[3] = profile_clicks
class FSDispatchClassifiedClickThrough : public LLDispatchHandler
{
public:
virtual bool operator()(
const LLDispatcher* dispatcher,
const std::string& key,
const LLUUID& invoice,
const sparam_t& strings)
{
if (strings.size() != 4) return false;
LLUUID classified_id(strings[0]);
S32 teleport_clicks = atoi(strings[1].c_str());
S32 map_clicks = atoi(strings[2].c_str());
S32 profile_clicks = atoi(strings[3].c_str());
FSPanelClassifiedInfo::setClickThrough(
classified_id, teleport_clicks, map_clicks, profile_clicks, false);
return true;
}
};
static FSDispatchClassifiedClickThrough sClassifiedClickThrough;
// Just to debug errors. Can be thrown away later.
@ -228,7 +202,6 @@ void FSPanelClassifiedInfo::onOpen(const LLSD& key)
LL_INFOS("FSPanelClassifiedInfo") << "Opening classified [" << getClassifiedName() << "] (" << getClassifiedId() << ")" << LL_ENDL;
LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(), this);
// LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(getClassifiedId());
updateData();
gGenericDispatcher.addHandler("classifiedclickthrough", &sClassifiedClickThrough);

View File

@ -36,9 +36,11 @@
#include "lltrans.h"
#include "llmenugl.h"
#include "llviewermenu.h"
#include "llviewergenericmessage.h"
#include "llregistry.h"
#include "llavatarpropertiesprocessor.h"
#include "fsdispatchclassifiedclickthrough.h"
#include "fspanelprofile.h"
#include "fspanelclassified.h"
@ -55,6 +57,7 @@ static const std::string PICK_NAME("pick_name");
static const std::string CLASSIFIED_ID("classified_id");
static const std::string CLASSIFIED_NAME("classified_name");
static FSDispatchClassifiedClickThrough sClassifiedClickThrough;
static LLPanelInjector<FSPanelClassifieds> t_panel_classifieds("panel_profile_classified");
@ -84,11 +87,8 @@ FSPanelClassifieds::~FSPanelClassifieds()
{
mRlvBehaviorCallbackConnection.disconnect();
}
}
void* FSPanelClassifieds::create(void* data /* = NULL */)
{
return new FSPanelClassifieds();
gGenericDispatcher.addHandler("classifiedclickthrough", NULL);
}
void FSPanelClassifieds::updateData()
@ -247,8 +247,9 @@ void FSPanelClassifieds::onOpen(const LLSD& key)
FSPanelProfileTab::onOpen(key);
gGenericDispatcher.addHandler("classifiedclickthrough", &sClassifiedClickThrough);
updateData();
updateButtons();
updateButtons();
}
void FSPanelClassifieds::onClosePanel()
@ -287,6 +288,7 @@ bool FSPanelClassifieds::callbackDeleteClassified(const LLSD& notification, cons
LLAvatarPropertiesProcessor::instance().sendClassifiedDelete(value[CLASSIFIED_ID]);
mClassifiedsList->removeItemByValue(value);
}
mNoItemsLabel->setVisible(!mClassifiedsList->size());
updateButtons();
return false;
}
@ -388,7 +390,6 @@ void FSPanelClassifieds::createNewClassified()
FSPanelClassifiedEdit* panel = NULL;
createClassifiedEditPanel(&panel);
// getProfilePanel()->openPanel(panel, LLSD());
openPanel(panel, LLSD());
}
@ -461,6 +462,8 @@ void FSPanelClassifieds::onPanelClassifiedSave(FSPanelClassifiedEdit* panel)
c_item->setRightMouseUpCallback(boost::bind(&FSPanelClassifieds::onRightMouseUpItem, this, _1, _2, _3, _4));
c_item->setMouseUpCallback(boost::bind(&FSPanelClassifieds::updateButtons, this));
c_item->childSetAction("info_chevron", boost::bind(&FSPanelClassifieds::onClickInfo, this));
mNoItemsLabel->setVisible(FALSE);
}
else if (panel->isNewWithErrors())
{

View File

@ -55,8 +55,6 @@ public:
FSPanelClassifieds();
~FSPanelClassifieds();
static void* create(void* data);
/*virtual*/ BOOL postBuild(void);
/*virtual*/ void onOpen(const LLSD& key);

View File

@ -367,6 +367,9 @@ void FSPanelRadar::updateList(const std::vector<LLSD>& entries, const LLSD& stat
row_data["columns"][9]["column"] = "range";
row_data["columns"][9]["value"] = entry["range"];
row_data["columns"][10]["column"] = "seen_sort";
row_data["columns"][10]["value"] = entry["seen"].asString() + "_" + entry["name"].asString();
LLScrollListItem* row = mRadarList->addElement(row_data);
static S32 rangeColumnIndex = mRadarList->getColumn("range")->mIndex;
@ -498,7 +501,9 @@ void FSPanelRadar::onColumnDisplayModeChanged()
parent_floater->reshape(min_width, parent_floater->getRect().getHeight());
}
if (current_sort_col.empty() || mRadarList->getColumn(current_sort_col)->getWidth() == -1)
if (current_sort_col.empty() ||
(current_sort_col != "seen_sort" && mRadarList->getColumn(current_sort_col)->getWidth() == -1) ||
(current_sort_col == "seen_sort" && mRadarList->getColumn("seen")->getWidth() == -1))
{
current_sort_col = "range";
current_sort_asc = TRUE;

View File

@ -37,13 +37,6 @@ set UPGRADECODE=%1
set UPGRADECODE2=%2
set CHANSUFFIX=%3
if exist %VIEWER_BUILDDIR%\Leap.dll (
set PACKAGE_LEAP=PACKAGE_LEAP=1
echo Packaging Leap.dll
) else (
set PACKAGE_LEAP=PACKAGE_LEAP=0
echo Not Packaging Leap.dll
)
heat dir %VIEWER_BUILDDIR%\character -gg -cg fs_character -var var.BUILDDIR -dr INSTALLDIR -out character.wxs
heat dir %VIEWER_BUILDDIR%\fonts -gg -cg fs_fonts -var var.BUILDDIR -dr INSTALLDIR -out fonts.wxs
@ -57,7 +50,7 @@ candle -dBUILDDIR=%VIEWER_BUILDDIR%\fonts fonts.wxs
candle -dBUILDDIR=%VIEWER_BUILDDIR%\fs_resources fs_resources.wxs
candle -dPLUGIN_SOURCEDIR=%PLUGIN_SOURCEDIR% %WIX_SOURCE_DIR%\llplugin.wxs
candle -dPROGRAM_FILE=%PROGRAM_FILE% -dMAJOR=%MAJOR% -dMINOR=%MINOR% -dHGCHANGE=%HGCHANGE% -dBUILDDIR=%VIEWER_BUILDDIR%\ -dWIX_SOURCEDIR=%WIX_SOURCE_DIR% -d%PACKAGE_LEAP% -dUPGRADECODE=%UPGRADECODE% -dCHANNEL_SUFFIX=%CHANSUFFIX% %WIX_SOURCE_DIR%\firestorm.wxs
candle -dPROGRAM_FILE=%PROGRAM_FILE% -dMAJOR=%MAJOR% -dMINOR=%MINOR% -dHGCHANGE=%HGCHANGE% -dBUILDDIR=%VIEWER_BUILDDIR%\ -dWIX_SOURCEDIR=%WIX_SOURCE_DIR% -dUPGRADECODE=%UPGRADECODE% -dCHANNEL_SUFFIX=%CHANSUFFIX% %WIX_SOURCE_DIR%\firestorm.wxs
candle -dPROGRAM_FILE=%PROGRAM_FILE% -dPROGRAM_VERSION=%PROGRAM_VERSION% -dCHANNEL_NAME=%CHANNEL_NAME% -dSETTINGS_FILE=%SETTINGS_FILE% -dPROGRAM_NAME=%PROGRAM_NAME% -dBUILDDIR=%VIEWER_BUILDDIR%\ -dCHANNEL_SUFFIX=%CHANSUFFIX% %WIX_SOURCE_DIR%\registry.wxs
light -sval -ext WixUIExtension -cultures:en-us -out %VIEWER_BUILDDIR%\%OUTPUT_FILE%.msi firestorm.wixobj character.wixobj fonts.wixobj fs_resources.wixobj llplugin.wixobj registry.wixobj

View File

@ -81,13 +81,6 @@
<File Source="$(var.BUILDDIR)/ca-bundle.crt" />
</Component>
<?if $(var.PACKAGE_LEAP)=1?>
<Component Id="leap_dll" Guid="*">
<File Source="$(var.BUILDDIR)/Leap.dll" />
</Component>
<?endif?>
</Directory>
</Directory>
</Directory>
@ -118,10 +111,6 @@
<ComponentRef Id="llplugin_libs" />
<ComponentRef Id="llplugin_dir_locales" />
<?if $(var.PACKAGE_LEAP)=1?>
<ComponentRef Id="leap_dll" />
<?endif?>
<ComponentGroupRef Id="fs_character" />
<ComponentGroupRef Id="fs_fonts" />
<ComponentGroupRef Id="fs_fsres" />

View File

@ -162,6 +162,8 @@ fi
fi
export FS_CEF_PRELOAD="libcef.so"
# Copy "$@" to ARGS array specifically to delete the --skip-gridargs switch.
# The gridargs.dat file is no more, but we still want to avoid breaking
# scripts that invoke this one with --skip-gridargs.

View File

@ -4430,6 +4430,7 @@ bool LLAgent::teleportCore(bool is_local)
// close the map panel so we can see our destination.
// we don't close search floater, see EXT-5840.
if (!gSavedSettings.getBOOL("FSDoNotHideMapOnTeleport")) // <FS:Ansariel> FIRE-17779: Option to not close world map on teleport
LLFloaterReg::hideInstance("world_map");
// hide land floater too - it'll be out of date

View File

@ -1597,9 +1597,6 @@ void LLAppearanceMgr::onOutfitRename(const LLSD& notification, const LLSD& respo
LLStringUtil::trim(outfit_name);
if (!outfit_name.empty())
{
// <FS:Ansariel> Debug code for FIRE-15571
LL_INFOS() << "OUTFIT RENAME: Invoking rename_category()" << LL_ENDL;
LLUUID cat_id = notification["payload"]["cat_id"].asUUID();
rename_category(&gInventory, cat_id, outfit_name);
}
@ -2119,9 +2116,8 @@ void LLAppearanceMgr::updateCOF(LLInventoryModel::item_array_t& body_items_new,
// Collect and filter descendents to determine new COF contents.
//
// - Body parts: always include COF contents as a fallback in case any required parts are missing.
//
// - Body parts: always include COF contents as a fallback in case any
// required parts are missing.
// Preserve body parts from COF if appending.
LLInventoryModel::item_array_t body_items;
getDescendentsOfAssetType(cof, body_items, LLAssetType::AT_BODYPART);
@ -2139,9 +2135,7 @@ void LLAppearanceMgr::updateCOF(LLInventoryModel::item_array_t& body_items_new,
removeDuplicateItems(body_items);
filterWearableItems(body_items, 1, 0);
//
// - Wearables: include COF contents only if appending.
//
LLInventoryModel::item_array_t wear_items;
if (append)
getDescendentsOfAssetType(cof, wear_items, LLAssetType::AT_CLOTHING);
@ -2167,9 +2161,7 @@ void LLAppearanceMgr::updateCOF(LLInventoryModel::item_array_t& body_items_new,
// [/SL:KB]
filterWearableItems(wear_items, 0, LLAgentWearables::MAX_CLOTHING_LAYERS);
//
// - Attachments: include COF contents only if appending.
//
LLInventoryModel::item_array_t obj_items;
if (append)
getDescendentsOfAssetType(cof, obj_items, LLAssetType::AT_OBJECT);
@ -2203,9 +2195,7 @@ void LLAppearanceMgr::updateCOF(LLInventoryModel::item_array_t& body_items_new,
removeDuplicateItems(obj_items);
//
// - Gestures: include COF contents only if appending.
//
LLInventoryModel::item_array_t gest_items;
if (append)
getDescendentsOfAssetType(cof, gest_items, LLAssetType::AT_GESTURE);
@ -2266,10 +2256,7 @@ void LLAppearanceMgr::updateCOF(LLInventoryModel::item_array_t& body_items_new,
const LLUUID& base_id = (append) ? getBaseOutfitUUID() : idOutfit;
LLViewerInventoryCategory* base_cat = (base_id.notNull()) ? gInventory.getCategory(base_id) : NULL;
// [/RLVa:KB]
// if (base_cat)
// [SL:KB] - Patch: Appearance-Misc | Checked: 2015-06-27 (Catznip-3.7)
if ((base_cat) && (base_cat->getPreferredType() == LLFolderType::FT_OUTFIT))
// [/SL:KB]
if (base_cat && (base_cat->getPreferredType() == LLFolderType::FT_OUTFIT))
{
LLSD base_contents;
base_contents["name"] = base_cat->getName();
@ -2812,12 +2799,6 @@ void LLAppearanceMgr::getUserDescendents(const LLUUID& category,
}
void LLAppearanceMgr::wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append)
// <FS:TT> ReplaceWornItemsOnly
{
wearInventoryCategory(category, copy, append, false);
}
void LLAppearanceMgr::wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append, bool replace)
// </FS:TT>
{
if(!category) return;
@ -2853,33 +2834,15 @@ void LLAppearanceMgr::wearInventoryCategory(LLInventoryCategory* category, bool
callAfterCategoryFetch(category->getUUID(),boost::bind(&LLAppearanceMgr::wearCategoryFinal,
&LLAppearanceMgr::instance(),
category->getUUID(), copy, append));
// <FS:TT> ReplaceWornItemsOnly
//category->getUUID(), copy, append, replace));
// <FS:TT>
}
}
// <FS:TT> ReplaceWornItemsOnly
void LLAppearanceMgr::replaceCategoryInCurrentOutfit(const LLUUID& cat_id)
{
LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
wearInventoryCategory(cat, false, true);
}
// </FS:TT>
S32 LLAppearanceMgr::getActiveCopyOperations() const
{
return LLCallAfterInventoryCopyMgr::getInstanceCount();
}
void LLAppearanceMgr::wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool append)
// <FS:TT> ReplaceWornItemsOnly
{
wearCategoryFinal(cat_id, copy_items, append, false);
}
void LLAppearanceMgr::wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool append, bool replace)
// </FS:TT>
{
LL_INFOS("Avatar") << self_av_string() << "starting" << LL_ENDL;
@ -3370,23 +3333,17 @@ void LLAppearanceMgr::updateIsDirty()
{
if (item1->getLinkedUUID() != item2->getLinkedUUID())
{
// <FS:Ansariel> Change log tag for easier debugging
//LL_DEBUGS("Avatar") << "link id different " << LL_ENDL;
LL_DEBUGS("Outfit") << "link id different for " << item1->getName() << " " << item2->getName() << LL_ENDL;
LL_DEBUGS("Avatar") << "link id different " << LL_ENDL;
}
else
{
if (item1->getName() != item2->getName())
{
// <FS:Ansariel> Change log tag for easier debugging
//LL_DEBUGS("Avatar") << "name different " << item1->getName() << " " << item2->getName() << LL_ENDL;
LL_DEBUGS("Outfit") << "name different " << item1->getName() << " " << item2->getName() << LL_ENDL;
LL_DEBUGS("Avatar") << "name different " << item1->getName() << " " << item2->getName() << LL_ENDL;
}
if (item1->getActualDescription() != item2->getActualDescription())
{
// <FS:Ansariel> Change log tag for easier debugging
//LL_DEBUGS("Avatar") << "desc different " << item1->getActualDescription()
LL_DEBUGS("Outfit") << "desc different " << item1->getActualDescription()
LL_DEBUGS("Avatar") << "desc different " << item1->getActualDescription()
<< " " << item2->getActualDescription()
<< " names " << item1->getName() << " " << item2->getName() << LL_ENDL;
}
@ -3397,9 +3354,7 @@ void LLAppearanceMgr::updateIsDirty()
}
}
llassert(!mOutfitIsDirty);
// <FS:Ansariel> Change log tag for easier debugging
//LL_DEBUGS("Avatar") << "clean" << LL_ENDL;
LL_DEBUGS("Outfit") << "clean" << LL_ENDL;
LL_DEBUGS("Avatar") << "clean" << LL_ENDL;
}
// *HACK: Must match name in Library or agent inventory
@ -4466,10 +4421,7 @@ bool LLAppearanceMgr::moveWearable(LLViewerInventoryItem* item, bool closer_to_b
//to cause appearance of the agent to be updated
bool result = false;
// <FS> Compiler appeasement by Cinder Roxley
//if (result = gAgentWearables.moveWearable(item, closer_to_body))
if ((result = gAgentWearables.moveWearable(item, closer_to_body)))
// </FS>
{
// <FS:Ansariel> [Legacy Bake]
//gAgentAvatarp->wearableUpdated(item->getWearableType());
@ -4836,4 +4788,3 @@ public:
};
LLWearFolderHandler gWearFolderHandler;

View File

@ -62,15 +62,8 @@ public:
bool append = false, const LLUUID& idOutfit = LLUUID::null, LLPointer<LLInventoryCallback> link_waiter = NULL);
// [/RLVa:KB]
void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append);
// <FS:TT> ReplaceWornItemsOnly
void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append, bool items);
// </FS:TT>
void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append);
void wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool append);
// <FS:TT> ReplaceWornItemsOnly
void wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool append, bool items);
void replaceCategoryInCurrentOutfit(const LLUUID& cat_id);
// </FS:TT>
void wearOutfitByName(const std::string& name);
void changeOutfit(bool proceed, const LLUUID& category, bool append);
void replaceCurrentOutfit(const LLUUID& new_outfit);
@ -285,7 +278,6 @@ private:
static void onOutfitRename(const LLSD& notification, const LLSD& response);
bool mAttachmentInvLinkEnabled;
bool mOutfitIsDirty;
bool mIsInUpdateAppearanceFromCOF; // to detect recursive calls.

View File

@ -140,7 +140,9 @@
#include "llleap.h"
#include "stringize.h"
#include "llcoros.h"
#if !LL_LINUX
//<FS:TS> Turn off library for 64-bit OS X too
//#if !LL_LINUX
#if !(LL_DARWIN && defined(ND_BUILD64BIT_ARCH))
#include "cef/llceflib.h"
#endif
@ -3987,13 +3989,22 @@ LLSD LLAppViewer::getViewerInfo() const
{
info["VOICE_VERSION"] = LLTrans::getString("NotConnected");
}
#if !LL_LINUX
//<FS:TS> Check for the symbol being defined, not for an OS
//#if !LL_LINUX
#if defined(LLCEFLIB_VERSION)
info["LLCEFLIB_VERSION"] = LLCEFLIB_VERSION;
#else
info["LLCEFLIB_VERSION"] = "Undefined";
#endif
#if defined( FS_CEFLIB_VERSION ) && FS_CEFLIB_VERSION >= 6
{
std::stringstream strm;
strm << LLCEFLIB_BASE_VERSION << ".FS" << FS_CEFLIB_VERSION << "-" << FS_CEF_VERSION << " (Chrome " << FS_CEF_CHROME_VERSION << ")";
info[ "LLCEFLIB_VERSION" ] = strm.str();
}
#endif
// <FS:ND> Use the total accumulated samples.
//S32 packets_in = LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_IN);
//if (packets_in > 0)
@ -6208,13 +6219,21 @@ void LLAppViewer::idleExperienceCache()
{
LLViewerRegion* region = gAgent.getRegion();
if (!region) return;
std::string lookup_url=region->getCapability("GetExperienceInfo");
if(!lookup_url.empty() && *lookup_url.rbegin() != '/')
{
lookup_url += '/';
}
std::string lookup_url;
if (region->capabilitiesReceived())
{
lookup_url = region->getCapability("GetExperienceInfo");
if (!lookup_url.empty() && *lookup_url.rbegin() != '/')
{
lookup_url += '/';
}
}
else
{
LL_WARNS_ONCE() << "GetExperienceInfo capability is not yet recieved" << LL_ENDL;
}
LLExperienceCache::setLookupURL(lookup_url);
LLExperienceCache::idle();

View File

@ -40,6 +40,8 @@
#include <exception>
#include "reader.h" // <FS:ND/> To parse manifest.json from pepperflash
#if LL_DBUS_ENABLED
# include "llappviewerlinux_api_dbus.h"
@ -71,6 +73,71 @@ static void exceptionTerminateHandler()
gOldTerminateHandler(); // call old terminate() handler
}
// <FS:ND> try to autodected installed pepper flash (Chrome)
void exportFlashVars()
{
if( getenv( "FS_FLASH_PLUGIN" ) && getenv( "FS_FLASH_VERSION" ) ) // User already set those enviroment variables in their shell or in the firestorm launcher
return;
char const* pathChecks[] = {
"/usr/lib64/chromium-browser/PepperFlash/", // Gentoo
"/usr/lib32/chromium-browser/PepperFlash/", // Gentoo
"/opt/google/chrome/PepperFlash/", // Mint 17.3 / XBuntu 14.04, probably works with all Ubuntu flavors of that version.
"/opt/firestorm/PepperFlash/", // In case someone likes to extract pepperflash from a chrome installer on their own, give them a choice with a predef. directory
NULL
};
std::string strExpectedArch = "ia32";
#ifdef ND_BUILD64BIT_ARCH
strExpectedArch = "x64";
#endif
for( int i = 0; pathChecks[i]; ++i )
{
std::string strPath = pathChecks[i];
std::string strManifest = strPath + "manifest.json";
std::string strPlugin = strPath + "libpepflashplayer.so";
if( !LLFile::isfile( strManifest ) )
continue;
if( !LLFile::isfile( strPlugin ) )
continue;
std::ifstream file;
file.open( strManifest, std::ios::in );
if( !file.is_open() )
{
LL_WARNS( "Flash" ) << "Cannot open " << strManifest << LL_ENDL;
continue;
}
Json::Value root;
Json::Reader reader;
if (!reader.parse(file,root))
continue;
std::string strArch; // ia32 or x64
std::string strVersion;
if( root.isMember( "version" ) )
strVersion = root[ "version" ].asString();
if( root.isMember( "x-ppapi-arch" ) )
strArch = root[ "x-ppapi-arch" ].asString();
if( strExpectedArch != strArch )
{
LL_WARNS( "Flash" ) << "Arch mismatch expecting: " << strExpectedArch << " got: " << strArch << LL_ENDL;
continue;
}
LL_INFOS( "Flash" ) << "Arch: " << strArch << " version: " << strVersion << " plugin " << strPlugin << LL_ENDL;
setenv( "FS_FLASH_PLUGIN", strPlugin.c_str(), 0 );
setenv( "FS_FLASH_VERSION", strVersion.c_str(), 0 );
break;
}
}
// </FS:ND>
int main( int argc, char **argv )
{
#if LL_SOLARIS && defined(__sparc)
@ -87,6 +154,8 @@ int main( int argc, char **argv )
// install crash handlers
viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash);
exportFlashVars(); // <FS:ND/> Try to autodetect installed pepper flash.
bool ok = viewer_app_ptr->init();
if(!ok)
{

View File

@ -81,10 +81,6 @@ LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/)
mBtnPermissionMap(NULL),
mBtnPermissionEditMine(NULL),
mIconPermissionEditTheirs(NULL),
// <FS:Ansariel> Extended Friend Permissions
mIconPermissionMapTheirs(NULL),
mIconPermissionOnlineTheirs(NULL),
// </FS:Ansariel>
mSpeakingIndicator(NULL),
mInfoBtn(NULL),
mProfileBtn(NULL),
@ -146,10 +142,6 @@ BOOL LLAvatarListItem::postBuild()
mBtnPermissionMap = getChild<LLButton>("permission_map_btn");
mBtnPermissionEditMine = getChild<LLButton>("permission_edit_mine_btn");
mIconPermissionEditTheirs = getChild<LLIconCtrl>("permission_edit_theirs_icon");
// <FS:Ansariel> Extended Friend Permissions
mIconPermissionMapTheirs = getChild<LLIconCtrl>("permission_map_theirs_icon");
mIconPermissionOnlineTheirs = getChild<LLIconCtrl>("permission_online_theirs_icon");
// </FS:Ansariel>
mBtnPermissionOnline->setClickedCallback(boost::bind(&LLAvatarListItem::onPermissionOnlineClick, this));
mBtnPermissionMap->setClickedCallback(boost::bind(&LLAvatarListItem::onPermissionMapClick, this));
@ -162,10 +154,6 @@ BOOL LLAvatarListItem::postBuild()
mBtnPermissionEditMine->setVisible(false);
mBtnPermissionEditMine->setIsChrome(TRUE);
mIconPermissionEditTheirs->setVisible(false);
// <FS:Ansariel> Extended Friend Permissions
mIconPermissionMapTheirs->setVisible(false);
mIconPermissionOnlineTheirs->setVisible(false);
// </FS:Ansariel>
mSpeakingIndicator = getChild<LLOutputMonitorCtrl>("speaking_indicator");
mInfoBtn = getChild<LLButton>("info_btn");
@ -263,8 +251,8 @@ void LLAvatarListItem::onMouseLeave(S32 x, S32 y, MASK mask)
{
getChildView("hovered_icon")->setVisible( false);
// <FS:Wolf> commented out to have the info button always shown
mInfoBtn->setVisible(false);
mProfileBtn->setVisible(false);
//mInfoBtn->setVisible(false);
//mProfileBtn->setVisible(false);
// </FS:Wolf>
mHovered = false;
@ -735,13 +723,8 @@ void LLAvatarListItem::initChildrenWidths(LLAvatarListItem* avatar_item)
// edit their objects permission icon width + padding
S32 permission_edit_theirs_width = avatar_item->mBtnPermissionEditMine->getRect().mLeft - avatar_item->mIconPermissionEditTheirs->getRect().mLeft;
// <FS:Ansariel> Extended Friend Permissions
S32 permission_map_theirs_width = avatar_item->mIconPermissionEditTheirs->getRect().mLeft - avatar_item->mIconPermissionMapTheirs->getRect().mLeft;
S32 permission_online_theirs_width = avatar_item->mIconPermissionMapTheirs->getRect().mLeft - avatar_item->mIconPermissionOnlineTheirs->getRect().mLeft;
// </FS:Ansariel>
// last interaction time textbox width + padding
S32 last_interaction_time_width = avatar_item->mIconPermissionOnlineTheirs->getRect().mLeft - avatar_item->mLastInteractionTime->getRect().mLeft;
S32 last_interaction_time_width = avatar_item->mIconPermissionEditTheirs->getRect().mLeft - avatar_item->mLastInteractionTime->getRect().mLeft;
// avatar icon width + padding
S32 icon_width = avatar_item->mAvatarName->getRect().mLeft - avatar_item->mAvatarIcon->getRect().mLeft;
@ -752,10 +735,6 @@ void LLAvatarListItem::initChildrenWidths(LLAvatarListItem* avatar_item)
sChildrenWidths[--index] = icon_width;
sChildrenWidths[--index] = 0; // for avatar name we don't need its width, it will be calculated as "left available space"
sChildrenWidths[--index] = last_interaction_time_width;
// <FS:Ansariel> Extended Friend Permissions
sChildrenWidths[--index] = permission_online_theirs_width;
sChildrenWidths[--index] = permission_map_theirs_width;
// </FS:Ansariel>
sChildrenWidths[--index] = permission_edit_theirs_width;
sChildrenWidths[--index] = permission_edit_mine_width;
sChildrenWidths[--index] = permission_map_width;
@ -886,25 +865,11 @@ bool LLAvatarListItem::showPermissions(bool visible)
mIconPermissionEditTheirs->setColor(LLUIColorTable::instance().getColor("White_10"));
else
mIconPermissionEditTheirs->setColor(LLUIColorTable::instance().getColor("White"));
// <FS:Ansariel> Extended Friend Permissions
if (!relation->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION))
mIconPermissionMapTheirs->setColor(LLUIColorTable::instance().getColor("White_10"));
else
mIconPermissionMapTheirs->setColor(LLUIColorTable::instance().getColor("White"));
if (!relation->isRightGrantedFrom(LLRelationship::GRANT_ONLINE_STATUS))
mIconPermissionOnlineTheirs->setColor(LLUIColorTable::instance().getColor("White_10"));
else
mIconPermissionOnlineTheirs->setColor(LLUIColorTable::instance().getColor("White"));
// </FS:Ansariel>
mBtnPermissionOnline->setVisible(true);
mBtnPermissionMap->setVisible(true);
mBtnPermissionEditMine->setVisible(true);
mIconPermissionEditTheirs->setVisible(true);
// <FS:Ansariel> Extended Friend Permissions
mIconPermissionMapTheirs->setVisible(true);
mIconPermissionOnlineTheirs->setVisible(true);
// </FS:Ansariel>
}
else
@ -913,10 +878,6 @@ bool LLAvatarListItem::showPermissions(bool visible)
mBtnPermissionMap->setVisible(false);
mBtnPermissionEditMine->setVisible(false);
mIconPermissionEditTheirs->setVisible(false);
// <FS:Ansariel> Extended Friend Permissions
mIconPermissionMapTheirs->setVisible(false);
mIconPermissionOnlineTheirs->setVisible(false);
// </FS:Ansariel>
}
updateChildren();
@ -1053,14 +1014,6 @@ LLView* LLAvatarListItem::getItemChildView(EAvatarListItemChildIndex child_view_
case ALIC_PERMISSION_EDIT_THEIRS:
child_view = mIconPermissionEditTheirs;
break;
// <FS:Ansariel> Extended Friend Permissions
case ALIC_PERMISSION_MAP_THEIRS:
child_view = mIconPermissionMapTheirs;
break;
case ALIC_PERMISSION_ONLINE_THEIRS:
child_view = mIconPermissionOnlineTheirs;
break;
// </FS:Ansariel>
case ALIC_INFO_BUTTON:
child_view = mInfoBtn;
break;

View File

@ -156,12 +156,6 @@ protected:
LLButton* mBtnPermissionEditMine;
/// Indicator for permission to edit their objects.
LLIconCtrl* mIconPermissionEditTheirs;
// <FS:Ansariel> Extended Friend Permissions
/// Indicator for permission to show their position on the map.
LLIconCtrl* mIconPermissionMapTheirs;
/// Indicator for permission to see their online status.
LLIconCtrl* mIconPermissionOnlineTheirs;
// </FS:Ansariel>
void confirmModifyRights(bool grant, S32 rights);
void rightsConfirmationCallback(const LLSD& notification,
const LLSD& response, S32 rights);
@ -200,10 +194,6 @@ private:
ALIC_PERMISSION_MAP,
ALIC_PERMISSION_EDIT_MINE,
ALIC_PERMISSION_EDIT_THEIRS,
// <FS:Ansariel> Extended Friend Permissions
ALIC_PERMISSION_MAP_THEIRS,
ALIC_PERMISSION_ONLINE_THEIRS,
// </FS:Ansariel>
ALIC_INTERACTION_TIME,
ALIC_NAME,
ALIC_ICON,

View File

@ -422,8 +422,19 @@ void LLFloaterCompileQueue::handleInventory(LLViewerObject *viewer_object,
LLScriptQueueData* datap = new LLScriptQueueData(getKey().asUUID(),
viewer_object->getID(), itemp);
ExperienceAssociationResponder::fetchAssociatedExperience(itemp->getParentUUID(), itemp->getUUID(),
boost::bind(LLFloaterCompileQueue::requestAsset, datap, _1));
// <FS:Ansariel> FIRE-17688: Recompile scripts not working on OpenSim
//ExperienceAssociationResponder::fetchAssociatedExperience(itemp->getParentUUID(), itemp->getUUID(),
// boost::bind(LLFloaterCompileQueue::requestAsset, datap, _1));
if (viewer_object->getRegion()->isCapabilityAvailable("GetMetadata"))
{
ExperienceAssociationResponder::fetchAssociatedExperience(itemp->getParentUUID(), itemp->getUUID(),
boost::bind(LLFloaterCompileQueue::requestAsset, datap, _1));
}
else
{
requestAsset(datap, LLSD());
}
// </FS:Ansariel>
}
}
}

View File

@ -55,6 +55,7 @@
#include "llsdserialize.h"
#include "llviewernetwork.h" // <FS:CR> FIRE-10122 - User@grid stored_favorites.xml - getGrid()
#include "fsfloaterplacedetails.h"
static LLDefaultChildRegistry::Register<LLFavoritesBarCtrl> r("favorites_bar");
@ -1263,14 +1264,7 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata)
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", key);
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", key);
}
else
{
LLFloaterSidePanelContainer::showPanel("places", key);
}
FSFloaterPlaceDetails::showPlaceDetails(key);
// </FS:Ansariel>
}
else if (action == "copy_slurl")

View File

@ -126,6 +126,13 @@ LLFloaterNotificationsTabbed::~LLFloaterNotificationsTabbed()
//---------------------------------------------------------------------------------
void LLFloaterNotificationsTabbed::removeItemByID(const LLUUID& id, std::string type)
{
// <FS:Ansariel> Ignore for script dialogs that are not listed in the notifications list
if (type == "ScriptDialog" || type == "ScriptDialogGroup")
{
return;
}
// </FS:Ansariel>
if(mNotificationsSeparator->removeItemByID(type, id))
{
if (NULL != mSysWellChiclet)

View File

@ -49,6 +49,7 @@
#include "fsfloatergroup.h"
#include "fsfloaterim.h"
#include "llpanelgroup.h"
#include "llresmgr.h"
#include "llslurl.h"
#include "rlvactions.h"
#include "rlvcommon.h"
@ -370,6 +371,14 @@ void LLGroupActions::processLeaveGroupDataResponse(const LLUUID group_id)
args["GROUP"] = gdatap->mName;
LLSD payload;
payload["group_id"] = group_id;
// <FS:Ansariel> FIRE-17676: Add special group leave notification in case of join fees
if (gdatap->mMembershipFee > 0)
{
args["AMOUNT"] = LLResMgr::getInstance()->getMonetaryString(gdatap->mMembershipFee);
LLNotificationsUtil::add("GroupLeaveConfirmMemberWithFee", args, payload, onLeaveGroup);
return;
}
// </FS:Ansariel>
LLNotificationsUtil::add("GroupLeaveConfirmMember", args, payload, onLeaveGroup);
}

View File

@ -4038,7 +4038,7 @@ void LLIMMgr::processIMTypingCore(const LLIMInfo* im_info, BOOL typing)
LLAgentUI::buildFullname(my_name);
if (is_busy)
{
response = gSavedPerAccountSettings.getString("BusyModeResponse");
response = gSavedPerAccountSettings.getString("DoNotDisturbModeResponse");
}
else if (is_autorespond_nonfriends && !is_friend)
{
@ -4052,6 +4052,10 @@ void LLIMMgr::processIMTypingCore(const LLIMInfo* im_info, BOOL typing)
{
response = gSavedPerAccountSettings.getString("FSAwayAvatarResponse");
}
else
{
LL_WARNS() << "Unknown auto-response mode" << LL_ENDL;
}
pack_instant_message(
gMessageSystem,
gAgent.getID(),
@ -4065,11 +4069,14 @@ void LLIMMgr::processIMTypingCore(const LLIMInfo* im_info, BOOL typing)
session_id);
gAgent.sendReliableMessage();
LLStringUtil::format_map_t args;
args["MESSAGE"] = response;
gIMMgr->addMessage(
session_id,
gAgentID,
LLStringUtil::null, // Pass null value so no name gets prepended
LLTrans::getString("IM_autoresponse_sent"),
LLTrans::getString("IM_autoresponse_sent", args),
false,
im_info->mName,
IM_NOTHING_SPECIAL,

View File

@ -97,6 +97,7 @@
#include "fsgridhandler.h"
#endif
// </FS:Zi>
#include "fsfloaterplacedetails.h"
#include <boost/shared_ptr.hpp>
@ -119,9 +120,6 @@ struct LLMoveInv
using namespace LLOldEvents;
// Function declarations
// <FS:TT> Patch: ReplaceWornItemsOnly
void wear_inventory_category_on_avatar(LLInventoryCategory* category);
// </FS:TT>
bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, boost::shared_ptr<LLMoveInv>);
bool confirm_attachment_rez(const LLSD& notification, const LLSD& response);
void teleport_via_landmark(const LLUUID& asset_id);
@ -3466,7 +3464,6 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
if(!cat) return;
gInventory.wearItemsOnAvatar(cat);
// modifyOutfit(TRUE, TRUE);
return;
}
// </FS:TT>
@ -4417,10 +4414,14 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags, menuentry_vec_t&
// Only enable add/replace outfit for non-system folders.
if (!is_system_folder)
{
// <FS:Ansariel> FIRE-3302: "Add to Current Outfit" missing for inventory outfit folder
items.push_back(std::string("Add To Outfit"));
// Adding an outfit onto another (versus replacing) doesn't make sense.
if (type != LLFolderType::FT_OUTFIT)
{
items.push_back(std::string("Add To Outfit"));
// <FS:Ansariel> FIRE-3302: "Add to Current Outfit" missing for inventory outfit folder
//items.push_back(std::string("Add To Outfit"));
// <FS:TT> Patch: ReplaceWornItemsOnly
items.push_back(std::string("Wear Items"));
// </FS:TT>
@ -4680,13 +4681,6 @@ void LLFolderBridge::createWearable(LLFolderBridge* bridge, LLWearableType::ETyp
}
void LLFolderBridge::modifyOutfit(BOOL append)
// <FS:TT> Patch: ReplaceWornItemsOnly
{
modifyOutfit(append, false);
}
void LLFolderBridge::modifyOutfit(BOOL append, BOOL replace)
// </FS:TT>
{
LLInventoryModel* model = getInventoryModel();
if(!model) return;
@ -4712,7 +4706,7 @@ void LLFolderBridge::modifyOutfit(BOOL append, BOOL replace)
return;
}
LLAppearanceMgr::instance().wearInventoryCategory( cat, FALSE, append, replace );
LLAppearanceMgr::instance().wearInventoryCategory( cat, FALSE, append );
}
// +=================================================+
@ -5834,14 +5828,7 @@ void LLLandmarkBridge::performAction(LLInventoryModel* model, std::string action
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", key);
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", key);
}
else
{
LLFloaterSidePanelContainer::showPanel("places", key);
}
FSFloaterPlaceDetails::showPlaceDetails(key);
// </FS:Ansariel>
}
}
@ -6037,7 +6024,10 @@ std::string LLCallingCardBridge::getLabelSuffix() const
LLViewerInventoryItem* item = getItem();
if( item && LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()) )
{
return LLItemBridge::getLabelSuffix() + " (online)";
// <FS:Ansariel> FIRE-17715: Make "online" suffix in calling card folder localizable
//return LLItemBridge::getLabelSuffix() + " (online)";
return LLItemBridge::getLabelSuffix() + " " + LLTrans::getString("CallingCardOnlineLabelSuffix");
// </FS:Ansariel>
}
else
{

View File

@ -385,9 +385,6 @@ protected:
BOOL checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& typeToCheck);
void modifyOutfit(BOOL append);
// <FS:TT> ReplaceWornItemsOnly
void modifyOutfit(BOOL append, BOOL replace);
// </FS:TT>
void determineFolderType();
void dropToFavorites(LLInventoryItem* inv_item);

View File

@ -3755,8 +3755,8 @@ void LLInventoryModel::wearWearablesOnAvatar(const LLUUID& category_id)
mItemArray,
LLInventoryModel::EXCLUDE_TRASH,
is_wearable);
S32 i;
S32 wearable_count = mItemArray.size();
size_t i;
size_t wearable_count = mItemArray.size();
if (wearable_count > 0) //Loop through wearables.
{
@ -3786,13 +3786,13 @@ void LLInventoryModel::wearWearablesOnAvatar(const LLUUID& category_id)
//take the first one from the list, since the list is diminishing.
LLViewerWearable* wearable = gAgentWearables.getViewerWearable((LLWearableType::EType)iType,0);
//if the item is from our folder - don't remove it
//for (LLViewerInventoryItem *item = item_array.get(i);
if ( mItemArray.end() == std::find( mItemArray.begin(), mItemArray.end(), (LLViewerInventoryItem*)wearable ) )
{
LLAppearanceMgr::instance().removeItemFromAvatar(wearable->getItemID());
}
//LL_INFOS() << "Removing wearable name: " << wearable->getName() << LL_ENDL;
}
//now add the first item (replace just in case)
LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(), true, true);
//LL_INFOS() << " Wearing item: " << item->getName() << " with replace=true" << LL_ENDL;
@ -3827,8 +3827,8 @@ void LLInventoryModel::wearAttachmentsOnAvatar(const LLUUID& category_id)
mObjArray,
LLInventoryModel::EXCLUDE_TRASH,
is_object);
S32 i;
S32 obj_count = mObjArray.size();
size_t i;
size_t obj_count = mObjArray.size();
if (obj_count > 0)
{
@ -3857,8 +3857,8 @@ void LLInventoryModel::wearGesturesOnAvatar(const LLUUID& category_id)
gest_item_array,
LLInventoryModel::EXCLUDE_TRASH,
is_gesture);
S32 i;
S32 gest_count = gest_item_array.size();
size_t i;
size_t gest_count = gest_item_array.size();
if (gest_count > 0)
{
@ -3881,7 +3881,7 @@ void LLInventoryModel::wearAttachmentsOnAvatarCheckRemove(LLViewerObject *object
LLUUID objID = object->getAttachmentItemID();
bool isObjectInList = false;
for (S32 i = 0; i < mObjArray.size(); ++i)
for (size_t i = 0; i < mObjArray.size(); ++i)
{
if (objID == (mObjArray.at(i))->getUUID())
{
@ -3891,7 +3891,7 @@ void LLInventoryModel::wearAttachmentsOnAvatarCheckRemove(LLViewerObject *object
}
//all attachment points
S32 obj_count = mObjArray.size();
size_t obj_count = mObjArray.size();
if (isObjectInList && attachment != NULL)
{
@ -3915,7 +3915,7 @@ void LLInventoryModel::wearAttachmentsOnAvatarCheckRemove(LLViewerObject *object
//if any of those things aren't in our list - remove them
bool isFound = false;
for (S32 j = 0; j < obj_count; ++j)
for (size_t j = 0; j < obj_count; ++j)
{
LLViewerInventoryItem *fold_item = mObjArray.at(j);
if (att_id == fold_item->getUUID())
@ -3941,8 +3941,7 @@ void LLInventoryModel::wearItemsOnAvatar(LLInventoryCategory* category)
return;
}
LL_INFOS() << "ReplaceWornItemsOnly wear_inventory_category_on_avatar( "
<< category->getName() << " )" << LL_ENDL;
LL_INFOS() << "ReplaceWornItemsOnly wear_inventory_category_on_avatar( " << category->getName() << " )" << LL_ENDL;
LLUUID category_id = category->getUUID();

View File

@ -345,6 +345,12 @@ void LLLandmarkActions::onRegionResponseSLURL(slurl_callback_t cb,
bool gotSimName = LLWorldMap::getInstance()->simNameFromPosGlobal(global_pos, sim_name);
if (gotSimName)
{
// <FS:Ansariel> Debug...
if (sim_name.empty())
{
LL_WARNS() << "Requested sim name is empty!" << LL_ENDL;
}
// </FS:Ansariel>
slurl = LLSLURL(sim_name, global_pos).getSLURLString();
}
else

View File

@ -74,6 +74,7 @@
#include "llviewernetwork.h"
#endif // OPENSIM
// </FS:CR>
#include "fsfloaterplacedetails.h"
//============================================================================
/*
@ -654,14 +655,7 @@ void LLLocationInputCtrl::onInfoButtonClicked()
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "agent"));
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", LLSD().with("type", "agent"));
}
else
{
LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "agent"));
}
FSFloaterPlaceDetails::showPlaceDetails(LLSD().with("type", "agent"));
// </FS:Ansariel>
}
@ -692,28 +686,14 @@ void LLLocationInputCtrl::onAddLandmarkButtonClicked()
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", key);
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", key);
}
else
{
LLFloaterSidePanelContainer::showPanel("places", key);
}
FSFloaterPlaceDetails::showPlaceDetails(key);
// </FS:Ansariel>
}
else
{
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", LLSD().with("type", "create_landmark"));
}
else
{
LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
}
FSFloaterPlaceDetails::showPlaceDetails(LLSD().with("type", "create_landmark"));
// </FS:Ansariel>
}
}
@ -1232,28 +1212,14 @@ void LLLocationInputCtrl::onLocationContextMenuItemClicked(const LLSD& userdata)
{
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", LLSD().with("type", "create_landmark"));
}
else
{
LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
}
FSFloaterPlaceDetails::showPlaceDetails(LLSD().with("type", "create_landmark"));
// </FS:Ansariel>
}
else
{
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "landmark").with("id",landmark->getUUID()));
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", LLSD().with("type", "landmark").with("id",landmark->getUUID()));
}
else
{
LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "landmark").with("id",landmark->getUUID()));
}
FSFloaterPlaceDetails::showPlaceDetails(LLSD().with("type", "landmark").with("id",landmark->getUUID()));
// </FS:Ansariel>
}
// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.0d) | Added: RLVa-1.2.0d

View File

@ -93,7 +93,12 @@ const static std::string MULTI_LINE_PREFIX(" ");
*/
const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}\\]\\s+|\\[\\d{1,2}:\\d{2}\\]\\s+)?(.*)$");
const static boost::regex TIMESTAMP("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}\\]|\\[\\d{1,2}:\\d{2}\\]).*");
const static boost::regex TIMESTAMP_AND_STUFF_SEC("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}:\\d{2}\\]\\s+|\\[\\d{1,2}:\\d{2}:\\d{2}\\]\\s+)?(.*)$");
// <FS:Ansariel> Timestamps in chat
// Note: In contrast to the TIMESTAMP_AND_STUFF regex, for the TIMESTAMP_AND_STUFF_SEC regex the match
// on the timestamp is NOT optional. We need this to decide during parsing if we have timestamps or not.
const static boost::regex TIMESTAMP_AND_STUFF_SEC("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}:\\d{2}\\]\\s+|\\[\\d{1,2}:\\d{2}:\\d{2}\\]\\s+)(.*)$");
const static boost::regex TIMESTAMP_AND_SEC("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}:\\d{2}\\]|\\[\\d{1,2}:\\d{2}:\\d{2}\\]).*");
// </FS:Ansariel>
/**
* Regular expression suitable to match names like
@ -117,8 +122,10 @@ const static std::string NAME_TEXT_DIVIDER(": ");
// is used for timestamps adjusting
const static char* DATE_FORMAT("%Y/%m/%d %H:%M");
const static char* TIME_FORMAT("%H:%M");
// <FS:Ansariel> Seconds in timestamps
const static char* DATE_FORMAT_SEC("%Y/%m/%d %H:%M:%S");
const static char* TIME_FORMAT_SEC("%H:%M:%S");
// </FS:Ansariel>
const static int IDX_TIMESTAMP = 1;
const static int IDX_STUFF = 2;
@ -143,18 +150,15 @@ public:
LLLogChatTimeScanner()
{
// Note, date/time facets will be destroyed by string streams
if (gSavedSettings.getBOOL("FSSecondsinChatTimestamps"))
{
mDateStream.imbue(std::locale(mDateStream.getloc(), new date_input_facet(DATE_FORMAT_SEC)));
mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_facet(TIME_FORMAT_SEC)));
mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_input_facet(DATE_FORMAT_SEC)));
}
else
{
mDateStream.imbue(std::locale(mDateStream.getloc(), new date_input_facet(DATE_FORMAT)));
mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_facet(TIME_FORMAT)));
mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_input_facet(DATE_FORMAT)));
}
mDateStream.imbue(std::locale(mDateStream.getloc(), new date_input_facet(DATE_FORMAT)));
mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_facet(TIME_FORMAT)));
mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_input_facet(DATE_FORMAT)));
// <FS:Ansariel> Seconds in timestamps
mDateSecStream.imbue(std::locale(mDateSecStream.getloc(), new date_input_facet(DATE_FORMAT_SEC)));
mTimeSecStream.imbue(std::locale(mTimeSecStream.getloc(), new time_facet(TIME_FORMAT_SEC)));
mTimeSecStream.imbue(std::locale(mTimeSecStream.getloc(), new time_input_facet(DATE_FORMAT_SEC)));
// </FS:Ansariel>
}
date getTodayPacificDate()
@ -215,10 +219,61 @@ public:
<< LL_ENDL;
}
// <FS:Ansariel> Seconds in timestamps
void checkAndCutOffDateWithSec(std::string& time_str)
{
// Cuts off the "%Y/%m/%d" from string for todays timestamps.
// Assume that passed string has at least "%H:%M:%S" time format.
date log_date(not_a_date_time);
date today(getTodayPacificDate());
// Parse the passed date
mDateSecStream.str(LLStringUtil::null);
mDateSecStream << time_str;
mDateSecStream >> log_date;
mDateSecStream.clear();
days zero_days(0);
days days_alive = today - log_date;
if ( days_alive == zero_days )
{
// Yep, today's so strip "%Y/%m/%d" info
ptime stripped_time(not_a_date_time);
mTimeSecStream.str(LLStringUtil::null);
mTimeSecStream << time_str;
mTimeSecStream >> stripped_time;
mTimeSecStream.clear();
time_str.clear();
mTimeSecStream.str(LLStringUtil::null);
mTimeSecStream << stripped_time;
mTimeSecStream >> time_str;
mTimeSecStream.clear();
}
LL_DEBUGS("LLChatLogParser")
<< " log_date: "
<< log_date
<< " today: "
<< today
<< " days alive: "
<< days_alive
<< " new time: "
<< time_str
<< LL_ENDL;
}
// </FS:Ansariel>
private:
std::stringstream mDateStream;
std::stringstream mTimeStream;
// <FS:Ansariel> Seconds in timestamps
std::stringstream mDateSecStream;
std::stringstream mTimeSecStream;
// </FS:Ansariel>
};
LLLogChat::save_history_signal_t * LLLogChat::sSaveHistorySignal = NULL;
@ -287,21 +342,23 @@ std::string LLLogChat::timestamp(bool withdate)
+ LLTrans::getString ("TimeDay") + "] ["
+ LLTrans::getString ("TimeHour") + "]:["
+ LLTrans::getString ("TimeMin") + "]";
// <FS> Seconds in timestamps
if (gSavedSettings.getBOOL("FSSecondsinChatTimestamps"))
{
timeStr += ":["
+LLTrans::getString ("TimeSec")+"]";
timeStr += ":[" + LLTrans::getString ("TimeSec") + "]";
}
// </FS>
}
else
{
timeStr = "[" + LLTrans::getString("TimeHour") + "]:["
+ LLTrans::getString ("TimeMin")+"]";
// <FS> Seconds in timestamps
if (gSavedSettings.getBOOL("FSSecondsinChatTimestamps"))
{
timeStr += ":["
+LLTrans::getString ("TimeSec")+"]";
timeStr += ":[" + LLTrans::getString ("TimeSec") + "]";
}
// </FS>
}
LLSD substitution;
@ -623,7 +680,10 @@ void LLLogChat::findTranscriptFiles(std::string pattern, std::vector<std::string
{
//matching a timestamp
boost::match_results<std::string::const_iterator> matches;
if (boost::regex_match(std::string(buffer), matches, TIMESTAMP))
// <FS:Ansariel> Seconds in timestamp
//if (boost::regex_match(std::string(buffer), matches, TIMESTAMP))
if (boost::regex_match(std::string(buffer), matches, TIMESTAMP) || boost::regex_match(std::string(buffer), matches, TIMESTAMP_AND_SEC))
// </FS:Ansariel>
{
list_of_transcriptions.push_back(gDirUtilp->add(dirname, filename));
}
@ -952,14 +1012,26 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params
//matching a timestamp
boost::match_results<std::string::const_iterator> matches;
if (gSavedSettings.getBOOL("FSSecondsinChatTimestamps"))
// <FS:Ansariel> Seconds in timestamps
// Logic here: First try to get a full match for timestamps with seconds. If we fail,
// this means we either have a timestamp without seconds or no timestamp at all.
// So we use the original regex for timestamps without seconds to find out what
// case it is. For this to work, the timestamp part in the TIMESTAMP_AND_STUFF_SEC
// regex is NOT optional!
//if (!boost::regex_match(raw, matches, TIMESTAMP_AND_STUFF)) return false;
bool has_sec = false;
if (boost::regex_match(raw, matches, TIMESTAMP_AND_STUFF_SEC))
{
if (!boost::regex_match(raw, matches, TIMESTAMP_AND_STUFF_SEC)) return false;
has_sec = true;
}
else
{
if (!boost::regex_match(raw, matches, TIMESTAMP_AND_STUFF)) return false;
if (!boost::regex_match(raw, matches, TIMESTAMP_AND_STUFF))
{
return false;
}
}
// </FS:Ansariel>
bool has_timestamp = matches[IDX_TIMESTAMP].matched;
if (has_timestamp)
@ -972,7 +1044,17 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params
if (cut_off_todays_date)
{
LLLogChatTimeScanner::instance().checkAndCutOffDate(timestamp);
// <FS:Ansariel> Seconds in timestamps
//LLLogChatTimeScanner::instance().checkAndCutOffDate(timestamp);
if (has_sec)
{
LLLogChatTimeScanner::instance().checkAndCutOffDateWithSec(timestamp);
}
else
{
LLLogChatTimeScanner::instance().checkAndCutOffDate(timestamp);
}
// </FS:Ansariel>
}
im[LL_IM_TIME] = timestamp;
@ -997,7 +1079,7 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params
bool has_name = name_and_text[IDX_NAME].matched;
std::string name = name_and_text[IDX_NAME];
// Ansariel: Handle the case an IM was stored in nearby chat history
// <FS:Ansariel> Handle the case an IM was stored in nearby chat history
if (name == "IM:")
{
size_t divider_pos = stuff.find(NAME_TEXT_DIVIDER, 3);
@ -1008,6 +1090,7 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params
return true;
}
}
// </FS:Ansariel>
//we don't need a name/text separator
if (has_name && name.length() && name[name.length()-1] == ':')

View File

@ -40,6 +40,8 @@
#include "llsdparam.h"
#include "lltooltip.h"
#include "lltrans.h"
#include "llslurl.h"
#include "llurlaction.h"
static LLDefaultChildRegistry::Register<LLNameListCtrl> r("name_list");
@ -145,7 +147,10 @@ void LLNameListCtrl::showInspector(const LLUUID& avatar_id, bool is_group, bool
if (is_group)
LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", avatar_id));
else
LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", avatar_id));
// <FS:Ansariel> FIRE-9045: Remove avatar inspector
//LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", avatar_id));
LLUrlAction::executeSLURL(LLSLURL("agent", avatar_id, "inspect").getSLURLString());
// </FS:Ansariel>
}
void LLNameListCtrl::mouseOverHighlightNthItem( S32 target_index )

View File

@ -79,6 +79,7 @@
// [/RLVa:KB]
#include "llmutelist.h"
#include "lfsimfeaturehandler.h"
#include "fsfloaterplacedetails.h"
// Ansariel: For accessing the radar data
#include "fsradar.h"
@ -1535,14 +1536,7 @@ void LLNetMap::handleShowProfile(const LLSD& sdParam) const
sdParams["y"] = mPosGlobalRightClick.mdV[VY];
sdParams["z"] = mPosGlobalRightClick.mdV[VZ];
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", sdParams);
}
else
{
LLFloaterSidePanelContainer::showPanel("places", sdParams);
}
FSFloaterPlaceDetails::showPlaceDetails(sdParams);
}
}

View File

@ -114,29 +114,41 @@ std::string LLNotificationListItem::buildNotificationDate(const LLDate& time_sta
std::string timeStr;
switch(time_type)
{
// <FS:Ansariel> FIRE-17649: Localizable date formats for group notices
//case Local:
// timeStr = "[" + LLTrans::getString("LTimeMthNum") + "]/["
// +LLTrans::getString("LTimeDay")+"]/["
// +LLTrans::getString("LTimeYear")+"] ["
// +LLTrans::getString("LTimeHour")+"]:["
// +LLTrans::getString("LTimeMin")+ "]";
// break;
//case UTC:
// timeStr = "[" + LLTrans::getString("UTCTimeMth") + "]/["
// +LLTrans::getString("UTCTimeDay")+"]/["
// +LLTrans::getString("UTCTimeYr")+"] ["
// +LLTrans::getString("UTCTimeHr")+"]:["
// +LLTrans::getString("UTCTimeMin")+"] ["
// +LLTrans::getString("UTCTimeTimezone")+"]";
// break;
//case SLT:
//default:
// timeStr = "[" + LLTrans::getString("TimeMonth") + "]/["
// +LLTrans::getString("TimeDay")+"]/["
// +LLTrans::getString("TimeYear")+"] ["
// +LLTrans::getString("TimeHour")+"]:["
// +LLTrans::getString("TimeMin")+"]";
// break;
case Local:
timeStr = "[" + LLTrans::getString("LTimeMthNum") + "]/["
+LLTrans::getString("LTimeDay")+"]/["
+LLTrans::getString("LTimeYear")+"] ["
+LLTrans::getString("LTimeHour")+"]:["
+LLTrans::getString("LTimeMin")+ "]";
timeStr = LLTrans::getString("NotificationItemDateStringLocal");
break;
case UTC:
timeStr = "[" + LLTrans::getString("UTCTimeMth") + "]/["
+LLTrans::getString("UTCTimeDay")+"]/["
+LLTrans::getString("UTCTimeYr")+"] ["
+LLTrans::getString("UTCTimeHr")+"]:["
+LLTrans::getString("UTCTimeMin")+"] ["
+LLTrans::getString("UTCTimeTimezone")+"]";
timeStr = LLTrans::getString("NotificationItemDateStringUTC");
break;
case SLT:
default:
timeStr = "[" + LLTrans::getString("TimeMonth") + "]/["
+LLTrans::getString("TimeDay")+"]/["
+LLTrans::getString("TimeYear")+"] ["
+LLTrans::getString("TimeHour")+"]:["
+LLTrans::getString("TimeMin")+"]";
timeStr = LLTrans::getString("NotificationItemDateStringSLT");
break;
// </FS:Ansariel>
}
LLSD substitution;
substitution["datetime"] = time_stamp;

View File

@ -123,9 +123,6 @@ public:
registrar.add("Gear.Expand", boost::bind(&LLOutfitsList::expand_all_folders, mOutfitList));
registrar.add("Gear.WearAdd", boost::bind(&LLOutfitListGearMenu::onAdd, this));
//-TT Patch: ReplaceWornItemsOnly
registrar.add("Gear.WearReplaceItems",boost::bind(&LLOutfitListGearMenu::onReplaceItems, this));
//-TT
enable_registrar.add("Gear.OnEnable", boost::bind(&LLOutfitListGearMenu::onEnable, this, _2));
enable_registrar.add("Gear.OnVisible", boost::bind(&LLOutfitListGearMenu::onVisible, this, _2));
@ -184,17 +181,6 @@ private:
}
}
//-TT Patch: ReplaceWornItemsOnly
void onReplaceItems()
{
const LLUUID& selected_id = getSelectedOutfitID();
if (selected_id.notNull())
{
//LLAppearanceMgr::getInstance()->replaceCategoryInCurrentOutfit(selected_id);
}
}
//-TT
void onTakeOff()
{
// Take off selected outfit.
@ -285,10 +271,6 @@ protected:
boost::bind(&LLAppearanceMgr::replaceCurrentOutfit, &LLAppearanceMgr::instance(), selected_id));
registrar.add("Outfit.WearAdd",
boost::bind(&LLAppearanceMgr::addCategoryToCurrentOutfit, &LLAppearanceMgr::instance(), selected_id));
//-TT Patch: ReplaceWornItemsOnly
registrar.add("Outfit.WearReplaceItems",
boost::bind(&LLAppearanceMgr::replaceCategoryInCurrentOutfit, &LLAppearanceMgr::instance(), selected_id));
//-TT
registrar.add("Outfit.TakeOff",
boost::bind(&LLAppearanceMgr::takeOffOutfit, &LLAppearanceMgr::instance(), selected_id));
registrar.add("Outfit.Edit", boost::bind(editOutfit));

View File

@ -203,12 +203,16 @@ std::string build_notice_date(const U32& the_time)
time(&t);
}
std::string dateStr = "["+LLTrans::getString("LTimeYear")+"]/["
+LLTrans::getString("LTimeMthNum")+"]/["
+LLTrans::getString("LTimeDay")+"] ["
+LLTrans::getString("LTimeHour")+"]:["
+LLTrans::getString("LTimeMin")+"]:["
+LLTrans::getString("LTimeSec")+"]";
// <FS:Ansariel> FIRE-17649: Localizable date formats for group notices
//std::string dateStr = "["+LLTrans::getString("LTimeYear")+"]/["
// +LLTrans::getString("LTimeMthNum")+"]/["
// +LLTrans::getString("LTimeDay")+"] ["
// +LLTrans::getString("LTimeHour")+"]:["
// +LLTrans::getString("LTimeMin")+"]:["
// +LLTrans::getString("LTimeSec")+"]";
std::string dateStr = LLTrans::getString("GroupNoticesPanelDateString");
// </FS:Ansariel>
LLSD substitution;
substitution["datetime"] = (S32) t;
LLStringUtil::format (dateStr, substitution);

View File

@ -56,6 +56,7 @@
#include "lltoggleablemenu.h"
#include "llviewermenu.h"
#include "llviewerregion.h"
#include "fsfloaterplacedetails.h"
// [RLVa:KB]
#include "rlvhandler.h"
// [/RLVa:KB]
@ -379,14 +380,7 @@ void LLLandmarksPanel::onSelectorButtonClicked()
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", key);
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", key);
}
else
{
LLFloaterSidePanelContainer::showPanel("places", key);
}
FSFloaterPlaceDetails::showPlaceDetails(key);
// </FS:Ansariel>
}
}
@ -814,14 +808,7 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const
{
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", LLSD().with("type", "create_landmark"));
}
else
{
LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
}
FSFloaterPlaceDetails::showPlaceDetails(LLSD().with("type", "create_landmark"));
// </FS:Ansariel>
}
// [RLVa:KB] - Checked: 2012-02-08 (RLVa-1.4.5) | Added: RLVa-1.4.5

View File

@ -1098,7 +1098,10 @@ void LLFloaterInventoryFinder::updateElementsFromFilter()
U32 date_search_direction = mFilter->getDateSearchDirection();
// update the ui elements
setTitle(mFilter->getName());
// <FS:PP> Make floater title translatable
// setTitle(mFilter->getName());
setTitle(LLTrans::getString(mFilter->getName()));
// </FS:PP>
getChild<LLUICtrl>("check_animation")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION));

View File

@ -355,7 +355,7 @@ LLPanelObject::LLPanelObject()
mHasPosClipboard(FALSE),
mHasSizeClipboard(FALSE),
mHasRotClipboard(FALSE),
mHasParamClipboard(FALSE),
mHasParamsClipboard(FALSE),
mHasFlexiParam(FALSE),
mHasSculptParam(FALSE),
mHasLightParam(FALSE)
@ -2606,7 +2606,7 @@ void LLPanelObject::onPasteRotClip(const LLSD& data)
void LLPanelObject::onCopyParams(const LLSD& data)
{
getVolumeParams(mClipboardVolumeParams);
mHasParamClipboard = TRUE;
mHasParamsClipboard = TRUE;
LLViewerObject* objectp = mObject;
if (!objectp)
@ -2622,15 +2622,15 @@ void LLPanelObject::onCopyParams(const LLSD& data)
LLFlexibleObjectData *attributes = (LLFlexibleObjectData *)objectp->getParameterEntry(LLNetworkData::PARAMS_FLEXIBLE);
if (attributes)
{
mPramsClipboard["lod"] = attributes->getSimulateLOD();
mPramsClipboard["gav"] = attributes->getGravity();
mPramsClipboard["ten"] = attributes->getTension();
mPramsClipboard["fri"] = attributes->getAirFriction();
mPramsClipboard["sen"] = attributes->getWindSensitivity();
mParamsClipboard["lod"] = attributes->getSimulateLOD();
mParamsClipboard["gav"] = attributes->getGravity();
mParamsClipboard["ten"] = attributes->getTension();
mParamsClipboard["fri"] = attributes->getAirFriction();
mParamsClipboard["sen"] = attributes->getWindSensitivity();
LLVector3 force = attributes->getUserForce();
mPramsClipboard["forx"] = force.mV[0];
mPramsClipboard["fory"] = force.mV[1];
mPramsClipboard["forz"] = force.mV[2];
mParamsClipboard["forx"] = force.mV[0];
mParamsClipboard["fory"] = force.mV[1];
mParamsClipboard["forz"] = force.mV[2];
mHasFlexiParam = TRUE;
}
}
@ -2686,11 +2686,11 @@ void LLPanelObject::onCopyParams(const LLSD& data)
}
}
if (allow_texture)
mPramsClipboard["sculptid"] = image_id;
mParamsClipboard["sculptid"] = image_id;
else
mPramsClipboard["sculptid"] = LLUUID(SCULPT_DEFAULT_TEXTURE);
mParamsClipboard["sculptid"] = LLUUID(SCULPT_DEFAULT_TEXTURE);
mPramsClipboard["sculpt_type"] = sculpt_params->getSculptType();
mParamsClipboard["sculpt_type"] = sculpt_params->getSculptType();
mHasSculptParam = TRUE;
}
else
@ -2700,13 +2700,13 @@ void LLPanelObject::onCopyParams(const LLSD& data)
if (volobjp && volobjp->getIsLight())
{
mPramsClipboard["Light Intensity"] = volobjp->getLightIntensity();
mPramsClipboard["Light Radius"] = volobjp->getLightRadius();
mPramsClipboard["Light Falloff"] = volobjp->getLightFalloff();
mParamsClipboard["Light Intensity"] = volobjp->getLightIntensity();
mParamsClipboard["Light Radius"] = volobjp->getLightRadius();
mParamsClipboard["Light Falloff"] = volobjp->getLightFalloff();
LLColor3 color = volobjp->getLightColor();
mPramsClipboard["r"] = color.mV[0];
mPramsClipboard["g"] = color.mV[1];
mPramsClipboard["b"] = color.mV[2];
mParamsClipboard["r"] = color.mV[0];
mParamsClipboard["g"] = color.mV[1];
mParamsClipboard["b"] = color.mV[2];
mHasLightParam = TRUE;
}
else
@ -2714,6 +2714,7 @@ void LLPanelObject::onCopyParams(const LLSD& data)
mHasLightParam = FALSE;
}
mParamsClipboard["physics_shape"] = objectp->getPhysicsShapeType();
}
void LLPanelObject::onPasteParams(const LLSD& data)
@ -2730,14 +2731,14 @@ void LLPanelObject::onPasteParams(const LLSD& data)
LLFlexibleObjectData new_attributes;
new_attributes = *attributes;
new_attributes.setSimulateLOD(mPramsClipboard["lod"].asInteger());
new_attributes.setGravity(mPramsClipboard["gav"].asReal());
new_attributes.setTension(mPramsClipboard["ten"].asReal());
new_attributes.setAirFriction(mPramsClipboard["fri"].asReal());
new_attributes.setWindSensitivity(mPramsClipboard["sen"].asReal());
F32 fx = (F32)mPramsClipboard["forx"].asReal();
F32 fy = (F32)mPramsClipboard["fory"].asReal();
F32 fz = (F32)mPramsClipboard["forz"].asReal();
new_attributes.setSimulateLOD(mParamsClipboard["lod"].asInteger());
new_attributes.setGravity(mParamsClipboard["gav"].asReal());
new_attributes.setTension(mParamsClipboard["ten"].asReal());
new_attributes.setAirFriction(mParamsClipboard["fri"].asReal());
new_attributes.setWindSensitivity(mParamsClipboard["sen"].asReal());
F32 fx = (F32)mParamsClipboard["forx"].asReal();
F32 fy = (F32)mParamsClipboard["fory"].asReal();
F32 fz = (F32)mParamsClipboard["forz"].asReal();
LLVector3 force(fx,fy,fz);
new_attributes.setUserForce(force);
objectp->setParameterEntry(LLNetworkData::PARAMS_FLEXIBLE, new_attributes, true);
@ -2748,8 +2749,8 @@ void LLPanelObject::onPasteParams(const LLSD& data)
{
LLSculptParams sculpt_params;
if (mPramsClipboard.has("sculptid"))
sculpt_params.setSculptTexture(mPramsClipboard["sculptid"].asUUID(), (U8)mPramsClipboard["sculpt_type"].asInteger());
if (mParamsClipboard.has("sculptid"))
sculpt_params.setSculptTexture(mParamsClipboard["sculptid"].asUUID(), (U8)mParamsClipboard["sculpt_type"].asInteger());
objectp->setParameterEntry(LLNetworkData::PARAMS_SCULPT, sculpt_params, TRUE);
}
@ -2767,15 +2768,20 @@ void LLPanelObject::onPasteParams(const LLSD& data)
if (volobjp && mHasLightParam)
{
volobjp->setIsLight(TRUE);
volobjp->setLightIntensity((F32)mPramsClipboard["Light Intensity"].asReal());
volobjp->setLightRadius((F32)mPramsClipboard["Light Radius"].asReal());
volobjp->setLightFalloff((F32)mPramsClipboard["Light Falloff"].asReal());
F32 r = (F32)mPramsClipboard["r"].asReal();
F32 g = (F32)mPramsClipboard["g"].asReal();
F32 b = (F32)mPramsClipboard["b"].asReal();
volobjp->setLightIntensity((F32)mParamsClipboard["Light Intensity"].asReal());
volobjp->setLightRadius((F32)mParamsClipboard["Light Radius"].asReal());
volobjp->setLightFalloff((F32)mParamsClipboard["Light Falloff"].asReal());
F32 r = (F32)mParamsClipboard["r"].asReal();
F32 g = (F32)mParamsClipboard["g"].asReal();
F32 b = (F32)mParamsClipboard["b"].asReal();
volobjp->setLightColor(LLColor3(r,g,b));
}
if (mParamsClipboard.has("physics_shape"))
{
objectp->setPhysicsShapeType((U8)mParamsClipboard["physics_shape"].asInteger());
}
if(mHasParamClipboard)
if(mHasParamsClipboard)
objectp->updateVolume(mClipboardVolumeParams);
}

View File

@ -113,9 +113,9 @@ protected:
BOOL mHasSizeClipboard;
BOOL mHasRotClipboard;
LLSD mPramsClipboard;
LLSD mParamsClipboard;
LLVolumeParams mClipboardVolumeParams;
BOOL mHasParamClipboard;
BOOL mHasParamsClipboard;
BOOL mHasFlexiParam;
BOOL mHasSculptParam;
BOOL mHasLightParam;

View File

@ -61,10 +61,20 @@ LLPanelOutfitsInventory::LLPanelOutfitsInventory() :
observer.addBOFChangedCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this));
observer.addCOFChangedCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this));
observer.addOutfitLockChangedCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this));
// <FS:Ansariel> FIRE-17626: Attachment count in appearance floater
mCategoriesObserver = new LLInventoryCategoriesObserver();
}
LLPanelOutfitsInventory::~LLPanelOutfitsInventory()
{
// <FS:Ansariel> FIRE-17626: Attachment count in appearance floater
if (gInventory.containsObserver(mCategoriesObserver))
{
gInventory.removeObserver(mCategoriesObserver);
}
delete mCategoriesObserver;
// </FS:Ansariel>
}
// virtual
@ -100,6 +110,13 @@ void LLPanelOutfitsInventory::onOpen(const LLSD& key)
panel_appearance->fetchInventory();
panel_appearance->refreshCurrentOutfitName();
}
// <FS:Ansariel> FIRE-17626: Attachment count in appearance floater
gInventory.addObserver(mCategoriesObserver);
mCategoriesObserver->addCategory(LLAppearanceMgr::instance().getCOF(), boost::bind(&LLPanelOutfitsInventory::onCOFChanged, this));
onCOFChanged();
// </FS:Ansariel>
mInitialized = true;
}
@ -220,6 +237,18 @@ void LLPanelOutfitsInventory::onSave()
LLNotificationsUtil::add("SaveOutfitAs", args, payload, boost::bind(&LLPanelOutfitsInventory::onSaveCommit, this, _1, _2));
}
// <FS:Ansariel> FIRE-17626: Attachment count in appearance floater
void LLPanelOutfitsInventory::onCOFChanged()
{
U32 attachments = LLAppearanceMgr::instance().getNumAttachmentsInCOF();
LLStringUtil::format_map_t args;
args["COUNT"] = llformat("%d", attachments);
args["MAX"] = llformat("%d", MAX_AGENT_ATTACHMENTS);
std::string title = getString("cof_tab_label", args);
mAppearanceTabs->setPanelTitle(mAppearanceTabs->getIndexForPanel(mCurrentOutfitPanel), title);
}
// </FS:Ansariel>
//static
LLPanelOutfitsInventory* LLPanelOutfitsInventory::findInstance()
{

View File

@ -38,6 +38,7 @@ class LLMenuGL;
class LLSidepanelAppearance;
class LLTabContainer;
class LLSaveOutfitComboBtn;
class LLInventoryCategoriesObserver; // <FS:Ansariel> FIRE-17626: Attachment count in appearance floater
class LLPanelOutfitsInventory : public LLPanel
{
@ -72,6 +73,11 @@ private:
std::string mFilterSubString;
std::auto_ptr<LLSaveOutfitComboBtn> mSaveComboBtn;
// <FS:Ansariel> FIRE-17626: Attachment count in appearance floater
LLInventoryCategoriesObserver* mCategoriesObserver;
void onCOFChanged();
// </FS:Ansariel>
//////////////////////////////////////////////////////////////////////////////////
// tab panels //
protected:

View File

@ -73,6 +73,7 @@
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
#include "llviewerwindow.h"
#include "fsfloaterplacedetails.h"
// Constants
static const F32 PLACE_INFO_UPDATE_INTERVAL = 3.0;
@ -120,14 +121,7 @@ public:
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", key);
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", key);
}
else
{
LLFloaterSidePanelContainer::showPanel("places", key);
}
FSFloaterPlaceDetails::showPlaceDetails(key);
// </FS:Ansariel>
return true;
}

View File

@ -49,6 +49,8 @@
#include "llviewercontrol.h"
#include "fsfloaterplacedetails.h"
// Maximum number of items that can be added to a list in one pass.
// Used to limit time spent for items list update per frame.
static const U32 ADD_LIMIT = 50;
@ -322,14 +324,7 @@ void LLTeleportHistoryFlatItem::showPlaceInfoPanel(S32 index)
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", params);
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", params);
}
else
{
LLFloaterSidePanelContainer::showPanel("places", params);
}
FSFloaterPlaceDetails::showPlaceDetails(params);
// </FS:Ansariel>
}

View File

@ -47,6 +47,7 @@
// [RLVa:KB] - Checked: 2012-02-08 (RLVa-1.4.5) | Added: RLVa-1.4.5
#include "rlvhandler.h"
// [/RLVa:KB]
#include "fsfloaterplacedetails.h"
#include "llfloaterreg.h"
@ -477,28 +478,14 @@ void LLPanelTopInfoBar::onContextMenuItemClicked(const LLSD::String& item)
{
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", LLSD().with("type", "create_landmark"));
}
else
{
LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
}
FSFloaterPlaceDetails::showPlaceDetails(LLSD().with("type", "create_landmark"));
// </FS:Ansariel>
}
else
{
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "landmark").with("id",landmark->getUUID()));
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", LLSD().with("type", "landmark").with("id",landmark->getUUID()));
}
else
{
LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "landmark").with("id",landmark->getUUID()));
}
FSFloaterPlaceDetails::showPlaceDetails(LLSD().with("type", "landmark").with("id",landmark->getUUID()));
// </FS:Ansariel>
}
// [RLVa:KB] - Checked: 2012-02-08 (RLVa-1.4.5) | Added: RLVa-1.4.5
@ -531,14 +518,7 @@ void LLPanelTopInfoBar::onInfoButtonClicked()
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "agent"));
//if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
//{
// LLFloaterReg::showInstance("fs_placedetails", LLSD().with("type", "agent"));
//}
//else
//{
// LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "agent"));
//}
//FSFloaterPlaceDetails::showPlaceDetails(LLSD().with("type", "agent"));
// </FS:Ansariel>
LLFloaterReg::showInstance("about_land");
}

View File

@ -227,10 +227,9 @@ void LLScriptFloater::createForm(const LLUUID& notification_id)
LLRect panel_rect = mScriptForm->getRect();
// <FS:Zi> Animated dialogs
// toast_rect.setLeftTopAndSize(toast_rect.mLeft, toast_rect.mTop, panel_rect.getWidth(), panel_rect.getHeight() + getHeaderHeight());
eDialogPosition dialog_position = (eDialogPosition)gSavedSettings.getS32("ScriptDialogsPosition");
mDesiredHeight = panel_rect.getHeight() + getHeaderHeight();
if (gSavedSettings.getBOOL("FSAnimatedScriptDialogs") &&
((eDialogPosition)gSavedSettings.getS32("ScriptDialogsPosition") == POS_TOP_LEFT ||
(eDialogPosition)gSavedSettings.getS32("ScriptDialogsPosition") == POS_TOP_RIGHT))
if (gSavedSettings.getBOOL("FSAnimatedScriptDialogs") && (dialog_position == POS_TOP_LEFT || dialog_position == POS_TOP_RIGHT))
{
mCurrentHeight = 0;
mStartTime = LLFrameTimer::getElapsedSeconds();
@ -246,7 +245,7 @@ void LLScriptFloater::createForm(const LLUUID& notification_id)
// <FS:Zi> Dialog Stacking browser
mScriptForm->getChild<LLButton>("DialogStackButton")->setCommitCallback(boost::bind(&LLScriptFloater::onStackClicked, this));
if ((eDialogPosition)gSavedSettings.getS32("ScriptDialogsPosition") != POS_DOCKED)
if (dialog_position != POS_DOCKED)
{
DialogStack::instance().push(notification_id);
}
@ -890,24 +889,24 @@ LLScriptFloater* LLScriptFloater::show(const LLUUID& notification_id)
if (floaterType == LLScriptFloaterManager::OBJ_SCRIPT || floaterType == LLScriptFloaterManager::OBJ_UNKNOWN || floaterType == LLScriptFloaterManager::OBJ_GIVE_INVENTORY)
// </FS:PP>
{
eDialogPosition dialogPos = (eDialogPosition)gSavedSettings.getS32("ScriptDialogsPosition");
eDialogPosition dialog_position = (eDialogPosition)gSavedSettings.getS32("ScriptDialogsPosition");
if (dialogPos == POS_LEGACY)
if (dialog_position == POS_LEGACY)
{
dialogPos = POS_TOP_RIGHT;
dialog_position = POS_TOP_RIGHT;
if (!gSavedSettings.getBOOL("ShowScriptDialogsTopRight"))
{
dialogPos = POS_DOCKED;
dialog_position = POS_DOCKED;
}
gSavedSettings.setS32("ScriptDialogsPosition", (S32)dialogPos);
gSavedSettings.setS32("ScriptDialogsPosition", (S32)dialog_position);
}
if (dialogPos == POS_DOCKED && chicletsDisabled)
if (dialog_position == POS_DOCKED && chicletsDisabled)
{
dialogPos = POS_TOP_RIGHT;
dialog_position = POS_TOP_RIGHT;
}
if (dialogPos != POS_DOCKED)
if (dialog_position != POS_DOCKED)
{
// undock the dialog
floater->setDocked(false, true);
@ -938,7 +937,7 @@ LLScriptFloater* LLScriptFloater::show(const LLUUID& notification_id)
floater->setOpenPositioning(LLFloaterEnums::POSITIONING_SPECIFIED);
switch (dialogPos)
switch (dialog_position)
{
case POS_DOCKED:
{
@ -975,7 +974,7 @@ LLScriptFloater* LLScriptFloater::show(const LLUUID& notification_id)
}
default:
{
LL_WARNS() << "dialogPos value " << dialogPos << " not handled in switch() statement." << LL_ENDL;
LL_WARNS() << "dialog_position value " << dialog_position << " not handled in switch() statement." << LL_ENDL;
}
}
}

View File

@ -654,15 +654,25 @@ bool LLSelectMgr::linkObjects()
bool LLSelectMgr::unlinkObjects()
{
S32 min_objects_for_confirm = gSavedSettings.getS32("MinObjectsForUnlinkConfirm");
S32 unlink_object_count = mSelectedObjects->getObjectCount(); // clears out nodes with NULL objects
if (unlink_object_count >= min_objects_for_confirm
&& unlink_object_count > mSelectedObjects->getRootObjectCount())
// <FS:PP>
if (gSavedSettings.getBOOL("FSUnlinkConfirmEnabled"))
{
// total count > root count means that there are childer inside and that there are linksets that will be unlinked
LLNotificationsUtil::add("ConfirmUnlink", LLSD(), LLSD(), boost::bind(&LLSelectMgr::confirmUnlinkObjects, this, _1, _2));
return true;
// </FS:PP>
S32 min_objects_for_confirm = gSavedSettings.getS32("MinObjectsForUnlinkConfirm");
S32 unlink_object_count = mSelectedObjects->getObjectCount(); // clears out nodes with NULL objects
if (unlink_object_count >= min_objects_for_confirm
&& unlink_object_count > mSelectedObjects->getRootObjectCount())
{
// total count > root count means that there are childer inside and that there are linksets that will be unlinked
LLNotificationsUtil::add("ConfirmUnlink", LLSD(), LLSD(), boost::bind(&LLSelectMgr::confirmUnlinkObjects, this, _1, _2));
return true;
}
// <FS:PP>
}
// </FS:PP>
LLSelectMgr::getInstance()->sendDelink();
return true;
@ -7127,6 +7137,12 @@ BOOL LLSelectMgr::canSelectObject(LLViewerObject* object, BOOL ignore_select_own
return FALSE;
}
// </FS:Ansariel>
// <FS:Ansariel> FIRE-17696: Option to select only locked objects
if (gSavedSettings.getBOOL("FSSelectLockedOnly") && object->permMove() && !object->isPermanentEnforced())
{
return FALSE;
}
// </FS:Ansariel>
// Can't select orphans
if (object->isOrphaned()) return FALSE;

View File

@ -2689,18 +2689,17 @@ bool idle_startup()
}
// If not first login, we need to fetch COF contents and
// compute appearance from that.
// <FS:Ansariel> [Legacy Bake]
//if (isAgentAvatarValid() && !gAgent.isFirstLogin() && !gAgent.isOutfitChosen())
#ifdef OPENSIM
if (LLGridManager::getInstance()->isInSecondLife() && isAgentAvatarValid() && !gAgent.isFirstLogin() && !gAgent.isOutfitChosen())
#else
if (isAgentAvatarValid() && !gAgent.isFirstLogin() && !gAgent.isOutfitChosen())
#endif
// </FS:Ansariel> [Legacy Bake]
{
gAgentWearables.notifyLoadingStarted();
gAgent.setOutfitChosen(TRUE);
gAgentWearables.sendDummyAgentWearablesUpdate();
// <FS:Ansariel> [Legacy Bake]
//gAgentWearables.sendDummyAgentWearablesUpdate();
if (LLGridManager::getInstance()->isInSecondLife())
{
gAgentWearables.sendDummyAgentWearablesUpdate();
}
// </FS:Ansariel> [Legacy Bake]
callAfterCategoryFetch(LLAppearanceMgr::instance().getCOF(), set_flags_and_update_appearance);
}
@ -2759,15 +2758,7 @@ bool idle_startup()
display_startup();
// <FS:Ansariel> [Legacy Bake]
//if (gAgent.isOutfitChosen() && (wearables_time > max_wearables_time))
#ifdef OPENSIM
if ((LLGridManager::getInstance()->isInSecondLife() && gAgent.isOutfitChosen() && (wearables_time > max_wearables_time)) ||
(!LLGridManager::getInstance()->isInSecondLife() && (wearables_time > max_wearables_time)))
#else
if (gAgent.isOutfitChosen() && (wearables_time > max_wearables_time))
#endif
// </FS:Ansariel> [Legacy Bake]
{
LLNotificationsUtil::add("ClothingLoading");
record(LLStatViewer::LOADING_WEARABLES_LONG_DELAY, wearables_time);
@ -4219,14 +4210,6 @@ bool process_login_success_response(U32 &first_sim_size_x, U32 &first_sim_size_y
// requested and available, etc.
//gAgent.setGenderChosen(TRUE);
// <FS:Ansariel> [Legacy Bake]
#ifdef OPENSIM
if (!LLGridManager::getInstance()->isInSecondLife())
{
gAgent.setOutfitChosen(TRUE);
}
#endif
// </FS:Ansariel> [Legacy Bake]
}
bool pacific_daylight_time = false;

View File

@ -95,15 +95,18 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(const LLNotificationPtr& notifi
//message body
const std::string& message = payload["message"].asString();
std::string timeStr = "["+LLTrans::getString("TimeWeek")+"], ["
+LLTrans::getString("TimeMth")+"] ["
+LLTrans::getString("TimeDay")+"] ["
+LLTrans::getString("TimeYear")+"] ["
+LLTrans::getString("TimeHour12")+"]:["
+LLTrans::getString("TimeMin")+"]:["
+LLTrans::getString("TimeSec")+"] ["
+LLTrans::getString("TimeAMPM")+"] ["
+LLTrans::getString("TimeTimezone")+"]";
// <FS:Ansariel> FIRE-17649: Localizable date formats for group notices
//std::string timeStr = "["+LLTrans::getString("TimeWeek")+"], ["
// +LLTrans::getString("TimeMth")+"] ["
// +LLTrans::getString("TimeDay")+"] ["
// +LLTrans::getString("TimeYear")+"] ["
// +LLTrans::getString("TimeHour12")+"]:["
// +LLTrans::getString("TimeMin")+"]:["
// +LLTrans::getString("TimeSec")+"] ["
// +LLTrans::getString("TimeAMPM")+"] ["
// +LLTrans::getString("TimeTimezone")+"]";
std::string timeStr = LLTrans::getString("GroupNoticesToastDateString");
// </FS:Ansariel>
const LLDate timeStamp = notification->getDate();
LLDate notice_date = timeStamp.notNull() ? timeStamp : payload["received_time"].asDate();
LLSD substitution;

View File

@ -190,10 +190,11 @@ void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair
mControlPanel->addChild(ignore_btn, -1);
mute_btn_pad = 4 * HPAD; //only use a 4 * HPAD padding if an ignore button exists
}
// FIRE-3948: Commenting all out as mute button is disabled (FS:MS)
// <FS:Ansariel> Undo the removal and make it optional after I was looking for the mute button on spammy dialogs!
// <FS:Ansariel> FIRE-3948: Option to remove the mute button; FIRE-17158: Remove "block" button for script dialog of own objects
//if (mIsScriptDialog && mute_btn != NULL)
if (mIsScriptDialog && mute_btn != NULL && !gSavedSettings.getBOOL("FSRemoveScriptBlockButton"))
if (mIsScriptDialog && mute_btn != NULL && !gSavedSettings.getBOOL("FSRemoveScriptBlockButton") &&
(!mNotification->getPayload().has("own_object") || !mNotification->getPayload()["own_object"].asBoolean()))
// </FS:Ansariel>
{
LLRect mute_btn_rect(mute_btn->getRect());
// Place mute (Block) button to the left of the ignore button.
@ -338,11 +339,11 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )
// </FS:Ansariel>
// <FS:Zi> Dialog Stacking browser
// hide the stacking button for things that are not scripting dialogs etc.
else if(mNotification->getName()!="LoadWebPage")
else if (notif_name != "LoadWebPage")
{
// setting size to 0,0 becuase button visibility is dictated by a control variable,
// so we need a different way to hide this button.
getChild<LLButton>("DialogStackButton")->reshape(0,0,FALSE);
getChild<LLButton>("DialogStackButton")->reshape(0, 0, FALSE);
}
// </FS:Zi>

View File

@ -117,6 +117,8 @@ LLObjectSelectionHandle LLToolSelect::handleObjectSelection(const LLPickInfo& pi
BOOL select_movable = gSavedSettings.getBOOL("SelectMovableOnly");
// <FS:Ansariel> FIRE-14593: Option to select only copyable objects
BOOL select_copyable = gSavedSettings.getBOOL("FSSelectCopyableOnly");
// <FS:Ansariel> FIRE-17696: Option to select only locked objects
BOOL select_locked = gSavedSettings.getBOOL("FSSelectLockedOnly");
// *NOTE: These settings must be cleaned up at bottom of function.
if (temp_select || LLSelectMgr::getInstance()->mAllowSelectAvatar)
@ -125,6 +127,8 @@ LLObjectSelectionHandle LLToolSelect::handleObjectSelection(const LLPickInfo& pi
gSavedSettings.setBOOL("SelectMovableOnly", FALSE);
// <FS:Ansariel> FIRE-14593: Option to select only copyable objects
gSavedSettings.setBOOL("FSSelectCopyableOnly", FALSE);
// <FS:Ansariel> FIRE-17696: Option to select only locked objects
gSavedSettings.setBOOL("FSSelectLockedOnly", FALSE);
LLSelectMgr::getInstance()->setForceSelection(TRUE);
}
@ -276,6 +280,8 @@ LLObjectSelectionHandle LLToolSelect::handleObjectSelection(const LLPickInfo& pi
gSavedSettings.setBOOL("SelectMovableOnly", select_movable);
// <FS:Ansariel> FIRE-14593: Option to select only copyable objects
gSavedSettings.setBOOL("FSSelectCopyableOnly", select_copyable);
// <FS:Ansariel> FIRE-17696: Option to select only locked objects
gSavedSettings.setBOOL("FSSelectLockedOnly", select_locked);
LLSelectMgr::getInstance()->setForceSelection(FALSE);
}

View File

@ -52,6 +52,8 @@
#include "llnotificationsutil.h"
#include "llsd.h"
#include "fsfloaterplacedetails.h"
static LLURLDispatcherListener sURLDispatcherListener;
class LLURLDispatcherImpl
@ -302,14 +304,7 @@ void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const LLSLURL&
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", key);
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", key);
}
else
{
LLFloaterSidePanelContainer::showPanel("places", key);
}
FSFloaterPlaceDetails::showPlaceDetails(key);
// </FS:Ansariel>
}
}

View File

@ -175,7 +175,6 @@ static bool handleRenderFarClipChanged(const LLSD& newvalue)
return true;
}
//</FS:HG> FIRE-6340, FIRE-6567 - Setting Bandwidth issues
static bool handleTerrainDetailChanged(const LLSD& newvalue)
{
LLDrawPoolTerrain::sDetailMode = newvalue.asInteger();

View File

@ -159,6 +159,7 @@
#include "llfloaterpreference.h" //<FS:KC> Volume controls prefs
#include "llcheckboxctrl.h" //<FS:KC> Volume controls prefs
#include "llscenemonitor.h"
#include "fsfloaterplacedetails.h"
using namespace LLAvatarAppearanceDefines;
@ -7140,14 +7141,7 @@ class LLWorldCreateLandmark : public view_listener_t
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", LLSD().with("type", "create_landmark"));
}
else
{
LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
}
FSFloaterPlaceDetails::showPlaceDetails(LLSD().with("type", "create_landmark"));
// </FS:Ansariel>
return true;
@ -7165,14 +7159,7 @@ class LLWorldPlaceProfile : public view_listener_t
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "agent"));
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", LLSD().with("type", "agent"));
}
else
{
LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "agent"));
}
FSFloaterPlaceDetails::showPlaceDetails(LLSD().with("type", "agent"));
// </FS:Ansariel>
return true;

View File

@ -132,6 +132,7 @@
#include "fsareasearch.h"
#include "fscommon.h"
#include "fsdata.h"
#include "fsfloaterplacedetails.h"
#include "fsradar.h"
#include "fskeywords.h" // <FS:PP> FIRE-10178: Keyword Alerts in group IM do not work unless the group is in the foreground
#include "fslightshare.h" // <FS:CR> FIRE-5118 - Lightshare support
@ -1415,14 +1416,7 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam
{
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "landmark").with("id", item->getUUID()));
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", LLSD().with("type", "landmark").with("id", item->getUUID()));
}
else
{
LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "landmark").with("id", item->getUUID()));
}
FSFloaterPlaceDetails::showPlaceDetails(LLSD().with("type", "landmark").with("id", item->getUUID()));
// </FS:Ansariel>
}
else if("group_offer" == from_name)
@ -1435,14 +1429,7 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", args);
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", args);
}
else
{
LLFloaterSidePanelContainer::showPanel("places", args);
}
FSFloaterPlaceDetails::showPlaceDetails(args);
// </FS:Ansariel>
continue;
@ -2973,6 +2960,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// <FS:Ansariel> Old "do not disturb" message behavior: only send once if session not open
// Session id will be null if avatar answers from offline IM via email
std::string response;
if (!gIMMgr->hasSession(session_id) && session_id.notNull())
{
// </FS:Ansariel>
@ -2980,7 +2968,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
has_session = false;
// <FS:Ansariel> FS autoresponse feature
std::string my_name;
std::string response;
LLAgentUI::buildFullname(my_name);
if (is_do_not_disturb)
{
@ -3000,6 +2987,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
response = gSavedPerAccountSettings.getString("FSAwayAvatarResponse");
}
// </FS:PP>
else
{
LL_WARNS() << "Unknown auto-response mode" << LL_ENDL;
}
pack_instant_message(
gMessageSystem,
gAgent.getID(),
@ -3069,11 +3060,14 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
if (!has_session)
{
// <FS:LO> Fire-5389 - "Autoresponse Sent" message added to Firestorm as was in Phoenix
LLStringUtil::format_map_t args;
args["MESSAGE"] = response;
gIMMgr->addMessage(
session_id,
gAgentID,
LLStringUtil::null, // Pass null value so no name gets prepended
LLTrans::getString("IM_autoresponse_sent"),
LLTrans::getString("IM_autoresponse_sent", args),
false,
name,
IM_NOTHING_SPECIAL,
@ -3321,8 +3315,13 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
info->mFolderID = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(info->mType));
std::string from_name;
from_name += "A group member named ";
from_name += name;
// <FS:Ansariel> FIRE-17714: Make group notice attachment confirmation localizable
//from_name += "A group member named ";
//from_name += name;
LLStringUtil::format_map_t args;
args["NAME"] = name;
from_name += LLTrans::getString("InvOfferGroupNoticeName", args);
// </FS:Ansariel>
info->mFromName = from_name;
info->mDesc = item_name;
@ -9337,6 +9336,17 @@ void process_script_dialog(LLMessageSystem* msg, void**)
payload["chat_channel"] = chat_channel;
payload["object_name"] = object_name;
// <FS:Ansariel> FIRE-17158: Remove "block" button for script dialog of own objects
bool own_object = false;
std::string self_name;
LLAgentUI::buildFullname(self_name);
if (LLCacheName::buildFullName(first_name, last_name) == self_name)
{
own_object = true;
}
payload["own_object"] = own_object;
// </FS:Ansariel>
// build up custom form
S32 button_count = msg->getNumberOfBlocks("Buttons");
if (button_count > SCRIPT_DIALOG_MAX_BUTTONS)

View File

@ -61,6 +61,8 @@
#include "llviewertexturelist.h"
#include "llviewerwindow.h"
#include "fsfloaterplacedetails.h"
static LLDefaultChildRegistry::Register<LLViewerTextEditor> r("text_editor");
///-----------------------------------------------------------------------
@ -83,14 +85,7 @@ public:
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", key);
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", key);
}
else
{
LLFloaterSidePanelContainer::showPanel("places", key);
}
FSFloaterPlaceDetails::showPlaceDetails(key);
// </FS:Ansariel>
}
@ -105,14 +100,7 @@ public:
// <FS:Ansariel> FIRE-817: Separate place details floater
//LLFloaterSidePanelContainer::showPanel("places", key);
if (gSavedSettings.getBOOL("FSUseStandalonePlaceDetailsFloater"))
{
LLFloaterReg::showInstance("fs_placedetails", key);
}
else
{
LLFloaterSidePanelContainer::showPanel("places", key);
}
FSFloaterPlaceDetails::showPlaceDetails(key);
// </FS:Ansariel>
}
// [/SL:KB]

View File

@ -1266,7 +1266,10 @@ void LLViewerFetchedTexture::setDeletionCandidate()
//set the texture inactive
void LLViewerFetchedTexture::setInactive()
{
if(mTextureState == ACTIVE && mGLTexturep.notNull() && mGLTexturep->getTexName() && !mGLTexturep->getBoundRecently())
// <FS:Ansariel> Try to plug the profile icon memory hole
//if(mTextureState == ACTIVE && mGLTexturep.notNull() && mGLTexturep->getTexName() && !mGLTexturep->getBoundRecently())
if((mTextureState == ACTIVE || (mTextureState == NO_DELETE && mBoostLevel == BOOST_ICON)) && mGLTexturep.notNull() && mGLTexturep->getTexName() && !mGLTexturep->getBoundRecently())
// </FS:Ansariel>
{
mTextureState = INACTIVE;
}

View File

@ -421,7 +421,10 @@ public:
MASK_BODYPART = 0x02,
MASK_ATTACHMENT = 0x04,
MASK_GESTURE = 0x08,
MASK_UNKNOWN = 0x16,
// <FS:Ansariel> Fix hexadecimal arithmetics brain fart
//MASK_UNKNOWN = 0x16,
MASK_UNKNOWN = 0x10
// </FS:Ansariel>
};
/* virtual */ LLContextMenu* createMenu();

View File

@ -165,13 +165,13 @@
value="0.035 0.035 0.035 1" />
<color
name="SL-Background"
value="0.25 0.25 0.25 1" />
value="0.035 0.035 0.035 1" />
<color
name="SL-Background_50"
value="0.25 0.25 0.25 0.50" />
value="0.035 0.035 0.035 0.50" />
<color
name="SL-Background_66"
value="0.25 0.25 0.25 0.66" />
value="0.035 0.035 0.035 0.66" />
<color
name="SL-Foreground"
value="0.175 0.020 0.200 1" />

View File

@ -159,13 +159,13 @@
value="0.035 0.035 0.035 1" />
<color
name="SL-Background"
value="0.25 0.25 0.25 1" />
value="0.035 0.035 0.035 1" />
<color
name="SL-Background_50"
value="0.25 0.25 0.25 0.50" />
value="0.035 0.035 0.035 0.50" />
<color
name="SL-Background_66"
value="0.25 0.25 0.25 0.66" />
value="0.035 0.035 0.035 0.66" />
<color
name="SL-Foreground"
value="0.175 0.020 0.200 1" />

View File

@ -96,11 +96,6 @@
name="icon_edit_mine"
tool_tip="Friend can edit, delete or take objects"
width="16" />
<fs_scroll_list.column
image="Permission_Visible_Online_h"
name="icon_visible_online_theirs"
tool_tip="You can see this friend&apos;s online status"
width="16" />
<fs_scroll_list.column
image="Permission_Visible_Map_h"
name="icon_visible_map_theirs"

View File

@ -218,11 +218,15 @@
<radar_list.columns
label="Seen"
name="seen"
sort_column="seen_sort"
width="50"/>
<radar_list.columns
label="Range"
name="range"
width="61"/>
<radar_list.columns
name="seen_sort"
width="-1"/>
</radar_list>
</layout_panel>
</layout_stack>

View File

@ -20,6 +20,10 @@
name="wear_items_tooltip">
Wear selected items
</panel.string>
<panel.string
name="cof_tab_label">
Wearing ([COUNT]/[MAX] Att.)
</panel.string>
<tab_container
follows="all"
height="539"

View File

@ -992,8 +992,6 @@ with the same filename but different name
<texture name="ff_edit_theirs_button" file_name="legacy/ff_edit_theirs_button.tga" preload="false" />
<texture name="icon_avatar_online" file_name="legacy/icon_avatar_online.tga" preload="false" />
<texture name="slim_icon_16_viewer" file_name="slim_icon_16_viewer.tga" preload="false" />
<texture name="ff_visible_online_button_theirs" file_name="legacy/ff_visible_online_button_theirs.tga" preload="false" />
<texture name="ff_visible_online_theirs" file_name="legacy/ff_visible_online_theirs.tga" preload="false" />
<texture name="Console_Background" file_name="Console_Background.png"/>
<texture name="Muted_Chat" file_name="icons/Muted_Chat.png" preload="false" />

View File

@ -59,6 +59,9 @@
<check_box name="filter_temporary" label="Temporär"/>
<check_box name="filter_attachment" label="Anhang"/>
<check_box name="filter_moap" label="Shared Media"/>
<check_box name="filter_perm_copy" label="Kopieren"/>
<check_box name="filter_perm_modify" label="Bearbeiten"/>
<check_box name="filter_perm_transfer" label="Transferieren"/>
<check_box name="filter_for_sale" label="Zum Verkauf zwischen" width="150"/>
<text name="and">
und
@ -82,6 +85,7 @@
<text name="and2">
und
</text>
<check_box name="filter_agent_parcel_only" label="Nur aktuelle Parzelle" width="140"/>
<text name="only_list">
Objekte mit diesen Eigenschaften ausschließen:
</text>

View File

@ -189,6 +189,7 @@
<menu_item_check label="Erweiterte Berechtigungen anzeigen" name="DebugPermissions"/>
<menu_item_check label="Nur meine Objekte auswählen" name="Select Only My Objects"/>
<menu_item_check label="Nur bewegliche Objekte auswählen" name="Select Only Movable Objects"/>
<menu_item_check label="Nur gesperrte Objekte auswählen" name="Select Only Locked Objects"/>
<menu_item_check label="Nur kopierbare Objekte auswählen" name="Select Only Copyable Objects"/>
<menu_item_check label="Gruppen-Objekte einschließen" name="Include Group-Owned Objects"/>
<menu_item_check label="Nach Umgebung auswählen" name="Select By Surrounding"/>

View File

@ -1733,6 +1733,11 @@ weitere Infos zu diesem Update finden Sie [[INFO_URL] hier].
</notification>
<notification name="GroupLeaveConfirmMember">
Sie sind gegenwärtig Mitglied der Gruppe &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
Diese Gruppe verlassen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMemberWithFee">
Sie sind gegenwärtig Mitglied der Gruppe &lt;nolink&gt;[GROUP]&lt;/nolink&gt;. Erneutes Beitreten kostet [AMOUNT] L$.
Diese Gruppe verlassen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
@ -2413,7 +2418,7 @@ Diese Aktion kann nicht rückgängig gemacht werden.
<usetemplate ignoretext="Vor dem Löschen von Objekten bestätigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="ConfirmUnlink">Soll das ausgewählte Objekt wirklich getrennt werden?
<usetemplate ignoretext="Vor dem Trennen von Objekten bestätigen" name="okcancelignore" notext="Abbrechen" yestext="Trennen"/>
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Trennen"/>
</notification>
<notification name="HelpReportAbuseSelectCategory">
Wählen Sie eine Missbrauchskategorie aus.

View File

@ -22,8 +22,6 @@
[COUNT]J
</string>
<text name="avatar_name" value="(laden)"/>
<icon name="permission_online_theirs_icon" tool_tip="Sie können sehen, wenn dieser Freund online ist"/>
<icon name="permission_map_theirs_icon" tool_tip="Sie können die Position dieses Freundes auf der Karte sehen"/>
<icon name="permission_edit_theirs_icon" tool_tip="Sie können die Objekte dieses Freundes bearbeiten"/>
<icon name="permission_edit_mine_btn" tool_tip="Dieser Freund kann Ihre Objekte bearbeiten, löschen und an sich nehmen"/>
<icon name="permission_map_btn" tool_tip="Dieser Freund kann Sie auf der Karte finden"/>

View File

@ -13,7 +13,6 @@
<fs_scroll_list.column name="icon_visible_online" tool_tip="Dieser Freund kann sehen, ob Sie online sind."/>
<fs_scroll_list.column name="icon_visible_map" tool_tip="Dieser Freund kann Ihre Position auf der Karte sehen."/>
<fs_scroll_list.column name="icon_edit_mine" tool_tip="Dieser Freund kann Ihre Objekte editieren, löschen oder nehmen."/>
<fs_scroll_list.column name="icon_visible_online_theirs" tool_tip="Sie können sehen, wenn dieser Freund online ist."/>
<fs_scroll_list.column name="icon_visible_map_theirs" tool_tip="Sie können die Position dieses Freundes auf der Karte sehen."/>
<fs_scroll_list.column name="icon_edit_theirs" tool_tip="Sie können Objekte dieses Freundes editieren."/>
</fs_scroll_list>

View File

@ -6,6 +6,9 @@
<panel.string name="wear_items_tooltip">
Ausgewählte Objekte tragen
</panel.string>
<panel.string name="cof_tab_label">
Aktuelles Outfit ([COUNT]/[MAX] Anh.)
</panel.string>
<tab_container name="appearance_tabs">
<panel label="Outfits" name="outfitslist_tab"/>
<panel label="Aktuelles Outfit" name="cof_tab"/>

View File

@ -224,6 +224,10 @@
<text name="RotationStepText2" width="290">
Grad beschränken, falls „An Raster ausrichten“ deakt.
</text>
<check_box label="Trennen von Objekten bestehend aus mindestens" name="FSUnlinkConfirmEnabled" width="295"/>
<text name="MinObjectsForUnlinkConfirmText2">
Einzelobjekten bestätigen
</text>
<check_box label="Strg+Maus zum Greifen und Manipulieren von Objekten verwenden" tool_tip="Falls aktiviert, können Objekte durch Bewegen der Maus bei gleichzeitig gedrückter Strg-Taste gegriffen und bewegt werden." name="FSEnableGrab"/>
<check_box label="Aktiviere Klicken-Ziehen od. Klicken-Skalieren (mit Caps Lock) einer Texturfläche beim Bauen" tool_tip="Falls aktiviert, wird Klicken-Ziehen oder Klicken-Skalieren (mit Caps Lock) einer Texturfläche im Baumodus aktiviert. Dieses ist eine experimentelle Funktion und sollte mit Vorsicht benutzt werden." name="FSExperimentalDragTexture"/>
<check_box label="Altes Verhalten für „Zum Verkauf:“ akt." tool_tip="Falls aktiviert wird die Änderung direkt gespeichert und es ist keine Bestätigung notwendig." name="FSCommitForSaleOnChange_toggle"/>

View File

@ -88,6 +88,7 @@
<check_box label="Bei Teleports immer „Abbrechen“-Button anzeigen" name="FSAlwaysShowTPCancel" tool_tip="Falls aktiviert, wird immer der „Abbrechen“-Button bei einem Teleport anzeigt, auch wenn der Simulator anderweitiges behauptet. Der Simulator weiß zu jeder Zeit, ob ein Teleport abgebrochen werden kann und ignoriert einen Abbruch-Befehl bei Gott- und Todes-TPs sowieso. RLVa-Restriktionen können diese Einstellung übersteuern."/>
<check_box label="Deaktiviere Teleport-Leitstrahl" name="tp_beam_toggle" tool_tip="Deaktiviert den Leitstrahl zum Teleportziel nach Teleports."/>
<check_box label="Deaktiviere Teleport-Anzeige" name="tp_screen_toggle" tool_tip="Deaktiviert den schwarzen Teleport-Bildschirm während eines Teleports."/>
<check_box label="Karte bei Teleports nicht schließen" name="FSDoNotHideMapOnTeleport" tool_tip="Deaktiviert das automatische Schließen der Karte während eines Teleports."/>
</panel>
<!-- Map & Minimap -->

View File

@ -4510,7 +4510,7 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
Ankommende Instant Message von [NAME]
</string>
<string name="IM_autoresponse_sent">
Automatische Antwort gesendet.
Automatische Antwort gesendet: [MESSAGE]
</string>
<string name="IM_autoresponse_item_sent">
Objekt für automatische Antwort gesendet: [ITEM_NAME]
@ -6578,4 +6578,34 @@ Setzen Sie den Editorpfad in Anführungszeichen
<string name="Reqsysinfo_Reason">
Der übermittelte Grund lautet: [REASON]
</string>
<string name="All Items">
Alle Objekte
</string>
<string name="Recent Items">
Aktuelle Objekte
</string>
<string name="Worn Items">
Angezogene Objekte
</string>
<string name="InvOfferGroupNoticeName">
Ein Gruppenmitglied namens [NAME]
</string>
<string name="CallingCardOnlineLabelSuffix">
(online)
</string>
<string name="GroupNoticesPanelDateString">
[day,datetime,local].[mthnum,datetime,local].[year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
</string>
<string name="GroupNoticesToastDateString">
[wkday,datetime,slt]., [day,datetime,slt]. [mth,datetime,slt]. [year,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [timezone,datetime,slt]
</string>
<string name="NotificationItemDateStringLocal">
[day,datetime,local].[mthnum,datetime,local].[year,datetime,local] [hour,datetime,local]:[min,datetime,local]
</string>
<string name="NotificationItemDateStringUTC">
[day,datetime,utc].[mth,datetime,utc].[year,datetime,utc] [hour,datetime,utc]:[min,datetime,utc] [timezone,datetime,utc]
</string>
<string name="NotificationItemDateStringSLT">
[day,datetime,slt].[mthnum,datetime,slt].[year,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]
</string>
</strings>

View File

@ -91,7 +91,7 @@ Dummy Name replaced at run time
</text_editor>
</panel>
<panel
height="840"
height="855"
border="true"
label="Firestorm Credits"
help_topic="about_fscredits_tab"
@ -156,7 +156,7 @@ Additional code generously contributed to Firestorm by:
<text
enabled="false"
follows="top|left"
height="160"
height="185"
bg_readonly_color="Transparent"
left="5"
text_color="LtGray"
@ -165,7 +165,7 @@ Additional code generously contributed to Firestorm by:
top_pad="4"
width="420"
wrap="true">
Albatroz Hird, Alexie Birman, Andromeda Rage, Armin Weatherwax, Casper Warden, Chalice Yao, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hitomi Tiponi, Inusaito Sayori, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Latif Khalifa, Magne Metaverse LLC, Magus Freston, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Miguael Liamano, Mimika Oh, Mister Acacia, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Paladin Forzane, paperwork, Peyton Menges, programmtest, Qwerty Venom, Revolution Smythe, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Thickbrick Sleaford, Vaalith Jinn, Whirly Fizzle, Zwagoth Klaar and others.
Albatroz Hird, Alexie Birman, Andromeda Rage, Armin Weatherwax, Casper Warden, Chalice Yao, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hitomi Tiponi, Inusaito Sayori, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Latif Khalifa, Magne Metaverse LLC, Magus Freston, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Miguael Liamano, Mimika Oh, Mister Acacia, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Paladin Forzane, paperwork, Peyton Menges, programmtest, Qwerty Venom, Revolution Smythe, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Thickbrick Sleaford, Vaalith Jinn, Whirly Fizzle, Zwagoth Klaar and others.
</text>
<text
follows="top|left"
@ -181,7 +181,7 @@ Special thanks to our Firestorm Support Team, wiki editors, educators, and trans
<text
enabled="false"
follows="top|left"
height="260"
height="275"
bg_readonly_color="Transparent"
left="5"
text_color="LtGray"
@ -190,7 +190,7 @@ Special thanks to our Firestorm Support Team, wiki editors, educators, and trans
top_pad="4"
width="420"
word_wrap="true">
Afrika Burton, Albatroz Hird, Alexru Resident, alison Seesaw, AnaLucia Loon, Angell Airy, Annuccia Resident, Annuccia Vuckovic, Anubi Alter, Atthosz Amiot, Ayelin Ethaniel, Basement Desade, Bia Scribe, Bluezy Bleac, Christy Mansbridge, Chymy India, Cordoba Cluny, Damian Zhaoying, DARK Mirabella, Ed Merryman, Eressea Karsin, Erick Gregan, F0RBIDDEN, Fabry String, Flandria Connolly, Foksy, Franklyn Watanabe, FreeSpirit Simmering, Gee McAuley, Greatfox Snowpaw, Gweneth Lange, Hatake Kohime, Hiroshi Kumaki, Hope Dreier, Jodi Nikolaidis, JogiTE Clip, Kool Koolhoven, Kosmox Voom, Lachrimo Skytower, Lalwende Leakey, Landaree Levee, Lassie, Lette Ponnier, Lina Pussycat, Lyn Mimistrobell, Marybeth Oceanlane, Mickeala Praga, Miller Thor, Miro Collas, Mister Acacia, Morgause Whiteberry, Mysty Saunders, Nano Bouscario, narcisssia McMahon, Natem Andel, Nicoletta Schnute, Nisa Maverick, NogarDrevlis Lectar, Norton Burns, PanteraPolnocy, Peewee Musytari, Pisano Smit, PixelProphet Lane, Pol Xaron, Poledra Behemoth, Programmtest, Rander Teskat, Ricky Munz, Riku Highfield, RINOBIT Footman, Robert0 Siamendes, Roth Grut, Sabah Back, SaHaRa Connor, Selene Gregoire, Selo Jacobus, silvanaf Demina, Sniper Siemans, Spartaco Zemenis , Spino Forcella, Srilania Svoboda, Sunset Faulkes, Tanja Levenque, TankMaster Finesmith, Tarlyn Dagger, Thea Brianna, Toy Wylie, Whirly Fizzle, Willow Wilder, Wolfspirit Magic and XLR8RRICK Hudson.
Afrika Burton, Albatroz Hird, Alexru Resident, alison Seesaw, AnaLucia Loon, Angell Airy, Annuccia Resident, Annuccia Vuckovic, Anubi Alter, Atthosz Amiot, Ayelin Ethaniel, Basement Desade, Bia Scribe, Bluezy Bleac, Clarke2, Christy Mansbridge, Chymy India, Cordoba Cluny, Damian Zhaoying, DARK Mirabella, Emmanuella Checchinato, Ed Merryman, Eressea Karsin, Erick Gregan, F0RBIDDEN, Fabry String, Fetish3d, Flandria Connolly, Foksy, Franklyn Watanabe, FreeSpirit Simmering, Gee McAuley, Greatfox Snowpaw, Gweneth Lange, Hatake Kohime, Hiroshi Kumaki, Hope Dreier, Jodi Nikolaidis, JogiTE Clip, Kool Koolhoven, Kosmox Voom, Lachrimo Skytower, Lalwende Leakey, Landaree Levee, Lassie, Lette Ponnier, Lina Pussycat, Lyn Mimistrobell, Marianne Qunhua, Marybeth Oceanlane, Mel Hinarada, Mickeala Praga, Miller Thor, Miro Collas, Mister Acacia, Morgause Whiteberry, Mysty Saunders, Nano Bouscario, narcisssia McMahon, Natem Andel, Nicoletta Schnute, Nisa Maverick, NogarDrevlis Lectar, Norton Burns, PanteraPolnocy, Peewee Musytari, Pisano Smit, PixelProphet Lane, Pol Xaron, Poledra Behemoth, Programmtest, Rander Teskat, Ricky Munz, Riku Highfield, RINOBIT Footman, Robert0 Siamendes, Roth Grut, Sabah Back, SaHaRa Connor, Selene Gregoire, Selo Jacobus, silvanaf Demina, Sniper Siemans, Spartaco Zemenis, Spino Forcella, Srilania Svoboda, Sunset Faulkes, Tanja Levenque, TankMaster Finesmith, Tarlyn Dagger, Thea Brianna, Toy Wylie, Whirly Fizzle, Willow Wilder, Wolfspirit Magic and XLR8RRICK Hudson.
</text>
<text
follows="top|left"
@ -217,7 +217,7 @@ UI Artists and Designers:
top_pad="4"
width="420"
wrap="true">
Adam Frisby, Alexandrea Fride, DarkAgent Baphomet, David Rowe, Digital Scribe, Hitomi Tiponi, Hugh Helendale, KirstenLee Cinquetti, Mobius Ryba, Nadin, Naomah Beaumont, Paladin Forzane, psi Merlin, samm florian, Sammie Benoir, Tommi Waydelich, and Vincent Nacon.
Adam Frisby, Alexandrea Fride, DarkAgent Baphomet, David Rowe, Digital Scribe, Hitomi Tiponi, Hugh Helendale, KirstenLee Cinquetti, Mobius Ryba, Nadin, Naomah Beaumont, Paladin Forzane, psi Merlin, samm florian, Sammie Benoir, Tommi Waydelich and Vincent Nacon.
</text>
</panel>
</scroll_container>

Some files were not shown because too many files have changed in this diff Show More