# Conflicts:
#	indra/newview/llviewermenu.cpp
master
Ansariel 2024-06-07 10:47:15 +02:00
commit b740bfb21c
86 changed files with 1330 additions and 1413 deletions

View File

@ -2699,51 +2699,37 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<map>
<key>platforms</key>
<map>
<key>darwin64</key>
<key>windows</key>
<map>
<key>archive</key>
<map>
<key>hash</key>
<string>49650353442698c3e05102676fe427d0ebe02f0b</string>
<string>fc67514183e7dbbb96bebb9970e1431c</string>
<key>hash_algorithm</key>
<string>sha1</string>
<string>md5</string>
<key>url</key>
<string>https://github.com/secondlife/3p-tracy/releases/download/v0.8.1-eecbf72/tracy-v0.8.1-eecbf72-darwin64-eecbf72.tar.zst</string>
<string>https://3p.firestormviewer.org/tracy-v0.10.241491433-windows-241491433.tar.bz2</string>
</map>
<key>name</key>
<string>darwin64</string>
</map>
<key>windows64</key>
<map>
<key>archive</key>
<map>
<key>hash</key>
<string>2b80e7407e4f3e82eff3879add0e9ad63e7fcace</string>
<key>hash_algorithm</key>
<string>sha1</string>
<key>url</key>
<string>https://github.com/secondlife/3p-tracy/releases/download/v0.8.1-eecbf72/tracy-v0.8.1-eecbf72-windows64-eecbf72.tar.zst</string>
</map>
<key>name</key>
<string>windows64</string>
<string>windows</string>
</map>
</map>
<key>license</key>
<string>bsd</string>
<key>license_file</key>
<string>LICENSES/tracy_license.txt</string>
<string>LICENSES/Tracy.txt</string>
<key>copyright</key>
<string>Copyright (c) 2017-2022, Bartosz Taudul (wolf@nereid.pl)</string>
<key>version</key>
<string>v0.8.1-eecbf72</string>
<string>v0.10.241491433</string>
<key>name</key>
<string>tracy</string>
<key>canonical_repo</key>
<string>https://bitbucket.org/lindenlab/3p-tracy</string>
<string>https://github.com/beqjanus/3p-tracy</string>
<key>description</key>
<string>Tracy Profiler Library</string>
<key>source</key>
<string>https://bitbucket.org/lindenlab/3p-tracy</string>
<string>https://github.com/beqjanus/3p-tracy</string>
<key>source_type</key>
<string>git</string>
</map>

View File

@ -10,7 +10,7 @@ if (USE_TRACY)
use_prebuilt_binary(tracy)
target_include_directories( ll::tracy SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/tracy)
target_link_libraries( ll::tracy INTERFACE TracyClient )
# target_link_libraries( ll::tracy INTERFACE TracyClient )
# See: indra/llcommon/llprofiler.h
add_compile_definitions(LL_PROFILER_CONFIGURATION=3)

View File

@ -268,8 +268,12 @@ if (DARWIN)
list(APPEND llcommon_SOURCE_FILES llsys_objc.mm)
endif (DARWIN)
# <FS:Beq/> Tracy Profiler support
# <FS:Beq> Tracy Profiler support
list(APPEND llcommon_SOURCE_FILES llprofiler.cpp)
if (USE_TRACY)
list(APPEND llcommon_SOURCE_FILES fstracyclient.cpp)
endif()
# </FS:Beq>
# <FS:ND> Add all nd* files. memory pool, intrinsics, ...

View File

@ -0,0 +1,8 @@
// Just a simple wrapper to easily import the single tracy source file and save
// all the pain of cross platform libraries in the Tracy 3p build.
#include "linden_common.h"
#if LL_PROFILER_CONFIGURATION == LL_PROFILER_CONFIG_TRACY || LL_PROFILER_CONFIGURATION == LL_PROFILER_CONFIG_TRACY_FAST_TIMER
#include "TracyClient.cpp"
#endif // LL_PROFILER_CONFIGURATION

View File

@ -91,12 +91,12 @@ namespace LLProfiler
// #define TRACY_NO_BROADCAST 1
// #define TRACY_ONLY_LOCALHOST 1
#define TRACY_ONLY_IPV4 1
#include "Tracy.hpp"
#include "tracy/Tracy.hpp"
// <FS:Beq> Fixed mutual exclusion issues with RAM and GPU. NOTE: This might still break on Apple in which case we'll need to restrict that platform
//// GPU Mutually exclusive with detailed memory tracing
// #define LL_PROFILER_ENABLE_TRACY_OPENGL 0
#define LL_PROFILER_ENABLE_TRACY_MEMORY 0
#define LL_PROFILER_ENABLE_TRACY_OPENGL 0
#define LL_PROFILER_ENABLE_TRACY_OPENGL 1
// Enable RenderDoc labeling
#define LL_PROFILER_ENABLE_RENDER_DOC 0
@ -104,37 +104,37 @@ namespace LLProfiler
#endif
#if LL_PROFILER_CONFIGURATION == LL_PROFILER_CONFIG_TRACY
#define LL_PROFILER_FRAME_END FrameMark
#define LL_PROFILER_FRAME_END FrameMark;
// <FS:Beq> Note: this threadlocal forces memory colelction enabled from the start. It conflicts with deferred profiling.
#define LL_PROFILER_SET_THREAD_NAME( name ) tracy::SetThreadName( name ); gProfilerEnabled = true;
// </FS:Beq>
#define LL_PROFILER_THREAD_BEGIN(name) FrameMarkStart( name ) // C string
#define LL_PROFILER_THREAD_END(name) FrameMarkEnd( name ) // C string
#define LL_PROFILER_THREAD_BEGIN(name) FrameMarkStart( name ); // C string
#define LL_PROFILER_THREAD_END(name) FrameMarkEnd( name ); // C string
// <FS:Beq> revert change that obscures custom FTM zones. We may want to may FTM Zones unique in future.
// #define LL_RECORD_BLOCK_TIME(name) ZoneScoped // Want descriptive names; was: ZoneNamedN( ___tracy_scoped_zone, #name, LLProfiler::active );
#define LL_RECORD_BLOCK_TIME(name) ZoneNamedN( ___tracy_scoped_zone, #name, LLProfiler::active )
#define LL_RECORD_BLOCK_TIME(name) ZoneNamedN( ___tracy_scoped_zone, #name, LLProfiler::active );
// </FS:Beq>
// <FS:Beq>
// #define LL_PROFILE_ZONE_NAMED(name) ZoneNamedN( ___tracy_scoped_zone, name, true )
// #define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, true ) // RGB
// #define LL_PROFILE_ZONE_SCOPED ZoneScoped
#define LL_PROFILE_ZONE_NAMED(name) ZoneNamedN( ___tracy_scoped_zone, name, LLProfiler::active )
#define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, LLProfiler::active ) // RGB
#define LL_PROFILE_ZONE_SCOPED ZoneNamed( ___tracy_scoped_zone, LLProfiler::active ) // <FS:Beq/> Enable deferred collection through filters
#define LL_PROFILE_ZONE_NAMED(name) ZoneNamedN( ___tracy_scoped_zone, name, LLProfiler::active );
#define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, LLProfiler::active ); // RGB
#define LL_PROFILE_ZONE_SCOPED ZoneNamed( ___tracy_scoped_zone, LLProfiler::active ); // <FS:Beq/> Enable deferred collection through filters
// </FS:Beq>
#define LL_PROFILE_ZONE_NUM( val ) ZoneValue( val )
#define LL_PROFILE_ZONE_TEXT( text, size ) ZoneText( text, size )
#define LL_PROFILE_ZONE_NUM( val ) ZoneValue( val );
#define LL_PROFILE_ZONE_TEXT( text, size ) ZoneText( text, size );
#define LL_PROFILE_ZONE_ERR(name) LL_PROFILE_ZONE_NAMED_COLOR( name, 0XFF0000 ) // RGB yellow
#define LL_PROFILE_ZONE_INFO(name) LL_PROFILE_ZONE_NAMED_COLOR( name, 0X00FFFF ) // RGB cyan
#define LL_PROFILE_ZONE_WARN(name) LL_PROFILE_ZONE_NAMED_COLOR( name, 0x0FFFF00 ) // RGB red
// <FS:Beq> Additional FS Tracy macros
#define LL_PROFILE_ZONE_COLOR(color) ZoneNamedC( ___tracy_scoped_zone, color, LLProfiler::active ) // <FS:Beq/> Additional Tracy macro
#define LL_PROFILE_PLOT( name, value ) TracyPlot( name, value)
#define LL_PROFILE_PLOT_SQ( name, prev, value ) TracyPlot(name,prev);TracyPlot( name, value)
#define LL_PROFILE_ZONE_COLOR(color) ZoneNamedC( ___tracy_scoped_zone, color, LLProfiler::active );
#define LL_PROFILE_PLOT( name, value ) TracyPlot( name, value);
#define LL_PROFILE_PLOT_CONFIG_SQUARE(name) TracyPlotConfig(name, tracy::PlotFormatType::Number, true, false, 0);
#define LL_PROFILE_IS_CONNECTED TracyIsConnected
// </FS:Beq>
#endif
@ -158,15 +158,15 @@ namespace LLProfiler
// <FS:Beq> Additional FS Tracy macros
#define LL_PROFILE_ZONE_COLOR(color)
#define LL_PROFILE_PLOT( name, value )
#define LL_PROFILE_PLOT_SQ( name, prev, value )
#define LL_PROFILE_PLOT_CONFIG_SQUARE(name)
#define LL_PROFILE_IS_CONNECTED
// </FS:Beq>
#endif
#if LL_PROFILER_CONFIGURATION == LL_PROFILER_CONFIG_TRACY_FAST_TIMER
#define LL_PROFILER_FRAME_END FrameMark
#define LL_PROFILER_FRAME_END FrameMark;
#define LL_PROFILER_SET_THREAD_NAME( name ) tracy::SetThreadName( name ); gProfilerEnabled = true;
#define LL_PROFILER_THREAD_BEGIN(name) FrameMarkStart( name ) // C string
#define LL_PROFILER_THREAD_END(name) FrameMarkEnd( name ) // C string
#define LL_PROFILER_THREAD_BEGIN(name) FrameMarkStart( name ); // C string
#define LL_PROFILER_THREAD_END(name) FrameMarkEnd( name ); // C string
// <FS:Beq> revert change that obscures custom FTM zones.
// #define LL_RECORD_BLOCK_TIME(name) ZoneScoped const LLTrace::BlockTimer& LL_GLUE_TOKENS(block_time_recorder, __LINE__)(LLTrace::timeThisBlock(name)); (void)LL_GLUE_TOKENS(block_time_recorder, __LINE__);
@ -177,20 +177,20 @@ namespace LLProfiler
// #define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, true ) // RGB
// #define LL_PROFILE_ZONE_SCOPED ZoneScoped
#define LL_PROFILE_ZONE_NAMED(name) ZoneNamedN( ___tracy_scoped_zone, name, LLProfiler::active );
#define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, LLProfiler::active ) // RGB
#define LL_PROFILE_ZONE_SCOPED ZoneNamed( ___tracy_scoped_zone, LLProfiler::active ) // <FS:Beq/> Enable deferred collection through filters
#define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, LLProfiler::active ); // RGB
#define LL_PROFILE_ZONE_SCOPED ZoneNamed( ___tracy_scoped_zone, LLProfiler::active ); // <FS:Beq/> Enable deferred collection through filters
// </FS:Beq>
#define LL_PROFILE_ZONE_NUM( val ) ZoneValue( val )
#define LL_PROFILE_ZONE_TEXT( text, size ) ZoneText( text, size )
#define LL_PROFILE_ZONE_NUM( val ) ZoneValue( val );
#define LL_PROFILE_ZONE_TEXT( text, size ) ZoneText( text, size );
#define LL_PROFILE_ZONE_ERR(name) LL_PROFILE_ZONE_NAMED_COLOR( name, 0XFF0000 ) // RGB yellow
#define LL_PROFILE_ZONE_INFO(name) LL_PROFILE_ZONE_NAMED_COLOR( name, 0X00FFFF ) // RGB cyan
#define LL_PROFILE_ZONE_WARN(name) LL_PROFILE_ZONE_NAMED_COLOR( name, 0x0FFFF00 ) // RGB red
// <FS:Beq> Additional FS Tracy macros
#define LL_PROFILE_ZONE_COLOR(color) ZoneNamedC( ___tracy_scoped_zone, color, LLProfiler::active )
#define LL_PROFILE_PLOT( name, value ) TracyPlot( name, value)
#define LL_PROFILE_PLOT_SQ( name, prev, value ) TracyPlot( name, prev );TracyPlot( name, value )
#define LL_PROFILE_ZONE_COLOR(color) ZoneNamedC( ___tracy_scoped_zone, color, LLProfiler::active );
#define LL_PROFILE_PLOT( name, value ) TracyPlot( name, value);
#define LL_PROFILE_PLOT_CONFIG_SQUARE(name) TracyPlotConfig(name, tracy::PlotFormatType::Number, true, false, 0);
#define LL_PROFILE_IS_CONNECTED TracyIsConnected
// </FS:Beq>
#endif
@ -215,16 +215,17 @@ namespace LLProfiler
// <FS:Ansariel> Additional FS Tracy macros
#define LL_PROFILE_ZONE_COLOR(color)
#define LL_PROFILE_PLOT( name, value )
#define LL_PROFILE_PLOT_SQ( name, prev, value )
#define LL_PROFILE_PLOT_CONFIG_SQUARE(name)
#define LL_PROFILE_IS_CONNECTED
// </FS:Ansariel>
#endif // LL_PROFILER
#if LL_PROFILER_ENABLE_TRACY_OPENGL
#define LL_PROFILE_GPU_ZONE(name) TracyGpuZone(name)
#define LL_PROFILE_GPU_ZONEC(name,color) TracyGpuZoneC(name,color)
#define LL_PROFILER_GPU_COLLECT TracyGpuCollect
#define LL_PROFILER_GPU_CONTEXT TracyGpuContext
#define LL_PROFILE_GPU_ZONE(name) TracyGpuZone(name);
#define LL_PROFILE_GPU_ZONEC(name,color) TracyGpuZoneC(name,color);
#define LL_PROFILER_GPU_COLLECT TracyGpuCollect;
#define LL_PROFILER_GPU_CONTEXT TracyGpuContext;
#define LL_PROFILER_GPU_CONTEXT_NS(name, size) TracyGpuContext;TracyGpuContextName(name,size);
// disable memory tracking (incompatible with GPU tracing
#define LL_PROFILE_ALLOC(ptr, size) (void)(ptr); (void)(size);
@ -234,12 +235,13 @@ namespace LLProfiler
#define LL_PROFILE_GPU_ZONEC(name,color) (void)name;(void)color;
#define LL_PROFILER_GPU_COLLECT
#define LL_PROFILER_GPU_CONTEXT
#define LL_PROFILER_GPU_CONTEXT_NS(name, size) (void)name;(void)size;
#define LL_LABEL_OBJECT_GL(type, name, length, label)
#if LL_PROFILER_CONFIGURATION > 1
#define LL_PROFILE_ALLOC(ptr, size) TracyAlloc(ptr, size)
#define LL_PROFILE_FREE(ptr) TracyFree(ptr)
#define LL_PROFILE_ALLOC(ptr, size) TracyAlloc(ptr, size);
#define LL_PROFILE_FREE(ptr) TracyFree(ptr);
#else
#define LL_PROFILE_ALLOC(ptr, size) (void)(ptr); (void)(size);
#define LL_PROFILE_FREE(ptr) (void)(ptr);
@ -248,7 +250,7 @@ namespace LLProfiler
#endif
#if LL_PROFILER_ENABLE_RENDER_DOC
#define LL_LABEL_OBJECT_GL(type, name, length, label) glObjectLabel(type, name, length, label)
#define LL_LABEL_OBJECT_GL(type, name, length, label) glObjectLabel(type, name, length, label);
#else
#define LL_LABEL_OBJECT_GL(type, name, length, label)
#endif

View File

@ -122,6 +122,7 @@ void LLSDSerialize::serialize(const LLSD& sd, std::ostream& str, ELLSD_Serialize
// static
bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, llssize max_bytes)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_LLSD;
char hdr_buf[MAX_HDR_LEN + 1] = ""; /* Flawfinder: ignore */
bool fail_if_not_legacy = false;

View File

@ -456,6 +456,7 @@ template<class T> std::string LLStringUtilBase<T>::sLocale;
typedef LLStringUtilBase<char> LLStringUtil;
typedef LLStringUtilBase<llwchar> LLWStringUtil;
typedef std::basic_string<llwchar> LLWString;
typedef std::basic_string_view<llwchar> LLWStringView;
//@ Use this where we want to disallow input in the form of "foo"
// This is used to catch places where english text is embedded in the code

View File

@ -70,7 +70,7 @@ LLTimer* LLTimer::sTimer = NULL;
#if 0
void ms_sleep(U32 ms)
{
LL_PROFILE_ZONE_SCOPED;
// LL_PROFILE_ZONE_SCOPED;
using TimePoint = std::chrono::steady_clock::time_point;
auto resume_time = TimePoint::clock::now() + std::chrono::milliseconds(ms);
while (TimePoint::clock::now() < resume_time)

View File

@ -213,6 +213,7 @@ void HttpPolicy::retryOp(const HttpOpRequest::ptr_t &op)
//
HttpService::ELoopSpeed HttpPolicy::processReadyQueue()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;// <FS:Beq/> missing http trace
const HttpTime now(totalTime());
HttpService::ELoopSpeed result(HttpService::REQUEST_SLEEP);
HttpLibcurl & transport(mService->getTransport());

View File

@ -365,6 +365,7 @@ public:
bool callHandlerFunc(LLMessageSystem *msgsystem) const
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;
if (mHandlerFunc)
{

View File

@ -541,6 +541,11 @@ bool LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender
llassert( mCurrentRMessageTemplate);
llassert( !mCurrentRMessageData );
delete mCurrentRMessageData; // just to make sure
// <FS:Beq> storage for Tracy tag
#ifdef TRACY_ENABLE
static char msgstr[36];
#endif
// </FS:Beq>
// The offset tells us how may bytes to skip after the end of the
// message name.
@ -556,6 +561,7 @@ bool LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender
iter != mCurrentRMessageTemplate->mMemberBlocks.end();
++iter)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("BuildFromTemplate");
LLMessageBlock* mbci = *iter;
U8 repeat_number;
S32 i;
@ -598,6 +604,13 @@ bool LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender
}
LLMsgBlkData* cur_data_block = NULL;
// <FS:Beq> Tracy Message processing
LL_DEBUGS("LLMessage") << "Processing " << mbci->mName << " with " << repeat_number << " repetitions" << LL_ENDL;
#ifdef TRACY_ENABLE
strncpy(msgstr, mbci->mName, 35);
LL_PROFILE_ZONE_TEXT(msgstr, 35);
#endif
// </FS:Beq>
// now loop through the block
for (i = 0; i < repeat_number; i++)
@ -622,6 +635,7 @@ bool LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender
mbci->mMemberVariables.begin();
iter != mbci->mMemberVariables.end(); iter++)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("AddVariables");
const LLMessageVariable& mvci = **iter;
// ok, build out the variables
@ -704,6 +718,12 @@ bool LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender
}
{
// <FS:Beq> Tracy Message processing
LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("ProcessMessage");
#ifdef TRACY_ENABLE
LL_PROFILE_ZONE_TEXT(msgstr, 35);
#endif
// </FS:Beq>
static LLTimer decode_timer;
if(LLMessageReader::getTimeDecodes() || gMessageSystem->getTimingCallback())
@ -742,7 +762,7 @@ bool LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender
if(decode_time > LLMessageReader::getTimeDecodesSpamThreshold())
{
LL_DEBUGS() << "--------- Message " << mCurrentRMessageTemplate->mName << " decode took " << decode_time << " seconds. (" <<
LL_DEBUGS("LLMessage") << "--------- Message " << mCurrentRMessageTemplate->mName << " decode took " << decode_time << " seconds. (" <<
mCurrentRMessageTemplate->mMaxDecodeTimePerMsg << " max, " <<
(mCurrentRMessageTemplate->mTotalDecodeTime / mCurrentRMessageTemplate->mTotalDecoded) << " avg)" << LL_ENDL;
}

View File

@ -2553,6 +2553,7 @@ void LLImageGLThread::run()
// WorkQueue, likewise cleanup afterwards.
mWindow->makeContextCurrent(mContext);
gGL.init(false);
LL_PROFILER_GPU_CONTEXT_NS("LLImageGL Context", 17);
LL::ThreadPool::run();
gGL.shutdown();
mWindow->destroySharedContext(mContext);

View File

@ -237,6 +237,7 @@ public:
{
mWindow->makeContextCurrent(mContext);
gGL.init(false);
LL_PROFILER_GPU_CONTEXT_NS("LLGLWorker Context", 18);
mQueue->runUntilClose();
gGL.shutdown();
mWindow->destroySharedContext(mContext);

View File

@ -1014,6 +1014,7 @@ LLBoundListener LLNotificationChannelBase::connectChangedImpl(const LLEventListe
LLBoundListener LLNotificationChannelBase::connectAtFrontChangedImpl(const LLEventListener& slot)
{
LLMutexLock lock(&mItemsMutex); // <FS:Beq/> Guard against against unlocked access to mItems
for (LLNotificationSet::iterator it = mItems.begin(); it != mItems.end(); ++it)
{
slot(LLSD().with("sigtype", "load").with("id", (*it)->id()));
@ -1052,10 +1053,17 @@ bool LLNotificationChannelBase::updateItem(const LLSD& payload)
bool LLNotificationChannelBase::updateItem(const LLSD& payload, LLNotificationPtr pNotification)
{
std::string cmd = payload["sigtype"];
LLNotificationSet::iterator foundItem = mItems.find(pNotification);
bool wasFound = (foundItem != mItems.end());
// <FS:Beq> Guard against unlocked access to mItems
// LLNotificationSet::iterator foundItem = mItems.find(pNotification);
// bool wasFound = (foundItem != mItems.end());
bool wasFound = false;
{
LLMutexLock lock(&mItemsMutex);
LLNotificationSet::iterator foundItem = mItems.find(pNotification);
wasFound = (foundItem != mItems.end());
}
// </FS:Beq>
bool passesFilter = mFilter ? mFilter(pNotification) : true;
// first, we offer the result of the filter test to the simple
// signals for pass/fail. One of these is guaranteed to be called.
// If either signal returns true, the change processing is NOT performed
@ -1084,6 +1092,7 @@ bool LLNotificationChannelBase::updateItem(const LLSD& payload, LLNotificationPt
assert(!wasFound);
if (passesFilter)
{
LLMutexLock lock(&mItemsMutex); // <FS:Beq/> Guard against unlocked access to mItems
// not in our list, add it and say so
mItems.insert(pNotification);
onLoad(pNotification);
@ -1107,6 +1116,7 @@ bool LLNotificationChannelBase::updateItem(const LLSD& payload, LLNotificationPt
}
else
{
LLMutexLock lock(&mItemsMutex); // <FS:Beq/> Guard against unlocked access to mItems
// not in our list, add it and say so
mItems.insert(pNotification);
onChange(pNotification);
@ -1120,6 +1130,7 @@ bool LLNotificationChannelBase::updateItem(const LLSD& payload, LLNotificationPt
{
if (wasFound)
{
LLMutexLock lock(&mItemsMutex); // <FS:Beq/> Guard against unlocked access to mItems
// it already existed, so this is a delete
mItems.erase(pNotification);
onChange(pNotification);
@ -1138,6 +1149,7 @@ bool LLNotificationChannelBase::updateItem(const LLSD& payload, LLNotificationPt
assert(!wasFound);
if (passesFilter)
{
LLMutexLock lock(&mItemsMutex); // <FS:Beq/> Guard against unlocked access to mItems
// not in our list, add it and say so
mItems.insert(pNotification);
onAdd(pNotification);
@ -1149,6 +1161,7 @@ bool LLNotificationChannelBase::updateItem(const LLSD& payload, LLNotificationPt
// if we have it in our list, pass on the delete, then delete it, else do nothing
if (wasFound)
{
LLMutexLock lock(&mItemsMutex); // <FS:Beq/> Guard against unlocked access to mItems
onDelete(pNotification);
abortProcessing = mChanged(payload);
mItems.erase(pNotification);
@ -1714,6 +1727,7 @@ void LLNotifications::add(const LLNotificationPtr pNotif)
if (pNotif == NULL) return;
// first see if we already have it -- if so, that's a problem
LLMutexLock lock(&mItemsMutex); // <FS:Beq/> Guard against unlocked acceess to mItems
LLNotificationSet::iterator it=mItems.find(pNotif);
if (it != mItems.end())
{

View File

@ -1676,6 +1676,7 @@ const S32 max_format = (S32)num_formats - 1;
close();
return false;
}
//LL_PROFILER_GPU_CONTEXT; <FS:Beq/> TODO(Beq) review this
LL_PROFILER_GPU_CONTEXT
@ -1710,7 +1711,7 @@ const S32 max_format = (S32)num_formats - 1;
swapBuffers();
}
LL_PROFILER_GPU_CONTEXT;
LL_PROFILER_GPU_CONTEXT_NS("MainGL Context", 14);
return true;
}
@ -1880,7 +1881,7 @@ void* LLWindowWin32::createSharedContext()
void LLWindowWin32::makeContextCurrent(void* contextPtr)
{
wglMakeCurrent(mhDC, (HGLRC) contextPtr);
LL_PROFILER_GPU_CONTEXT;
}
void LLWindowWin32::destroySharedContext(void* contextPtr)

View File

@ -137,6 +137,7 @@ set(viewer_SOURCE_FILES
fsfloatervolumecontrols.cpp
fsfloatervramusage.cpp
fsfloaterwearablefavorites.cpp
fsfloaterwhitelisthelper.cpp
fskeywords.cpp
fslslbridge.cpp
fslslbridgerequest.cpp
@ -165,6 +166,7 @@ set(viewer_SOURCE_FILES
fsscriptlibrary.cpp
fsscrolllistctrl.cpp
fsslurlcommand.cpp
fsworldmapmessage.cpp
groupchatlistener.cpp
lggbeamcolormapfloater.cpp
lggbeammapfloater.cpp
@ -177,8 +179,6 @@ set(viewer_SOURCE_FILES
llpanelopenregionsettings.cpp
# <FS:Ansariel> [Legacy Bake]
llagentwearablesfetch.cpp
# local mesh
vjlocalmesh.cpp
vjfloaterlocalmesh.cpp
vjlocalmeshimportdae.cpp
@ -926,6 +926,7 @@ set(viewer_HEADER_FILES
fsfloatervolumecontrols.h
fsfloatervramusage.h
fsfloaterwearablefavorites.h
fsfloaterwhitelisthelper.h
fsgridhandler.h
fskeywords.h
fslslbridge.h
@ -956,6 +957,7 @@ set(viewer_HEADER_FILES
fsscrolllistctrl.h
fsslurl.h
fsslurlcommand.h
fsworldmapmessage.h
groupchatlistener.h
llaccountingcost.h
lggbeamcolormapfloater.h
@ -968,8 +970,6 @@ set(viewer_HEADER_FILES
llfloaterflickr.h
# <FS:Ansariel> [Legacy Bake]
llagentwearablesfetch.h
# local mesh
vjlocalmesh.h
vjfloaterlocalmesh.h
vjlocalmeshimportdae.h

File diff suppressed because it is too large Load Diff

View File

@ -153,6 +153,17 @@
<key>Value</key>
<string>http://phoenixviewer.com/app/fsdata/grids.xml</string>
</map>
<key>FSGridBuilderURL</key>
<map>
<key>Comment</key>
<string>Fetch an html page of grids from this URL.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>https://phoenixviewer.com/app/fsdata/fs_grid_builder.html</string>
</map>
<key>LastConnectedGrid</key>
<map>
<key>Comment</key>
@ -13761,6 +13772,17 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>1</integer>
</map>
<key>FSUseLegacyUnsupportedHardwareChecks</key>
<map>
<key>Comment</key>
<string>If enabled, Firestorm will perform utterly pointless checks that probably made sense in 2004.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSUseStandaloneGroupFloater</key>
<map>
<key>Comment</key>

View File

@ -505,7 +505,7 @@ bool FSCommon::isFilterEditorKeyCombo(KEY key, MASK mask)
LLUUID FSCommon::getGroupForRezzing()
{
LLUUID group_id = gAgent.getGroupID();
LLUUID group_id{ gAgent.getGroupID() };
LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
if (parcel && gSavedSettings.getBOOL("RezUnderLandGroup"))
@ -523,12 +523,12 @@ LLUUID FSCommon::getGroupForRezzing()
return group_id;
}
void FSCommon::updateUsedEmojis(LLWString text)
void FSCommon::updateUsedEmojis(LLWStringView text)
{
LLEmojiDictionary* dictionary = LLEmojiDictionary::getInstance();
bool emojiSent = false;
for (llwchar& c : text)
bool emojiSent{ false };
for (const llwchar& c : text)
{
if (dictionary->isEmoji(c))
{

View File

@ -94,7 +94,7 @@ namespace FSCommon
LLUUID getGroupForRezzing();
void updateUsedEmojis(LLWString text);
void updateUsedEmojis(LLWStringView text);
};
#endif // FS_COMMON_H

View File

@ -313,6 +313,7 @@ void FSFloaterWearableFavorites::onFilterEdit(const std::string& search_string)
{
mItemsList->setFilterSubString(search_string, true);
mItemsList->setNoItemsCommentText(getString("empty_list"));
mItemsList->rearrange();
}
void FSFloaterWearableFavorites::onOptionsMenuItemClicked(const LLSD& userdata)

View File

@ -61,6 +61,11 @@ public:
return mDADSignal.connect(cb);
}
void rearrange()
{
rearrangeItems();
}
protected:
friend class LLUICtrlFactory;
FSWearableFavoritesItemsList(const Params&);

View File

@ -0,0 +1,87 @@
/**
* @file fsfloaterwhitelisthelper.cpp
* @brief Helper tool implementation to display paths to whitelist in antivirus tools
*
* $LicenseInfo:firstyear=2024&license=fsviewerlgpl$
* Phoenix Firestorm Viewer Source Code
* Copyright (C) 2024, The Phoenix Firestorm Project, Inc.
*
* 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 "llviewerprecompiledheaders.h"
#include "fsfloaterwhitelisthelper.h"
#include "lltexteditor.h"
#include "llviewercontrol.h"
#include "lldir.h"
FSFloaterWhiteListHelper::FSFloaterWhiteListHelper(const LLSD& key) : LLFloater(key)
{
}
BOOL FSFloaterWhiteListHelper::postBuild()
{
populateWhitelistInfo();
return TRUE;
}
void FSFloaterWhiteListHelper::populateWhitelistInfo()
{
// Hopefully we can trash this bit soon in favor of webRTC
#if LL_WINDOWS
// On windows use exe (not work or RO) directory
std::string voiceexe_path = gDirUtilp->getExecutableDir();
gDirUtilp->append(voiceexe_path, "SLVoice.exe");
#elif LL_DARWIN
// On MAC use resource directory
std::string voiceexe_path = gDirUtilp->getAppRODataDir();
gDirUtilp->append(voiceexe_path, "SLVoice");
#else
std::string voiceexe_path = gDirUtilp->getExecutableDir();
bool usingWine = gSavedSettings.getBOOL("FSLinuxEnableWin64VoiceProxy");
if (!usingWine)
{
gDirUtilp->append(voiceexe_path, "SLVoice"); // native version
}
else
{
gDirUtilp->append(voiceexe_path, "win64/SLVoice.exe"); // use bundled win64 version
}
#endif
const std::string slpluginexe_path = gDirUtilp->getLLPluginLauncher();
std::string whitelist_folder_info =
gDirUtilp->getExecutableDir() + "\n" // Executable Dir
+ gDirUtilp->getOSUserAppDir() + "\n" // Top-level User Data Dir
+ gDirUtilp->getCacheDir(); // "Cache Dir
std::string whitelist_exe_info =
gDirUtilp->getExecutableFilename() + "\n" // Viewer Binary
+ gDirUtilp->getExecutablePathAndName() + "\n" // Viewer Binary full path
+ gDirUtilp->getBaseFileName(voiceexe_path, false) + "\n" // " Voice Binary"
+ voiceexe_path + "\n" // slvoice full path
+ gDirUtilp->getBaseFileName(slpluginexe_path, false) + "\n" // SLPlugin Launcher Binary
+ slpluginexe_path + "\n"; // SLPlugin Launcher full path
getChild<LLTextEditor>("whitelist_folders_editor")->setText(whitelist_folder_info);
getChild<LLTextEditor>("whitelist_exes_editor")->setText(whitelist_exe_info);
}

View File

@ -0,0 +1,44 @@
/**
* @file fsfloaterwhitelisthelper.h
* @brief Helper tool header file to display paths to whitelist in antivirus tools
*
* $LicenseInfo:firstyear=2024&license=fsviewerlgpl$
* Phoenix Firestorm Viewer Source Code
* Copyright (C) 2024, The Phoenix Firestorm Project, Inc.
*
* 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 FSFLOATERWHITELISTHELPER_H
#define FSFLOATERWHITELISTHELPER_H
#include "llfloater.h"
class FSFloaterWhiteListHelper : public LLFloater
{
public:
explicit FSFloaterWhiteListHelper(const LLSD& key);
~FSFloaterWhiteListHelper() final = default;
BOOL postBuild() override final;
private:
void populateWhitelistInfo();
};
#endif // FSFLOATERWHITELISTHELPER_H

View File

@ -250,6 +250,12 @@ FSPanelLogin::FSPanelLogin(const LLRect &rect,
LLTextBox* grid_mgr_help_text = getChild<LLTextBox>("grid_login_text");
grid_mgr_help_text->setClickedCallback(onClickGridMgrHelp, NULL);
#ifdef OPENSIM
LLTextBox* grid_builder_text = getChild<LLTextBox>("grid_builder_text");
grid_builder_text->setClickedCallback(onClickGridBuilder, NULL);
grid_builder_text->setVisible(true);
#endif
LLSLURL start_slurl(LLStartUp::getStartSLURL());
// The StartSLURL might have been set either by an explicit command-line
// argument (CmdLineLoginLocation) or by default.
@ -1356,6 +1362,12 @@ void FSPanelLogin::onClickGridMgrHelp(void*)
}
}
//static
void FSPanelLogin::onClickGridBuilder(void*)
{
LLWeb::loadURLInternal(gSavedSettings.getString("FSGridBuilderURL"));
}
void FSPanelLogin::onSelectUser()
{
LL_INFOS("AppInit") << "onSelectUser()" << LL_ENDL;

View File

@ -109,6 +109,7 @@ private:
static void onClickRemove(void*);
static void onRemoveCallback(const LLSD& notification, const LLSD& response);
static void onClickGridMgrHelp(void*);
static void onClickGridBuilder(void*);
static std::string credentialName();
private:

View File

@ -90,13 +90,15 @@ public:
//=============================================================================
FSRadar::FSRadar() :
mRadarAlertRequest(false),
mRadarFrameCount(0),
mRadarLastBulkOffsetRequestTime(0),
mRadarLastRequestTime(0.f),
mShowUsernamesCallbackConnection(),
mNameFormatCallbackConnection(),
mAgeAlertCallbackConnection()
mRadarAlertRequest(false),
mRadarFrameCount(0),
mRadarLastBulkOffsetRequestTime(0),
mRadarLastRequestTime(0.f),
mShowUsernamesCallbackConnection(),
mNameFormatCallbackConnection(),
mAgeAlertCallbackConnection(),
mRegionCapabilitiesReceivedCallbackConnection(),
mRegionChangedCallbackConnection()
{
// Use the callback from LLAvatarNameCache here or we might update the names too early!
LLAvatarNameCache::getInstance()->addUseDisplayNamesCallback(boost::bind(&FSRadar::updateNames, this));
@ -104,10 +106,18 @@ FSRadar::FSRadar() :
mNameFormatCallbackConnection = gSavedSettings.getControl("RadarNameFormat")->getSignal()->connect(boost::bind(&FSRadar::updateNames, this));
mAgeAlertCallbackConnection = gSavedSettings.getControl("RadarAvatarAgeAlertValue")->getSignal()->connect(boost::bind(&FSRadar::updateAgeAlertCheck, this));
mRegionChangedCallbackConnection = gAgent.addRegionChangedCallback([this]() { onRegionChanged(); });
}
FSRadar::~FSRadar()
{
gAgent.removeRegionChangedCallback(mRegionChangedCallbackConnection);
if (mRegionCapabilitiesReceivedCallbackConnection.connected())
{
mRegionCapabilitiesReceivedCallbackConnection.disconnect();
}
if (mShowUsernamesCallbackConnection.connected())
{
mShowUsernamesCallbackConnection.disconnect();
@ -1040,8 +1050,35 @@ void FSRadar::updateAgeAlertCheck()
void FSRadar::updateNotes(const LLUUID& avatar_id, std::string_view notes)
{
if (auto entry = getEntry(avatar_id); entry)
if (auto entry = getEntry(avatar_id))
{
entry->setNotes(notes);
}
}
void FSRadar::onRegionChanged()
{
if (mRegionCapabilitiesReceivedCallbackConnection.connected())
{
mRegionCapabilitiesReceivedCallbackConnection.disconnect();
}
if (auto region = gAgent.getRegion())
{
if (region->capabilitiesReceived())
{
for (auto& [id, entry] : mEntryList)
entry->requestProperties();
}
else
{
mRegionCapabilitiesReceivedCallbackConnection = region->setCapabilitiesReceivedCallback(
[this](const LLUUID&, LLViewerRegion*)
{
mRegionCapabilitiesReceivedCallbackConnection.disconnect();
for (auto& [id, entry] : mEntryList)
entry->requestProperties();
});
}
}
}

View File

@ -119,6 +119,8 @@ private:
void radarAlertMsg(const LLUUID& agent_id, const LLAvatarName& av_name, std::string_view postMsg);
void updateAgeAlertCheck();
void onRegionChanged();
std::unique_ptr<Updater> mRadarListUpdater;
struct RadarFields
@ -150,6 +152,9 @@ private:
boost::signals2::connection mShowUsernamesCallbackConnection;
boost::signals2::connection mNameFormatCallbackConnection;
boost::signals2::connection mAgeAlertCallbackConnection;
boost::signals2::connection mRegionCapabilitiesReceivedCallbackConnection;
boost::signals2::connection mRegionChangedCallbackConnection;
};
#endif // FS_RADAR_H

View File

@ -55,85 +55,10 @@ FSRadarEntry::FSRadarEntry(const LLUUID& avid)
mNotes(LLStringUtil::null),
mAlertAge(false),
mAgeAlertPerformed(false),
mAvatarNameCallbackConnection(),
mRegionCapabilitiesReceivedCallbackConnection(),
mRegionChangedCallbackConnection()
mPropertiesRequested(false),
mAvatarNameCallbackConnection()
{
if (mID.notNull())
{
// NOTE: typically we request these once on creation to avoid excess traffic/processing.
//This means updates to these properties won't typically be seen while target is in nearby range.
LLAvatarPropertiesProcessor* processor = LLAvatarPropertiesProcessor::getInstance();
processor->addObserver(mID, this);
if (auto region = gAgent.getRegion(); region)
{
if (region->capabilitiesReceived())
{
if (LLGridManager::instance().isInSecondLife() || region->isCapabilityAvailable(CAPNAME))
{
processor->sendAvatarPropertiesRequest(mID);
}
else
{
processor->sendAvatarLegacyPropertiesRequest(mID);
processor->sendAvatarNotesRequest(mID);
}
}
else
{
auto capsReceivedCb = [this](const LLUUID&, LLViewerRegion* reg)
{
if (mRegionCapabilitiesReceivedCallbackConnection.connected())
{
mRegionCapabilitiesReceivedCallbackConnection.disconnect();
}
gAgent.removeRegionChangedCallback(mRegionChangedCallbackConnection);
if (LLGridManager::instance().isInSecondLife() || (reg && reg->isCapabilityAvailable(CAPNAME)))
{
LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesRequest(mID);
}
else
{
LLAvatarPropertiesProcessor::getInstance()->sendAvatarLegacyPropertiesRequest(mID);
LLAvatarPropertiesProcessor::getInstance()->sendAvatarNotesRequest(mID);
}
};
mRegionChangedCallbackConnection = gAgent.addRegionChangedCallback([this, capsReceivedCb]()
{
if (mRegionCapabilitiesReceivedCallbackConnection.connected())
{
mRegionCapabilitiesReceivedCallbackConnection.disconnect();
}
if (auto newregion = gAgent.getRegion(); newregion)
{
if (newregion->capabilitiesReceived())
{
gAgent.removeRegionChangedCallback(mRegionChangedCallbackConnection);
if (LLGridManager::instance().isInSecondLife() || newregion->isCapabilityAvailable(CAPNAME))
{
LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesRequest(mID);
}
else
{
LLAvatarPropertiesProcessor::getInstance()->sendAvatarLegacyPropertiesRequest(mID);
LLAvatarPropertiesProcessor::getInstance()->sendAvatarNotesRequest(mID);
}
}
else
{
mRegionCapabilitiesReceivedCallbackConnection = newregion->setCapabilitiesReceivedCallback(capsReceivedCb);
}
}
});
mRegionCapabilitiesReceivedCallbackConnection = region->setCapabilitiesReceivedCallback(capsReceivedCb);
}
}
}
requestProperties();
updateName();
}
@ -147,11 +72,34 @@ FSRadarEntry::~FSRadarEntry()
{
mAvatarNameCallbackConnection.disconnect();
}
if (mRegionCapabilitiesReceivedCallbackConnection.connected())
}
void FSRadarEntry::requestProperties()
{
if (!mPropertiesRequested && mID.notNull())
{
mRegionCapabilitiesReceivedCallbackConnection.disconnect();
// NOTE: typically we request these once on creation to avoid excess traffic/processing.
//This means updates to these properties won't typically be seen while target is in nearby range.
LLAvatarPropertiesProcessor* processor = LLAvatarPropertiesProcessor::getInstance();
processor->addObserver(mID, this);
if (auto region = gAgent.getRegion())
{
if (region->capabilitiesReceived())
{
if (LLGridManager::instance().isInSecondLife() || region->isCapabilityAvailable(CAPNAME))
{
processor->sendAvatarPropertiesRequest(mID);
}
else
{
processor->sendAvatarLegacyPropertiesRequest(mID);
processor->sendAvatarNotesRequest(mID);
}
mPropertiesRequested = true;
}
}
}
gAgent.removeRegionChangedCallback(mRegionChangedCallbackConnection);
}
void FSRadarEntry::updateName()

View File

@ -68,6 +68,7 @@ public:
private:
void updateName();
void onAvatarNameCache(const LLUUID& av_id, const LLAvatarName& av_name);
void requestProperties();
void processProperties(void* data, EAvatarProcessorType type);
LLUUID mID;
@ -87,10 +88,9 @@ private:
bool mIgnore;
bool mAlertAge;
bool mAgeAlertPerformed;
bool mPropertiesRequested;
LLAvatarNameCache::callback_connection_t mAvatarNameCallbackConnection;
boost::signals2::connection mRegionCapabilitiesReceivedCallbackConnection;
boost::signals2::connection mRegionChangedCallbackConnection;
};
#endif // FS_RADARENTRY_H

View File

@ -0,0 +1,214 @@
/**
* @file fsworldmapmessage.cpp
* @brief FS specific extensions to world map handling for OpenSim
*
* $LicenseInfo:firstyear=2024&license=fsviewerlgpl$
* Phoenix Firestorm Viewer Source Code
* Copyright (C) 2024, The Phoenix Firestorm Project, Inc.
*
* 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$
*
*/
// potential workaround for hop://grid:port/Partial/x/y/z resolution
// 2024.04.30 humbletim
// notes:
// - exact MapNameRequests are sent flagless here (not using LAYER_FLAG)
// - this is to avoid triggering OpenSim code paths that modify result names
// - only affects LLWorldMapMessage->sendNamedRegionRequest(name, callback, ...)
// - in particular where a grid hosts overlapping names, hop Region matching may work better
#include "llviewerprecompiledheaders.h"
#ifdef OPENSIM
#include "fsworldmapmessage.h"
#include "llagent.h"
#include "llworldmap.h" // grid_to_region_handle
#include "fsgridhandler.h"
#include "llworldmapmessage.h"
#include "message.h"
#include <regex>
#define htxhop_log(format, ...) LL_DEBUGS("GridManager") << llformat(format, __VA_ARGS__) << LL_ENDL;
namespace hypergrid
{
static inline std::string extract_region(const std::string& s)
{
static auto const& patterns = {
std::regex { R"(/ ([^/:=]+)$)" }, // TODO: figure out where the spec lives for hop "slash space" embedding...
std::regex { R"(([^/:=]+)$)" }, // TODO: figure out where the spec lives for hop "grid:port:region" embedding...
};
std::smatch match_results;
std::string ls{ s };
LLStringUtil::toLower(ls);
for (const auto& pattern : patterns)
{
if (std::regex_search(ls, match_results, pattern))
{
return match_results[1].str();
}
}
return {};
}
// helper to encapsulate Region Map Block responses
struct MapBlock
{
S32 index{};
U16 x_regions{}, y_regions{}, x_size{ REGION_WIDTH_UNITS }, y_size{ REGION_WIDTH_UNITS };
std::string name{};
U8 accesscode{};
U32 region_flags{};
LLUUID image_id{};
inline U32 x_world() const { return (U32)(x_regions)*REGION_WIDTH_UNITS; }
inline U32 y_world() const { return (U32)(y_regions)*REGION_WIDTH_UNITS; }
inline U64 region_handle() const { return grid_to_region_handle(x_regions, y_regions); }
// see: LLWorldMapMessage::processMapBlockReply
MapBlock(LLMessageSystem* msg, S32 block)
: index(block)
{
msg->getU16Fast(_PREHASH_Data, _PREHASH_X, x_regions, block);
msg->getU16Fast(_PREHASH_Data, _PREHASH_Y, y_regions, block);
msg->getStringFast(_PREHASH_Data, _PREHASH_Name, name, block);
msg->getU8Fast(_PREHASH_Data, _PREHASH_Access, accesscode, block);
msg->getU32Fast(_PREHASH_Data, _PREHASH_RegionFlags, region_flags, block);
// msg->getU8Fast(_PREHASH_Data, _PREHASH_WaterHeight, water_height, block);
// msg->getU8Fast(_PREHASH_Data, _PREHASH_Agents, agents, block);
msg->getUUIDFast(_PREHASH_Data, _PREHASH_MapImageID, image_id, block);
// <FS:CR> Aurora Sim
if (msg->getNumberOfBlocksFast(_PREHASH_Size) > 0)
{
msg->getU16Fast(_PREHASH_Size, _PREHASH_SizeX, x_size, block);
msg->getU16Fast(_PREHASH_Size, _PREHASH_SizeY, y_size, block);
}
if (x_size == 0 || (x_size % 16) != 0 || (y_size % 16) != 0)
{
x_size = 256;
y_size = 256;
}
// </FS:CR> Aurora Sim
}
};
constexpr U32 EXACT_FLAG = 0x00000000;
constexpr U32 LAYER_FLAG = 0x00000002;
// see: LLWorldMapMessage::sendNamedRegionRequest
static void sendMapNameRequest(const std::string& region_name, U32 flags)
{
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_MapNameRequest);
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgentID);
msg->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
msg->addU32Fast(_PREHASH_Flags, flags);
msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim
msg->addBOOLFast(_PREHASH_Godlike, false); // Filled in on sim
msg->nextBlockFast(_PREHASH_NameData);
msg->addStringFast(_PREHASH_Name, region_name);
gAgent.sendReliableMessage();
}
struct AdoptedRegionNameQuery
{
std::string key{};
std::string region_name{};
hypergrid::url_callback_t arbitrary_callback;
std::string arbitrary_slurl{};
bool arbitrary_teleport{ false };
};
// map extracted region names => pending query entries
static std::map<std::string, AdoptedRegionNameQuery> region_name_queries;
}
bool hypergrid::sendExactNamedRegionRequest(const std::string& region_name, const url_callback_t& callback, const std::string& callback_url, bool teleport)
{
if (!LLGridManager::instance().isInOpenSim() || !callback)
{
return false;
}
auto key = extract_region(region_name);
if (key.empty())
{
return false;
}
region_name_queries.try_emplace(key, AdoptedRegionNameQuery{ key, region_name, callback, callback_url, teleport });
htxhop_log("Send Region Name '%s' (key: %s)", region_name.c_str(), key.c_str());
sendMapNameRequest(region_name, EXACT_FLAG);
return true;
}
bool hypergrid::processExactNamedRegionResponse(LLMessageSystem* msg, U32 agent_flags)
{
if (!LLGridManager::instance().isInOpenSim() || !msg || agent_flags & LAYER_FLAG)
{
return false;
}
// NOTE: we assume only agent_flags have been read from msg so far
S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_Data);
std::vector<MapBlock> blocks;
blocks.reserve(num_blocks);
for (S32 b = 0; b < num_blocks; b++)
{
blocks.emplace_back(msg, b);
}
for (const auto& block : blocks)
{
htxhop_log("#%02d key='%s' block.name='%s' block.region_handle=%llu", block.index, extract_region(block.name).c_str(), block.name.c_str(), block.region_handle());
}
// special case: handle singular result w/empty name tho valid region handle AND singular pending query as a match
// (might be that a landing area / redirect hop URL is coming back: "^hop://grid:port/$", which extract_region's into "")
bool solo_result = blocks.size() == 2 && blocks[0].region_handle() && extract_region(blocks[0].name).empty() && !blocks[1].region_handle();
if (solo_result && region_name_queries.size() == 1)
{
htxhop_log("applying first block as redirect; region_handle: %llu", blocks[0].region_handle());
blocks[0].name = region_name_queries.begin()->second.region_name;
}
for (const auto& block : blocks)
{
auto key = extract_region(block.name);
if (key.empty())
{
continue;
}
auto idx = region_name_queries.find(key);
if (idx == region_name_queries.end())
{
continue;
}
auto pending{ idx->second };
htxhop_log("Recv Region Name '%s' (key: %s) block.name='%s' block.region_handle=%llu)", pending.region_name.c_str(),
pending.key.c_str(), block.name.c_str(), block.region_handle());
region_name_queries.erase(idx);
pending.arbitrary_callback(block.region_handle(), pending.arbitrary_slurl, block.image_id, pending.arbitrary_teleport);
return true;
}
return false;
}
#endif

View File

@ -0,0 +1,49 @@
/**
* @file fsworldmapmessage.h
* @brief FS specific extensions to world map handling for OpenSim
*
* $LicenseInfo:firstyear=2024&license=fsviewerlgpl$
* Phoenix Firestorm Viewer Source Code
* Copyright (C) 2024, The Phoenix Firestorm Project, Inc.
*
* 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_WORLDMAPMESSAGE_H
#define FS_WORLDMAPMESSAGE_H
#ifdef OPENSIM
#include <stdtypes.h>
#include <functional>
#include <string>
class LLMessageSystem;
class LLUUID;
namespace hypergrid
{
// Needs to be identical to url_callback_t defined in llworldmapmessage.h
using url_callback_t = std::function<void(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)>;
bool sendExactNamedRegionRequest(const std::string& region_name, const url_callback_t& callback, const std::string& callback_url, bool teleport);
bool processExactNamedRegionResponse(LLMessageSystem* msg, U32 agent_flags);
}
#endif
#endif // FS_WORLDMAPMESSAGE_H

View File

@ -1162,7 +1162,7 @@ bool LLAppViewer::init()
}
// alert the user if they are using unsupported hardware
if(!gSavedSettings.getBOOL("AlertedUnsupportedHardware"))
if(gSavedSettings.getBOOL("FSUseLegacyUnsupportedHardwareChecks") && !gSavedSettings.getBOOL("AlertedUnsupportedHardware"))
{
bool unsupported = false;
LLSD args;

View File

@ -3375,7 +3375,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
for (LLInventoryModel::item_array_t::value_type& item : items)
{
if (get_is_item_worn(item))
if (!item->getIsLinkType() && get_is_item_worn(item))
{
has_worn = true;
LLWearableType::EType type = item->getWearableType();
@ -3395,7 +3395,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
}
}
LLViewerInventoryItem* item = gInventory.getItem(obj_id);
if (item && get_is_item_worn(item))
if (item && !item->getIsLinkType() && get_is_item_worn(item))
{
has_worn = true;
LLWearableType::EType type = item->getWearableType();

View File

@ -1988,7 +1988,7 @@ void LLInventoryGallery::deleteSelection()
for (LLInventoryModel::item_array_t::value_type& item : items)
{
if (get_is_item_worn(item))
if (!item->getIsLinkType() && get_is_item_worn(item))
{
has_worn = true;
LLWearableType::EType type = item->getWearableType();
@ -2009,7 +2009,7 @@ void LLInventoryGallery::deleteSelection()
}
LLViewerInventoryItem* item = gInventory.getItem(id);
if (item && get_is_item_worn(item))
if (item && !item->getIsLinkType() && get_is_item_worn(item))
{
has_worn = true;
LLWearableType::EType type = item->getWearableType();

View File

@ -232,6 +232,11 @@ bool LLPanelGroup::postBuild()
button = getChild<LLButton>("btn_refresh");
button->setClickedCallback(onBtnRefresh, this);
// <FS:PP> FIRE-33939: Activate button
button = getChild<LLButton>("btn_activate");
button->setClickedCallback(onBtnActivateClicked, this);
// <FS:PP>
childSetCommitCallback("back",boost::bind(&LLPanelGroup::onBackBtnClick,this),NULL);
LLPanelGroupTab* panel_general = findChild<LLPanelGroupTab>("group_general_tab_panel");
@ -296,6 +301,7 @@ void LLPanelGroup::reposButtons()
reposButton("btn_cancel");
reposButton("btn_chat");
reposButton("btn_call");
reposButton("btn_activate"); // <FS:PP> FIRE-33939: Activate button
}
void LLPanelGroup::reshape(S32 width, S32 height, bool called_from_parent )
@ -347,6 +353,15 @@ void LLPanelGroup::onBtnGroupChatClicked(void* user_data)
self->chatGroup();
}
// <FS:PP> FIRE-33939: Activate button
void LLPanelGroup::onBtnActivateClicked(void* user_data)
{
LLPanelGroup* self = static_cast<LLPanelGroup*>(user_data);
self->activateGroup();
self->refreshData();
}
// </FS:PP>
void LLPanelGroup::onBtnJoin()
{
if (LLGroupActions::isInGroup(mID))
@ -486,6 +501,15 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
if(button_chat)
button_chat->setVisible(!is_null_group_id);
// <FS:PP> FIRE-33939: Activate button
LLButton* button_activate = findChild<LLButton>("btn_activate");
if (button_activate)
{
button_activate->setVisible(!is_null_group_id);
button_activate->setEnabled(group_id != gAgent.getGroupID());
}
// </FS:PP>
getChild<LLUICtrl>("prepend_founded_by")->setVisible(!is_null_group_id);
// <FS:Ansariel> TabContainer switch
@ -566,6 +590,10 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
button_call->setVisible(false);
if(button_chat)
button_chat->setVisible(false);
// <FS:PP> FIRE-33939: Activate button
if(button_activate)
button_activate->setVisible(false);
// </FS:PP>
}
else
{
@ -625,6 +653,10 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
button_call->setVisible(is_member);
if(button_chat)
button_chat->setVisible(is_member);
// <FS:PP> FIRE-33939: Activate button
if(button_activate)
button_activate->setVisible(is_member);
// </FS:PP>
}
// <FS:Ansariel> TabContainer switch
@ -710,6 +742,12 @@ void LLPanelGroup::draw()
mRefreshTimer.stop();
childEnable("btn_refresh");
childEnable("groups_accordion");
// <FS:PP> FIRE-33939: Activate button
if (gAgent.getGroupID() != getID())
{
childEnable("btn_activate");
}
// </FS:PP>
}
LLButton* button_apply = findChild<LLButton>("btn_apply");
@ -741,6 +779,7 @@ void LLPanelGroup::refreshData()
// 5 second timeout
childDisable("btn_refresh");
childDisable("groups_accordion");
childDisable("btn_activate"); // <FS:PP> FIRE-33939: Activate button
mRefreshTimer.start();
mRefreshTimer.setTimerExpirySec(5);
@ -756,6 +795,17 @@ void LLPanelGroup::chatGroup()
LLGroupActions::startIM(getID());
}
// <FS:PP> FIRE-33939: Activate button
void LLPanelGroup::activateGroup()
{
LLUUID group_id = getID();
if (gAgent.getGroupID() != group_id)
{
LLGroupActions::activate(group_id);
}
}
// </FS:PP>
void LLPanelGroup::showNotice(const std::string& subject,
const std::string& message,
const bool& has_inventory,

View File

@ -76,6 +76,7 @@ public:
void refreshData();
void callGroup();
void chatGroup();
void activateGroup(); // <FS:PP> FIRE-33939: Activate button
virtual void reshape(S32 width, S32 height, bool called_from_parent = true);
@ -102,6 +103,7 @@ protected:
static void onBtnRefresh(void*);
static void onBtnGroupCallClicked(void*);
static void onBtnGroupChatClicked(void*);
static void onBtnActivateClicked(void*); // <FS:PP> FIRE-33939: Activate button
void reposButton(const std::string& name);
void reposButtons();

View File

@ -627,13 +627,12 @@ void LLTaskInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
// [/RLVa:KB]
}
items.push_back(std::string("Task Properties"));
// <FS:Ansariel> Legacy object properties
// <FS:Ansariel> Improved object properties
//if ((flags & FIRST_SELECTED_ITEM) == 0)
if (!gSavedSettings.getBOOL("FSUseLegacyObjectProperties") && (flags & FIRST_SELECTED_ITEM) == 0)
//{
// disabled_items.push_back(std::string("Task Properties"));
//}
// </FS:Ansariel>
{
disabled_items.push_back(std::string("Task Properties"));
}
// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Added: RLVa-1.2.1f
items.push_back(std::string("Task Rename"));
if ( (!isItemRenameable()) || ((flags & FIRST_SELECTED_ITEM) == 0) )
@ -1007,13 +1006,12 @@ void LLTaskSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
}
items.push_back(std::string("Task Properties"));
// <FS:Ansariel> Legacy object properties
// <FS:Ansariel> Improved object properties
//if ((flags & FIRST_SELECTED_ITEM) == 0)
if (!gSavedSettings.getBOOL("FSUseLegacyObjectProperties") && (flags & FIRST_SELECTED_ITEM) == 0)
//{
// disabled_items.push_back(std::string("Task Properties"));
//}
// </FS:Ansariel>
{
disabled_items.push_back(std::string("Task Properties"));
}
if(isItemRenameable())
{
items.push_back(std::string("Task Rename"));

View File

@ -279,13 +279,16 @@ namespace LLPerfStats
auto ot{upd.objType};
auto& key{upd.objID};
auto& avKey{upd.avID};
auto type {upd.statType};
auto val {upd.time};
// <FS:Beq> markup to support coverage testing on stats collection
#ifdef TRACY_ENABLE
//LL_PROFILE_ZONE_TEXT(key.toStringFast(obstr), 36);
//LL_PROFILE_ZONE_TEXT(avKey.toStringFast(avstr), 36);
//LL_PROFILE_ZONE_NUM(val);
static char obstr[36];
static char avstr[36];
LL_PROFILE_ZONE_TEXT(key.toStringFast(obstr), 36);
LL_PROFILE_ZONE_TEXT(avKey.toStringFast(avstr), 36);
LL_PROFILE_ZONE_NUM(val);
#endif
// </FS:Beq>
@ -295,6 +298,14 @@ namespace LLPerfStats
doUpd(key, ot, type,val);
return;
}
if (ot == ObjType_t::OT_AVATAR)
{
// LL_INFOS("perfstats") << "Avatar update:" << LL_ENDL;
doUpd(avKey, ot, type, val);
return;
}
}
static inline void doUpd(const LLUUID& key, ObjType_t ot, StatType_t type, uint64_t val)
@ -429,13 +440,13 @@ namespace LLPerfStats
// </FS:Beq>
stat.time = LLTrace::BlockTimer::getCPUClockCount64() - start;
// <FS:Beq> extra profiling coverage tracking
#ifdef ATTACHMENT_TRACKING
static char obstr[36];
static char avstr[36];
LL_PROFILE_ZONE_NUM(static_cast<U64>(stat.objType));
LL_PROFILE_ZONE_TEXT(stat.avID.toStringFast(avstr), 36);
LL_PROFILE_ZONE_TEXT(stat.objID.toStringFast(obstr), 36);
LL_PROFILE_ZONE_NUM(stat.time);
#if TRACY_ENABLE && defined(ATTACHMENT_TRACKING)
// static char obstr[36];
// static char avstr[36];
// LL_PROFILE_ZONE_NUM(static_cast<U64>(stat.objType));
// LL_PROFILE_ZONE_TEXT(stat.avID.toStringFast(avstr), 36);
// LL_PROFILE_ZONE_TEXT(stat.objID.toStringFast(obstr), 36);
// LL_PROFILE_ZONE_NUM(stat.time);
#endif
// </FS:Beq>
StatsRecorder::send(std::move(stat));

View File

@ -229,6 +229,7 @@
#include "particleeditor.h"
#include "quickprefs.h"
#include "vjfloaterlocalmesh.h" // local mesh
#include "fsfloaterwhitelisthelper.h" // fs whitelist helper
// handle secondlife:///app/openfloater/{NAME} URLs
@ -649,6 +650,8 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("sound_explorer", "floater_NACL_explore_sounds.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<NACLFloaterExploreSounds>);
LLFloaterReg::add("vram_usage", "floater_fs_vram_usage.xml", static_cast<LLFloaterBuildFunc>(&LLFloaterReg::build<FSFloaterVRAMUsage>));
LLFloaterReg::add("local_mesh_floater", "floater_vj_local_mesh.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLocalMesh>); // local mesh
LLFloaterReg::add("fs_whitelist_floater", "floater_whitelist.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterWhiteListHelper>); // white list advisor
LLFloaterReg::registerControlVariables(); // Make sure visibility and rect controls get preserved when saving
}

View File

@ -9168,13 +9168,10 @@ class LLAttachmentDetach : public view_listener_t
// [RLVa:KB] - Checked: 2010-03-15 (RLVa-1.2.0a) | Modified: RLVa-1.0.5
// NOTE: copy/paste of the code in enable_detach()
if ((rlv_handler_t::isEnabled()) && (gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_REMOVE)))
if ((rlv_handler_t::isEnabled()) && (gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_REMOVE)) &&
gRlvAttachmentLocks.isLockedAttachment(objectp->getRootEdit()))
{
//LLObjectSelectionHandle hSelect = LLSelectMgr::getInstance()->getSelection();
//RlvSelectHasLockedAttach f;
//if ((hSelect->isAttachment()) && (hSelect->getFirstRootNode(&f, false) != NULL))
// return true;
return !gRlvAttachmentLocks.isLockedAttachment(objectp->getRootEdit()); // <FS:Ansariel> Kitty will have to check this...
return false;
}
// [/RLVa:KB]

View File

@ -831,6 +831,7 @@ void LLViewerRegion::setRegionID(const LLUUID& region_id)
void LLViewerRegion::loadObjectCache()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;
if (mCacheLoaded)
{
return;
@ -3123,6 +3124,7 @@ void LLViewerRegion::clearVOCacheFromMemory()
void LLViewerRegion::unpackRegionHandshake()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;
LLMessageSystem *msg = gMessageSystem;
U64 region_flags = 0;

View File

@ -1541,6 +1541,7 @@ bool LLVOCache::updateEntry(const HeaderEntryInfo* entry)
bool LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_entry_map_t& cache_entry_map)
// </FS:Beq>
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;
if(!mEnabled)
{
LL_WARNS() << "Not reading cache for handle " << handle << "): Cache is currently disabled." << LL_ENDL;
@ -1559,6 +1560,7 @@ bool LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::voca
S32 num_entries=0; // <FS:Beq/> FIRE-33808 - Material Override Cache causes long delays
std::string filename;
{
LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("VOCache:loadRegionObjectCache");
LLUUID cache_id;
getObjectCacheFilename(handle, filename);
LLAPRFile apr_file(filename, APR_READ|APR_BINARY, mLocalAPRFilePoolp);
@ -1567,6 +1569,7 @@ bool LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::voca
if(success)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("VOCache:loadCacheForRegion");
if(cache_id != id)
{
LL_INFOS() << "Cache ID doesn't match for this region, discarding"<< LL_ENDL;
@ -1615,6 +1618,7 @@ bool LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::voca
// void LLVOCache::readGenericExtrasFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_gltf_overrides_map_t& cache_extras_entry_map)
void LLVOCache::readGenericExtrasFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_gltf_overrides_map_t& cache_extras_entry_map, const LLVOCacheEntry::vocache_entry_map_t& cache_entry_map)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;
int loaded= 0;
int discarded = 0;
// get ViewerRegion pointer from handle
@ -1635,6 +1639,13 @@ void LLVOCache::readGenericExtrasFromCache(U64 handle, const LLUUID& id, LLVOCac
}
std::string filename(getObjectCacheExtrasFilename(handle));
// <FS:Beq> Material Override Cache caused long delays
#ifdef TRACY_ENABLE
static char extra_filename[256];
strncpy(extra_filename, filename.c_str(), 256);
LL_PROFILE_ZONE_TEXT(extra_filename,256);
#endif
// </FS:Beq>
llifstream in(filename, std::ios::in | std::ios::binary);
std::string line;
@ -1714,8 +1725,10 @@ void LLVOCache::readGenericExtrasFromCache(U64 handle, const LLUUID& id, LLVOCac
LL_DEBUGS("GLTF") << "Beginning reading extras cache for handle " << handle << " from " << getObjectCacheExtrasFilename(handle) << LL_ENDL;
LLSD entry_llsd;
LL_PROFILE_ZONE_NUM(num_entries);
for (U32 i = 0; i < num_entries && !in.eof(); i++)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("RegionExtrasReadEntries");
static const U32 max_size = 4096;
bool success = LLSDSerialize::deserialize(entry_llsd, in, max_size);
// check bool(in) this time since eof is not a failure condition here
@ -1756,6 +1769,7 @@ void LLVOCache::readGenericExtrasFromCache(U64 handle, const LLUUID& id, LLVOCac
void LLVOCache::purgeEntries(U32 size)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;
// <FS:Beq/> FIRE-33808 - Material Override Cache causes long delays
LL_DEBUGS("VOCache","GLTF") << "Purging " << size << " entries from cache" << LL_ENDL;
while(mHeaderEntryQueue.size() > size)
@ -1775,6 +1789,7 @@ void LLVOCache::purgeEntries(U32 size)
void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry::vocache_entry_map_t& cache_entry_map, bool dirty_cache, bool removal_enabled)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;
// <FS:Beq> FIRE-33808 - Material Override Cache causes long delays
std::string filename;
getObjectCacheFilename(handle, filename);
@ -1929,19 +1944,20 @@ void LLVOCache::removeGenericExtrasForHandle(U64 handle)
auto* entry = mHandleEntryMap[handle];
if (entry)
{
LL_WARNS("GLTF", "VOCache") << "Removing generic extras for handle " << entry->mHandle << "Filename: " << getObjectCacheExtrasFilename(handle) << LL_ENDL;
removeEntry(entry);
}
else
{
//shouldn't happen, but if it does, we should remove the extras file since it's orphaned
LL_WARNS("GLTF", "VOCache") << "Removing generic extras for handle " << entry->mHandle << "Filename: " << getObjectCacheExtrasFilename(handle) << LL_ENDL;
LLFile::remove(getObjectCacheExtrasFilename(entry->mHandle));
LLFile::remove(getObjectCacheExtrasFilename(handle));
}
}
// </FS:Beq>
void LLVOCache::writeGenericExtrasToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry::vocache_gltf_overrides_map_t& cache_extras_entry_map, bool dirty_cache, bool removal_enabled)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;
if(!mEnabled)
{
LL_WARNS() << "Not writing extras cache for handle " << handle << "): Cache is currently disabled." << LL_ENDL;

View File

@ -36,6 +36,7 @@
// <FS:CR> Aurora Sim
#include "llviewernetwork.h"
// </FS:CR> Aurora Sim
#include "fsworldmapmessage.h" // <FS:humbletim/> FIRE-31368: [OPENSIM] ... Search returns more than one result
const U32 LAYER_FLAG = 2;
@ -99,6 +100,14 @@ void LLWorldMapMessage::sendNamedRegionRequest(std::string region_name,
const std::string& callback_url,
bool teleport) // immediately teleport when result returned
{
// <FS:humbletim> FIRE-31368: [OPENSIM] ... Search returns more than one result
#ifdef OPENSIM
if (hypergrid::sendExactNamedRegionRequest(region_name, callback, callback_url, teleport))
{
return;
}
#endif
// </FS:humbletim>
//LL_INFOS("WorldMap") << LL_ENDL;
mSLURLRegionName = region_name;
mSLURLRegionHandle = 0;
@ -160,6 +169,14 @@ void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**)
}
U32 agent_flags;
msg->getU32Fast(_PREHASH_AgentData, _PREHASH_Flags, agent_flags);
// <FS:humbletim> FIRE-31368: [OPENSIM] ... Search returns more than one result
#ifdef OPENSIM
if (hypergrid::processExactNamedRegionResponse(msg, agent_flags))
{
return;
}
#endif
// </FS:humbletim>
// There's only one flag that we ever use here
if (agent_flags != LAYER_FLAG)

View File

@ -8219,6 +8219,12 @@ void LLPipeline::renderDeferredLighting()
const F32 *c = center.getF32ptr();
F32 s = volume->getLightRadius() * 1.5f;
// <FS:Beq> relocated above colour calc for early exit on small lights
if (s <= 0.001f)
{
continue;
}
// </FS:Beq>
// send light color to shader in linear space
LLColor3 col = volume->getLightLinearColor() * light_scale;
@ -8226,12 +8232,12 @@ void LLPipeline::renderDeferredLighting()
{
continue;
}
if (s <= 0.001f)
{
continue;
}
// <FS:Beq> relocated above colour calc for early exit on small lights
// if (s <= 0.001f)
// {
// continue;
// }
// </FS:Beq>
LLVector4a sa;
sa.splat(s);
if (camera->AABBInFrustumNoFarClip(center, sa) == 0)

View File

@ -219,6 +219,26 @@ background_visible="false"
width="23" />
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
left_pad="3"
name="btn_activate_lp"
user_resize="false"
auto_resize="true"
width="72">
<button
layout="topleft"
follows="bottom|left|right"
label="Activate"
name="btn_activate"
left="1"
height="23"
top="0"
width="71" />
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
@ -227,7 +247,7 @@ background_visible="false"
name="btn_chat_lp"
user_resize="false"
auto_resize="true"
width="97">
width="72">
<button
layout="topleft"
follows="bottom|left|right"
@ -236,7 +256,7 @@ background_visible="false"
left="1"
height="23"
top="0"
width="96" />
width="71" />
</layout_panel>
<layout_panel
@ -247,7 +267,7 @@ background_visible="false"
name="call_btn_lp"
user_resize="false"
auto_resize="true"
width="97">
width="72">
<button
follows="bottom|left|right"
left="1"
@ -257,7 +277,7 @@ background_visible="false"
layout="topleft"
tool_tip="Call this group"
top="0"
width="96" />
width="71" />
</layout_panel>
<layout_panel
@ -268,7 +288,7 @@ background_visible="false"
name="btn_apply_lp"
user_resize="false"
auto_resize="true"
width="97">
width="72">
<button
follows="bottom|left|right"
height="23"
@ -277,7 +297,7 @@ background_visible="false"
name="btn_apply"
left="1"
top="0"
width="96" />
width="71" />
</layout_panel>
</layout_stack>

View File

@ -0,0 +1,17 @@
<floater name="whitelist_floater" title="Whitelist für Verzeichnnisse und Dateien">
<text name="whitelist_intro">
Anti-Virus- und Anti-Malware-Software sind essenziell für die sichere Nutzung des Internet, können aber eine Vielzahl an Problem für den Viewer erzeugen.
Um die Beinträchtigung zu minimieren und Stabilität und Performance zu erhöhen, raten wir daher eingehend alle Benutzer Ausnahmen (auch bekannt als Whitelisting) für wichtige Verzeichnisse und Programme einzurichten, die vom Viewer verwendet werden.
Weitere Details hierzu finden Sie unter
https://wiki.firestormviewer.org/antivirus_whitelisting
</text>
<text name="whitelist_folder_instruction">
Das folgende Textfeld die Verzeichnisse angezeigt, die vom Viewer verwendet werden.
Bitte fügen Sie diese zu den Verzeichnis-Ausnahmen hinzu.
</text>
<text name="whitelist_exe_instruction">
Das folgende Textfeld zeigt die Namen und vollständigen Pfade der ausführbaren Dateien des Viewers an.
Bitte fügen Sie diese zu den Ausnahmen für ausführbare Dateien hinzu hinzu.
</text>
</floater>

View File

@ -282,6 +282,7 @@
<menu_item_check label="Anweisungen..." name="How To"/>
<menu_item_call label="[CURRENT_GRID]-Hilfe" name="current_grid_help"/>
<menu_item_call label="Über [CURRENT_GRID]" name="current_grid_about"/>
<menu_item_call label="Whitelist-Unterstützung" name="whitelist_folders"/>
<menu_item_call label="Grid-Status prüfen" name="Grid Status"/>
<menu_item_call label="Missbrauch melden" name="Report Abuse"/>
<menu_item_call label="Problem melden" name="Report Bug"/>

View File

@ -34,6 +34,9 @@
</combo_box>
</layout_panel>
<layout_panel name="grid_panel">
<text name="grid_builder_text">
+ Klicken um Grids hinzuzufügen
</text>
<text name="grid_login_text">
Gridauswahl:
</text>

View File

@ -37,6 +37,9 @@
<text name="grid_login_text">
Grid:
</text>
<text name="grid_builder_text">
+ Klicken um Grids hinzuzufügen
</text>
</layout_panel>
<layout_panel name="mode_selection">
<text name="mode_selection_text">

View File

@ -45,6 +45,9 @@
</layout_panel>
</layout_stack>
<layout_stack name="button_row_ls">
<layout_panel name="btn_activate_lp">
<button label="Aktivieren" name="btn_activate"/>
</layout_panel>
<layout_panel name="btn_chat_lp">
<button label="Chat" name="btn_chat"/>
</layout_panel>

View File

@ -0,0 +1,74 @@
<floater name="whitelist_floater"
title="Whitelist Folders and Binaries"
width="700"
height="470"
can_minimize="true"
can_resize="false">
<text
follows="top|left|right"
font="SansSerif"
height="120"
layout="topleft"
left="11"
name="whitelist_intro"
top="16"
width="689"
wrap="true">
Anti-virus and Anti-malware are an essential part of safe Internet use, but they can cause a variety of issues for the viewer.
To reduce interference and improve stability and performance, we strongly advise that all users ensure that there are exclusions (known as Whitelisting) for important folders and programs that the viewer uses.
For more detailed information, visit
https://wiki.firestormviewer.org/antivirus_whitelisting
</text>
<text
follows="top|left|right"
font="SansSerif"
height="35"
layout="topleft"
left="11"
name="whitelist_folder_instruction"
top_pad="10"
width="689"
wrap="true">
To help simplify the task the box below shows the folders the viewer is using.
Please add these to your AV folder exclusions as shown on the above wiki page.
</text>
<text_editor
parse_urls="true"
follows="top|left|right|bottom"
font="SansSerif"
height="100"
bg_readonly_color="Transparent"
left="5"
max_length="65536"
name="whitelist_folders_editor"
top_pad="5"
width="689"
word_wrap="true" />
<text
follows="top|left|right"
font="SansSerif"
height="35"
layout="topleft"
left="11"
name="whitelist_exe_instruction"
top_pad="5"
width="689"
wrap="true">
The following box is the name and full path of the viewer executables.
Add these to you AV executable exclusions as shown in the above wiki.
</text>
<text_editor
parse_urls="true"
follows="top|left|right|bottom"
font="SansSerif"
height="130"
bg_readonly_color="Transparent"
left="5"
max_length="65536"
name="whitelist_exes_editor"
top_pad="5"
width="689"
word_wrap="true" />
</floater>

View File

@ -2632,6 +2632,13 @@
parameter="http://community.secondlife.com/t5/Blogs/ct-p/Blogs"/>
</menu_item_call>-->
<menu_item_separator/>
<menu_item_call
name="whitelist_folders"
label="Whitelist adviser">
<menu_item_call.on_click
function="Floater.Show"
parameter="fs_whitelist_floater" />
</menu_item_call>
<menu_item_check
label="Check Grid status"
name="Grid Status">

View File

@ -150,25 +150,25 @@
Start at:
</text>
<combo_box
allow_text_entry="true"
control_name="NextLoginLocation"
follows="left|bottom"
height="22"
max_chars="128"
top_pad="0"
name="start_location_combo"
width="165">
allow_text_entry="true"
control_name="NextLoginLocation"
follows="left|bottom"
height="22"
max_chars="128"
top_pad="0"
name="start_location_combo"
width="165">
<combo_box.item
label="Last location"
name="MyLastLocation"
value="last" />
label="Last location"
name="MyLastLocation"
value="last" />
<combo_box.item
label="Home"
name="MyHome"
value="home" />
label="Home"
name="MyHome"
value="home" />
<combo_box.item
label="&lt;Type region name&gt;"
name="Typeregionname" value="" />
label="&lt;Type region name&gt;"
name="Typeregionname" value="" />
</combo_box>
</layout_panel>
<layout_panel
@ -179,6 +179,18 @@
width="145"
height="80"
visible="false">
<text
follows="left|top|right"
font="SansSerifMedium"
text_color="EmphasisColor"
top="10"
height="16"
name="grid_builder_text"
left="5"
width="190"
visible="false">
+ Click to add more grids
</text>
<text
follows="left|bottom"
font="SansSerifSmall"
@ -193,6 +205,7 @@
allow_text_entry="true"
follows="left|bottom"
height="22"
top_pad="0"
max_chars="256"
force_disable_fulltext_search="true"
combo_editor.commit_on_focus_lost="false"

View File

@ -282,6 +282,19 @@
<combo_box.drop_down_button
font="SansSerifLarge"/>
</combo_box>
<text
follows="left|top|right"
font="SansSerifMedium"
text_color="EmphasisColor"
top_pad="5"
height="16"
name="grid_builder_text"
valign="center"
left="45"
width="250"
visible="false">
+ Click to add more grids
</text>
</layout_panel>
<layout_panel
follows="left|top|right"

View File

@ -256,7 +256,25 @@ background_visible="false"
name="btn_refresh"
width="23" />
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
left_pad="3"
name="btn_activate_lp"
auto_resize="true"
width="67">
<button
follows="bottom|left|right"
label="Activate"
name="btn_activate"
left="1"
height="23"
top="0"
width="66" />
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
@ -264,7 +282,7 @@ background_visible="false"
left_pad="3"
name="btn_chat_lp"
auto_resize="true"
width="91">
width="67">
<button
follows="bottom|left|right"
label="Chat"
@ -272,7 +290,7 @@ background_visible="false"
left="1"
height="23"
top="0"
width="90" />
width="66" />
</layout_panel>
<layout_panel
@ -282,7 +300,7 @@ background_visible="false"
left_pad="3"
name="call_btn_lp"
auto_resize="true"
width="91">
width="67">
<button
follows="bottom|left|right"
left="1"
@ -292,7 +310,7 @@ background_visible="false"
layout="topleft"
tool_tip="Call this group"
top="0"
width="90" />
width="66" />
</layout_panel>
<layout_panel
@ -302,7 +320,7 @@ background_visible="false"
left_pad="3"
name="btn_apply_lp"
auto_resize="true"
width="91">
width="67">
<button
follows="bottom|left|right"
height="23"
@ -311,7 +329,7 @@ background_visible="false"
name="btn_apply"
left="1"
top="0"
width="90" />
width="66" />
</layout_panel>
</layout_stack>

View File

@ -0,0 +1,17 @@
<floater name="whitelist_floater" title="Liste blanche de dossiers et programmes">
<text name="whitelist_intro">
Les antivirus et les anti-logiciels malveillants sont un élément essentiel d'une utilisation sûre de l'internet, mais ils peuvent causer toute une série de problèmes à la visionneuse.
Pour réduire les interférences et améliorer la stabilité et les performances, nous conseillons vivement à tous les utilisateurs de veiller à ce qu'il y ait des exclusions (connues sous le nom de liste blanche) pour les dossiers et les programmes importants que la visionneuse utilise.
Pour plus d'informations, visitez le site
https://wiki.firestormviewer.org/antivirus_whitelisting
</text>
<text name="whitelist_folder_instruction">
Pour vous simplifier la tâche, l'encadré ci-dessous indique les dossiers utilisés par la visionneuse.
Veuillez les ajouter à vos exclusions de dossiers AV, comme indiqué sur la page wiki ci-dessus.
</text>
<text name="whitelist_exe_instruction">
La case suivante indique le nom et le chemin d'accès complet des exécutables de la visionneuse.
Ajoutez-les à vos exclusions d'exécutables AV comme indiqué dans le wiki ci-dessus.
</text>
</floater>

View File

@ -266,8 +266,17 @@
<menu_item_call label="Horaires des classes Firestorm" name="Firestorm Classes Schedule"/>
<menu_item_call label="Calendrier des évènements Firestorm" name="Firestorm Events Calendar"/>
<menu_item_check label="Guide" name="How To"/>
<!-- <menu_item_call label="Aide Second Life" name="Second Life Help"/>-->
<menu_item_call label="Aide [CURRENT_GRID]" name="current_grid_help"/>
<menu_item_call label="À propos de [CURRENT_GRID]" name="current_grid_about"/>
<!-- <menu_item_call label="Tutoriels" name="Tutorial"/>
<menu_item_call label="Base de connaissance" name="Knowledge Base"/>
<menu_item_call label="Wiki" name="Wiki"/>
<menu_item_call label="Forums communautaires" name="Community Forums"/>
<menu_item_call label="Portail d'assistance" name="Support portal"/>
<menu_item_call label="Nouvelles de [SECOND_LIFE]" name="Second Life News"/>
<menu_item_call label="Blogs de [SECOND_LIFE]" name="Second Life Blogs"/>-->
<menu_item_call name="whitelist_folders" label="Conseils de liste blanche"/>
<menu_item_check label="Consulter l'état de la grille" name="Grid Status"/>
<menu_item_call label="Signaler une infraction" name="Report Abuse"/>
<menu_item_call label="Signaler un problème" name="Report Bug"/>

View File

@ -17,6 +17,9 @@
</combo_box>
</layout_panel>
<layout_panel name="grid_panel">
<text name="grid_builder_text">
+ Ajouter des grilles
</text>
<text name="grid_login_text">Connexion à la Grille :</text>
</layout_panel>
<layout_panel name="links_login_panel">

View File

@ -37,6 +37,9 @@
<text name="grid_login_text" width="55">
Grille :
</text>
<text name="grid_builder_text">
+ Ajouter des grilles
</text>
</layout_panel>
<layout_panel name="mode_selection">
<text name="mode_selection_text">

View File

@ -9,7 +9,10 @@
<panel.string name="leave_txt">Quitter</panel.string>
<layout_stack name="group_info_sidetray_main">
<layout_panel name="header_container">
<panel name="group_info_top"><line_editor label="Saisissez le nom de votre nouveau groupe ici" name="group_name_editor"/></panel>
<panel name="group_info_top">
<text_editor name="group_name" value="(Chargement ...)"/>
<line_editor label="Saisissez le nom de votre nouveau groupe ici" name="group_name_editor"/>
</panel>
</layout_panel>
<layout_panel name="group_info_content">
<layout_stack name="layout">
@ -24,11 +27,17 @@
</layout_panel>
</layout_stack>
<layout_stack name="button_row_ls">
<layout_panel name="btn_chat_lp"><button label="Chat" name="btn_chat"/></layout_panel>
<layout_panel name="call_btn_lp"><button name="btn_call" label="Appel de groupe" tool_tip="Appeler ce groupe"/></layout_panel>
<layout_panel name="btn_activate_lp">
<button label="Activer" name="btn_activate" />
</layout_panel>
<layout_panel name="btn_chat_lp">
<button label="Chat" name="btn_chat"/>
</layout_panel>
<layout_panel name="call_btn_lp">
<button name="btn_call" label="Appel de groupe" tool_tip="Appeler ce groupe"/>
</layout_panel>
<layout_panel name="btn_apply_lp">
<button label="Enregistrer" label_selected="Enregistrer" name="btn_apply"/>
<button label="Créer un groupe" name="btn_create" tool_tip="Créer un nouveau groupe"/>
</layout_panel>
</layout_stack>
</layout_panel>

View File

@ -36,7 +36,7 @@
<button label="Chat" name="btn_chat"/>
</layout_panel>
<layout_panel name="call_btn_lp">
<button label="Chiamata al gruppo" name="btn_call" tool_tip="Avvia una conferenza vocale in questo gruppo"/>
<button label="Chiamata" name="btn_call" tool_tip="Avvia una conferenza vocale in questo gruppo"/>
</layout_panel>
<layout_panel name="btn_apply_lp">
<button label="Salva" label_selected="Salva" name="btn_apply"/>

View File

@ -0,0 +1,17 @@
<floater name="whitelist_floater" title="Dodaj foldery i pliki binarne do wykluczeń">
<text name="whitelist_intro">
Antywirusy i oprogramowanie chroniące przed złośliwym oprogramowaniem są istotnym elementem bezpiecznego korzystania z Internetu, ale mogą powodować wiele problemów.
Aby poprawić stabilność i wydajność zdecydowanie zalecamy, aby wszyscy użytkownicy upewnili się, że dodali do wykluczeń (tzw. białej listy) ważne foldery i programy używane przez przeglądarkę.
Więcej szczegółowych informacji znajdziesz na stronie
https://wiki.firestormviewer.org/antivirus_whitelisting
</text>
<text name="whitelist_folder_instruction">
Aby uprościć zadanie, w polu poniżej znajdują się foldery używane przez przeglądarkę.
Dodaj je do wykluczeń antywirusa, jak pokazano na stronie wiki powyżej.
</text>
<text name="whitelist_exe_instruction">
Poniższe pole zawiera nazwy i ścieżki plików wykonywalnych przeglądarki.
Dodaj je do wykluczeń antywirusa, jak pokazano na stronie wiki powyżej.
</text>
</floater>

View File

@ -297,6 +297,7 @@
<menu_item_call label="Portal wsparcia" name="Support portal"/>
<menu_item_call label="Newsy: [SECOND_LIFE]" name="Second Life News"/>
<menu_item_call label="Blogi: [SECOND_LIFE]" name="Second Life Blogs"/> -->
<menu_item_call name="whitelist_folders" label="Doradca wykluczeń" />
<menu_item_check label="Sprawdź stan świata" name="Grid Status"/>
<menu_item_call label="Zgłoś nadużycie" name="Report Abuse"/>
<menu_item_call label="Zgłoś problem" name="Report Bug"/>

View File

@ -28,6 +28,9 @@
</combo_box>
</layout_panel>
<layout_panel name="grid_panel">
<text name="grid_builder_text">
+ Kliknij, by dodać światy
</text>
<text name="grid_login_text">
Loguj do świata:
</text>

View File

@ -34,6 +34,9 @@
<text name="grid_login_text" width="55">
Świat:
</text>
<text name="grid_builder_text">
+ Kliknij, by dodać światy
</text>
</layout_panel>
<layout_panel name="mode_selection">
<text name="mode_selection_text">

View File

@ -41,11 +41,14 @@
</layout_panel>
</layout_stack>
<layout_stack name="button_row_ls">
<layout_panel name="btn_activate_lp">
<button label="Aktywuj" name="btn_activate" />
</layout_panel>
<layout_panel name="btn_chat_lp">
<button label="Czat" name="btn_chat"/>
</layout_panel>
<layout_panel name="call_btn_lp">
<button label="Konferencja głosowa" name="btn_call" tool_tip="Rozpocznij konferencję głosową w tej grupie"/>
<button label="Konf. głosowa" name="btn_call" tool_tip="Rozpocznij konferencję głosową w tej grupie"/>
</layout_panel>
<layout_panel name="btn_apply_lp">
<button label="Zapisz" label_selected="Zapisz" name="btn_apply"/>

View File

@ -45,72 +45,72 @@
<text name="title" value="Profil obiektu"/>
<text name="where" value="(W świecie)"/>
<scroll_container name="item_profile_scroll">
<panel name="properties_panel">
<text name="Name:">
Nazwa:
</text>
<line_editor name="Object Name" tool_tip="Nazwa jest ograniczona do 63 znaków. Dłuższe nazwy prim są skracane. Nazwy mogą składać się tylko z widocznych znaków znajdujących się w zestawie ASCII-7 (bez rozszerzenia), z wyjątkiem pionowej kreski &apos;|&apos;." />
<text name="Description:">
Opis:
</text>
<line_editor name="Object Description" tool_tip="Kiedy ludzie mają &apos;Pokaż chmurki pomocy na wszystkich obiektach&apos; włączone w ustawieniach przeglądarki, to zobaczą wyskakujący opis obiektu dla dowolnego obiektu pod ich wskaźnikiem myszy. Opis primy jest ograniczony do 127 bajtów, ciąg znaków dłuższy niż ten limit zostanie obcięty." />
<text name="CreatorNameLabel">
Twórca:
</text>
<text name="Owner:">
Właściciel:
</text>
<text name="Group_label">
Grupa:
</text>
<button name="button set group" tool_tip="Wybierz grupę by udostępnić jej prawa do tego obiektu"/>
<name_box initial_value="Ładowanie..." name="Group Name Proxy"/>
<button label="Przypisz" label_selected="Przypisz" name="button deed" tool_tip="Opcja przypisania udostępnia obiektowi takie same prawa jak zostały zaznaczone dla następnego właściciela. Obiekty udostępnione grupie mogą zostać przypisane dla grupy przez oficera grupy."/>
<text name="label click action">
Po kliku:
</text>
<combo_box name="clickaction" tool_tip="Akcja po kliku umożliwia interakcję z obiektem jednym kliknięciem lewym przyciskiem myszy. Każda akcja ma specjalny kursor wskazujący, co robi. Niektóre działania związane z klikaniem mają pewne wymagania, aby zaczęły działać. Na przykład Dotknij i Zapłać wymagają skryptów.">
<combo_box.item label="Dotknij (domyślne)" name="Touch/grab(default)"/>
<combo_box.item label="Usiądź na obiekcie" name="Sitonobject"/>
<combo_box.item label="Kup obiekt" name="Buyobject"/>
<combo_box.item label="Zapłać obiektowi" name="Payobject"/>
<combo_box.item label="Otwórz" name="Open"/>
<combo_box.item label="Przybliż" name="Zoom"/>
<combo_box.item label="Brak" name="None"/>
<combo_box.item label="Ignoruj obiekt" name="Ignoreobject" />
</combo_box>
<panel name="perms_inv">
<text name="perm_modify">
Możesz modyfikować ten obiekt
<panel name="properties_panel">
<text name="Name:">
Nazwa:
</text>
<text name="Anyone can:">
Każdy:
<line_editor name="Object Name" tool_tip="Nazwa jest ograniczona do 63 znaków. Dłuższe nazwy prim są skracane. Nazwy mogą składać się tylko z widocznych znaków znajdujących się w zestawie ASCII-7 (bez rozszerzenia), z wyjątkiem pionowej kreski &apos;|&apos;." />
<text name="Description:">
Opis:
</text>
<check_box label="Kopiowanie" name="checkbox allow everyone copy" tool_tip="Każdy może wziąć kopię obiektu. Obiekt i cała jego zawartość muszą być kopiowalne i transferowalne." />
<check_box label="Przesuwanie" name="checkbox allow everyone move" tool_tip="Każdy może przesuwać obiekt." />
<text name="GroupLabel">
<line_editor name="Object Description" tool_tip="Kiedy ludzie mają &apos;Pokaż chmurki pomocy na wszystkich obiektach&apos; włączone w ustawieniach przeglądarki, to zobaczą wyskakujący opis obiektu dla dowolnego obiektu pod ich wskaźnikiem myszy. Opis primy jest ograniczony do 127 bajtów, ciąg znaków dłuższy niż ten limit zostanie obcięty." />
<text name="CreatorNameLabel">
Twórca:
</text>
<text name="Owner:">
Właściciel:
</text>
<text name="Group_label">
Grupa:
</text>
<check_box label="Udostępnij" name="checkbox share with group" tool_tip="Pozwól wszystkim osobom z ustawionej grupy na dzielenie prawa do modyfikacji dla tego obiektu. Musisz przypisać obiekt grupie aby aktywować ograniczenia wynikające z funkcji."/>
<text name="NextOwnerLabel">
Nast. właściciel:
<button name="button set group" tool_tip="Wybierz grupę by udostępnić jej prawa do tego obiektu"/>
<name_box initial_value="Ładowanie..." name="Group Name Proxy"/>
<button label="Przypisz" label_selected="Przypisz" name="button deed" tool_tip="Opcja przypisania udostępnia obiektowi takie same prawa jak zostały zaznaczone dla następnego właściciela. Obiekty udostępnione grupie mogą zostać przypisane dla grupy przez oficera grupy."/>
<text name="label click action">
Po kliku:
</text>
<combo_box name="clickaction" tool_tip="Akcja po kliku umożliwia interakcję z obiektem jednym kliknięciem lewym przyciskiem myszy. Każda akcja ma specjalny kursor wskazujący, co robi. Niektóre działania związane z klikaniem mają pewne wymagania, aby zaczęły działać. Na przykład Dotknij i Zapłać wymagają skryptów.">
<combo_box.item label="Dotknij (domyślne)" name="Touch/grab(default)"/>
<combo_box.item label="Usiądź na obiekcie" name="Sitonobject"/>
<combo_box.item label="Kup obiekt" name="Buyobject"/>
<combo_box.item label="Zapłać obiektowi" name="Payobject"/>
<combo_box.item label="Otwórz" name="Open"/>
<combo_box.item label="Przybliż" name="Zoom"/>
<combo_box.item label="Brak" name="None"/>
<combo_box.item label="Ignoruj obiekt" name="Ignoreobject" />
</combo_box>
<panel name="perms_inv">
<text name="perm_modify">
Możesz modyfikować ten obiekt
</text>
<text name="Anyone can:">
Każdy:
</text>
<check_box label="Kopiowanie" name="checkbox allow everyone copy" tool_tip="Każdy może wziąć kopię obiektu. Obiekt i cała jego zawartość muszą być kopiowalne i transferowalne." />
<check_box label="Przesuwanie" name="checkbox allow everyone move" tool_tip="Każdy może przesuwać obiekt." />
<text name="GroupLabel">
Grupa:
</text>
<check_box label="Udostępnij" name="checkbox share with group" tool_tip="Pozwól wszystkim osobom z ustawionej grupy na dzielenie prawa do modyfikacji dla tego obiektu. Musisz przypisać obiekt grupie aby aktywować ograniczenia wynikające z funkcji."/>
<text name="NextOwnerLabel">
Nast. właściciel:
</text>
<check_box label="Modyfikacja" name="checkbox next owner can modify" tool_tip="Następny właściciel może edytować właściwości, takie jak nazwa lub rozmiar tego obiektu." />
<check_box label="Kopiowanie" name="checkbox next owner can copy" tool_tip="Następny właściciel może wykonać nieograniczoną liczbę kopii tego obiektu. Kopie przechowują informacje o twórcy i nigdy nie mogą mieć większych zezwoleń niż kopiowany element." />
<check_box label="Transferowanie" name="checkbox next owner can transfer" tool_tip="Następny właściciel może sprzedać lub oddać ten obiekt." />
</panel>
<check_box label="Na sprzedaż" name="checkbox for sale" tool_tip="Pozwala ludziom kupować ten obiekt, jego zawartość lub kopię w świecie za określoną cenę." />
<combo_box name="sale type" tool_tip="Wybierz, czy kupujący otrzyma kopię przedmiotu, kopię samej zawartości przedmiotu lub oryginalny przedmiot w ogóle.">
<combo_box.item label="Kopia" name="Copy"/>
<combo_box.item label="Zawartość" name="Contents"/>
<combo_box.item label="Oryginał" name="Original"/>
</combo_box>
<spinner label="Cena: L$" name="Edit Cost" tool_tip="Koszt obiektu." />
<check_box label="Pokaż w wyszukiwarce" name="search_check" tool_tip="Udostępnij widzialność tego obiektu w wyszukiwarce"/>
<text name="pathfinding_attributes_label">
Atrybuty odnajd. ścieżek:
</text>
<check_box label="Modyfikacja" name="checkbox next owner can modify" tool_tip="Następny właściciel może edytować właściwości, takie jak nazwa lub rozmiar tego obiektu." />
<check_box label="Kopiowanie" name="checkbox next owner can copy" tool_tip="Następny właściciel może wykonać nieograniczoną liczbę kopii tego obiektu. Kopie przechowują informacje o twórcy i nigdy nie mogą mieć większych zezwoleń niż kopiowany element." />
<check_box label="Transferowanie" name="checkbox next owner can transfer" tool_tip="Następny właściciel może sprzedać lub oddać ten obiekt." />
</panel>
<check_box label="Na sprzedaż" name="checkbox for sale" tool_tip="Pozwala ludziom kupować ten obiekt, jego zawartość lub kopię w świecie za określoną cenę." />
<combo_box name="sale type" tool_tip="Wybierz, czy kupujący otrzyma kopię przedmiotu, kopię samej zawartości przedmiotu lub oryginalny przedmiot w ogóle.">
<combo_box.item label="Kopia" name="Copy"/>
<combo_box.item label="Zawartość" name="Contents"/>
<combo_box.item label="Oryginał" name="Original"/>
</combo_box>
<spinner label="Cena: L$" name="Edit Cost" tool_tip="Koszt obiektu." />
<check_box label="Pokaż w wyszukiwarce" name="search_check" tool_tip="Udostępnij widzialność tego obiektu w wyszukiwarce"/>
<text name="pathfinding_attributes_label">
Atrybuty odnajd. ścieżek:
</text>
</panel>
</scroll_container>
<layout_stack name="buttons_ls">
<layout_panel name="open_btn_panel">

View File

@ -0,0 +1,17 @@
<floater name="whitelist_floater" title="Папки и двоичные файлы Белого списка">
<text name="whitelist_intro">
Антивирус и защита от вредоносных программ являются неотъемлемой частью безопасного использования Интернета, но они могут вызвать целый ряд проблем у пользователя.
Чтобы уменьшить помехи и повысить стабильность и производительность, мы настоятельно рекомендуем всем пользователям убедиться в наличии исключений (известных как Белый список) для важных папок и программ, которые использует программа просмотра.
Для получения более подробной информации посетите веб-сайт
https://wiki.firestormviewer.org/antivirus_whitelisting
</text>
<text name="whitelist_folder_instruction">
Чтобы упростить задачу, в поле ниже указаны папки, которые использует программа просмотра.
Пожалуйста добавьте их в список исключений антивируса для папок, как показано на вики-странице выше.
</text>
<text name="whitelist_exe_instruction">
В следующем поле указаны название и полный путь к исполняемым файлам программы просмотра.
Добавьте их в список исключений антивируса для файлов, как показано на вики-странице выше.
</text>
</floater>

View File

@ -333,6 +333,7 @@
<menu_item_call label="Support portal" name="Support portal"/>
<menu_item_call label="[SECOND_LIFE] News" name="Second Life News"/>
<menu_item_call label="[SECOND_LIFE] Blogs" name="Second Life Blogs"/> -->
<menu_item_call name="whitelist_folders" label="Советник Белого Списка"/>
<menu_item_call label="Проверка статуса сети (Grid Status)" name="Grid Status"/>
<menu_item_call label="Пожаловаться" name="Report Abuse"/>
<menu_item_call label="Сообщить об ошибке" name="Report Bug"/>

View File

@ -28,6 +28,9 @@
</combo_box>
</layout_panel>
<layout_panel name="grid_panel">
<text name="grid_builder_text" width="300">
+ Нажмите чтобы добавить больше сеток
</text>
<text name="grid_login_text">
Подключиться к сетке:
</text>

View File

@ -33,6 +33,7 @@
<layout_stack name="2nd_row_stack">
<layout_panel name="grid_panel">
<text name="grid_login_text" width="45">Сеть:</text>
<text name="grid_builder_text" width="300">+ Нажмите чтобы добавить больше сеток</text>
</layout_panel>
<layout_panel name="mode_selection">
<text name="mode_selection_text">Режим:</text>

View File

@ -219,6 +219,26 @@ background_visible="false"
width="23" />
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
left_pad="3"
name="btn_activate_lp"
user_resize="false"
auto_resize="true"
width="72">
<button
layout="topleft"
follows="bottom|left|right"
label="Activate"
name="btn_activate"
left="1"
height="23"
top="0"
width="71" />
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
@ -227,7 +247,7 @@ background_visible="false"
name="btn_chat_lp"
user_resize="false"
auto_resize="true"
width="97">
width="72">
<button
layout="topleft"
follows="bottom|left|right"
@ -236,7 +256,7 @@ background_visible="false"
left="1"
height="23"
top="0"
width="96" />
width="71" />
</layout_panel>
<layout_panel
@ -247,7 +267,7 @@ background_visible="false"
name="call_btn_lp"
user_resize="false"
auto_resize="true"
width="97">
width="72">
<button
follows="bottom|left|right"
left="1"
@ -257,7 +277,7 @@ background_visible="false"
layout="topleft"
tool_tip="Call this group"
top="0"
width="96" />
width="71" />
</layout_panel>
<layout_panel
@ -268,7 +288,7 @@ background_visible="false"
name="btn_apply_lp"
user_resize="false"
auto_resize="true"
width="97">
width="72">
<button
follows="bottom|left|right"
height="23"
@ -277,7 +297,7 @@ background_visible="false"
name="btn_apply"
left="1"
top="0"
width="96" />
width="71" />
</layout_panel>
</layout_stack>

View File

@ -209,6 +209,25 @@ background_visible="true"
orientation="horizontal"
top_delta="2"
width="445">
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
left_pad="3"
name="btn_activate_lp"
user_resize="false"
auto_resize="true"
width="67">
<button
follows="bottom|left|right"
label="Activate"
name="btn_activate"
left="1"
height="23"
top="0"
width="66" />
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
@ -217,7 +236,7 @@ background_visible="true"
name="btn_chat_lp"
user_resize="false"
auto_resize="true"
width="91">
width="67">
<button
follows="bottom|left|right"
label="Chat"
@ -225,7 +244,7 @@ background_visible="true"
left="1"
height="23"
top="0"
width="90" />
width="66" />
</layout_panel>
<layout_panel
@ -236,7 +255,7 @@ background_visible="true"
name="call_btn_lp"
user_resize="false"
auto_resize="true"
width="91">
width="77">
<button
follows="bottom|left|right"
left="1"
@ -246,7 +265,7 @@ background_visible="true"
layout="topleft"
tool_tip="Call this group"
top="0"
width="90" />
width="76" />
</layout_panel>
<layout_panel
@ -257,7 +276,7 @@ background_visible="true"
name="btn_apply_lp"
user_resize="false"
auto_resize="true"
width="91">
width="57">
<button
follows="bottom|left|right"
height="23"
@ -266,7 +285,7 @@ background_visible="true"
name="btn_apply"
left="1"
top="0"
width="90" />
width="56" />
</layout_panel>
</layout_stack>

View File

@ -868,8 +868,8 @@ with the same filename but different name
<texture name="Inv_OutboxClosed" file_name="icons/Inv_SysClosed.png" />
<texture name="Inv_SettingsOpen" file_name="icons/Inv_SysOpen.png" />
<texture name="Inv_SettingsClosed" file_name="icons/Inv_SysClosed.png" />
<texture name="Inv_MaterialsClosed" file_name="icons/Inv_SysOpen.png" />
<texture name="Inv_MaterialsOpen" file_name="icons/Inv_SysClosed.png" />
<texture name="Inv_MaterialsOpen" file_name="icons/Inv_SysOpen.png" />
<texture name="Inv_MaterialsClosed" file_name="icons/Inv_SysClosed.png" />
<texture name="TabIcon_Translate_Off" file_name="taskpanel/translate_icon_24x24.png" preload="false" />
<texture name="ao_toggle_18" file_name="toolbar_icons/animation_override.png" preload="false" />
<texture name="groundsit" file_name="toolbar_icons/groundsit.png" preload="true" />

View File

@ -268,7 +268,25 @@ background_visible="true"
orientation="horizontal"
top_delta="0"
width="279">
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
left_pad="3"
name="btn_activate_lp"
auto_resize="true"
width="72">
<button
follows="bottom|left|right"
label="Activate"
name="btn_activate"
left="1"
height="23"
top="0"
width="71" />
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
@ -276,7 +294,7 @@ background_visible="true"
left_pad="3"
name="btn_chat_lp"
auto_resize="true"
width="83">
width="72">
<button
follows="bottom|left|right"
label="Chat"
@ -284,7 +302,7 @@ background_visible="true"
left="1"
height="23"
top="0"
width="82" />
width="71" />
</layout_panel>
<layout_panel
@ -294,7 +312,7 @@ background_visible="true"
left_pad="3"
name="call_btn_lp"
auto_resize="true"
width="113">
width="72">
<button
follows="bottom|left|right"
left="1"
@ -304,7 +322,7 @@ background_visible="true"
layout="topleft"
tool_tip="Call this group"
top="0"
width="112" />
width="71" />
</layout_panel>
<layout_panel
@ -314,7 +332,7 @@ background_visible="true"
left_pad="3"
name="btn_apply_lp"
auto_resize="true"
width="83">
width="72">
<button
follows="bottom|left|right"
height="23"
@ -323,7 +341,7 @@ background_visible="true"
name="btn_apply"
left="1"
top="0"
width="82" />
width="71" />
</layout_panel>
</layout_stack>
<!--<button

View File

@ -12,6 +12,15 @@
<panel.string name="group_join_free">
Darmowe
</panel.string>
<panel.string name="group_member">
Osoba
</panel.string>
<panel.string name="join_txt">
Dołącz
</panel.string>
<panel.string name="leave_txt">
Opuść
</panel.string>
<layout_stack name="group_info_sidetray_main">
<layout_panel name="header_container">
<panel name="group_info_top">
@ -34,6 +43,9 @@
<layout_stack name="layout">
<layout_panel name="button_row">
<layout_stack name="button_row_ls">
<layout_panel name="btn_activate_lp">
<button label="Aktywuj" name="btn_activate" />
</layout_panel>
<layout_panel name="btn_chat_lp">
<button label="Czat" name="btn_chat"/>
</layout_panel>

View File

@ -39,7 +39,7 @@
<button label="Чат" name="btn_chat"/>
</layout_panel>
<layout_panel name="call_btn_lp">
<button label="Звонок группе" name="btn_call" tool_tip="Звонок этой группе"/>
<button label="Звонок" name="btn_call" tool_tip="Звонок этой группе"/>
</layout_panel>
<layout_panel name="btn_apply_lp">
<button label="Сохранить" label_selected="Сохранить" name="btn_apply"/>

View File

@ -868,8 +868,8 @@ with the same filename but different name
<texture name="Inv_OutboxClosed" file_name="icons/Inv_SysClosed.png" />
<texture name="Inv_SettingsOpen" file_name="icons/Inv_SysOpen.png" />
<texture name="Inv_SettingsClosed" file_name="icons/Inv_SysClosed.png" />
<texture name="Inv_MaterialsClosed" file_name="icons/Inv_SysOpen.png" />
<texture name="Inv_MaterialsOpen" file_name="icons/Inv_SysClosed.png" />
<texture name="Inv_MaterialsOpen" file_name="icons/Inv_SysOpen.png" />
<texture name="Inv_MaterialsClosed" file_name="icons/Inv_SysClosed.png" />
<texture name="TabIcon_Translate_Off" file_name="taskpanel/translate_icon_24x24.png" preload="false" />
<texture name="ao_toggle_18" file_name="toolbar_icons/animation_override.png" preload="false" />
<texture name="groundsit" file_name="toolbar_icons/groundsit.png" preload="true" />

View File

@ -268,7 +268,25 @@ background_visible="true"
orientation="horizontal"
top_delta="0"
width="279">
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
left_pad="3"
name="btn_activate_lp"
auto_resize="true"
width="72">
<button
follows="bottom|left|right"
label="Activate"
name="btn_activate"
left="1"
height="23"
top="0"
width="71" />
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
@ -276,7 +294,7 @@ background_visible="true"
left_pad="3"
name="btn_chat_lp"
auto_resize="true"
width="83">
width="72">
<button
follows="bottom|left|right"
label="Chat"
@ -284,7 +302,7 @@ background_visible="true"
left="1"
height="23"
top="0"
width="82" />
width="71" />
</layout_panel>
<layout_panel
@ -294,7 +312,7 @@ background_visible="true"
left_pad="3"
name="call_btn_lp"
auto_resize="true"
width="113">
width="72">
<button
follows="bottom|left|right"
left="1"
@ -304,7 +322,7 @@ background_visible="true"
layout="topleft"
tool_tip="Call this group"
top="0"
width="112" />
width="71" />
</layout_panel>
<layout_panel
@ -314,7 +332,7 @@ background_visible="true"
left_pad="3"
name="btn_apply_lp"
auto_resize="true"
width="83">
width="72">
<button
follows="bottom|left|right"
height="23"
@ -323,7 +341,7 @@ background_visible="true"
name="btn_apply"
left="1"
top="0"
width="82" />
width="71" />
</layout_panel>
</layout_stack>
<!--<button

View File

@ -12,6 +12,15 @@
<panel.string name="group_join_free">
Darmowe
</panel.string>
<panel.string name="group_member">
Osoba
</panel.string>
<panel.string name="join_txt">
Dołącz
</panel.string>
<panel.string name="leave_txt">
Opuść
</panel.string>
<layout_stack name="group_info_sidetray_main">
<layout_panel name="header_container">
<panel name="group_info_top">
@ -34,6 +43,9 @@
<layout_stack name="layout">
<layout_panel name="button_row">
<layout_stack name="button_row_ls">
<layout_panel name="btn_activate_lp">
<button label="Aktywuj" name="btn_activate" />
</layout_panel>
<layout_panel name="btn_chat_lp">
<button label="Czat" name="btn_chat"/>
</layout_panel>

View File

@ -209,6 +209,25 @@ background_visible="true"
orientation="horizontal"
top_delta="2"
width="445">
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
left_pad="3"
name="btn_activate_lp"
user_resize="false"
auto_resize="true"
width="67">
<button
follows="bottom|left|right"
label="Activate"
name="btn_activate"
left="1"
height="23"
top="0"
width="66" />
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
@ -217,7 +236,7 @@ background_visible="true"
name="btn_chat_lp"
user_resize="false"
auto_resize="true"
width="91">
width="67">
<button
follows="bottom|left|right"
label="Chat"
@ -225,7 +244,7 @@ background_visible="true"
left="1"
height="23"
top="0"
width="90" />
width="66" />
</layout_panel>
<layout_panel
@ -236,7 +255,7 @@ background_visible="true"
name="call_btn_lp"
user_resize="false"
auto_resize="true"
width="91">
width="67">
<button
follows="bottom|left|right"
left="1"
@ -246,7 +265,7 @@ background_visible="true"
layout="topleft"
tool_tip="Call this group"
top="0"
width="90" />
width="66" />
</layout_panel>
<layout_panel
@ -257,7 +276,7 @@ background_visible="true"
name="btn_apply_lp"
user_resize="false"
auto_resize="true"
width="91">
width="67">
<button
follows="bottom|left|right"
height="23"
@ -266,7 +285,7 @@ background_visible="true"
name="btn_apply"
left="1"
top="0"
width="90" />
width="66" />
</layout_panel>
</layout_stack>

View File

@ -68,7 +68,11 @@
name="no_group_text"
value="None" />
<string
name="age_format">
name="age_format_short">
Birthdate: [REG_DATE]
</string>
<string
name="age_format_full">
Birthdate: [REG_DATE]
([AGE])
</string>
@ -763,6 +767,19 @@
layout="topleft"
visible="false" />
<check_box
name="hide_sl_age"
label="Show full birthdate"
tool_tip="Let people see your SL age"
enabled="false"
bottom="-28"
left="230"
height="16"
width="130"
follows="left|bottom"
layout="topleft"
visible="false" />
<button
name="save_description_changes"
label="Save"

View File

@ -11,7 +11,10 @@
</string>
<string name="no_partner_text" value="Aucun" />
<string name="no_group_text" value="Aucun" />
<string name="age_format">
<string name="age_format_short">
Anniversaire : [REG_DATE]
</string>
<string name="age_format_full">
Anniversaire : [REG_DATE]
([AGE])
</string>
@ -66,6 +69,7 @@ Anniversaire : [REG_DATE]
</layout_panel>
</layout_stack>
<check_box name="show_in_search" label="Afficher dans la recherche" tool_tip="Laissez les autres vous voir dans les résultats de recherche" />
<check_box name="hide_sl_age" label="Afficher la date de naissance complète'" tool_tip="Laissez les gens voir votre âge SL"/>
<button name="save_description_changes" label="Enregistrer" />
<button name="discard_description_changes" label="Annuler" />
</panel>

View File

@ -12,7 +12,10 @@
<string name="BadgeTeam" value="Zespół [APP_NAME]a" />
<string name="no_partner_text" value="Brak" />
<string name="no_group_text" value="Brak" />
<string name="age_format">
<string name="age_format_short">
Urodziny: [REG_DATE]
</string>
<string name="age_format_full">
Urodziny: [REG_DATE]
([AGE])
</string>
@ -66,6 +69,7 @@ Urodziny: [REG_DATE]
</layout_panel>
</layout_stack>
<check_box name="show_in_search" label="Pokaż w wyszukiwarce" tool_tip="Pozwól innym zobaczyć Cię w wynikach wyszukiwania" />
<check_box name="hide_sl_age" label="Pełna data urodzenia" tool_tip="Pozwól innym widzieć Twój wiek w SL" />
<button name="save_description_changes" label="Zapisz" />
<button name="discard_description_changes" label="Odrzuć" />
</panel>

View File

@ -12,7 +12,10 @@
<string name="BadgeTeam" value="Член [APP_NAME]" />
<string name="no_partner_text" value="Нет" />
<string name="no_group_text" value="Нет" />
<string name="age_format">
<string name="age_format_short">
Возраст: [REG_DATE]
</string>
<string name="age_format_full">
Возраст: [REG_DATE]
([AGE])
</string>
@ -68,6 +71,7 @@
</layout_panel>
</layout_stack>
<check_box name="show_in_search" label="Показать в поиске" tool_tip="Пусть люди видят вас в результатах поиска"/>
<check_box name="hide_sl_age" label="Показать полную дату рождения" tool_tip="Позволить людям видеть ваш возраст в СЛ"/>
<button name="save_description_changes" label="Сохранить"/>
<button name="discard_description_changes" label="Отклонить"/>
</panel>