Merge Firestorm LGPL tip

master
Ansariel 2016-02-12 19:40:54 +01:00
commit dabc4add87
642 changed files with 14138 additions and 20585 deletions

View File

@ -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>
@ -1739,11 +1739,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>b7e6e8cf0ad6a16d7da56e524d6a33a4</string>
<string>7d12fe9dff388d237615f7158315d1cb</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://downloads.phoenixviewer.com/llceflib-1.0-windows-201601151441-r42.tar.bz2</string>
<string>http://downloads.phoenixviewer.com/llceflib-1.0-windows-201602081454-r54.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@ -1753,11 +1753,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>03fd572a7536d96fe34272fd30b34bac</string>
<string>cb4f8508b0212056c7a67967d668467f</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>http://downloads.phoenixviewer.com/llceflib-1.0-linux-201601151414-r42.tar.bz2</string>
<string>http://downloads.phoenixviewer.com/llceflib-1.0-linux-201602081446-r54.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@ -3486,6 +3486,7 @@
<array>
<string>--fmodex</string>
<string>--kdu</string>
<string>--quicktime</string>
<string>--version</string>
<string>--platform win32</string>
</array>
@ -3522,6 +3523,7 @@
<array>
<string>--fmodex</string>
<string>--kdu</string>
<string>--quicktime</string>
<string>--version</string>
<string>--platform win32</string>
</array>

View File

@ -241,7 +241,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
@ -249,7 +248,6 @@ SET( llcommon_ND_SOURCE_FILES
SET( llcommon_ND_HEADER_FILES
nd/ndboolswitch.h
nd/ndexceptions.h
nd/ndfile.h
nd/ndintrin.h
nd/ndlocks.h
nd/ndlogthrottle.h

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -876,6 +876,7 @@ set(viewer_HEADER_FILES
fsblocklistmenu.h
fschathistory.h
fschatoptionsmenu.h
fsdispatchclassifiedclickthrough.h
fscommon.h
fsconsoleutils.h
fscontactsfriendsmenu.h

View File

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

View File

@ -23843,6 +23843,17 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>0</integer>
</map>
<key>FSDoNotHideMapOnTeleport</key>
<map>
<key>Comment</key>
<string>If enabled, the world map won't be closed when teleporting</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
</map>
</llsd>

View File

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

View File

@ -435,10 +435,18 @@ 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;
}
else
{
mFrom = LLTrans::getString("SECOND_LIFE"); // Will automatically be substituted!
if (!chat.mFromName.empty() && (mFrom != chat.mFromName))
{
mFrom += " (" + chat.mFromName + ")";
}
}
mUserNameTextBox->setValue(mFrom);
updateMinUserNameWidth();
@ -492,7 +500,6 @@ public:
mUserNameTextBox->setValue(mFrom);
updateMinUserNameWidth();
}
// [/RLVa:KB]
}
else
{
@ -714,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]

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2256,7 +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)
if (base_cat && (base_cat->getPreferredType() == LLFolderType::FT_OUTFIT))
{
LLSD base_contents;
base_contents["name"] = base_cat->getName();

View File

@ -143,7 +143,7 @@
#include "llcoros.h"
//<FS:TS> Turn off library for 64-bit OS X too
//#if !LL_LINUX
#if !LL_LINUX && !(LL_DARWIN && defined(ND_BUILD64BIT_ARCH))
#if !(LL_DARWIN && defined(ND_BUILD64BIT_ARCH))
#include "cef/llceflib.h"
#endif
@ -4002,6 +4002,14 @@ LLSD LLAppViewer::getViewerInfo() const
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)
@ -6216,13 +6224,21 @@ void LLAppViewer::idleExperienceCache()
{
LLViewerRegion* region = gAgent.getRegion();
if (!region) return;
std::string lookup_url=region->getCapability("GetExperienceInfo");
if(!lookup_url.empty() && *lookup_url.rbegin() != '/')
{
lookup_url += '/';
}
std::string lookup_url;
if (region->capabilitiesReceived())
{
lookup_url = region->getCapability("GetExperienceInfo");
if (!lookup_url.empty() && *lookup_url.rbegin() != '/')
{
lookup_url += '/';
}
}
else
{
LL_WARNS_ONCE() << "GetExperienceInfo capability is not yet recieved" << LL_ENDL;
}
LLExperienceCache::setLookupURL(lookup_url);
LLExperienceCache::idle();

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -97,6 +97,7 @@
#include "fsgridhandler.h"
#endif
// </FS:Zi>
#include "fsfloaterplacedetails.h"
#include <boost/shared_ptr.hpp>
@ -5827,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>
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -4537,7 +4537,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]

View File

@ -91,7 +91,7 @@ Dummy Name replaced at run time
</text_editor>
</panel>
<panel
height="840"
height="855"
border="true"
label="Firestorm Credits"
help_topic="about_fscredits_tab"
@ -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"

View File

@ -1098,7 +1098,7 @@ Loading...
name="Autoreturn"
top_pad="0"
width="412"
wrap="true">
word_wrap="true">
Auto return other Residents&apos; objects (minutes, 0 for off):
</text>
<line_editor
@ -1528,7 +1528,7 @@ Only large parcels can be listed in search.
top="184"
name="allow_label5"
width="205"
wrap="true">
word_wrap="true">
Avatars on other parcels can see and chat with avatars on this parcel
</text>
<check_box

View File

@ -77,28 +77,6 @@
text_color="LtGray_50"
value="0s"
width="35" />
<icon
height="16"
follows="right"
image_name="Permission_Visible_Online"
layout="topleft"
left_pad="3"
right="-260"
name="permission_online_theirs_icon"
tool_tip="You can see this friend&apos;s online status"
top="4"
width="16" />
<icon
height="16"
follows="right"
image_name="Permission_Visible_Map"
layout="topleft"
left_pad="3"
right="-241"
name="permission_map_theirs_icon"
tool_tip="You can locate this friend on the map"
top="4"
width="16" />
<icon
height="16"
follows="right"

View File

@ -359,7 +359,6 @@
width="290"
height="215">
<text
auto_resize="false"
follows="left|top"
font.style="BOLD"
height="10"

View File

@ -10,26 +10,26 @@
width="313">
<icon
follows="all"
height="85"
height="84"
image_name="ListItem_Over"
left="0"
right="-2"
mouse_opaque="false"
name="hovered_icon"
top="1"
scale_image="true"
visible="false"
width="308"/>
visible="false"/>
<icon
follows="all"
height="85"
height="84"
image_name="ListItem_Select"
left="0"
right="-2"
mouse_opaque="false"
name="selected_icon"
top="1"
scale_image="true"
visible="false"
width="308"/>
visible="false"/>
<texture_picker
allow_no_texture="true"
fallback_image="default_land_picture.j2c"

View File

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

View File

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

View File

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

View File

@ -13,29 +13,28 @@ bg_opaque_color="SL-Background_66"
width="313">
<icon
follows="all"
height="85"
height="84"
image_name="ListItem_Over"
left="0"
right="-2"
mouse_opaque="false"
name="hovered_icon"
top="1"
scale_image="true"
visible="false"
width="308" />
visible="false"/>
<icon
follows="all"
height="85"
height="84"
image_name="ListItem_Select"
left="0"
right="-2"
mouse_opaque="false"
name="selected_icon"
top="1"
scale_image="true"
visible="false"
width="308" />
visible="false"/>
<texture_picker
allow_no_texture="true"
border_enabled="true"
fallback_image="default_land_picture.j2c"
enabled="false"
follows="left|top"
@ -72,7 +71,7 @@ bg_opaque_color="SL-Background_66"
textbox.show_context_menu="false"
top_pad="0"
width="178"
word_wrap="true" />
textbox.word_wrap="true" />
<button
follows="right"
height="20"

View File

@ -36,11 +36,11 @@ background_opaque="false"
color="SL-Background_66"
follows="all"
layout="topleft"
left="0"
left="2"
right="-2"
name="picks_list"
opaque="true"
top="0"
width="313" />
top="0"/>
</panel>
<panel
layout="topleft"
@ -52,11 +52,11 @@ background_opaque="false"
color="SL-Background_66"
follows="all"
layout="topleft"
left="0"
left="2"
right="-2"
name="classifieds_list"
opaque="true"
top="0"
width="313" />
top="0"/>
</panel>
</tab_container>

View File

@ -102,7 +102,7 @@ Settings groups to be restored (backup will always save all):
<layout_stack
name="ls_list_view_stack"
follows="top|left|right"
height="190"
height="200"
orientation="horizontal"
top_pad="4"
left="1"
@ -111,6 +111,8 @@ Settings groups to be restored (backup will always save all):
<layout_panel
name="lp_restore_global_files"
top="0"
bottom="-1"
follows="all"
user_resize="false"
auto_resize="true"
@ -123,7 +125,7 @@ Settings groups to be restored (backup will always save all):
left="1"
top="0"
right="-1"
height="180"
bottom="-1"
draw_heading="true"
multi_select="false">
<column label="" name="restore_global_files_check" width="16" />
@ -165,6 +167,8 @@ Settings groups to be restored (backup will always save all):
<layout_panel
name="lp_restore_per_account_files"
top="0"
bottom="-1"
follows="all"
user_resize="false"
auto_resize="true"
@ -178,7 +182,7 @@ Settings groups to be restored (backup will always save all):
left="1"
top="0"
right="-1"
height="180"
bottom="-1"
draw_heading="true"
multi_select="false">
<column label="" name="restore_per_account_files_check" width="16" />
@ -248,12 +252,14 @@ Settings groups to be restored (backup will always save all):
left="0"
top="0"
right="-1"
height="180"/>
bottom="-1"/>
</layout_panel>
<layout_panel
name="lp_restore_folders"
top="0"
bottom="-1"
follows="all"
user_resize="false"
auto_resize="true"
@ -266,7 +272,7 @@ Settings groups to be restored (backup will always save all):
left="1"
top="0"
right="-1"
height="180"
bottom="-1"
draw_heading="true"
multi_select="false">
<column label="" name="restore_global_folders_check" width="16" />

View File

@ -726,6 +726,15 @@
width="270"
control_name="FSDisableTeleportScreens"
tool_tip="Disables the black teleport screen during all teleports."/>
<check_box
top_pad="3"
follows="left|top"
height="16"
label="Do not close the map when teleporting"
name="FSDoNotHideMapOnTeleport"
width="270"
control_name="FSDoNotHideMapOnTeleport"
tool_tip="Disables the automatic closing of the map when teleporting."/>
</panel>

View File

@ -18,71 +18,15 @@
follows="top|right"
name="progress_indicator"
visible="false" />
<!--
<text
top="5"
left="114"
height="16"
width="302"
layout="topleft"
follows="left|top"
name="Place an ad in Second Life&apos;s classified listings.">
Place an ad in Second Life&apos;s classified listings.
</text>
<button
top="24"
left="114"
height="20"
width="75"
layout="topleft"
follows="left|top"
name="New..."
label="New..."
label_selected="New..." />
<button
top="24"
left_delta="79"
height="20"
width="75"
layout="topleft"
follows="left|top"
name="Delete..."
label="Delete..."
label_selected="Delete..." />
<tab_container
top="50"
left="4"
height="395"
width="412"
layout="topleft"
follows="left|top"
name="classified tab"
tab_position="left" />
<text
top="55"
left="20"
height="18"
width="100"
layout="topleft"
follows="all"
name="classified_panel_text"
mouse_opaque="false">
Loading...
</text>
-->
<string
name="no_classifieds"
value="No Classifieds" />
<flat_list_view
top="6"
left="0"
left="5"
height="385"
width="412"
width="408"
follows="all"
layout="topleft"
name="classifieds_list"

View File

@ -2025,7 +2025,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<!-- Additional IM messages -->
<string name="IM_announce_incoming">Incoming message from [NAME]</string>
<string name="IM_autoresponse_sent">Autoresponse sent</string>
<string name="IM_autoresponse_sent">Autoresponse sent: [MESSAGE]</string>
<string name="IM_autoresponse_item_sent">Sent auto-response item: [ITEM_NAME]</string>
<!-- voice calls -->

View File

@ -4323,7 +4323,7 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
Mensaje entrante de [NAME]
</string>
<string name="IM_autoresponse_sent">
Autorrespuesta enviada
Autorrespuesta enviada: [MESSAGE]
</string>
<string name="answered_call">
Han respondido a tu llamada

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="sound_explorer" title="Explorateur de sons">
<floater.string name="Playing">Joué</floater.string>
<floater.string name="NotPlaying">il y a [TIME] min</floater.string>
<floater.string name="Type_UI">UI</floater.string>
<floater.string name="Type_Avatar">Avatar</floater.string>
<floater.string name="Type_llTriggerSound">llTriggerSound</floater.string>
<floater.string name="Type_llLoopSound">llLoopSound</floater.string>
<floater.string name="Type_llPlaySound">llPlaySound</floater.string>
<check_box name="avatars_chk" label="Avatars"/>
<check_box name="objects_chk" label="Objets"/>
<check_box name="collision_chk" label="Sons de collisions par défaut" />
<check_box name="repeated_asset_chk" label="Répétitions" left_delta="180" />
<check_box name="pause_chk" label="Pause"/>
<scroll_list name="sound_list">
<columns label="Joué" name="playing" />
<columns label="Type" name="type" />
<columns label="Propriétaire" name="owner" />
<columns label="Son" name="sound" />
</scroll_list>
<button label="Écouter" name="play_locally_btn"/>
<button label="Zoomer" name="look_at_btn"/>
<button label="Stop" name="stop_btn"/>
<button label="Blacklister" name="bl_btn"/>
</floater>

View File

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Test Floater" title="Fenêtre de test">
<text>
ceci
est
du
texte
qui
est
aligné
en haut</text>
<text>
ceci
est
du
texte
qui
est
aligné
au centre</text>
<text>
ceci
est
du
texte
qui
est
aligné
en bas</text>
<text_editor>
ceci
est
du
texte
qui
est
aligné
en haut
</text_editor>
<text_editor>
ceci
est
du
texte
qui
est
aligné
au centre
</text_editor>
<text_editor>
ceci
est
du
texte
qui
est
aligné
en bas
</text_editor>
</floater>

View File

@ -1,100 +1,36 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="À propos de [APP_NAME]">
<floater.string name="AboutHeader">
[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL]) [BUILD_TYPE]
[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
</floater.string>
<floater.string name="AboutCompiler">
Compilé avec [COMPILER] version [COMPILER_VERSION]
</floater.string>
<floater.string name="AboutPosition">
Vous êtes à [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] dans [REGION], se trouvant à &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
SLURL : &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
(coordonnées globales [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
[SERVER_RELEASE_NOTES_URL]
</floater.string>
<floater.string name="AboutSystem">
CPU : [CPU]
Mémoire : [MEMORY_MB] Mo
Version OS : [OS_VERSION]
Distributeur de cartes graphiques : [GRAPHICS_CARD_VENDOR]
Cartes graphiques : [GRAPHICS_CARD]
</floater.string>
<floater.string name="AboutDriver">
Version Windows Graphics Driver : [GRAPHICS_DRIVER_VERSION]
</floater.string>
<floater.string name="AboutLibs">
Version OpenGL : [OPENGL_VERSION]
RestrainedLove API: [RLV_VERSION]
Version libcurl : [LIBCURL_VERSION]
Version J2C Decoder : [J2C_VERSION]
Version Audio Driver : [AUDIO_DRIVER_VERSION]
Version Qt Webkit : [QT_WEBKIT_VERSION]
Version serveur vocal : [VOICE_VERSION]
</floater.string>
<floater.string name="none">
(aucun)
</floater.string>
<floater.string name="AboutTraffic">
Paquets perdus : [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</floater.string>
<floater.string name="ErrorFetchingServerReleaseNotesURL">
Erreur lors de la récupération de l&apos;URL des notes de version du serveur.
</floater.string>
<tab_container name="about_tab">
<panel label="Infos" name="support_panel">
<text name="support_intro">
For the latest information about Firestorm, visit
http://www.firestormviewer.org
</text>
<button label="Copier dans le presse-papiers" name="copy_btn"/>
</panel>
<panel label="Remerciements" name="credits_panel">
<text name="linden_intro">
Firestorm would not be possible without the decision from Linden Lab to make their Second Life viewer source code available.
Second Life vous est proposé par les Linden,
avec contributions Open Source:
<panel label="Informations" name="support_panel">
<text name="support_intro">
Pour les dernières informations à propos de Firestorm, visitez
http://www.firestormviewer.org
</text>
<text_editor name="contrib_names">
Dummy Name remplacé au moment de l&apos;exécution
</text_editor>
<button label="Copier" name="copy_btn"/>
</panel>
<panel label="Licences" name="licenses_panel">
<text_editor name="licenses_editor">
3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
APR Copyright (C) 2011 The Apache Software Foundation
Collada DOM Copyright 2006 Sony Computer Entertainment Inc.
cURL Copyright (C) 1996-2010, Daniel Stenberg, (daniel@haxx.se)
DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
FMOD Sound System Copyright (C) Firelight Technologies Pty, Ltd., 1994-2013
FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm et Werner Lemberg.
GL Copyright (C) 1999-2004 Brian Paul.
GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University, et David Luebke, Brenden Schubert, University of Virginia.
google-perftools Copyright (c) 2005, Google Inc.
Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
HACD Copyright (C) 2011, Khaled Mamou (kmamou@gmail.com)
jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
ogg/vorbis Copyright (C) 2002, Xiphophorus
OpenSSL Copyright (C) 1998-2008 The OpenSSL Project.
PCRE Copyright (c) 1997-2012 University of Cambridge
SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
zlib Copyright (C) 1995-2012 Jean-Loup Gailly et Mark Adler.
Le client Second Life utilise Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (et ses concédants de licence). Tous droits réservés. Pour plus de détails, consultez le site Web www.havok.com.
Ce logiciel contient du code source fourni par NVIDIA Corporation.
Tous droits réservés. Voir licenses.txt pour plus d&apos;informations.
Codage audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
</text_editor>
<panel label="Auteurs Linden Lab" name="credits_panel">
<text name="linden_intro">
Firestorm n'existerait pas sans la décision de Linden Lab de rendre son code source disponible.
Second Life est conçu par les Linden,
avec les contributions open source provenant de :
</text>
<text_editor name="contrib_names">Dummy Name replaced at run time</text_editor>
</panel>
<panel label="Contributeurs Firestorm" name="fs_credits_panel">
<scroll_container name="fs_credits_scroll_container">
<panel name="fs_credits_scroll_container_content_panel">
<text name="firestorm_intro">
Firestorm est un projet destiné à améliorer l'immersion dans SecondLife(tm). Nous avons mis en commun les contributions d'une communauté de plusieurs développeurs qui travaillent autour du code fourni par Linden Lab ainsi que du nôtre afin de vous apporter une interface riche en possibilités et soutenue par de nombreux volontaires. Firestorm vous est fourni par The Phoenix Firestorm Project, Inc., une organisation à but non lucratif.
L'équipe de développement Firestorm :
</text>
<text name="fs_contrib_intro">Code additionnel pour Firestorm généreusement fourni par :</text>
<text name="fs_support_intro">Remerciements particuliers à notre équipe d'aide Firestorm, aux contributeurs wiki, éducateurs et traducteurs :</text>
<text name="fs_art_intro" height="70">
Firestorm intègre Starlight modifié pour Firestorm, développé par des résidents pour les résidents, dans le but d'offrir une interface alternative, plus claire et avec de la chance, plus simple à utiliser. Pour plus de détails, consulter &lt;nolink&gt;https://wiki.secondlife.com/wiki/Viewer_Skins/Starlight&lt;/nolink&gt;
Création de l'interface :
</text>
</panel>
</scroll_container>
</panel>
</tab_container>
</floater>

View File

@ -1,482 +1,246 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floaterland" title="À PROPOS DU TERRAIN">
<floater.string name="maturity_icon_general">
&quot;Parcel_PG_Dark&quot;
</floater.string>
<floater.string name="maturity_icon_moderate">
&quot;Parcel_M_Dark&quot;
</floater.string>
<floater.string name="maturity_icon_adult">
&quot;Parcel_R_Dark&quot;
</floater.string>
<floater.string name="Minutes">
[MINUTES] minutes
</floater.string>
<floater.string name="Minute">
minute
</floater.string>
<floater.string name="Seconds">
[SECONDS] secondes
</floater.string>
<floater.string name="Remaining">
restantes
</floater.string>
<tab_container name="landtab" tab_min_width="60">
<panel label="GÉNÉRAL" name="land_general_panel">
<panel.string name="new users only">
Nouveaux résidents uniquement
</panel.string>
<panel.string name="anyone">
Tout le monde
</panel.string>
<panel.string name="area_text">
Surface
</panel.string>
<panel.string name="area_size_text">
[AREA] m²
</panel.string>
<panel.string name="auction_id_text">
Code de l&apos;enchère : [ID]
</panel.string>
<panel.string name="need_tier_to_modify">
Pour modifier ce terrain, vous devez approuver votre achat.
</panel.string>
<panel.string name="group_owned_text">
(propriété du groupe)
</panel.string>
<panel.string name="profile_text">
Profil
</panel.string>
<panel.string name="info_text">
Infos
</panel.string>
<panel.string name="public_text">
(public)
</panel.string>
<panel.string name="none_text">
(aucun)
</panel.string>
<panel.string name="sale_pending_text">
(vente en cours)
</panel.string>
<panel.string name="no_selection_text">
Aucune parcelle sélectionnée.
</panel.string>
<panel.string name="time_stamp_template">
[wkday,datetime,local] [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
</panel.string>
<text name="Name:">
Nom :
</text>
<line_editor name="Name"/>
<text name="Description:">
Description :
</text>
<text_editor name="Description"/>
<text name="LandType">
Type :
</text>
<text name="LandTypeText">
Continent / Homestead
</text>
<text name="ContentRating">
Catégorie :
</text>
<text name="ContentRatingText">
Adulte
</text>
<text name="Owner:">
Propriétaire :
</text>
<text name="OwnerText">
Loading...
</text>
<text name="Group:">
Groupe :
</text>
<text name="GroupText">
Loading...
</text>
<button label="Choisir" label_selected="Définir..." name="Set..."/>
<check_box label="Autoriser la cession au groupe" name="check deed" tool_tip="Un officier du groupe peut céder ce terrain à ce groupe, afin qu&apos;il soit pris en charge par l&apos;allocation de terrains du groupe."/>
<button label="Céder" label_selected="Céder..." name="Deed..." tool_tip="Vous ne pouvez céder le terrain que si vous avez un rôle d&apos;officier dans le groupe sélectionné."/>
<check_box label="Le propriétaire contribue en cédant du terrain" name="check contrib" tool_tip="Lorsqu&apos;un terrain est cédé au groupe, l&apos;ancien propriétaire fait également un don de terrain suffisant."/>
<text name="For Sale:">
À vendre :
</text>
<text name="Not for sale.">
Pas à vendre
</text>
<text name="For Sale: Price L$[PRICE].">
Prix : [PRICE] L$ ([PRICE_PER_SQM] L$/m²)
</text>
<text name="SalePending"/>
<button label="Vendre le terrain" label_selected="Vendre le terrain..." name="Sell Land..."/>
<text name="For sale to">
À vendre à : [BUYER]
</text>
<text name="Sell with landowners objects in parcel.">
Objets inclus dans la vente
</text>
<text name="Selling with no objects in parcel.">
Objets non inclus dans la vente
</text>
<floater name="floaterland" title="À propos du terrain">
<floater.string name="Minutes">[MINUTES] min.</floater.string>
<floater.string name="Minute">min.</floater.string>
<floater.string name="Seconds">[SECONDS] sec.</floater.string>
<floater.string name="Remaining">restantes</floater.string>
<tab_container name="landtab">
<panel label="Général" name="land_general_panel">
<panel.string name="new users only">Nouveaux habitants seulement</panel.string>
<panel.string name="anyone">Tout le monde</panel.string>
<panel.string name="area_text">Surface :</panel.string>
<panel.string name="area_size_text">[AREA] m²</panel.string>
<panel.string name="auction_id_text">ID de l'enchère : [ID]</panel.string>
<panel.string name="need_tier_to_modify">Vous devez approuver votre achat pour modifier ce terrain</panel.string>
<panel.string name="group_owned_text">(Propriété de groupe)</panel.string>
<panel.string name="profile_text">Profil</panel.string>
<panel.string name="info_text">Infos</panel.string>
<panel.string name="public_text">(public)</panel.string>
<panel.string name="none_text">(aucun)</panel.string>
<panel.string name="sale_pending_text">(Vente en attente)</panel.string>
<panel.string name="no_selection_text">Pas de terrain sélectionné</panel.string>
<panel.string name="time_stamp_template">[wkday,datetime,local] [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]</panel.string>
<panel.string name="error_resolving_uuid">L'ID du terrain n'a pas pu être déterminé</panel.string>
<text name="Name:">Nom :</text>
<text name="UUID:">ID du terrain :</text>
<text name="Description:">Description :</text>
<text name="LandType">Type :</text>
<text name="LandTypeText">Continent / Résidentiel</text>
<text name="ContentRating">Classification :</text>
<text name="ContentRatingText">Adulte</text>
<text name="Owner:">Propriétaire :</text>
<text name="OwnerText">Chargement...</text>
<text name="Group:">Groupe :</text>
<text name="GroupText">Chargement... </text>
<button label="Définir" name="Set..."/>
<check_box label="Autoriser la cession au groupe" name="check deed" tool_tip="Un gestionnaire du groupe peut céder ce terrain au groupe de manière à en laisser le contrôle à celui-ci."/>
<button label="Céder" name="Deed..." tool_tip="Vous ne pouvez faire don de ce terrain que si vous êtes gestionnaire du groupe choisi."/>
<check_box label="Le propriétaire participe au loyer" name="check contrib" tool_tip="Si le terrain est cédé au groupe, le propriétaire contribue également au loyer du terrain."/>
<text name="For Sale:">À vendre :</text>
<text name="Not for sale.">Pas à vendre</text>
<text name="For Sale: Price L$[PRICE].">Prix : [PRICE] L$ ([PRICE_PER_SQM] L$/m²)</text>
<button label="Vendre le terrain" name="Sell Land..."/>
<text name="For sale to">À vendre à : [BUYER]</text>
<text name="Sell with landowners objects in parcel.">Objets inclus dans la vente</text>
<text name="Selling with no objects in parcel.">Objets non inclus dans la vente</text>
<button label="Annuler la vente du terrain" label_selected="Annuler la vente du terrain" name="Cancel Land Sale"/>
<text name="Claimed:">
Acquis :
</text>
<text name="DateClaimText">
Tue Aug 15 13:47:25 2006
</text>
<text name="PriceLabel">
Superficie :
</text>
<text name="PriceText">
4 048 m²
</text>
<text name="Traffic:">
Trafic :
</text>
<text name="DwellText">
Chargement...
</text>
<button label="Acheter le terrain" label_selected="Acheter le terrain..." left_delta="60" name="Buy Land..." width="125"/>
<button label="Vente Linden" label_selected="Vente Linden..." name="Linden Sale..." tool_tip="Le terrain doit être la propriété d&apos;un résident, avoir un contenu défini et ne pas être aux enchères."/>
<button label="Infos sur les scripts" name="Scripts..." width="110"/>
<button label="Acheter pour le groupe" label_selected="Acheter pour le groupe..." name="Buy For Group..."/>
<button label="Acheter un pass" label_selected="Acheter un pass..." left_delta="-127" name="Buy Pass..." tool_tip="Un pass vous donne un accès temporaire à ce terrain." width="125"/>
<button label="Abandonner le terrain" label_selected="Abandonner le terrain..." name="Abandon Land..."/>
<button label="Récupérer le terrain" label_selected="Redemander le terrain…" name="Reclaim Land..."/>
<text name="Claimed:">Acquis le :</text>
<text name="DateClaimText">Tue Aug 15 13:47:25 2006</text>
<text name="PriceLabel">Surface :</text>
<text name="PriceText">4048 m²</text>
<text name="Traffic:">Trafic :</text>
<text name="DwellText">Chargement...</text>
<button label="Acheter le terrain" name="Buy Land..."/>
<button label="Ventes Linden" name="Linden Sale..." tool_tip="Le terrain doit être possédé et ne doit pas faire l'objet d'une vente aux enchères."/>
<button label="Infos sur les scripts" name="Scripts..."/>
<button label="Acheter pour un groupe" name="Buy For Group..."/>
<button label="Droit d'entrée" name="Buy Pass..." tool_tip="Un droit d'entrée vous donne un accès temporaire à ce terrain."/>
<button label="Abandonner le terrain" name="Abandon Land..."/>
<button label="Récupérer le terrain" name="Reclaim Land..."/>
</panel>
<panel label="RÈGLEMENT" name="land_covenant_panel">
<panel.string name="can_resell">
Le terrain acheté dans cette région peut être revendu.
</panel.string>
<panel.string name="can_not_resell">
Le terrain acheté dans cette région ne peut pas être revendu.
</panel.string>
<panel.string name="can_change">
Le terrain acheté dans cette région peut être fusionné
ou divisé.
</panel.string>
<panel.string name="can_not_change">
Le terrain acheté dans cette région ne peut pas être fusionné
ou divisé.
</panel.string>
<text name="estate_section_lbl">
Domaine :
</text>
<text name="estate_name_text">
continent
</text>
<text name="estate_owner_lbl">
Propriétaire :
</text>
<text name="estate_owner_text">
(aucun)
</text>
<text_editor name="covenant_editor">
Il n&apos;y a aucun règlement pour ce domaine.
</text_editor>
<text name="covenant_timestamp_text">
Last Modified Wed Dec 31 16:00:00 1969
</text>
<text name="region_section_lbl">
Région :
</text>
<text name="region_name_text">
Loading...
</text>
<text name="region_landtype_lbl">
Type :
</text>
<text name="region_landtype_text">
Continent / Homestead
</text>
<text name="region_maturity_lbl">
Catégorie :
</text>
<text name="region_maturity_text">
Adult
</text>
<text name="resellable_lbl">
Revendre :
</text>
<text name="resellable_clause">
Le terrain dans cette région ne peut être revendu.
</text>
<text name="changeable_lbl">
Sous-diviser :
</text>
<text name="changeable_clause">
Le terrain dans cette région ne peut être fusionné/divisé.
</text>
<panel label="Règlement" name="land_covenant_panel">
<panel.string name="can_resell">Le terrain dans cette région peut être revendu.</panel.string>
<panel.string name="can_not_resell">Le terrain dans cette région ne peut être revendu.</panel.string>
<panel.string name="can_change">Le terrain dans cette région peut être fusionné ou divisé.</panel.string>
<panel.string name="can_not_change">Le terrain dans cette région ne peut être fusionné ou divisé.</panel.string>
<text name="estate_section_lbl">Domaine :</text>
<text name="estate_name_text">Continent</text>
<text name="estate_owner_lbl">Propriétaire :</text>
<text name="estate_owner_text">(aucun)</text>
<text_editor name="covenant_editor">Il n'y a aucun règlement de défini pour ce domaine.</text_editor>
<text name="covenant_timestamp_text">Last Modified Wed Dec 31 16:00:00 1969</text>
<text name="region_section_lbl">Région :</text>
<text name="region_name_text">Chargement...</text>
<text name="region_landtype_lbl">Type :</text>
<text name="region_landtype_text">Continent / Résidentiel</text>
<text name="region_maturity_lbl">Classification :</text>
<text name="region_maturity_text">Adulte</text>
<text name="resellable_lbl">Revente :</text>
<text name="resellable_clause">Le terrain dans cette région ne peut être revendu.</text>
<text name="changeable_lbl">Subdivision :</text>
<text name="changeable_clause">Le terrain dans cette région ne peut être fusionné/subdivisé.</text>
</panel>
<panel label="OBJETS" name="land_objects_panel">
<panel.string name="objects_available_text">
[COUNT] sur [MAX] ([AVAILABLE] disponibles)
</panel.string>
<panel.string name="objects_deleted_text">
[COUNT] sur [MAX] ([DELETED] seront supprimés)
</panel.string>
<text name="parcel_object_bonus">
Facteur Bonus objets : [BONUS]
</text>
<text name="Simulator primitive usage:">
Capacité de la région :
</text>
<text name="objects_available">
[COUNT] sur [MAX] ([AVAILABLE] disponibles)
</text>
<text name="Primitives parcel supports:">
Capacité de la parcelle :
</text>
<text name="object_contrib_text">
[COUNT]
</text>
<text name="Primitives on parcel:">
Impact sur la parcelle :
</text>
<text name="total_objects_text">
[COUNT]
</text>
<text name="Owned by parcel owner:">
Appartenant au propriétaire :
</text>
<text name="owner_objects_text">
[COUNT]
</text>
<panel label="Objets" name="land_objects_panel">
<panel.string name="objects_available_text">[COUNT] sur [MAX] ([AVAILABLE] disponibles)</panel.string>
<panel.string name="objects_deleted_text">[COUNT] sur [MAX] ([DELETED] seront supprimés)</panel.string>
<text name="parcel_object_bonus">Objets bonus dans la région : [BONUS]</text>
<text name="Simulator primitive usage:">Capacités de la région :</text>
<text name="objects_available">[COUNT] sur [MAX] ([AVAILABLE] disponibles)</text>
<text name="Primitives parcel supports:">Capacités du terrain :</text>
<text name="object_contrib_text">[COUNT]</text>
<text name="Primitives on parcel:">Impact du terrain :</text>
<text name="total_objects_text">[COUNT]</text>
<text name="Owned by parcel owner:">Possédés par le propriétaire :</text>
<text name="owner_objects_text">[COUNT]</text>
<button label="Afficher" label_selected="Afficher" name="ShowOwner"/>
<button label="Retour" label_selected="Renvoyer..." name="ReturnOwner..." tool_tip="Renvoyer les objets à leurs propriétaires."/>
<text name="Set to group:">
Données au groupe :
</text>
<text name="group_objects_text">
[COUNT]
</text>
<button label="Renvoyer" name="ReturnOwner..." tool_tip="Renvoyer les objets à leurs propriétaires."/>
<text name="Set to group:">Donnés au groupe :</text>
<text name="group_objects_text">[COUNT]</text>
<button label="Afficher" label_selected="Afficher" name="ShowGroup"/>
<button label="Retour" label_selected="Renvoyer..." name="ReturnGroup..." tool_tip="Renvoyer les objets à leurs propriétaires."/>
<text name="Owned by others:">
Appartenant à d&apos;autres :
</text>
<text name="other_objects_text">
[COUNT]
</text>
<button label="Renvoyer" name="ReturnGroup..." tool_tip="Renvoyer les objets à leurs propriétaires."/>
<text name="Owned by others:">Possédés par des tiers :</text>
<text name="other_objects_text">[COUNT]</text>
<button label="Afficher" label_selected="Afficher" name="ShowOther"/>
<button label="Retour" label_selected="Renvoyer..." name="ReturnOther..." tool_tip="Renvoyer les objets à leurs propriétaires."/>
<text name="Selected / sat upon:">
Sélectionnées/où quelqu&apos;un est assis :
</text>
<text name="selected_objects_text">
[COUNT]
</text>
<text name="Autoreturn">
Renvoi automatique des objets d&apos;autres résidents (minutes, 0 pour désactiver) :
</text>
<line_editor name="clean other time"/>
<text name="Object Owners:">
Propriétaires :
</text>
<button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh List" tool_tip="Actualiser la liste des objets"/>
<button label="Renvoi des objets" label_selected="Renvoyer les objets..." name="Return objects..."/>
<name_list label="Plus récents" name="owner list">
<button label="Renvoyer" name="ReturnOther..." tool_tip="Renvoyer les objets à leurs propriétaires."/>
<text name="Selected / sat upon:">Objets sélectionnés / actifs :</text>
<text name="selected_objects_text">[COUNT]</text>
<text name="Autoreturn">Renvoi automatique des objets d'autres résidents en minutes (0 pour désactiver):</text>
<text name="Object Owners:" width="150">Propriétaires des objets :</text>
<button name="Refresh List" tool_tip="Actualiser la liste des objets"/>
<button label="Renvoyer les objets" name="Return objects..."/>
<name_list name="owner list">
<name_list.columns label="Type" name="type"/>
<name_list.columns label="Nom" name="name"/>
<name_list.columns label="Nombre" name="count"/>
<name_list.columns label="Plus récents" name="mostrecent"/>
<name_list.columns label="Compte" name="count"/>
<name_list.columns label="Plus récent" name="mostrecent"/>
</name_list>
</panel>
<panel label="OPTIONS" name="land_options_panel">
<panel.string name="search_enabled_tooltip">
Permettre aux autres résidents de voir cette parcelle dans les résultats de recherche
</panel.string>
<panel label="Options" name="land_options_panel">
<panel.string name="search_enabled_tooltip">Afficher ce terrain dans les résultats de recherche</panel.string>
<panel.string name="search_disabled_small_tooltip">
Cette option est désactivée car la superficie de cette parcelle est inférieure ou égale à 128 m².
Seules les parcelles de grande taille peuvent apparaître dans la recherche.
Cette option est désactivée car ce terrain fait 128 m² ou moins.
Seuls les grands terrains peuvent être listés dans la recherche.
</panel.string>
<panel.string name="search_disabled_permissions_tooltip">
Cette option est désactivée car vous ne pouvez pas modifier les options de cette parcelle.
</panel.string>
<panel.string name="mature_check_mature">
Contenu Modéré
</panel.string>
<panel.string name="mature_check_adult">
Contenu Adult
</panel.string>
<panel.string name="mature_check_mature_tooltip">
Les informations ou contenu de votre parcelle sont classés Modéré.
</panel.string>
<panel.string name="mature_check_adult_tooltip">
Les informations ou contenu de votre parcelle sont classés Adult.
</panel.string>
<panel.string name="landing_point_none">
(aucun)
</panel.string>
<panel.string name="push_restrict_text">
Pas de bousculades
</panel.string>
<panel.string name="push_restrict_region_text">
Pas de bousculades (les règles de la région priment)
</panel.string>
<text name="allow_label">
Autoriser les autres résidents à :
</text>
<text name="allow_label0">
Voler :
</text>
<check_box label="Tous" name="check fly" tool_tip="Si cette option est cochée, les résidents peuvent voler sur votre terrain. Si elle n&apos;est pas cochée, ils ne pourront voler que lorsqu&apos;ils arrivent et passent au dessus de votre terrain."/>
<text name="allow_label2">
Construire :
</text>
<check_box label="Tous" name="edit objects check"/>
<panel.string name="search_disabled_permissions_tooltip">Cette option est désactivée car vous ne pouvez modifier les options du terrain.</panel.string>
<panel.string name="mature_check_mature">Contenu modéré</panel.string>
<panel.string name="mature_check_adult">Contenu adulte</panel.string>
<panel.string name="mature_check_mature_tooltip">La description de votre terrain ou son contenu est de classification modérée.</panel.string>
<panel.string name="mature_check_adult_tooltip">La description de votre terrain ou son contenu est de classification adulte.</panel.string>
<panel.string name="landing_point_none">(aucun)</panel.string>
<panel.string name="push_restrict_text">Pas de bousculades</panel.string>
<panel.string name="push_restrict_region_text">Pas de bousculades (Ignore la configuration de la région)</panel.string>
<panel.string name="DirectoryFree">Afficher ce terrain dans la recherche</panel.string>
<panel.string name="DirectoryFee">Afficher ce terrain dans la recherche ([DIRECTORY_FEE] L$ / semaine)</panel.string>
<text name="allow_label">Autoriser les autres résidents à :</text>
<text name="allow_label1">Modifier le terrain :</text>
<check_box label="Tout le monde" name="edit land check" tool_tip="Si coché, n'importe qui pourra terraformer votre terrain. Il est conseillé de laisser cette option décochée, vous pourrez toujours modifier votre propre terrain." width="160"/>
<text name="caution_text">À utiliser avec précaution !</text>
<text name="allow_label0">Voler :</text>
<check_box label="Tout le monde" name="check fly" tool_tip="Si coché, les résidents pourront voler dans votre terrain."/>
<text name="allow_label2">Construire :</text>
<check_box label="Tout le monde" name="edit objects check"/>
<check_box label="Groupe" name="edit group objects check"/>
<text name="allow_label3">
Laisser entrer des objets :
</text>
<check_box label="Tous" name="all object entry check"/>
<text name="allow_label3">Créer des objets :</text>
<check_box label="Tout le monde" name="all object entry check"/>
<check_box label="Groupe" name="group object entry check"/>
<text name="allow_label4">
Exécuter des scripts :
</text>
<check_box label="Tous" name="check other scripts"/>
<text name="allow_label4">Exécuter des scripts :</text>
<check_box label="Tout le monde" name="check other scripts"/>
<check_box label="Groupe" name="check group scripts"/>
<check_box label="Sécurisé (pas de dégâts)" name="check safe" tool_tip="Si cette option est cochée, le terrain est sécurisé et il n&apos;y pas de risques de dommages causés par des combats. Si elle est décochée, des dommages causés par les combats peuvent avoir lieu."/>
<check_box label="Pas de bousculades" name="PushRestrictCheck" tool_tip="Empêche l&apos;utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/>
<check_box label="Voir le lieu dans la recherche (30 L$/sem.)" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/>
<check_box label="Sûr (pas de dégâts)" name="check safe" tool_tip="Si actif, le terrain sera considéré comme sûr, désactivant les dégâts. Si désactivé, les dégâts seront activés."/>
<check_box label="Pas de bousculades" name="PushRestrictCheck" tool_tip="Empêche les scripts de pousser. Cocher cette option peut être utile pour prévenir les comportements perturbateurs sur votre terrain."/>
<check_box label="Afficher le terrain dans les résultats de recherche (30 L$ / semaine)" name="ShowDirectoryCheck" tool_tip="Laisser les gens voir cette parcelle dans les résultats de recherche"/>
<combo_box name="land category">
<combo_box.item label="Toutes catégories" name="item0"/>
<combo_box.item label="Appartenant aux Lindens" name="item1"/>
<combo_box.item label="Art et Culture" name="item3"/>
<combo_box.item label="Affaires" name="item4"/>
<combo_box.item label="Éducation" name="item5"/>
<combo_box.item label="Toute Catégorie" name="item0"/>
<combo_box.item label="Linden Location" name="item1"/>
<combo_box.item label="Arts &amp; Culture" name="item3"/>
<combo_box.item label="Entreprises" name="item4"/>
<combo_box.item label="Educatif" name="item5"/>
<combo_box.item label="Jeux" name="item6"/>
<combo_box.item label="Favoris" name="item7"/>
<combo_box.item label="Accueil pour les nouveaux" name="item8"/>
<combo_box.item label="Parcs et Nature" name="item9"/>
<combo_box.item label="Lieux de prédilections" name="item7"/>
<combo_box.item label="Débutants bienvenus" name="item8"/>
<combo_box.item label="Parcs &amp; Nature" name="item9"/>
<combo_box.item label="Résidentiel" name="item10"/>
<combo_box.item label="Shopping" name="item11"/>
<combo_box.item label="Location" name="item13"/>
<combo_box.item label="Locations" name="item13"/>
<combo_box.item label="Autre" name="item12"/>
</combo_box>
<check_box label="Contenu Modéré" name="MatureCheck" tool_tip=""/>
<text name="Snapshot:">
Photo :
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/>
<text name="allow_label5">
Les avatars sur d&apos;autres parcelles peuvent voir et chatter avec les avatars sur cette parcelle.
</text>
<check_box label="Voir les avatars" name="SeeAvatarsCheck" tool_tip="Permettre aux avatars présents sur d&apos;autres parcelles de voir et chatter avec les avatars présents sur cette parcelle et à vous de les voir et de chatter avec eux."/>
<text name="landing_point">
Lieu d&apos;arrivée : [LANDING]
</text>
<button label="Définir" label_selected="Définir" name="Set" tool_tip="Définit le point d&apos;arrivée des visiteurs. Définit l&apos;emplacement de votre avatar sur ce terrain."/>
<button label="Annuler" label_selected="Annuler" name="Clear" tool_tip="Effacer le lieu d&apos;arrivée"/>
<text name="Teleport Routing: ">
Règles de téléportation :
</text>
<combo_box name="landing type" tool_tip="Règles de téléportation - Choisissez les règles de téléportation sur votre terrain" width="140">
<check_box label="Contenu Modéré" name="MatureCheck" tool_tip=" "/>
<text name="Snapshot:">Photo :</text>
<texture_picker name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/>
<text name="allow_label5">Les avatars sur d'autres terrains peuvent voir et dialoguer avec ceux sur ce terrain</text>
<check_box name="SeeAvatarsCheck" tool_tip="Permet aux avatars sur d'autres terrains de voir et de dialoguer avec ceux sur ce terrain, et inversement."/>
<text name="landing_point">Lieu d'arrivée : [LANDING]</text>
<button label="Définir" label_selected="Définir" name="Set" tool_tip="Définit le lieu d'arrivée où les visiteurs arrivent. Définit le lieu à l'emplacement actuel de votre avatar."/>
<button label="Effacer" label_selected="Effacer" name="Clear" tool_tip="Effacer le lieu d'arrivée"/>
<button label="Téléporter" label_selected="Téléporter" name="teleport_to_landing_point" tool_tip="Se téléporter au lieu d'arrivée" width="75"/>
<text name="Teleport Routing: ">Règles de téléportation :</text>
<combo_box name="landing type" tool_tip="Sélectionnez comment gérer l'accès à votre terrain">
<combo_box.item label="Bloqué" name="Blocked"/>
<combo_box.item label="Lieu d&apos;arrivée fixe" name="LandingPoint"/>
<combo_box.item label="Lieu d&apos;arrivée libre" name="Anywhere"/>
<combo_box.item label="Au Lieu d'arrivée défini" name="LandingPoint"/>
<combo_box.item label="N'importe où" name="Anywhere"/>
</combo_box>
</panel>
<panel label="MÉDIA" name="land_media_panel">
<text name="with media:" width="85">
Type :
</text>
<combo_box left="97" name="media type" tool_tip="Indiquez s&apos;il s&apos;agit de l&apos;URL d&apos;un film, d&apos;une page web ou autre"/>
<text name="mime_type"/>
<text name="at URL:" width="85">
Page d&apos;accueil :
</text>
<line_editor left="97" name="media_url"/>
<button label="Choisir" name="set_media_url"/>
<text name="Description:">
Description :
</text>
<line_editor left="97" name="url_description" tool_tip="Texte affiché à côté du bouton Jouer/Charger"/>
<text name="Media texture:">
Remplacer la
texture :
</text>
<texture_picker label="" left="97" name="media texture" tool_tip="Cliquez pour sélectionner une image"/>
<text name="replace_texture_help">
Les objets avec cette texture affichent le film ou la page web quand vous cliquez sur la flèche Jouer. Sélectionnez l&apos;image miniature pour choisir une texture différente.
</text>
<check_box label="Échelle automatique" name="media_auto_scale" tool_tip="Si vous sélectionnez cette option, le contenu de cette parcelle sera automatiquement mis à l&apos;échelle. La qualité visuelle sera peut-être amoindrie mais vous n&apos;aurez à faire aucune autre mise à l&apos;échelle ou alignement."/>
<text name="media_size" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut.">
Taille :
</text>
<spinner name="media_size_width" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
<spinner name="media_size_height" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
<text name="pixels">
pixels
</text>
<text name="Options:">
Options :
</text>
<check_box label="En boucle" name="media_loop" tool_tip="Jouer le média en boucle. Lorsque le média aura fini de jouer, il recommencera."/>
<panel label="Média" name="land_media_panel">
<text name="with media:">Type :</text>
<combo_box name="media type" tool_tip="Indiquez si l'adresse est une vidéo, une page Web ou un autre média"/>
<text name="at URL:">Page d'accueil :</text>
<button label="Définir" name="set_media_url"/>
<text name="Description:">Description :</text>
<line_editor name="url_description" tool_tip="Texte affiché à côté du bouton Lecture"/>
<text name="Media texture:">Texture :</text>
<texture_picker name="media texture" tool_tip="Cliquez pour sélectionner une image"/>
<text name="replace_texture_help">Les objets utilisant cette texture montreront le film ou une page web lorsque vous cliquez sur la flèche de lecture. Sélectionnez la vignette pour choisir une texture différente.</text>
<check_box label="Mise a l'échelle automatiquement" name="media_auto_scale" tool_tip="Cocher cette option mettra à l'échelle le contenu pour cette parcelle automatiquement. Il peut être un peu plus lent et de moins bonne qualité visuelle mais aucune autre mise à l'échelle de la texture ou l'alignement seront tenus."/>
<text name="media_size" tool_tip="Taille de rendu pour les médias Web, laissez 0 par défaut.">Taille :</text>
<spinner name="media_size_width" tool_tip="Taille de rendu pour les médias Web, laissez 0 par défaut."/>
<spinner name="media_size_height" tool_tip="Taille de rendu pour les médias Web, laissez 0 par défaut."/>
<text name="pixels">pixels</text>
<text name="Options:">Options :</text>
<check_box label="Boucle" name="media_loop" tool_tip="Jouer cette musique en boucle. Quand le média aura fini sa liste de lecture, il reprendra du début."/>
</panel>
<panel label="SON" name="land_audio_panel">
<text bottom_delta="-28" name="MusicURL:">
URL de la
musique :
</text>
<text name="Sound:">
Son :
</text>
<check_box label="Limiter les sons des gestes et des objets à cette parcelle" name="check sound local"/>
<text name="Avatar Sounds:">
Sons d&apos;avatar :
</text>
<panel label="Audio" name="land_audio_panel">
<text name="MusicURL:">Musique :</text>
<button name="stream_add_btn" tool_tip="Ajouter l'adresse de la musique à la liste de lecture"/>
<button name="stream_delete_btn" tool_tip="Supprimer l'adresse de la musique de la liste de lecture"/>
<button name="stream_copy_btn" tool_tip="Copier l'adresse de la musique"/>
<text name="Sound:">Son :</text>
<check_box label="Restreindre les animations et les sons des objets à ce terrain" name="check sound local"/>
<text name="Avatar Sounds:">Son des résidents :</text>
<check_box label="Tout le monde" name="all av sound check"/>
<check_box label="Groupe" name="group av sound check"/>
<text name="Voice settings:">
Voix :
</text>
<text name="Voice settings:">Chat vocal :</text>
<check_box label="Activer le chat vocal" name="parcel_enable_voice_channel"/>
<check_box label="Activer la voix (contrôlé par le domaine)" name="parcel_enable_voice_channel_is_estate_disabled"/>
<check_box label="Limiter le chat vocal à cette parcelle" name="parcel_enable_voice_channel_local"/>
<check_box label="Activer le chat vocal (défini par le domaine)" name="parcel_enable_voice_channel_is_estate_disabled"/>
<check_box label="Restreindre le chat vocal à ce terrain" name="parcel_enable_voice_channel_local"/>
</panel>
<panel label="ACCÈS" name="land_access_panel">
<panel.string name="access_estate_defined">
(défini par le domaine
</panel.string>
<panel.string name="estate_override">
Au moins une de ces options est définie au niveau du domaine.
</panel.string>
<check_box label="Autoriser l&apos;accès public (des lignes d&apos;interdiction seront créées si cette case n&apos;est pas cochée)" name="public_access"/>
<text name="Only Allow">
Conditions d&apos;accès des résidents :
</text>
<check_box label="Informations de paiement enregistrées [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Pour pouvoir accéder à cette parcelle, les résidents doivent avoir enregistré des informations de paiement. Consultez le [SUPPORT_SITE] pour plus d&apos;informations."/>
<check_box label="Avoir plus de 18 ans [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Pour accéder à cette parcelle, les résidents doivent avoir au moins 18 ans. Consultez le [SUPPORT_SITE] pour plus d&apos;informations."/>
<check_box label="Autoriser l&apos;accès au groupe : [GROUP]" name="GroupCheck" tool_tip="Définir le groupe à l&apos;onglet Général."/>
<check_box label="Vendre des pass à :" name="PassCheck" tool_tip="Autoriser un accès temporaire à cette parcelle"/>
<panel label="Accès" name="land_access_panel">
<panel.string name="access_estate_defined">(Défini par le domaine)</panel.string>
<panel.string name="estate_override">Une ou plusieurs options définies ici le sont au niveau du domaine</panel.string>
<check_box name="public_access" label="Autoriser l'accès public (Décocher cette option créera une barrière)"/>
<text name="Only Allow">Autoriser l'accès aux résidents qui :</text>
<check_box label="Ont saisi leurs informations de paiement [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Les résidents doivent avoir saisi leurs informations de paiement pour accéder à ce terrain. Consultez [SUPPORT_SITE] pour plus d'informations."/>
<check_box label="Sont majeurs [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Les résidents doivent être majeurs pour accéder à ce terrain. Consultez [SUPPORT_SITE] pour plus d'informations."/>
<check_box label="Autoriser l'accès au groupe : [GROUP]" name="GroupCheck" tool_tip="Définissez le groupe dans l'onglet Général."/>
<check_box label="Vendre un droit d'accès à :" name="PassCheck" tool_tip="Autorise l'accès temporaire à ce terrain" width="150"/>
<combo_box name="pass_combo" width="110">
<combo_box.item label="Tout le monde" name="Anyone"/>
<combo_box.item label="N'importe qui" name="Anyone"/>
<combo_box.item label="Groupe" name="Group"/>
</combo_box>
<spinner label="Prix en L$ :" name="PriceSpin"/>
<spinner label="Durée en heures :" name="HoursSpin"/>
<spinner label="Prix en L$ :" name="PriceSpin"/>
<spinner label="Durée de l'accès :" name="HoursSpin"/>
<panel name="Allowed_layout_panel">
<text label="Toujours autoriser" name="AllowedText">
Résidents autorisés ([LISTED]/[MAX])
</text>
<name_list name="AccessList" tool_tip="([LISTED] dans la liste, [MAX] max.)"/>
<text label="Toujours autoriser" name="AllowedText">Résidents autorisés ([LISTED]/[MAX])</text>
<name_list name="AccessList" tool_tip="([LISTED] définis, [MAX] max)"/>
<button label="Ajouter" name="add_allowed"/>
<button label="Supprimer" label_selected="Supprimer" name="remove_allowed"/>
</panel>
<panel name="Banned_layout_panel">
<text label="Bannir" name="BanCheck">
Résidents bannis ([LISTED]/[MAX])
</text>
<name_list name="BannedList" tool_tip="([LISTED] dans la liste, [MAX] max.)"/>
<text label="Bannir" name="BanCheck">Résidents bannis ([LISTED]/[MAX])</text>
<name_list name="BannedList" tool_tip="([LISTED] définis, [MAX] max)"/>
<button label="Ajouter" name="add_banned"/>
<button label="Supprimer" label_selected="Supprimer" name="remove_banned"/>
</panel>
</panel>
<panel label="EXPÉRIENCES" name="land_experiences_panel"/>
<panel label="Expériences" name="land_experiences_panel"/>
</tab_container>
</floater>

View File

@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_activeim" title="IM ACTIVE"/>
<floater name="floater_activeim" title="IM actif"/>

View File

@ -1,11 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Anim Preview" title="ANIMATION.ANIM">
<text name="name_label">
Nom :
</text>
<text name="description_label">
Description :
</text>
<button label="Charger ([AMOUNT] L$)" name="ok_btn"/>
<floater name="Anim Preview" title="Animation.Anim">
<text name="name_label">Nom :</text>
<text name="description_label">Description :</text>
<button label="Uploader ([AMOUNT] L$)" name="ok_btn"/>
<button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
</floater>

View File

@ -1,186 +1,112 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Animation Preview">
<floater.string name="failed_to_initialize">
Échec de l&apos;initialisation du mouvement
</floater.string>
<floater.string name="failed_to_initialize">Échec lors de l'initialisation du mouvement</floater.string>
<floater.string name="anim_too_long">
La durée du fichier d&apos;animation est de [LENGTH] secondes.
La limite maximale est de [MAX_LENGTH] secondes.
L'animation dure [LENGTH] secondes.
La durée maximum d'une animation est de [MAX_LENGTH] secondes.
</floater.string>
<floater.string name="failed_file_read">
Impossible de lire le fichier d&apos;animation.
[STATUS]
Impossible de lire l'animation.
[STATUS]
</floater.string>
<floater.string name="E_ST_OK">
Ok
</floater.string>
<floater.string name="E_ST_EOF">
Fin prématurée du fichier.
</floater.string>
<floater.string name="E_ST_NO_CONSTRAINT">
Impossible de lire la définition des contraintes.
</floater.string>
<floater.string name="E_ST_NO_FILE">
Impossible d&apos;ouvrir le fichier BVH.
</floater.string>
<floater.string name="E_ST_NO_HIER">
En-tête HIERARCHY non valide.
</floater.string>
<floater.string name="E_ST_NO_JOINT">
Impossible de trouver ROOT ou JOINT.
</floater.string>
<floater.string name="E_ST_NO_NAME">
Impossible d&apos;obtenir le nom JOINT.
</floater.string>
<floater.string name="E_ST_NO_OFFSET">
Impossible de trouver OFFSET.
</floater.string>
<floater.string name="E_ST_NO_CHANNELS">
CHANNELS introuvables.
</floater.string>
<floater.string name="E_ST_NO_ROTATION">
Impossible d&apos;obtenir l&apos;ordre de rotation.
</floater.string>
<floater.string name="E_ST_NO_AXIS">
Impossible d&apos;obtenir l&apos;axe de rotation.
</floater.string>
<floater.string name="E_ST_NO_MOTION">
Impossible de trouver MOTION.
</floater.string>
<floater.string name="E_ST_NO_FRAMES">
Impossible d&apos;obtenir le nombre d&apos;images.
</floater.string>
<floater.string name="E_ST_NO_FRAME_TIME">
Impossible d&apos;obtenir la durée des images.
</floater.string>
<floater.string name="E_ST_NO_POS">
Impossible d&apos;obtenir les valeurs de position.
</floater.string>
<floater.string name="E_ST_NO_ROT">
Impossible d&apos;obtenir les valeurs de rotation.
</floater.string>
<floater.string name="E_ST_NO_XLT_FILE">
Impossible d&apos;ouvrir le fichier de traduction.
</floater.string>
<floater.string name="E_ST_NO_XLT_HEADER">
Impossible de lire l&apos;en-tête de traduction.
</floater.string>
<floater.string name="E_ST_NO_XLT_NAME">
Impossible de lire les noms de traduction.
</floater.string>
<floater.string name="E_ST_NO_XLT_IGNORE">
Impossible de lire la valeur ignorant la traduction.
</floater.string>
<floater.string name="E_ST_NO_XLT_RELATIVE">
Impossible de lire la valeur relative de la traduction.
</floater.string>
<floater.string name="E_ST_NO_XLT_OUTNAME">
Impossible de lire la valeur outname de la traduction.
</floater.string>
<floater.string name="E_ST_NO_XLT_MATRIX">
Impossible de lire la matrice de traduction.
</floater.string>
<floater.string name="E_ST_NO_XLT_MERGECHILD">
Impossible d&apos;obtenir le nom mergechild.
</floater.string>
<floater.string name="E_ST_NO_XLT_MERGEPARENT">
Impossible d&apos;obtenir le nom mergeparent.
</floater.string>
<floater.string name="E_ST_NO_XLT_PRIORITY">
Impossible d&apos;obtenir la valeur priority.
</floater.string>
<floater.string name="E_ST_NO_XLT_LOOP">
Impossible d&apos;obtenir la valeur loop.
</floater.string>
<floater.string name="E_ST_NO_XLT_EASEIN">
Impossible d&apos;obtenir les valeurs easeIn.
</floater.string>
<floater.string name="E_ST_NO_XLT_EASEOUT">
Impossible d&apos;obtenir les valeurs easeOut.
</floater.string>
<floater.string name="E_ST_NO_XLT_HAND">
Impossible d&apos;obtenir la valeur hand morph.
</floater.string>
<floater.string name="E_ST_NO_XLT_EMOTE">
Impossible de lire le nom emote.
</floater.string>
<floater.string name="E_ST_BAD_ROOT">
Nom root joint incorrect ; utiliser &quot;hip&quot;.
</floater.string>
<text name="name_label">
Nom :
</text>
<text name="description_label">
Description :
</text>
<spinner label="Priorité" name="priority" tool_tip="Contrôle quelles autres animations peuvent être remplacées par cette animation."/>
<check_box label="Boucle" name="loop_check" tool_tip="Entraîne la lecture en boucle de cette animation."/>
<spinner label="Début (%)" name="loop_in_point" tool_tip="Définit le point de l&apos;animation auquel retourne la boucle."/>
<spinner label="Fin (%)" name="loop_out_point" tool_tip="Définit le point de l&apos;animation auquel se termine la boucle."/>
<text name="hand_label">
Pose des mains
</text>
<combo_box name="hand_pose_combo" tool_tip="Contrôle ce que font les mains pendant l&apos;animation.">
<combo_box.item label="Écartées" name="Spread"/>
<combo_box.item label="Détendues" name="Relaxed"/>
<combo_box.item label="Montrer du doigt (les deux)" name="PointBoth"/>
<combo_box.item label="Poing" name="Fist"/>
<combo_box.item label="Détendue (gauche)" name="RelaxedLeft"/>
<combo_box.item label="Montrer du doigt (gauche)" name="PointLeft"/>
<combo_box.item label="Poing (gauche)" name="FistLeft"/>
<combo_box.item label="Détendue (droite)" name="RelaxedRight"/>
<combo_box.item label="Montrer du doigt (droite)" name="PointRight"/>
<combo_box.item label="Poing (droite)" name="FistRight"/>
<combo_box.item label="Salut (droite)" name="SaluteRight"/>
<combo_box.item label="Clavier" name="Typing"/>
<combo_box.item label="Paix (droite)" name="PeaceRight"/>
<floater.string name="E_ST_OK">Pas d'erreurs</floater.string>
<floater.string name="E_ST_EOF">Fin de fichier prématurée.</floater.string>
<floater.string name="E_ST_NO_CONSTRAINT">Impossible de lire la définition de contrainte.</floater.string>
<floater.string name="E_ST_NO_FILE">Impossible d'ouvrir le fichier BVH.</floater.string>
<floater.string name="E_ST_NO_HIER">En-tête HIERARCHY invalide.</floater.string>
<floater.string name="E_ST_NO_JOINT">Impossible de trouver ROOT ou JOINT.</floater.string>
<floater.string name="E_ST_NO_NAME">Impossible de trouver le nom JOINT.</floater.string>
<floater.string name="E_ST_NO_OFFSET">Impossible de trouver OFFSET.</floater.string>
<floater.string name="E_ST_NO_CHANNELS">Impossible de trouver CHANNELS.</floater.string>
<floater.string name="E_ST_NO_ROTATION">Impossible de trouver le sens de rotation.</floater.string>
<floater.string name="E_ST_NO_AXIS">Impossible de trouver l'axe de rotation.</floater.string>
<floater.string name="E_ST_NO_MOTION">Impossible de trouver MOTION.</floater.string>
<floater.string name="E_ST_NO_FRAMES">Impossible de trouver le nombre de trames.</floater.string>
<floater.string name="E_ST_NO_FRAME_TIME">Impossible de trouver frame time.</floater.string>
<floater.string name="E_ST_NO_POS">Impossible de trouver les valeurs de position.</floater.string>
<floater.string name="E_ST_NO_ROT">Impossible de trouver les valeurs de rotation.</floater.string>
<floater.string name="E_ST_NO_XLT_FILE">Impossible d'ouvrir le fichier de transformation.</floater.string>
<floater.string name="E_ST_NO_XLT_HEADER">Impossible de lire l'en-tête de transformation.</floater.string>
<floater.string name="E_ST_NO_XLT_NAME">Impossible de lire les noms de transformation.</floater.string>
<floater.string name="E_ST_NO_XLT_IGNORE">Impossible de lire la transformation valeur ignorée.</floater.string>
<floater.string name="E_ST_NO_XLT_RELATIVE">Impossible de lire la valeur relative de transformation.</floater.string>
<floater.string name="E_ST_NO_XLT_OUTNAME">Impossible de lire le nom de sortie dans la transformation.</floater.string>
<floater.string name="E_ST_NO_XLT_MATRIX">Impossible de lire la matrice de transformation.</floater.string>
<floater.string name="E_ST_NO_XLT_MERGECHILD">Impossible de récupérer le nom de l'élément enfant fusionné.</floater.string>
<floater.string name="E_ST_NO_XLT_MERGEPARENT">Impossible de récupérer le nom du parent fusionné.</floater.string>
<floater.string name="E_ST_NO_XLT_PRIORITY">Impossible de récupérer la priorité.</floater.string>
<floater.string name="E_ST_NO_XLT_LOOP">Impossible de récupérer la valeur de la boucle.</floater.string>
<floater.string name="E_ST_NO_XLT_EASEIN">Impossible de récupérer la valeur de transition initiale.</floater.string>
<floater.string name="E_ST_NO_XLT_EASEOUT">Impossible de récupérer la valeur de transition terminale.</floater.string>
<floater.string name="E_ST_NO_XLT_HAND">Impossible de récupérer la valeur de disposition de la main.</floater.string>
<floater.string name="E_ST_NO_XLT_EMOTE">Impossible de récupérer le nom de l'expression.</floater.string>
<floater.string name="E_ST_BAD_ROOT">Point racine incorrect, utilisation des hanches.</floater.string>
<floater.string name="FS_report_frames">[F] frm. [S] s. [FPS] FPS</floater.string>
<text name="name_label">Nom :</text>
<text name="description_label">Description :</text>
<spinner label="Priorité" name="priority" tool_tip="Contrôle quelles autres animations peuvent être outrepassées par cette animation"/>
<check_box label="Boucle" name="loop_check" tool_tip="Boucle l'animation"/>
<text name="frames_label">300 frm. 30 s. 10 FPS</text>
<spinner label="Début (%)" name="loop_in_point" tool_tip="Sélectionne le point à partir duquel boucler"/>
<spinner label="Fin (%)" name="loop_out_point" tool_tip="Sélectionne le point à partir duquel sortir de la boucle"/>
<spinner label="Début (frm)" name="loop_in_frames" tool_tip="Sélectionne le point à partir duquel boucler, en trames"/>
<spinner label="Fin (frm)" name="loop_out_frames" tool_tip="Sélectionne le point à partir duquel sortir de la boucle, en trames"/>
<text name="hand_label" width="120">Disposition de la main</text>
<combo_box name="hand_pose_combo" left_pad="10" tool_tip="Contrôle ce que les mains font pendant l'animation">
<combo_box.item label="Spread" name="Spread"/>
<combo_box.item label="Relaxed" name="Relaxed"/>
<combo_box.item label="Point Both" name="PointBoth"/>
<combo_box.item label="Fist" name="Fist"/>
<combo_box.item label="Relaxed Left" name="RelaxedLeft"/>
<combo_box.item label="Point Left" name="PointLeft"/>
<combo_box.item label="Fist Left" name="FistLeft"/>
<combo_box.item label="Relaxed Right" name="RelaxedRight"/>
<combo_box.item label="Point Right" name="PointRight"/>
<combo_box.item label="Fist Right" name="FistRight"/>
<combo_box.item label="Salute Right" name="SaluteRight"/>
<combo_box.item label="Typing" name="Typing"/>
<combo_box.item label="Peace Right" name="PeaceRight"/>
</combo_box>
<text name="emote_label">
Expression
</text>
<combo_box name="emote_combo" tool_tip="Contrôle ce que fait le visage pendant l&apos;animation.">
<item label="(Aucune)" name="[None]"/>
<text name="emote_label">Expression</text>
<combo_box name="emote_combo" tool_tip="Contrôle ce que le visage fait pendant l'animation">
<item label="(None)" name="[None]"/>
<item label="Aaaaah" name="Aaaaah"/>
<item label="Effrayé" name="Afraid"/>
<item label="En colère" name="Angry"/>
<item label="Grand sourire" name="BigSmile"/>
<item label="Ennui" name="Bored"/>
<item label="Pleurer" name="Cry"/>
<item label="Mépris" name="Disdain"/>
<item label="Gêne" name="Embarrassed"/>
<item label="Froncer les sourcils" name="Frown"/>
<item label="Embrasser" name="Kiss"/>
<item label="Rire" name="Laugh"/>
<item label="Tirer la langue" name="Plllppt"/>
<item label="Dégoût" name="Repulsed"/>
<item label="Triste" name="Sad"/>
<item label="Hausser les épaules" name="Shrug"/>
<item label="Sourire" name="Smile"/>
<item label="Afraid" name="Afraid"/>
<item label="Angry" name="Angry"/>
<item label="Big Smile" name="BigSmile"/>
<item label="Bored" name="Bored"/>
<item label="Cry" name="Cry"/>
<item label="Disdain" name="Disdain"/>
<item label="Embarrassed" name="Embarrassed"/>
<item label="Frown" name="Frown"/>
<item label="Kiss" name="Kiss"/>
<item label="Laugh" name="Laugh"/>
<item label="Plllppt" name="Plllppt"/>
<item label="Repulsed" name="Repulsed"/>
<item label="Sad" name="Sad"/>
<item label="Shrug" name="Shrug"/>
<item label="Smile" name="Smile"/>
<item label="Surprise" name="Surprise"/>
<item label="Clin d&apos;œil" name="Wink"/>
<item label="Inquiétude" name="Worry"/>
<item label="Wink" name="Wink"/>
<item label="Worry" name="Worry"/>
</combo_box>
<text name="preview_label">
Aperçu
</text>
<combo_box name="preview_base_anim" tool_tip="Permet de tester le comportement de l&apos;animation lorsque votre avatar effectue certaines actions courantes.">
<text name="preview_label">Voir lorsque je suis</text>
<combo_box name="preview_base_anim" tool_tip="Utilisez ceci pour tester le comportement de l'animation pendant que votre avatar fait autre chose.">
<item label="Debout" name="Standing"/>
<item label="En marche" name="Walking"/>
<item label="Marchant à pied" name="Walking"/>
<item label="Assis" name="Sitting"/>
<item label="En vol" name="Flying"/>
</combo_box>
<spinner label="Transition début (s)" name="ease_in_time" tool_tip="Durée (en secondes) de l&apos;entrée en fondu de l&apos;animation."/>
<spinner label="Transition fin (s)" name="ease_out_time" tool_tip="Durée (en secondes) de la sortie en fondu de l&apos;animation."/>
<button name="play_btn" tool_tip="Lire l&apos;animation."/>
<button name="pause_btn" tool_tip="Suspendre l&apos;animation."/>
<button name="stop_btn" tool_tip="Arrêter la lecture de l&apos;animation."/>
<spinner label="Transition initiale (sec)" name="ease_in_time" tool_tip="Durée en secondes de la transition initiale"/>
<spinner label="Transition terminale (sec)" name="ease_out_time" tool_tip="Durée en secondes de la transition terminale"/>
<button name="play_btn" tool_tip="Lire votre animation"/>
<button name="pause_btn" tool_tip="Mettre votre animation en pause"/>
<button name="stop_btn" tool_tip="Stopper l'animation"/>
<text name="bad_animation_text">
Impossible de lire le fichier d&apos;animation.
Les fichiers BVH exportés depuis Poser 4 sont recommandés.
Impossible de lire l'animation.
Nous recommandons les fichiers BVH exportés depuis Poser 4.
</text>
<button label="Charger ([AMOUNT] L$)" name="ok_btn"/>
<button label="Annuler" name="cancel_btn"/>
<button label="Recharger le fichier" width="140" name="reload_btn"/>
<button label="Uploader (10 L$)" width="140" name="ok_btn"/>
<button label="Annuler" width="100" left="170" name="cancel_btn"/>
</floater>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="animation_explorer" title="Explorateur d'animations">
<scroll_list name="animation_list">
<scroll_list.column label="Jouée par" name="played_by"/>
<scroll_list.column label="Jouée" name="played"/>
<scroll_list.column label="Priorité" name="priority" />
<scroll_list.column label="Timestamp" name="timestamp"/>
<scroll_list.column label="ID de l'animation" name="animation_id"/>
<scroll_list.column label="ID de l'objet" name="object_id"/>
</scroll_list>
<panel name="buttons_panel">
<button label="Stop" name="stop_btn"/>
<button label="Stop &amp; révoquer" name="stop_and_revoke_btn"/>
<button label="Révoquer" name="revoke_btn" width="100"/>
<check_box label="Non possédées" name="no_owned_animations_check" tool_tip="Activer l'option filtrera les animations que possède votre avatar (AO et animations du système)."/>
</panel>
</floater>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="animation_overrider" title="AO">
<floater.string name="ao_no_sets_loaded">Aucun groupe chargé</floater.string>
<floater.string name="ao_no_animations_loaded">Aucune animation chargée</floater.string>
<floater.string name="ao_dnd_only_on_full_interface">Vous pouvez seulement glisser une animation vers l'interface complète. Cliquez sur l'icône de l'outil pour l'ouvrir.</floater.string>
</floater>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="ws_asset_blacklist" title="Éléments Blacklistés">
<floater.string name="asset_object">Objet</floater.string>
<floater.string name="asset_texture">Texture</floater.string>
<floater.string name="asset_sound">Son</floater.string>
<floater.string name="asset_resident">Résident</floater.string>
<floater.string name="asset_unknown">Inconnu</floater.string>
<floater.string name="unknown_object">Objet inconnu</floater.string>
<floater.string name="unknown_region">Région inconnue</floater.string>
<scroll_list name="result_list">
<scroll_list.columns name="name" label="Nom"/>
<scroll_list.columns name="region" label="Région"/>
<scroll_list.columns name="type" label="Type"/>
<scroll_list.columns name="date" label="Date"/>
<row>
<column>[INCONNU] Template item</column>
<column>[INCONNU] Template item</column>
<column>INCONNU</column>
<column>2012-12-11 13:37:00</column>
</row>
</scroll_list>
<button name="remove_btn" label="Supprimer la sélection des éléments blacklistés" height="23" width="320"/>
</floater>

View File

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="associate listing" title="ASSOCIER L&apos;ANNONCE">
<text name="message">ID d&apos;annonce :</text>
<line_editor name="listing_id">Saisir l&apos;ID ici</line_editor>
<button label="OK" name="OK"/>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="associate listing" title="Associer une annonce">
<text name="message">Référence de l'annonce :</text>
<line_editor name="listing_id">Saisissez la référence de l'annonce ici</line_editor>
<button label="Annuler" name="Cancel"/>
</floater>

View File

@ -1,11 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_auction" title="COMMENCER LA VENTE DE TERRAINS LINDEN">
<floater.string name="already for sale">
Vous ne pouvez pas mettre aux enchères des parcelles déjà en vente.
</floater.string>
<check_box initial_value="true" label="Inclure le marquage de sélection jaune" name="fence_check"/>
<button label="Capture d&apos;écran" label_selected="Capture d&apos;écran" name="snapshot_btn" width="110"/>
<button label="Vendre à n&apos;importe qui" label_selected="Vendre à n&apos;importe qui" name="sell_to_anyone_btn"/>
<floater name="floater_auction" title="Ventes aux enchères">
<floater.string name="already for sale">Vous ne pouvez pas mettre aux enchères des parcelles déjà en vente.</floater.string>
<check_box label="Afficher les limites de terrain sur la photo" name="fence_check"/>
<button label="Photo" label_selected="Photo" name="snapshot_btn"/>
<button label="Vendre à tout le monde" label_selected="Vendre à tout le monde" name="sell_to_anyone_btn"/>
<button label="Effacer les paramètres" label_selected="Effacer les paramètres" name="reset_parcel_btn"/>
<button label="Commencer les enchères" label_selected="Commencer les enchères" name="start_auction_btn"/>
</floater>

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