Merge Firestorm LGPL tip
commit
824a1b359e
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
}}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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}")
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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) )
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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")
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
/////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -63,6 +63,8 @@ public:
|
|||
void processParcelDetails(const LLParcelData& parcel_details);
|
||||
void togglePickPanel(BOOL visible);
|
||||
|
||||
static void showPlaceDetails(const LLSD& key);
|
||||
|
||||
private:
|
||||
enum ePlaceDisplayInfo
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -55,8 +55,6 @@ public:
|
|||
FSPanelClassifieds();
|
||||
~FSPanelClassifieds();
|
||||
|
||||
static void* create(void* data);
|
||||
|
||||
/*virtual*/ BOOL postBuild(void);
|
||||
|
||||
/*virtual*/ void onOpen(const LLSD& key);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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] == ':')
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
|
|
|||
|
|
@ -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's online status"
|
||||
width="16" />
|
||||
<fs_scroll_list.column
|
||||
image="Permission_Visible_Map_h"
|
||||
name="icon_visible_map_theirs"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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 <nolink>[GROUP]</nolink>.
|
||||
Diese Gruppe verlassen?
|
||||
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="GroupLeaveConfirmMemberWithFee">
|
||||
Sie sind gegenwärtig Mitglied der Gruppe <nolink>[GROUP]</nolink>. 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.
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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 -->
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Reference in New Issue