Ansariel 2020-09-23 10:08:11 +02:00
commit b5635da9e9
238 changed files with 2181 additions and 1286 deletions

6
.gitignore vendored
View File

@ -21,10 +21,8 @@ indra/.distcc
build-vc80/
build-vc100/
build-vc120/
build-vc120-32/
build-vc120-64/
build-vc150-32/
build-vc150-64/
build-vc[0-9]*-32/
build-vc[0-9]*-64/
indra/CMakeFiles
indra/build-vc[0-9]*
indra/lib/mono/1.0/*.dll

View File

@ -48,9 +48,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>47ddd059d48f650e39796c10ea828689</string>
<string>7d375112b162e32e37262da4a6c0a702</string>
<key>url</key>
<string>http://3p.firestormviewer.org/ndPhysicsStub-1.0-darwin-201606211534-r77.tar.bz2</string>
<string>http://3p.firestormviewer.org/ndPhysicsStub-1.0-darwin-202330107.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@ -60,9 +60,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>99fe10fdec03a22d680de72bc8b5f85a</string>
<string>c266a8d6124fc11e41a82c288f2bf8e4</string>
<key>url</key>
<string>http://3p.firestormviewer.org/ndPhysicsStub-1.181041840-linux64-181041840.tar.bz2</string>
<string>http://3p.firestormviewer.org/ndPhysicsStub-1.202321033-linux64-202321033.tar.bz2</string>
</map>
<key>name</key>
<string>linux64</string>
@ -292,9 +292,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>d670d00aa732b97d105d287b62582762</string>
<string>9b8bcc3be6dbe40a04c9c81c313f70dc</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55065/512118/apr_suite-1.4.5.539073-darwin64-539073.tar.bz2</string>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68333/658209/apr_suite-1.4.5.548882-darwin64-548882.tar.bz2</string>
</map>
<key>name</key>
<string>darwin64</string>
@ -328,9 +328,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>83b4a047db5f7ee462753d91e6277cba</string>
<string>6bdf460c18ee004b41a46afc80041a92</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55143/512317/apr_suite-1.4.5.539073-windows-539073.tar.bz2</string>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68334/658225/apr_suite-1.4.5.548882-windows-548882.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@ -340,16 +340,16 @@
<key>archive</key>
<map>
<key>hash</key>
<string>b3bbf168b39e25c08cc1febddeb33332</string>
<string>83104bfa4dabb77cd70d185e38a95b49</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55139/512304/apr_suite-1.4.5.539073-windows64-539073.tar.bz2</string>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68332/658215/apr_suite-1.4.5.548882-windows64-548882.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>1.4.5.539073</string>
<string>1.4.5.548882</string>
</map>
<key>boost</key>
<map>
@ -964,11 +964,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>6963689ea12131c0ff80b07a08cbe667</string>
<string>2c7c5fb28c34d4833b14d49d4abb101a</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///opt/firestorm/fmodstudio-2.01.03-darwin-202272255.tar.bz2</string>
<string>file:///opt/firestorm/fmodstudio-2.01.04-darwin-202612342.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@ -992,11 +992,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>fab47cbf13e89dd0359b5f5e995f6794</string>
<string>fd75a1941350a5a0b510b18192f28ef3</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.01.03-windows-202191858.tar.bz2</string>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.01.04-windows-202592205.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@ -1006,18 +1006,18 @@
<key>archive</key>
<map>
<key>hash</key>
<string>a757fe92a8a48b247e23802c22153d1c</string>
<string>534c065e8d284b794d1aabeda20f3600</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.01.03-windows64-202191859.tar.bz2</string>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.01.04-windows64-202592207.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>2.01.02</string>
<string>2.01.04</string>
</map>
<key>fontconfig</key>
<map>
@ -1947,7 +1947,7 @@
</map>
</map>
<key>version</key>
<string>7.A.6</string>
<string>8.0.6</string>
</map>
<key>libhunspell</key>
<map>
@ -2375,16 +2375,16 @@
<key>archive</key>
<map>
<key>hash</key>
<string>8501cbaa7e0f254614694da784a9c61c</string>
<string>b677ee43822212f0a27c838dc8bf3623</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64944/606925/llca-202008010216.546021-common-546021.tar.bz2</string>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/67622/646614/llca-202009010215.548269-common-548269.tar.bz2</string>
</map>
<key>name</key>
<string>common</string>
</map>
</map>
<key>version</key>
<string>202008010216.546021</string>
<string>202009010215.548269</string>
</map>
<key>llphysicsextensions_source</key>
<map>
@ -4520,9 +4520,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<array>
<string>-G</string>
<string>${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN}</string>
<string>-DUNATTENDED:BOOL=ON</string>
<string>-DINSTALL_PROPRIETARY=FALSE</string>
<string>-DUSE_KDU=FALSE</string>
<string>-DOPENAL:BOOL=ON</string>
</array>
</map>
<key>name</key>
@ -4593,6 +4593,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<string>-DUNATTENDED:BOOL=ON</string>
<string>-DINSTALL_PROPRIETARY=FALSE</string>
<string>-DUSE_KDU=FALSE</string>
<string>-DOPENAL:BOOL=ON</string>
</array>
</map>
<key>name</key>

View File

@ -261,6 +261,8 @@ Beansy Twine
Benja Kepler
VWR-746
Benjamin Bigdipper
Beq Janus
BUG-227094
Beth Walcher
Beq Janus
SL-10288
@ -1313,6 +1315,7 @@ Shyotl Kuhr
MAINT-2334
MAINT-6913
STORM-2143
SL-11625
Siana Gearz
STORM-960
STORM-1088
@ -1352,6 +1355,7 @@ Sovereign Engineer
MAINT-7343
SL-11079
OPEN-343
SL-11625
SpacedOut Frye
VWR-34
VWR-45

View File

@ -84,7 +84,7 @@ if(WINDOWS)
endif (FMODSTUDIO)
if (OPENAL)
set(release_files ${release_files} OpenAL32.dll alut.dll)
list(APPEND release_files openal32.dll alut.dll)
endif (OPENAL)
#*******************************

View File

@ -1024,11 +1024,20 @@ CURLcode HttpOpRequest::curlSslCtxCallback(CURL *curl, void *sslctx, void *userd
{
HttpOpRequest::ptr_t op(HttpOpRequest::fromHandle<HttpOpRequest>(userdata));
if (op->mCallbackSSLVerify)
{
SSL_CTX * ctx = (SSL_CTX *)sslctx;
// disable any default verification for server certs
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
if (op->mCallbackSSLVerify)
{
SSL_CTX * ctx = (SSL_CTX *)sslctx;
if (op->mReqOptions && op->mReqOptions->getSSLVerifyPeer())
{
// verification for ssl certs
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
}
else
{
// disable any default verification for server certs
// Ex: setting urls (assume non-SL) for parcel media in LLFloaterURLEntry
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
}
// set the verification callback.
SSL_CTX_set_cert_verify_callback(ctx, sslCertVerifyCallback, userdata);
// the calls are void

View File

@ -46,10 +46,10 @@ class LLRotation;
// of this writing, July 08, 2010) about getting it implemented before you resort to
// LLVector3/LLVector4.
/////////////////////////////////
class LLVector4a;
struct LLVector4a;
LL_ALIGN_PREFIX(16)
class LLVector4a
struct LLVector4a
{
public:
@ -92,6 +92,7 @@ public:
// CONSTRUCTORS
////////////////////////////////////
//LLVector4a is plain data which should never have a default constructor or destructor(malloc&free won't trigger it)
LLVector4a()
{ //DO NOT INITIALIZE -- The overhead is completely unnecessary
ll_assert_aligned(this,16);

View File

@ -77,12 +77,12 @@ public:
///
inline size_t countActive() const
{
return mActiveCoprocs.size();
return mActiveCoprocsCount;
}
/// Returns the total number of coprocedures either queued or in active processing.
///
inline size_t count() const
inline S32 count() const
{
return countPending() + countActive();
}
@ -113,12 +113,10 @@ private:
// because the consuming coroutine might outlive this LLCoprocedurePool
// instance.
typedef boost::shared_ptr<CoprocQueue_t> CoprocQueuePtr;
typedef std::map<LLUUID, LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t> ActiveCoproc_t;
std::string mPoolName;
size_t mPoolSize, mPending{0};
size_t mPoolSize, mActiveCoprocsCount, mPending;
CoprocQueuePtr mPendingCoprocs;
ActiveCoproc_t mActiveCoprocs;
LLTempBoundListener mStatusListener;
typedef std::map<std::string, LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t> CoroAdapterMap_t;
@ -191,8 +189,13 @@ LLUUID LLCoprocedureManager::enqueueCoprocedure(const std::string &pool, const s
void LLCoprocedureManager::setPropertyMethods(SettingQuery_t queryfn, SettingUpdate_t updatefn)
{
// functions to discover and store the pool sizes
mPropertyQueryFn = queryfn;
mPropertyDefineFn = updatefn;
// workaround until we get mutex into initializePool
initializePool("VAssetStorage");
initializePool("Upload");
}
//-------------------------------------------------------------------------
@ -272,21 +275,12 @@ void LLCoprocedureManager::close(const std::string &pool)
}
}
// <FS:Ansariel> Explicitly create the VAAssetStorage pool
void LLCoprocedureManager::createPool(const std::string& poolName)
{
poolMap_t::iterator it = mPoolMap.find(poolName);
if (it == mPoolMap.end())
{
initializePool(poolName);
}
}
// </FS:Ansariel> Explicitly create the VAAssetStorage pool
//=========================================================================
LLCoprocedurePool::LLCoprocedurePool(const std::string &poolName, size_t size):
mPoolName(poolName),
mPoolSize(size),
mActiveCoprocsCount(0),
mPending(0),
mPendingCoprocs(boost::make_shared<CoprocQueue_t>(DEFAULT_QUEUE_SIZE)),
mHTTPPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID),
mCoroMapping()
@ -412,8 +406,7 @@ void LLCoprocedurePool::coprocedureInvokerCoro(
}
// we actually popped an item
--mPending;
ActiveCoproc_t::iterator itActive = mActiveCoprocs.insert(ActiveCoproc_t::value_type(coproc->mId, httpAdapter)).first;
mActiveCoprocsCount++;
LL_DEBUGS("CoProcMgr") << "Dequeued and invoking coprocedure(" << coproc->mName << ") with id=" << coproc->mId.asString() << " in pool \"" << mPoolName << "\" (" << mPending << " left)" << LL_ENDL;
@ -421,20 +414,26 @@ void LLCoprocedurePool::coprocedureInvokerCoro(
{
coproc->mProc(httpAdapter, coproc->mId);
}
catch (const LLCoros::Stop &e)
{
LL_INFOS("LLCoros") << "coprocedureInvokerCoro terminating because "
<< e.what() << LL_ENDL;
throw; // let toplevel handle this as LLContinueError
}
catch (...)
{
LOG_UNHANDLED_EXCEPTION(STRINGIZE("Coprocedure('" << coproc->mName
<< "', id=" << coproc->mId.asString()
<< ") in pool '" << mPoolName << "'"));
// must NOT omit this or we deplete the pool
mActiveCoprocs.erase(itActive);
mActiveCoprocsCount--;
continue;
}
// Nicky: This is super spammy. Consider using LL_DEBUGS here?
LL_DEBUGS("CoProcMgr") << "Finished coprocedure(" << coproc->mName << ")" << " in pool \"" << mPoolName << "\"" << LL_ENDL;
mActiveCoprocs.erase(itActive);
mActiveCoprocsCount--;
}
}

View File

@ -79,8 +79,6 @@ public:
void close();
void close(const std::string &pool);
void createPool(const std::string& poolName); // <FS:Ansariel> Explicitly create the VAAssetStorage pool
private:

View File

@ -86,15 +86,15 @@ const F64 LLExperienceCache::DEFAULT_EXPIRATION = 600.0;
const S32 LLExperienceCache::DEFAULT_QUOTA = 128; // this is megabytes
const int LLExperienceCache::SEARCH_PAGE_SIZE = 30;
bool LLExperienceCache::sShutdown = false;
//=========================================================================
LLExperienceCache::LLExperienceCache():
mShutdown(false)
LLExperienceCache::LLExperienceCache()
{
}
LLExperienceCache::~LLExperienceCache()
{
}
void LLExperienceCache::initSingleton()
@ -128,7 +128,7 @@ void LLExperienceCache::cleanup()
{
cache_stream << (*this);
}
mShutdown = true;
sShutdown = true;
}
//-------------------------------------------------------------------------
@ -350,7 +350,7 @@ void LLExperienceCache::requestExperiences()
ostr << urlBase << "?page_size=" << PAGE_SIZE1;
RequestQueue_t requests;
while (!mRequestQueue.empty())
while (!mRequestQueue.empty() && !sShutdown)
{
RequestQueue_t::iterator it = mRequestQueue.begin();
LLUUID key = (*it);
@ -404,8 +404,6 @@ void LLExperienceCache::idleCoro()
LL_INFOS("ExperienceCache") << "Launching Experience cache idle coro." << LL_ENDL;
do
{
llcoro::suspendUntilTimeout(SECS_BETWEEN_REQUESTS);
if (mEraseExpiredTimer.checkExpirationAndReset(ERASE_EXPIRED_TIMEOUT))
{
eraseExpired();
@ -416,7 +414,9 @@ void LLExperienceCache::idleCoro()
requestExperiences();
}
} while (!mShutdown);
llcoro::suspendUntilTimeout(SECS_BETWEEN_REQUESTS);
} while (!sShutdown);
// The coroutine system will likely be shut down by the time we get to this point
// (or at least no further cycling will occur on it since the user has decided to quit.)

View File

@ -142,7 +142,7 @@ private:
LLFrameTimer mEraseExpiredTimer; // Periodically clean out expired entries from the cache
CapabilityQuery_t mCapability;
std::string mCacheFileName;
bool mShutdown;
static bool sShutdown; // control for coroutines, they exist out of LLExperienceCache's scope, so they need a static control
void idleCoro();
void eraseExpired();

View File

@ -44,6 +44,8 @@ const U32 TELEPORT_FLAGS_VIA_REGION_ID = 1 << 12;
const U32 TELEPORT_FLAGS_IS_FLYING = 1 << 13;
const U32 TELEPORT_FLAGS_SHOW_RESET_HOME = 1 << 14;
const U32 TELEPORT_FLAGS_FORCE_REDIRECT = 1 << 15; // used to force a redirect to some random location - used when kicking someone from land.
const U32 TELEPORT_FLAGS_VIA_GLOBAL_COORDS = 1 << 16;
const U32 TELEPORT_FLAGS_WITHIN_REGION = 1 << 17;
const U32 TELEPORT_FLAGS_MASK_VIA = TELEPORT_FLAGS_VIA_LURE
| TELEPORT_FLAGS_VIA_LANDMARK

View File

@ -668,7 +668,7 @@ void LLAccordionCtrl::onScrollPosChangeCallback(S32, LLScrollbar*)
}
// virtual
void LLAccordionCtrl::onChildGotFocus(const LLUICtrl *cntrl)
void LLAccordionCtrl::onUpdateScrollToChild(const LLUICtrl *cntrl)
{
if (mScrollbar && mScrollbar->getVisible())
{
@ -694,7 +694,7 @@ void LLAccordionCtrl::onChildGotFocus(const LLUICtrl *cntrl)
}
}
LLUICtrl::onChildGotFocus(cntrl);
LLUICtrl::onUpdateScrollToChild(cntrl);
}
void LLAccordionCtrl::onOpen (const LLSD& key)

View File

@ -116,7 +116,7 @@ public:
void draw();
void onScrollPosChangeCallback(S32, LLScrollbar*);
virtual void onChildGotFocus(const LLUICtrl * cntrl);
virtual void onUpdateScrollToChild(const LLUICtrl * cntrl);
void onOpen (const LLSD& key);
S32 notifyParent(const LLSD& info);

View File

@ -453,7 +453,7 @@ void LLAccordionCtrlTab::onVisibilityChange(BOOL new_visibility)
}
// virtual
void LLAccordionCtrlTab::onChildGotFocus(const LLUICtrl *cntrl)
void LLAccordionCtrlTab::onUpdateScrollToChild(const LLUICtrl *cntrl)
{
if (mScrollbar && mScrollbar->getVisible())
{
@ -478,7 +478,7 @@ void LLAccordionCtrlTab::onChildGotFocus(const LLUICtrl *cntrl)
}
}
LLUICtrl::onChildGotFocus(cntrl);
LLUICtrl::onUpdateScrollToChild(cntrl);
}
BOOL LLAccordionCtrlTab::handleMouseDown(S32 x, S32 y, MASK mask)

View File

@ -159,7 +159,7 @@ public:
* Raises notifyParent event with "child_visibility_change" = new_visibility
*/
void onVisibilityChange(BOOL new_visibility);
virtual void onChildGotFocus(const LLUICtrl * cntrl);
virtual void onUpdateScrollToChild(const LLUICtrl * cntrl);
// Changes expand/collapse state and triggers expand/collapse callbacks
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);

View File

@ -56,6 +56,14 @@ void LLBadgeOwner::initBadgeParams(const LLBadge::Params& p)
}
}
void LLBadgeOwner::reshapeBadge(const LLRect& new_rect)
{
if (mBadge)
{
mBadge->setShape(new_rect);
}
}
// <FS:Ansariel> Re-add setBadgeLabel
void LLBadgeOwner::setBadgeLabel(const LLStringExplicit& label)
{

View File

@ -49,6 +49,7 @@ public:
// </FS:Ansariel>
void setBadgeVisibility(bool visible);
void setDrawBadgeAtTop(bool draw_at_top);
void reshapeBadge(const LLRect& new_rect);
private:

View File

@ -517,6 +517,14 @@ S32 LLComboBox::getCurrentIndex() const
return -1;
}
void LLComboBox::setEnabledByValue(const LLSD& value, BOOL enabled)
{
LLScrollListItem *found = mList->getItem(value);
if (found)
{
found->setEnabled(enabled);
}
}
void LLComboBox::createLineEditor(const LLComboBox::Params& p)
{

View File

@ -159,6 +159,8 @@ public:
BOOL setCurrentByIndex( S32 index );
S32 getCurrentIndex() const;
void setEnabledByValue(const LLSD& value, BOOL enabled);
void createLineEditor(const Params&);
// <FS:Ansariel> For setting the focus to the LLLineEditor

View File

@ -2247,6 +2247,7 @@ void LLLineEditor::clear()
void LLLineEditor::onTabInto()
{
selectAll();
LLUICtrl::onTabInto();
}
//virtual

View File

@ -509,6 +509,7 @@ void LLMultiSliderCtrl::onTabInto()
{
mEditor->onTabInto();
}
LLF32UICtrl::onTabInto();
}
void LLMultiSliderCtrl::reportInvalidData()

View File

@ -256,7 +256,7 @@ LLNotificationForm::LLNotificationForm(const LLSD& sd)
}
else
{
LL_WARNS() << "Invalid form data " << sd << LL_ENDL;
LL_WARNS("Notifications") << "Invalid form data " << sd << LL_ENDL;
mFormData = LLSD::emptyArray();
}
}
@ -449,11 +449,11 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par
mUniqueContext.push_back(context.value);
}
LL_DEBUGS() << "notification \"" << mName << "\": tag count is " << p.tags.size() << LL_ENDL;
LL_DEBUGS("Notifications") << "notification \"" << mName << "\": tag count is " << p.tags.size() << LL_ENDL;
BOOST_FOREACH(const LLNotificationTemplate::Tag& tag, p.tags)
{
LL_DEBUGS() << " tag \"" << std::string(tag.value) << "\"" << LL_ENDL;
LL_DEBUGS("Notifications") << " tag \"" << std::string(tag.value) << "\"" << LL_ENDL;
mTags.push_back(tag.value);
}
@ -1407,8 +1407,14 @@ void LLNotifications::initSingleton()
createDefaultChannels();
}
void LLNotifications::cleanupSingleton()
{
clear();
}
void LLNotifications::createDefaultChannels()
{
LL_INFOS("Notifications") << "Generating default notification channels" << LL_ENDL;
// now construct the various channels AFTER loading the notifications,
// because the history channel is going to rewrite the stored notifications file
mDefaultChannels.push_back(new LLNotificationChannel("Enabled", "",
@ -1464,7 +1470,7 @@ void LLNotifications::forceResponse(const LLNotification::Params& params, S32 op
if (selected_item.isUndefined())
{
LL_WARNS() << "Invalid option" << option << " for notification " << (std::string)params.name << LL_ENDL;
LL_WARNS("Notifications") << "Invalid option" << option << " for notification " << (std::string)params.name << LL_ENDL;
return;
}
response[selected_item["name"].asString()] = true;
@ -1498,12 +1504,12 @@ void replaceSubstitutionStrings(LLXMLNodePtr node, StringMap& replacements)
if (found != replacements.end())
{
replacement = found->second;
LL_DEBUGS() << "replaceSubstitutionStrings: value: \"" << value << "\" repl: \"" << replacement << "\"." << LL_ENDL;
LL_DEBUGS("Notifications") << "replaceSubstitutionStrings: value: \"" << value << "\" repl: \"" << replacement << "\"." << LL_ENDL;
it->second->setValue(replacement);
}
else
{
LL_WARNS() << "replaceSubstitutionStrings FAILURE: could not find replacement \"" << value << "\"." << LL_ENDL;
LL_WARNS("Notifications") << "replaceSubstitutionStrings FAILURE: could not find replacement \"" << value << "\"." << LL_ENDL;
}
}
}
@ -1542,7 +1548,7 @@ void addPathIfExists(const std::string& new_path, std::vector<std::string>& path
bool LLNotifications::loadTemplates()
{
LL_INFOS() << "Reading notifications template" << LL_ENDL;
LL_INFOS("Notifications") << "Reading notifications template" << LL_ENDL;
// Passing findSkinnedFilenames(constraint=LLDir::ALL_SKINS) makes it
// output all relevant pathnames instead of just the ones from the most
// specific skin.
@ -1613,7 +1619,7 @@ bool LLNotifications::loadTemplates()
mTemplates[notification.name] = LLNotificationTemplatePtr(new LLNotificationTemplate(notification));
}
LL_INFOS() << "...done" << LL_ENDL;
LL_INFOS("Notifications") << "...done" << LL_ENDL;
return true;
}
@ -1841,7 +1847,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
for(it = mVisibilityRules.begin(); it != mVisibilityRules.end(); it++)
{
// An empty type/tag/name string will match any notification, so only do the comparison when the string is non-empty in the rule.
LL_DEBUGS()
LL_DEBUGS("Notifications")
<< "notification \"" << n->getName() << "\" "
<< "testing against " << ((*it)->mVisible?"show":"hide") << " rule, "
<< "name = \"" << (*it)->mName << "\" "
@ -1886,7 +1892,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
if((*it)->mResponse.empty())
{
// Response property is empty. Cancel this notification.
LL_DEBUGS() << "cancelling notification " << n->getName() << LL_ENDL;
LL_DEBUGS("Notifications") << "cancelling notification " << n->getName() << LL_ENDL;
cancel(n);
}
@ -1897,7 +1903,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
// TODO: verify that the response template has an item with the correct name
response[(*it)->mResponse] = true;
LL_DEBUGS() << "responding to notification " << n->getName() << " with response = " << response << LL_ENDL;
LL_DEBUGS("Notifications") << "responding to notification " << n->getName() << " with response = " << response << LL_ENDL;
n->respond(response);
}
@ -1909,7 +1915,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
break;
}
LL_DEBUGS() << "allowing notification " << n->getName() << LL_ENDL;
LL_DEBUGS("Notifications") << "allowing notification " << n->getName() << LL_ENDL;
return true;
}
@ -1971,7 +1977,7 @@ void LLPostponedNotification::onAvatarNameCache(const LLUUID& agent_id,
// from PE merge - we should figure out if this is the right thing to do
if (name.empty())
{
LL_WARNS() << "Empty name received for Id: " << agent_id << LL_ENDL;
LL_WARNS("Notifications") << "Empty name received for Id: " << agent_id << LL_ENDL;
name = SYSTEM_FROM;
}

View File

@ -963,6 +963,7 @@ public:
private:
/*virtual*/ void initSingleton();
/*virtual*/ void cleanupSingleton();
void loadPersistentNotifications();
@ -1078,6 +1079,7 @@ public:
LLPersistentNotificationChannel()
: LLNotificationChannel("Persistent", "Visible", &notificationFilter)
{}
virtual ~LLPersistentNotificationChannel() {}
typedef std::vector<LLNotificationPtr> history_list_t;
history_list_t::iterator beginHistory() { sortHistory(); return mHistory.begin(); }

View File

@ -479,6 +479,7 @@ void LLSliderCtrl::onTabInto()
{
mEditor->onTabInto();
}
LLF32UICtrl::onTabInto();
}
void LLSliderCtrl::reportInvalidData()

View File

@ -496,7 +496,8 @@ void LLSpinCtrl::setAllowEdit(BOOL allow_edit)
void LLSpinCtrl::onTabInto()
{
mEditor->onTabInto();
mEditor->onTabInto();
LLF32UICtrl::onTabInto();
}

View File

@ -33,7 +33,7 @@
#include "llui.h"
LLStyle::Params::Params()
: visible("visible", true),
: visible("visible", true),
drop_shadow("drop_shadow", LLFontGL::NO_SHADOW),
color("color", LLColor4::black),
readonly_color("readonly_color", LLColor4::black),
@ -44,7 +44,7 @@ LLStyle::Params::Params()
is_link("is_link"),
// <FS:Ansariel> Don't highlight URLs on hover if font style contains underline
use_default_link_style("use_default_link_style", true),
is_chat_header("is_chat_header", false)
can_underline_on_hover("can_underline_on_hover", true)
// </FS:Ansariel>
{}

View File

@ -50,7 +50,7 @@ public:
Optional<bool> is_link;
// <FS:Ansariel> Don't highlight URLs on hover if font style contains underline
Optional<bool> use_default_link_style;
Optional<bool> is_chat_header;
Optional<bool> can_underline_on_hover;
// </FS:Ansariel>
Params();
};

View File

@ -1112,8 +1112,6 @@ BOOL LLTextBase::handleMouseDown(S32 x, S32 y, MASK mask)
line_start = it->mDocIndexStart;
}
line_end = it->mDocIndexEnd;
// <FS:Ansariel> FIRE-29545: Backspace not working after triple-click selecting last line
line_end = llclamp(line_end, 0, getLength());
}
@ -2260,15 +2258,7 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para
//link_params.overwriteFrom(match.getStyle());
if (input_params.use_default_link_style)
{
LLUIColor color(link_params.color());
LLUIColor readonly_color(link_params.readonly_color());
bool is_chat_header = link_params.is_chat_header();
link_params.overwriteFrom(match.getStyle());
if (is_chat_header)
{
link_params.color = color;
link_params.readonly_color = readonly_color;
}
}
// </FS:Ansariel>
@ -2309,7 +2299,7 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para
// <FS:CR> FIRE-11437 - Don't supress font style for chat history name links
//appendAndHighlightTextImpl(match.getLabel(), part, link_params, match.underlineOnHoverOnly());
appendAndHighlightTextImpl(match.getLabel(), part, link_params,
input_params.use_default_link_style ? match.underlineOnHoverOnly() : false);
input_params.can_underline_on_hover ? match.underlineOnHoverOnly() : false);
// </FS:CR>
bool tooltip_required = !match.getTooltip().empty();
@ -2330,7 +2320,7 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para
static LLUIColor query_part_color = LLUIColorTable::getInstance()->getColor("UriQueryPartColor", LLColor4::grey);
link_params.color = query_part_color;
link_params.readonly_color = query_part_color;
appendAndHighlightTextImpl(label, part, link_params, input_params.use_default_link_style ? match.underlineOnHoverOnly() : false);
appendAndHighlightTextImpl(label, part, link_params, input_params.can_underline_on_hover ? match.underlineOnHoverOnly() : false);
// </FS:Ansariel>
// set the tooltip for the query part of url
@ -2506,7 +2496,16 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig
LLTextSegmentPtr segmentp;
if (underline_on_hover_only || mSkipLinkUnderline)
{
highlight_params.font.style("NORMAL");
// <FS:Ansariel> Only reset underline font style
//highlight_params.font.style("NORMAL");
std::string normal_font_style(highlight_params.font.style());
LLStringUtil::replaceString(normal_font_style, "UNDERLINE", "");
if (normal_font_style.empty())
{
normal_font_style = "NORMAL";
}
highlight_params.font.style(normal_font_style);
// </FS:Ansariel>
LLStyleConstSP normal_sp(new LLStyle(highlight_params));
segmentp = new LLOnHoverChangeableTextSegment(sp, normal_sp, cur_length, cur_length + wide_text.size(), *this);
}

View File

@ -709,7 +709,6 @@ void LLUICtrl::setFocus(BOOL b)
if (!hasFocus())
{
gFocusMgr.setKeyboardFocus( this );
onChildGotFocus(this);
}
}
else
@ -752,8 +751,9 @@ void LLUICtrl::resetDirty()
}
// virtual
void LLUICtrl::onTabInto()
void LLUICtrl::onTabInto()
{
onUpdateScrollToChild(this);
}
// virtual

View File

@ -691,12 +691,12 @@ void LLView::onVisibilityChange ( BOOL new_visibility )
}
// virtual
void LLView::onChildGotFocus(const LLUICtrl * cntrl)
void LLView::onUpdateScrollToChild(const LLUICtrl * cntrl)
{
LLView* parent_view = getParent();
if (parent_view)
{
parent_view->onChildGotFocus(cntrl);
parent_view->onUpdateScrollToChild(cntrl);
}
}

View File

@ -307,7 +307,7 @@ public:
virtual BOOL setLabelArg( const std::string& key, const LLStringExplicit& text );
virtual void onVisibilityChange ( BOOL new_visibility );
virtual void onChildGotFocus(const LLUICtrl * cntrl);
virtual void onUpdateScrollToChild(const LLUICtrl * cntrl);
void pushVisible(BOOL visible) { mLastVisible = mVisible; setVisible(visible); }
void popVisible() { setVisible(mLastVisible); }

View File

@ -369,10 +369,10 @@ attributedStringInfo getSegments(NSAttributedString *str)
callRightMouseDown(mMousePos, [theEvent modifierFlags]);
mSimulatedRightClick = true;
} else {
if ([theEvent clickCount] >= 2)
if ([theEvent clickCount] == 2)
{
callDoubleClick(mMousePos, [theEvent modifierFlags]);
} else if ([theEvent clickCount] == 1) {
} else if ([theEvent clickCount] >= 1) {
callLeftMouseDown(mMousePos, [theEvent modifierFlags]);
}
}

View File

@ -2122,6 +2122,12 @@ endif (FMODSTUDIO)
# set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
set_source_files_properties(llstartup.cpp llfloaterpreference.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
# </FS:Ansariel>
if (HAVOK OR HAVOK_TPV)
set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_HAVOK")
endif (HAVOK OR HAVOK_TPV)
# progress view disables/enables icons based on available packages
set_source_files_properties(llprogressview.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES})
@ -2250,10 +2256,10 @@ if (WINDOWS)
endif (FMODSTUDIO)
if (OPENAL)
list(APPEND COPY_INPUT_DEPENDENCIES
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/OpenAL32.dll
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/alut.dll
)
list(APPEND COPY_INPUT_DEPENDENCIES
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/OpenAL32.dll
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/alut.dll
)
endif (OPENAL)
add_custom_command(
@ -2266,6 +2272,7 @@ if (WINDOWS)
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
"--fmodstudio=${FMODSTUDIO}"
"--openal=${OPENAL}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=${CMAKE_BUILD_TYPE}
"--channel=${VIEWER_CHANNEL}"
@ -2276,7 +2283,6 @@ if (WINDOWS)
--touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/copy_touched.bat
--versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
--viewer_flavor=${ND_VIEWER_FLAVOR}
--openal=${OPENAL}
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
stage_third_party_libs
@ -2330,6 +2336,7 @@ if (WINDOWS)
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
"--fmodstudio=${FMODSTUDIO}"
"--openal=${OPENAL}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=${CMAKE_BUILD_TYPE}
"--channel=${VIEWER_CHANNEL}"
@ -2340,7 +2347,6 @@ if (WINDOWS)
--touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat
--versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
--viewer_flavor=${ND_VIEWER_FLAVOR}
--openal=${OPENAL}
DEPENDS
${VIEWER_BINARY_NAME}
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
@ -2511,6 +2517,7 @@ endif (NOT ENABLE_MEDIA_PLUGINS)
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
"--fmodstudio=${FMODSTUDIO}"
"--openal=${OPENAL}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=${CMAKE_BUILD_TYPE}
"--channel=${VIEWER_CHANNEL}"
@ -2521,7 +2528,6 @@ endif (NOT ENABLE_MEDIA_PLUGINS)
--touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched
--versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
--viewer_flavor=${ND_VIEWER_FLAVOR}
--openal=${OPENAL}
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
${COPY_INPUT_DEPENDENCIES}
@ -2538,6 +2544,7 @@ endif (NOT ENABLE_MEDIA_PLUGINS)
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
"--fmodstudio=${FMODSTUDIO}"
"--openal=${OPENAL}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=${CMAKE_BUILD_TYPE}
"--channel=${VIEWER_CHANNEL}"
@ -2547,7 +2554,6 @@ endif (NOT ENABLE_MEDIA_PLUGINS)
--source=${CMAKE_CURRENT_SOURCE_DIR}
--versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
--viewer_flavor=${ND_VIEWER_FLAVOR}
--openal=${OPENAL}
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
${COPY_INPUT_DEPENDENCIES}
@ -2622,6 +2628,7 @@ if (DARWIN)
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
"--fmodstudio=${FMODSTUDIO}"
"--openal=${OPENAL}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=${CMAKE_BUILD_TYPE}
--bundleid=${MACOSX_BUNDLE_GUI_IDENTIFIER}
@ -2632,7 +2639,6 @@ if (DARWIN)
--source=${CMAKE_CURRENT_SOURCE_DIR}
--versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
--viewer_flavor=${ND_VIEWER_FLAVOR}
--openal=${OPENAL}
DEPENDS
${VIEWER_BINARY_NAME}
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
@ -2659,6 +2665,7 @@ if (DARWIN)
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
"--fmodstudio=${FMODSTUDIO}"
"--openal=${OPENAL}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=${CMAKE_BUILD_TYPE}
"--channel=${VIEWER_CHANNEL}"
@ -2669,7 +2676,6 @@ if (DARWIN)
--touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched
--versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
--viewer_flavor=${ND_VIEWER_FLAVOR}
--openal=${OPENAL}
${SIGNING_SETTING}
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py

View File

@ -1 +1 @@
6.4.8
6.4.9

View File

@ -1,16 +1,5 @@
<llsd>
<map>
<key>AppearanceCameraMovement</key>
<map>
<key>Comment</key>
<string>When entering appearance editing mode, camera zooms in on currently selected portion of avatar</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>AvatarSitRotation</key>
<map>
<key>Comment</key>
@ -90,17 +79,6 @@
<key>Value</key>
<real>0.90322577953338623</real>
</map>
<key>EditCameraMovement</key>
<map>
<key>Comment</key>
<string>When entering build mode, camera moves up above avatar</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FocusOffsetRearView</key>
<map>
<key>Comment</key>

View File

@ -1,16 +1,5 @@
<llsd>
<map>
<key>AppearanceCameraMovement</key>
<map>
<key>Comment</key>
<string>When entering appearance editing mode, camera zooms in on currently selected portion of avatar</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>AvatarSitRotation</key>
<map>
<key>Comment</key>
@ -90,17 +79,6 @@
<key>Value</key>
<real>0.90322577953338623</real>
</map>
<key>EditCameraMovement</key>
<map>
<key>Comment</key>
<string>When entering build mode, camera moves up above avatar</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FocusOffsetRearView</key>
<map>
<key>Comment</key>

View File

@ -1,16 +1,5 @@
<llsd>
<map>
<key>AppearanceCameraMovement</key>
<map>
<key>Comment</key>
<string>When entering appearance editing mode, camera zooms in on currently selected portion of avatar</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>AvatarSitRotation</key>
<map>
<key>Comment</key>
@ -90,17 +79,6 @@
<key>Value</key>
<real>0.90322577953338623</real>
</map>
<key>EditCameraMovement</key>
<map>
<key>Comment</key>
<string>When entering build mode, camera moves up above avatar</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FocusOffsetRearView</key>
<map>
<key>Comment</key>

View File

@ -1407,10 +1407,21 @@
<key>Backup</key>
<integer>0</integer>
</map>
<key>RLVaShowRedirectChatTyping</key>
<map>
<key>Comment</key>
<string>Sends typing start messages (and optionally plays the typing animation) when @redirchat restricted</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<boolean>0</boolean>
</map>
<key>RLVaSplitRedirectChat</key>
<map>
<key>Comment</key>
<string>Splits long nearby chat lines across multiple messages when @redir* restricted.</string>
<string>Splits long nearby chat lines across multiple messages when @redir* restricted</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@ -17963,17 +17974,6 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Backup</key>
<integer>0</integer>
</map>
<key>VoiceCallsFriendsOnly</key>
<map>
<key>Comment</key>
<string>Only accept voice calls from residents on your friends list</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>VoiceCallsRejectGroup</key>
<map>
<key>Comment</key>
@ -22718,17 +22718,6 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>0</integer>
</map>
<key>UseHTTPBakedTextureFetch</key>
<map>
<key>Comment</key>
<string>If true, baked avatar textures will be fetched using HTTP instead of UDP.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSIMTabNameFormat</key>
<map>
<key>Comment</key>

View File

@ -477,6 +477,17 @@
<key>Value</key>
<integer>1</integer>
</map>
<key>VoiceCallsFriendsOnly</key>
<map>
<key>Comment</key>
<string>Only accept voice calls and receive IMs from residents on your friends list</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>VoiceEffectDefault</key>
<map>
<key>Comment</key>

View File

@ -167,16 +167,29 @@ bool exoGroupMuteList::restoreDeferredGroupChat(const LLUUID& group)
LLGroupData groupData;
if (gAgent.getGroupData(group, groupData))
{
gIMMgr->addSession(groupData.mName, IM_SESSION_INVITE, group);
uuid_vec_t ids;
LLIMModel::sendStartSession(group, group, ids, IM_SESSION_GROUP_START);
if (!gAgent.isDoNotDisturb() && gSavedSettings.getU32("PlayModeUISndNewIncomingGroupIMSession") != 0)
if (!isMuted(group))
{
make_ui_sound("UISndNewIncomingGroupIMSession");
LL_INFOS() << "Restoring group chat from " << groupData.mName << " (" << group.asString() << ")" << LL_ENDL;
gIMMgr->addSession(groupData.mName, IM_SESSION_INVITE, group);
uuid_vec_t ids;
LLIMModel::sendStartSession(group, group, ids, IM_SESSION_GROUP_START);
if (!gAgent.isDoNotDisturb() && gSavedSettings.getU32("PlayModeUISndNewIncomingGroupIMSession") != 0)
{
make_ui_sound("UISndNewIncomingGroupIMSession");
}
return true;
}
else
{
LL_INFOS() << "NOT restoring group chat from " << groupData.mName << " (" << group.asString() << ") because the group is muted" << LL_ENDL;
gIMMgr->clearPendingInvitation(group);
gIMMgr->clearPendingAgentListUpdates(group);
LLIMModel::getInstance()->sendLeaveSession(group, group);
return false;
}
return true;
}
}

View File

@ -15,6 +15,7 @@
<file>nirmala.ttf</file>
<file>tahoma.ttf</file>
<file load_collection="true">Cambria.ttc</file>
<file>micross.ttf</file>
<file>malgun.ttf</file>
</os>
<os name="Mac">
@ -29,6 +30,7 @@
<file>华文细黑.ttf</file>
<file>PingFang.ttc</file>
<file>STIXGeneral.otf</file>
<file>Thonburi.ttc</file>
</os>
</font>

View File

@ -15,6 +15,7 @@
<file>nirmala.ttf</file>
<file>tahoma.ttf</file>
<file load_collection="true">Cambria.ttc</file>
<file>micross.ttf</file>
<file>malgun.ttf</file>
</os>
<os name="Mac">
@ -29,6 +30,7 @@
<file>华文细黑.ttf</file>
<file>PingFang.ttc</file>
<file>STIXGeneral.otf</file>
<file>Thonburi.ttc</file>
</os>
</font>

View File

@ -15,6 +15,7 @@
<file>nirmala.ttf</file>
<file>tahoma.ttf</file>
<file load_collection="true">Cambria.ttc</file>
<file>micross.ttf</file>
<file>malgun.ttf</file>
</os>
<os name="Mac">
@ -29,6 +30,7 @@
<file>华文细黑.ttf</file>
<file>PingFang.ttc</file>
<file>STIXGeneral.otf</file>
<file>Thonburi.ttc</file>
</os>
</font>

View File

@ -15,6 +15,7 @@
<file>nirmala.ttf</file>
<file>tahoma.ttf</file>
<file load_collection="true">Cambria.ttc</file>
<file>micross.ttf</file>
<file>malgun.ttf</file>
</os>
<os name="Mac">
@ -29,6 +30,7 @@
<file>华文细黑.ttf</file>
<file>PingFang.ttc</file>
<file>STIXGeneral.otf</file>
<file>Thonburi.ttc</file>
</os>
</font>

View File

@ -15,6 +15,7 @@
<file>nirmala.ttf</file>
<file>tahoma.ttf</file>
<file load_collection="true">Cambria.ttc</file>
<file>micross.ttf</file>
<file>malgun.ttf</file>
</os>
<os name="Mac">
@ -29,6 +30,7 @@
<file>华文细黑.ttf</file>
<file>PingFang.ttc</file>
<file>STIXGeneral.otf</file>
<file>Thonburi.ttc</file>
</os>
</font>

View File

@ -15,6 +15,7 @@
<file>nirmala.ttf</file>
<file>tahoma.ttf</file>
<file load_collection="true">Cambria.ttc</file>
<file>micross.ttf</file>
<file>malgun.ttf</file>
</os>
<os name="Mac">
@ -29,6 +30,7 @@
<file>华文细黑.ttf</file>
<file>PingFang.ttc</file>
<file>STIXGeneral.otf</file>
<file>Thonburi.ttc</file>
</os>
</font>

View File

@ -15,6 +15,7 @@
<file>nirmala.ttf</file>
<file>tahoma.ttf</file>
<file load_collection="true">Cambria.ttc</file>
<file>micross.ttf</file>
<file>malgun.ttf</file>
</os>
<os name="Mac">
@ -29,6 +30,7 @@
<file>华文细黑.ttf</file>
<file>PingFang.ttc</file>
<file>STIXGeneral.otf</file>
<file>Thonburi.ttc</file>
</os>
</font>

View File

@ -15,6 +15,7 @@
<file>nirmala.ttf</file>
<file>tahoma.ttf</file>
<file load_collection="true">Cambria.ttc</file>
<file>micross.ttf</file>
<file>malgun.ttf</file>
</os>
<os name="Mac">
@ -29,6 +30,7 @@
<file>华文细黑.ttf</file>
<file>PingFang.ttc</file>
<file>STIXGeneral.otf</file>
<file>Thonburi.ttc</file>
</os>
</font>

View File

@ -15,6 +15,7 @@
<file>nirmala.ttf</file>
<file>tahoma.ttf</file>
<file load_collection="true">Cambria.ttc</file>
<file>micross.ttf</file>
<file>malgun.ttf</file>
</os>
<os name="Mac">
@ -29,6 +30,7 @@
<file>华文细黑.ttf</file>
<file>PingFang.ttc</file>
<file>STIXGeneral.otf</file>
<file>Thonburi.ttc</file>
</os>
</font>

View File

@ -73,6 +73,7 @@
#include "llfocusmgr.h"
#include "llkeyboard.h"
#include "llpanelblockedlist.h"
#include "rlvactions.h"
#include "rlvcommon.h"
#include "rlvhandler.h"
@ -509,6 +510,12 @@ public:
{
return canModerate(userdata);
}
// [RLVa:KB] - @pay
else if (param == "can_pay")
{
return RlvActions::canPayAvatar(getAvatarId());
}
// [/RLVa:KB]
else if (param == "can_ban_member")
{
return canBanGroupMember(getAvatarId());
@ -997,6 +1004,13 @@ protected:
{
const LLRect sticky_rect = mUserNameTextBox->getRect();
S32 icon_x = llmin(sticky_rect.mLeft + mUserNameTextBox->getTextBoundingRect().getWidth() + 7, sticky_rect.mRight - 3);
if (gSavedSettings.getBOOL("ShowChatMiniIcons"))
{
LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
icon_x += icon->getRect().getWidth() + icon->getRect().mLeft;
}
mInfoCtrl->setOrigin(icon_x, sticky_rect.getCenterY() - mInfoCtrl->getRect().getHeight() / 2 ) ;
}
mInfoCtrl->setVisible(isVisible);
@ -1256,12 +1270,14 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
LLStyle::Params name_params(body_message_params);
name_params.color(name_color);
name_params.readonly_color(name_color);
name_params.is_chat_header(true);
std::string name_font_style_postfix = use_plain_text_chat_history ? "UNDERLINE" : "";
name_params.font.style = name_font_style_postfix; // This will be used when hovering the name (LLTextBase::appendAndHighlightTextImpl() will filter it out)
std::string delimiter_style = "NORMAL";
// FS:LO FIRE-2899 - Faded text for IMs in nearby chat
F32 FSIMChatHistoryFade = gSavedSettings.getF32("FSIMChatHistoryFade");
if(FSIMChatHistoryFade > 1.0f)
if (FSIMChatHistoryFade > 1.0f)
{
FSIMChatHistoryFade = 1.0f;
gSavedSettings.setF32("FSIMChatHistoryFade",FSIMChatHistoryFade);
@ -1292,22 +1308,24 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
delimiter = LLStringUtil::null;
// italics for emotes -Zi
if(gSavedSettings.getBOOL("EmotesUseItalic"))
if (gSavedSettings.getBOOL("EmotesUseItalic"))
{
body_message_params.font.style = "ITALIC";
name_params.font.style = "ITALIC";
name_params.font.style = "ITALIC" + name_font_style_postfix;
}
}
if (chat.mChatType == CHAT_TYPE_WHISPER && gSavedSettings.getBOOL("FSEmphasizeShoutWhisper"))
{
body_message_params.font.style = "ITALIC";
name_params.font.style = "ITALIC";
name_params.font.style = "ITALIC" + name_font_style_postfix;
delimiter_style = "ITALIC";
}
else if(chat.mChatType == CHAT_TYPE_SHOUT && gSavedSettings.getBOOL("FSEmphasizeShoutWhisper"))
{
body_message_params.font.style = "BOLD";
name_params.font.style = "BOLD";
name_params.font.style = "BOLD" + name_font_style_postfix;
delimiter_style = "BOLD";
}
bool message_from_log = chat.mChatStyle == CHAT_STYLE_HISTORY;
@ -1327,11 +1345,23 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
U32 moderator_body_style_value = gSavedSettings.getU32("FSModTextStyle");
std::string moderator_name_style = applyModeratorStyle(moderator_name_style_value);
std::string moderator_body_style = applyModeratorStyle(moderator_body_style_value);
std::string moderator_timestamp_style = moderator_name_style;
if (chat.mChatStyle == CHAT_STYLE_MODERATOR)
{
moderator_style_active = true;
delimiter_style = moderator_name_style;
if (moderator_name_style_value < UNDERLINE)
{
// Need to add "UNDERLINE" here because we want to underline the name on hover
moderator_name_style += name_font_style_postfix;
}
else
{
// Always contains underline - don't show it on hover only
name_params.can_underline_on_hover = false;
}
name_params.font.style(moderator_name_style);
body_message_params.font.style(moderator_body_style);
@ -1340,6 +1370,7 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
if ( (ITALIC & moderator_name_style_value) != ITALIC )//HG: if ITALIC isn't one of the styles... add it
{
moderator_name_style += "ITALIC";
moderator_timestamp_style += "ITALIC";
name_params.font.style(moderator_name_style);
}
if ( (ITALIC & moderator_body_style_value) != ITALIC )
@ -1375,7 +1406,7 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
//<FS:HG> FS-1734 seperate name and text styles for moderator
if ( moderator_style_active )
{
timestamp_style.font.style(moderator_name_style);
timestamp_style.font.style(moderator_timestamp_style);
}
//</FS:HG> FS-1734 seperate name and text styles for moderator
appendText("[" + chat.mTimeStr + "] ", prependNewLineState, timestamp_style);
@ -1448,7 +1479,7 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
}
}
name_params.use_default_link_style = (!moderator_style_active || moderator_name_style_value == 0);
name_params.use_default_link_style = false;
name_params.link_href = LLSLURL("agent", chat.mFromID, "inspect").getSLURLString();
if (from_me && gSavedSettings.getBOOL("FSChatHistoryShowYou"))
@ -1466,7 +1497,7 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
if (delimiter.length() > 0 && delimiter[0] == ':')
{
LLStyle::Params delimiter_params(body_message_params);
delimiter_params.font.style = name_params.font.style;
delimiter_params.font.style = delimiter_style;
appendText(":", prependNewLineState, delimiter_params);
prependNewLineState = false;

View File

@ -49,6 +49,9 @@
#include "lltooldraganddrop.h"
#include "llviewermenu.h"
#include "llvoiceclient.h"
// [RLVa:KB] - @pay
#include "rlvactions.h"
// [/RLVa:KB]
//Maximum number of people you can select to do an operation on at once.
const U32 MAX_FRIEND_SELECT = 20;
@ -796,7 +799,7 @@ void FSFloaterContacts::refreshRightsChangeList()
else
{
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC) &&
!gRlvHandler.isException(RLV_BHVR_TPLURE, *itr, RLV_CHECK_PERMISSIVE) &&
!gRlvHandler.isException(RLV_BHVR_TPLURE, *itr, ERlvExceptionCheck::Permissive) &&
!friend_status->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION))
{
can_offer_teleport = false;
@ -840,7 +843,6 @@ void FSFloaterContacts::refreshUI()
//Options that can only be performed with one friend selected
childSetEnabled("profile_btn", single_selected && !multiple_selected);
childSetEnabled("pay_btn", single_selected && !multiple_selected);
//Options that can be performed with up to MAX_FRIEND_SELECT friends selected
//(single_selected will always be true in this situations)
@ -849,12 +851,15 @@ void FSFloaterContacts::refreshUI()
LLScrollListItem* selected_item = mFriendsList->getFirstSelected();
bool mappable = false;
bool payable = false;
if (selected_item)
{
LLUUID av_id = selected_item->getUUID();
mappable = (single_selected && !multiple_selected && av_id.notNull() && is_agent_mappable(av_id));
payable = (single_selected && !multiple_selected && av_id.notNull() && RlvActions::canPayAvatar(av_id));
}
childSetEnabled("map_btn", mappable && !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWWORLDMAP));
childSetEnabled("pay_btn", payable);
// Set friend count
mFriendsTab->getChild<LLTextBox>("friend_count")->setTextArg("COUNT", llformat("%d", mFriendsList->getItemCount()));
@ -1088,7 +1093,8 @@ void FSFloaterContacts::childShowTab(const std::string& id, const std::string& t
void FSFloaterContacts::updateRlvRestrictions(ERlvBehaviour behavior)
{
if (behavior == RLV_BHVR_SHOWLOC ||
behavior == RLV_BHVR_SHOWWORLDMAP)
behavior == RLV_BHVR_SHOWWORLDMAP ||
behavior == RLV_BHVR_PAY)
{
refreshUI();
}

View File

@ -545,7 +545,7 @@ void FSFloaterIM::sendMsg(const std::string& msg)
if (fRlvFilter)
{
utf8_text = RlvStrings::getString(RLV_STRING_BLOCKED_SENDIM);
utf8_text = RlvStrings::getString(RlvStringKeys::Blocked::SendIm);
}
}
// [/RLVa:KB]

View File

@ -613,8 +613,7 @@ void FSNearbyChat::handleChatBarKeystroke(LLUICtrl* source, S32 channel /* = 0 *
static LLCachedControl<bool> allow_mu_pose(gSavedSettings, "AllowMUpose");
if (length > 0 &&
((raw_text[0] != '/' || (type_during_emote && length > 3 && prefix == utf8string_to_wstring("/me") && (raw_text[3] == ' ' || raw_text[3] == '\'')))
&& (raw_text[0] != ':' || !allow_mu_pose || type_during_emote)) &&
!gRlvHandler.hasBehaviour(RLV_BHVR_REDIRCHAT))
&& (raw_text[0] != ':' || !allow_mu_pose || type_during_emote)))
{
// only start typing animation if we are chatting without / on channel 0 -Zi
if (channel == 0)

View File

@ -719,7 +719,7 @@ void FSPanelProfileSecondLife::updateButtons()
{
const LLRelationship* friend_status = LLAvatarTracker::instance().getBuddyInfo(av_id);
bool can_offer_tp = (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC) ||
(gRlvHandler.isException(RLV_BHVR_TPLURE, av_id, RLV_CHECK_PERMISSIVE) ||
(gRlvHandler.isException(RLV_BHVR_TPLURE, av_id, ERlvExceptionCheck::Permissive) ||
friend_status->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION)));
mTeleportButton->setEnabled(is_buddy_online && can_offer_tp);
@ -729,7 +729,7 @@ void FSPanelProfileSecondLife::updateButtons()
else
{
bool can_offer_tp = (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC) ||
gRlvHandler.isException(RLV_BHVR_TPLURE, av_id, RLV_CHECK_PERMISSIVE));
gRlvHandler.isException(RLV_BHVR_TPLURE, av_id, ERlvExceptionCheck::Permissive));
mTeleportButton->setEnabled(can_offer_tp);
mAddFriendButton->setEnabled(true);
}

View File

@ -39,6 +39,7 @@
#include "llcallingcard.h" // for LLAvatarTracker
#include "llnetmap.h"
#include "llviewermenu.h" // for gMenuHolder
#include "rlvactions.h"
#include "rlvhandler.h"
namespace FSFloaterRadarMenu
@ -228,6 +229,11 @@ bool FSRadarMenu::enableContextMenuItem(const LLSD& userdata)
{
return (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWINV));
}
else if (item == std::string("can_pay"))
{
const LLUUID& id = mUUIDs.front();
return RlvActions::canPayAvatar(id);
}
return false;
}

View File

@ -605,7 +605,7 @@ std::string LLSLURL::getSLURLString() const
// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.0d) | Added: RLVa-1.2.0d
ret.append( ( ((!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) || (!RlvUtil::isNearbyRegion(mRegion)))
? (LLURI::escape(mRegion) + llformat("/%d/%d/%d",x,y,z))
: RlvStrings::getString(RLV_STRING_HIDDEN_REGION) ));
: RlvStrings::getString(RlvStringKeys::Hidden::Region) ));
// [/RLVa:KB]
LL_DEBUGS("SLURL") << "Location: " << ret << LL_ENDL;
return ret;

View File

@ -1019,9 +1019,7 @@ void LLAgent::setRegion(LLViewerRegion *regionp)
if (mRegionp != regionp)
{
std::string ip = regionp->getHost().getString();
LL_INFOS("AgentLocation") << "Moving agent into region: " << regionp->getName()
<< " located at " << ip << LL_ENDL;
LL_INFOS("AgentLocation") << "Moving agent into region: " << regionp->getName() << LL_ENDL;
if (mRegionp)
{
// NaCl - Antispam Registry clear anti-spam queues when changing regions
@ -2381,6 +2379,13 @@ BOOL LLAgent::needsRenderHead()
//-----------------------------------------------------------------------------
void LLAgent::startTyping()
{
// [RLVa:KB] - @redirchat
if (!RlvActions::canSendTypingStart())
{
return;
}
// [/RLVa:KB]
mTypingTimer.reset();
if (getRenderState() & AGENT_STATE_TYPING)
@ -4800,7 +4805,7 @@ void LLAgent::teleportViaLandmark(const LLUUID& landmark_asset_id)
: gRlvHandler.hasBehaviour(RLV_BHVR_TPLM) && gRlvHandler.hasBehaviour(RLV_BHVR_TPLOC) ) ||
((gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) && (isAgentAvatarValid()) && (gAgentAvatarp->isSitting())) ))
{
RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_TELEPORT);
RlvUtil::notifyBlocked(RlvStringKeys::Blocked::Teleport);
return;
}
// [/RLVa:KB]
@ -4915,7 +4920,7 @@ void LLAgent::teleportViaLocation(const LLVector3d& pos_global)
if ( (RlvActions::isLocalTp(pos_global)) ? !RlvActions::canTeleportToLocal(pos_global) : !RlvActions::canTeleportToLocation() )
{
RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_TELEPORT);
RlvUtil::notifyBlocked(RlvStringKeys::Blocked::Teleport);
return;
}
@ -5000,7 +5005,7 @@ void LLAgent::teleportViaLocationLookAt(const LLVector3d& pos_global, const LLVe
if ( (RlvActions::isLocalTp(pos_global)) ? !RlvActions::canTeleportToLocal(pos_global) : !RlvActions::canTeleportToLocation() )
{
RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_TELEPORT);
RlvUtil::notifyBlocked(RlvStringKeys::Blocked::Teleport);
return;
}

View File

@ -388,6 +388,18 @@ void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera, BOOL moveme
// <FS:CR> FIRE-8798: Option to prevent camera reset on movement
}
// </FS:CR>
if (LLSelectMgr::getInstance()->mAllowSelectAvatar)
{
// resetting camera also resets position overrides in debug mode 'AllowSelectAvatar'
LLObjectSelectionHandle selected_handle = LLSelectMgr::getInstance()->getSelection();
if (selected_handle->getObjectCount() == 1
&& selected_handle->getFirstObject() != NULL
&& selected_handle->getFirstObject()->isAvatar())
{
LLSelectMgr::getInstance()->resetObjectOverrides(selected_handle);
}
}
}
// Allow camera to be moved somewhere other than behind avatar.

View File

@ -136,8 +136,8 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
// RELEASE-RLVa: [SL-2.0.0] Check ELocationFormat to make sure our switch still makes sense
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
{
parcel_name = RlvStrings::getString(RLV_STRING_HIDDEN_PARCEL);
region_name = RlvStrings::getString(RLV_STRING_HIDDEN_REGION);
parcel_name = RlvStrings::getString(RlvStringKeys::Hidden::Parcel);
region_name = RlvStrings::getString(RlvStringKeys::Hidden::Region);
if (LOCATION_FORMAT_NO_MATURITY == fmt)
fmt = LOCATION_FORMAT_LANDMARK;
else if (LOCATION_FORMAT_FULL == fmt || LOCATION_FORMAT_V1 == fmt || LOCATION_FORMAT_V1_NO_COORDS == fmt)

View File

@ -533,20 +533,20 @@ void LLAppCoreHttp::refreshSettings(bool initial)
LLCore::HttpStatus LLAppCoreHttp::sslVerify(const std::string &url,
const LLCore::HttpHandler::ptr_t &handler, void *appdata)
{
X509_STORE_CTX *ctx = static_cast<X509_STORE_CTX *>(appdata);
LLCore::HttpStatus result;
LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore("");
LLPointer<LLCertificateChain> chain = gSecAPIHandler->getCertificateChain(ctx);
LLSD validation_params = LLSD::emptyMap();
LLURI uri(url);
LLCore::HttpStatus result;
try
{
X509_STORE_CTX *ctx = static_cast<X509_STORE_CTX *>(appdata);
LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore("");
LLPointer<LLCertificateChain> chain = gSecAPIHandler->getCertificateChain(ctx);
LLSD validation_params = LLSD::emptyMap();
LLURI uri(url);
validation_params[CERT_HOSTNAME] = uri.hostName();
validation_params[CERT_HOSTNAME] = uri.hostName();
// *TODO: In the case of an exception while validating the cert, we need a way
// to pass the offending(?) cert back out. *Rider*
// *TODO: In the case of an exception while validating the cert, we need a way
// to pass the offending(?) cert back out. *Rider*
try
{
// don't validate hostname. Let libcurl do it instead. That way, it'll handle redirects
store->validate(VALIDATION_POLICY_SSL & (~VALIDATION_POLICY_HOSTNAME), chain, validation_params);
}

View File

@ -296,6 +296,7 @@ struct AttachmentInfo
std::vector<AttachmentInfo> info{
AttachmentInfo(metadata.logFilePathname, "text/plain"),
AttachmentInfo(metadata.userSettingsPathname, "text/xml"),
AttachmentInfo(metadata.accountSettingsPathname, "text/xml"),
AttachmentInfo(metadata.staticDebugPathname, "text/xml")
};

View File

@ -4017,6 +4017,10 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
}
llcoro::suspend();
if (LLApp::isQuitting())
{
return;
}
S32 retryCount(0);
bool bRetry;
do
@ -4080,6 +4084,11 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
LLSD result = httpAdapter->postAndSuspend(httpRequest, url, postData);
if (LLApp::isQuitting())
{
return;
}
LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
@ -4115,6 +4124,10 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
LL_WARNS("Avatar") << "Bake retry #" << retryCount << " in " << timeout << " seconds." << LL_ENDL;
llcoro::suspendUntilTimeout(timeout);
if (LLApp::isQuitting())
{
return;
}
bRetry = true;
continue;
}

View File

@ -425,7 +425,10 @@ const std::string ERROR_MARKER_FILE_NAME(SAFE_FILE_NAME_PREFIX + ".error_marker"
const std::string LLERROR_MARKER_FILE_NAME(SAFE_FILE_NAME_PREFIX + ".llerror_marker"); //FS orig modified LL
const std::string LOGOUT_MARKER_FILE_NAME(SAFE_FILE_NAME_PREFIX + ".logout_marker"); //FS orig modified LL
static BOOL gDoDisconnect = FALSE;
//static BOOL gDoDisconnect = FALSE;
// [RLVa:KB] - Checked: RLVa-2.3
BOOL gDoDisconnect = FALSE;
// [/RLVa:KB]
static std::string gLaunchFileOnQuit;
// Used on Win32 for other apps to identify our window (eg, win_setup)
@ -956,7 +959,7 @@ bool LLAppViewer::init()
LLFile::remove(per_user_dir_glob + "filters.xml");
LLFile::remove(per_user_dir_glob + "medialist.xml");
LLFile::remove(per_user_dir_glob + "plugin_cookies.xml");
LLFile::remove(per_user_dir_glob + "screen_last.bmp");
LLFile::remove(per_user_dir_glob + "screen_last*.*");
LLFile::remove(per_user_dir_glob + "search_history.xml");
LLFile::remove(per_user_dir_glob + "settings_friends_groups.xml");
LLFile::remove(per_user_dir_glob + "settings_per_account.xml");
@ -3428,7 +3431,7 @@ bool LLAppViewer::initConfiguration()
}
// [RLVa:KB] - Patch: RLVa-2.1.0
if (LLControlVariable* pControl = gSavedSettings.getControl(RLV_SETTING_MAIN))
if (LLControlVariable* pControl = gSavedSettings.getControl(RlvSettingNames::Main))
{
if ( (pControl->getValue().asBoolean()) && (pControl->hasUnsavedValue()) )
{
@ -3779,9 +3782,8 @@ LLSD LLAppViewer::getViewerInfo() const
info["POSITION"] = ll_sd_from_vector3d(pos);
info["POSITION_LOCAL"] = ll_sd_from_vector3(gAgent.getPosAgentFromGlobal(pos));
info["REGION"] = gAgent.getRegion()->getName();
info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName();
info["HOSTIP"] = gAgent.getRegion()->getHost().getString();
// info["SERVER_VERSION"] = gLastVersionChannel;
boost::regex regex("\\.(secondlife|lindenlab)\\..*");
info["HOSTNAME"] = boost::regex_replace(gAgent.getRegion()->getHost().getHostName(), regex, "");
LLSLURL slurl;
LLAgentUI::buildSLURL(slurl);
info["SLURL"] = slurl.getSLURLString();
@ -3789,7 +3791,7 @@ LLSD LLAppViewer::getViewerInfo() const
}
else
{
info["REGION"] = RlvStrings::getString(RLV_STRING_HIDDEN_REGION);
info["REGION"] = RlvStrings::getString(RlvStringKeys::Hidden::Region);
}
info["SERVER_VERSION"] = gLastVersionChannel;
// [/RLVa:KB]
@ -5722,13 +5724,14 @@ void LLAppViewer::idle()
// </FS:CR>
return;
}
gViewerWindow->updateUI();
if (gTeleportDisplay)
{
return;
}
gViewerWindow->updateUI();
///////////////////////////////////////
// Agent and camera movement
//

View File

@ -41,6 +41,7 @@ struct CrashMetadata
{
std::string logFilePathname;
std::string userSettingsPathname;
std::string accountSettingsPathname;
std::string staticDebugPathname;
std::string OSInfo;
std::string agentFullname;

View File

@ -199,10 +199,11 @@ CrashMetadataSingleton::CrashMetadataSingleton()
else
{
LL_INFOS() << "Metadata from '" << staticDebugPathname << "':" << LL_ENDL;
logFilePathname = get_metadata(info, "SLLog");
userSettingsPathname = get_metadata(info, "SettingsFilename");
OSInfo = get_metadata(info, "OSInfo");
agentFullname = get_metadata(info, "LoginName");
logFilePathname = get_metadata(info, "SLLog");
userSettingsPathname = get_metadata(info, "SettingsFilename");
accountSettingsPathname = get_metadata(info, "PerAccountSettingsFilename");
OSInfo = get_metadata(info, "OSInfo");
agentFullname = get_metadata(info, "LoginName");
// Translate underscores back to spaces
LLStringUtil::replaceChar(agentFullname, '_', ' ');
regionName = get_metadata(info, "CurrentRegion");

View File

@ -177,19 +177,29 @@ namespace
// name and on the other hand a Linden will not likely ever crash on Firestom.
sBugSplatSender->setDefaultUserName( WCSTR("Crash.Linden") );
// <FS:ND> Only send avatar name if enabled via prefs
if (gCrashSettings.getBOOL("CrashSubmitName"))
if (gAgentAvatarp)
{
// </FS:ND>
if (gAgentAvatarp)
// <FS:ND> Only send avatar name if enabled via prefs
if (gCrashSettings.getBOOL("CrashSubmitName"))
// </FS:ND>
{
// user name, when we have it
sBugSplatSender->setDefaultUserName(WCSTR(gAgentAvatarp->getFullname()));
// <FS:ND> Only send avatar name if enabled via prefs
}
// <FS:ND> Only send avatar name if enabled via prefs
// </FS:ND>
//<FS:Ansariel> Only include if sending settings file
//sBugSplatSender->sendAdditionalFile(
// WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "settings_per_account.xml")));
if (gCrashSettings.getBOOL("CrashSubmitSettings"))
{
sBugSplatSender->sendAdditionalFile(
WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "settings_per_account.xml")));
}
// <FS:Ansariel>
}
// </FS:ND>
// LL_ERRS message, when there is one
sBugSplatSender->setDefaultUserDescription(WCSTR(LLError::getFatalMessage()));

View File

@ -248,7 +248,7 @@ void LLAvatarActions::startIM(const LLUUID& id)
if (!RlvActions::canStartIM(id))
{
make_ui_sound("UISndInvalidOp");
RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_STARTIM, LLSD().with("RECIPIENT", LLSLURL("agent", id, "completename").getSLURLString()));
RlvUtil::notifyBlocked(RlvStringKeys::Blocked::StartIm, LLSD().with("RECIPIENT", LLSLURL("agent", id, "completename").getSLURLString()));
return;
}
// [/RLVa:KB]
@ -293,7 +293,7 @@ void LLAvatarActions::startCall(const LLUUID& id)
if (!RlvActions::canStartIM(id))
{
make_ui_sound("UISndInvalidOp");
RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_STARTIM, LLSD().with("RECIPIENT", LLSLURL("agent", id, "completename").getSLURLString()));
RlvUtil::notifyBlocked(RlvStringKeys::Blocked::StartIm, LLSD().with("RECIPIENT", LLSLURL("agent", id, "completename").getSLURLString()));
return;
}
// [/RLVa:KB]
@ -325,7 +325,7 @@ const LLUUID LLAvatarActions::startAdhocCall(const uuid_vec_t& ids, const LLUUID
if (!RlvActions::canStartIM(idAgent))
{
make_ui_sound("UISndInvalidOp");
RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_STARTCONF);
RlvUtil::notifyBlocked(RlvStringKeys::Blocked::StartConference);
return LLUUID::null;
}
id_array.push_back(idAgent);
@ -391,7 +391,7 @@ const LLUUID LLAvatarActions::startConference(const uuid_vec_t& ids, const LLUUI
if (!RlvActions::canStartIM(idAgent))
{
make_ui_sound("UISndInvalidOp");
RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_STARTCONF);
RlvUtil::notifyBlocked(RlvStringKeys::Blocked::StartConference);
return LLUUID::null;
}
id_array.push_back(idAgent);
@ -565,7 +565,7 @@ void LLAvatarActions::teleport_request_callback(const LLSD& notification, const
// Filter the request message if the recipients is IM-blocked
if ( (RlvActions::isRlvEnabled()) && ((!RlvActions::canStartIM(idRecipient)) || (!RlvActions::canSendIM(idRecipient))) )
{
strMessage = RlvStrings::getString(RLV_STRING_HIDDEN);
strMessage = RlvStrings::getString(RlvStringKeys::Hidden::Generic);
}
// [/RLVa:KB]
@ -1246,7 +1246,7 @@ bool LLAvatarActions::canOfferTeleport(const LLUUID& id)
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
{
const LLRelationship* pBuddyInfo = LLAvatarTracker::instance().getBuddyInfo(id);
if (gRlvHandler.isException(RLV_BHVR_TPLURE, id, RLV_CHECK_PERMISSIVE) ||
if (gRlvHandler.isException(RLV_BHVR_TPLURE, id, ERlvExceptionCheck::Permissive) ||
(pBuddyInfo && pBuddyInfo->isOnline() && pBuddyInfo->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION)))
{
return true;

View File

@ -69,6 +69,7 @@
#include "llviewermenu.h"
#include "llviewerobjectlist.h"
// [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.0f)
#include "rlvactions.h"
#include "rlvcommon.h"
// [/RLVa:KB]
@ -489,6 +490,12 @@ public:
{
return canModerate(userdata);
}
// [RLVa:KB] - @pay
else if (level == "can_pay")
{
return RlvActions::canPayAvatar(getAvatarId());
}
// [/RLVa:KB]
else if (level == "can_ban_member")
{
return canBanGroupMember(getAvatarId());

View File

@ -1996,6 +1996,10 @@ void LLScriptChiclet::onMenuItemClicked(const LLSD& user_data)
{
LLScriptFloaterManager::instance().removeNotification(getSessionId());
}
else if ("close all" == action)
{
LLIMWellWindow::getInstance()->closeAll();
}
}
void LLScriptChiclet::createPopupMenu()

View File

@ -449,6 +449,13 @@ void LLFloaterCompileQueue::processExperienceIdResults(LLSD result, LLUUID paren
bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloater,
const LLPointer<LLViewerObject> &object, LLInventoryObject* inventory, LLEventPump &pump)
{
if (LLApp::isQuitting())
{
// Reply from coroutine came on shutdown
// We are quiting, don't start any more coroutines!
return true;
}
LLSD result;
LLCheckedHandle<LLFloaterCompileQueue> floater(hfloater);
// Dereferencing floater may fail. If they do they throw LLExeceptionStaleHandle.
@ -502,6 +509,8 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat
}
// </FS:Ansariel>
floater.check();
if (result.has("timeout"))
{ // A timeout filed in the result will always be true if present.
LLStringUtil::format_map_t args;
@ -525,6 +534,12 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat
}
if (!gAssetStorage)
{
// viewer likely is shutting down
return true;
}
{
// <FS:Ansariel> [LSL PreProc]
//HandleScriptUserData userData(pump.getName());
@ -609,6 +624,8 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat
result = llcoro::suspendUntilEventOnWithTimeout(pump, fetch_timeout, LLSDMap("timeout", LLSD::Boolean(true)));
floater.check();
if (result.has("timeout"))
{ // A timeout filed in the result will always be true if present.
LLStringUtil::format_map_t args;
@ -1012,6 +1029,7 @@ void LLFloaterScriptQueue::objectScriptProcessingQueueCoro(std::string action, L
// but offers no guarantee of doing so.
llcoro::suspend();
}
floater.check();
}
// <FS:Ansariel> Translation fixes

View File

@ -37,6 +37,9 @@
#include "llviewercontrol.h" // <FS:CR>
#include "llviewerwindow.h"
#include "llwindow.h"
// [RLVa:KB] - @pay
#include "rlvactions.h"
// [/RLVa:KB]
static LLDefaultChildRegistry::Register<LLConversationLogList> r("conversation_log_list");
@ -397,6 +400,12 @@ bool LLConversationLogList::isActionEnabled(const LLSD& userdata)
{
return (is_p2p || is_group_member) && LLAvatarActions::canCall();
}
// [RLVa:KB] - @pay
else if ("can_pay" == command_name)
{
return is_p2p && RlvActions::canPayAvatar(selected_id);
}
// [/RLVa:KB]
else if ("add_rem_friend" == command_name ||
"can_invite_to_group" == command_name ||
"can_share" == command_name ||

View File

@ -138,24 +138,24 @@ public:
PASS_POST_BUMP,
PASS_MATERIAL,
PASS_MATERIAL_ALPHA,
PASS_MATERIAL_ALPHA_MASK,
PASS_MATERIAL_ALPHA_MASK, // Diffuse texture used as alpha mask
PASS_MATERIAL_ALPHA_EMISSIVE,
PASS_SPECMAP,
PASS_SPECMAP_BLEND,
PASS_SPECMAP_MASK,
PASS_SPECMAP_MASK, // Diffuse texture used as alpha mask and specular texture(map)
PASS_SPECMAP_EMISSIVE,
PASS_NORMMAP,
PASS_NORMMAP_BLEND,
PASS_NORMMAP_MASK,
PASS_NORMMAP_MASK, // Diffuse texture used as alpha mask and normal map
PASS_NORMMAP_EMISSIVE,
PASS_NORMSPEC,
PASS_NORMSPEC_BLEND,
PASS_NORMSPEC_MASK,
PASS_NORMSPEC_MASK, // Diffuse texture used as alpha mask with normal and specular map
PASS_NORMSPEC_EMISSIVE,
PASS_GLOW,
PASS_ALPHA,
PASS_ALPHA_MASK,
PASS_FULLBRIGHT_ALPHA_MASK,
PASS_FULLBRIGHT_ALPHA_MASK, // Diffuse texture used as alpha mask and fullbright
PASS_ALPHA_INVISIBLE,
NUM_RENDER_TYPES,
};

View File

@ -319,11 +319,15 @@ void LLDrawPoolAlpha::render(S32 pass)
LLVertexBuffer::MAP_TEXCOORD0);
pushBatches(LLRenderPass::PASS_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
pushBatches(LLRenderPass::PASS_ALPHA_INVISIBLE, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
// Material alpha mask
gGL.diffuseColor4f(0, 0, 1, 1);
pushBatches(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
pushBatches(LLRenderPass::PASS_NORMMAP_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
pushBatches(LLRenderPass::PASS_SPECMAP_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
pushBatches(LLRenderPass::PASS_NORMSPEC_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
gGL.diffuseColor4f(0, 1, 0, 1);
pushBatches(LLRenderPass::PASS_INVISIBLE, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);

View File

@ -1879,15 +1879,14 @@ bool LLDrawPoolAvatar::getRiggedGeometry(
face->setGeomIndex(0);
face->setIndicesIndex(0);
//rigged faces do not batch textures
// <FS:ND> if needed reset drawinfo as the face was set up for texture for batching
if (face->getTextureIndex() != 0xFF )
face->setDrawInfo(nullptr);
// <FS:ND>
if (face->getTextureIndex() != FACE_DO_NOT_BATCH_TEXTURES)
{
face->setDrawInfo(NULL);
}
face->setTextureIndex(255);
//rigged faces do not batch textures
face->setTextureIndex(FACE_DO_NOT_BATCH_TEXTURES);
if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable())
{

View File

@ -156,7 +156,7 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
}
mTEOffset = -1;
mTextureIndex = 255;
mTextureIndex = FACE_DO_NOT_BATCH_TEXTURES;
setDrawable(drawablep);
mVObjp = objp;
@ -191,6 +191,7 @@ void LLFace::destroy()
if(mTexture[i].notNull())
{
mTexture[i]->removeFace(i, this) ;
mTexture[i] = NULL;
}
}
@ -210,7 +211,6 @@ void LLFace::destroy()
{
mDrawPoolp->removeFace(this);
}
mDrawPoolp = NULL;
}
@ -219,7 +219,7 @@ void LLFace::destroy()
delete mTextureMatrix;
mTextureMatrix = NULL;
if (mDrawablep.notNull())
if (mDrawablep)
{
LLSpatialGroup* group = mDrawablep->getSpatialGroup();
if (group)
@ -231,7 +231,7 @@ void LLFace::destroy()
}
setDrawInfo(NULL);
mDrawablep = NULL;
mVObjp = NULL;
}
@ -476,13 +476,13 @@ void LLFace::setTextureIndex(U8 index)
{
mTextureIndex = index;
if (mTextureIndex != 255)
if (mTextureIndex != FACE_DO_NOT_BATCH_TEXTURES)
{
mDrawablep->setState(LLDrawable::REBUILD_POSITION);
}
else
{
if (mDrawInfo && mDrawInfo->mTextureList.size() <= 1)
if (mDrawInfo && !mDrawInfo->mTextureList.empty())
{
LL_ERRS() << "Face with no texture index references indexed texture draw info." << LL_ENDL;
}
@ -558,7 +558,7 @@ void LLFace::updateCenterAgent()
void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
{
if (mDrawablep->getSpatialGroup() == NULL)
if (mDrawablep == NULL || mDrawablep->getSpatialGroup() == NULL)
{
return;
}
@ -566,7 +566,7 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
mDrawablep->getSpatialGroup()->rebuildGeom();
mDrawablep->getSpatialGroup()->rebuildMesh();
if(mDrawablep.isNull() || mVertexBuffer.isNull())
if(mVertexBuffer.isNull())
{
return;
}
@ -1639,7 +1639,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_VERTEX, mGeomIndex, mGeomCount);
U8 index = mTextureIndex < 255 ? mTextureIndex : 0;
U8 index = mTextureIndex < FACE_DO_NOT_BATCH_TEXTURES ? mTextureIndex : 0;
S32 val = 0;
U8* vp = (U8*) &val;
@ -2188,7 +2188,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
LLVector4a texIdx;
S32 index = mTextureIndex < 255 ? mTextureIndex : 0;
S32 index = mTextureIndex < FACE_DO_NOT_BATCH_TEXTURES ? mTextureIndex : 0;
F32 val = 0.f;
S32* vp = (S32*) &val;
@ -2798,7 +2798,7 @@ S32 LLFace::renderElements(const U16 *index_array) const
S32 LLFace::renderIndexed()
{
if(mDrawablep.isNull() || mDrawPoolp == NULL)
if(mDrawablep == NULL || mDrawPoolp == NULL)
{
return 0;
}
@ -2908,7 +2908,7 @@ void LLFace::setDefaultTexture(U32 nChannel, bool fShowDefault) const
if ((fUpdated) && (mDrawablep))
{
gPipeline.markTextured(mDrawablep);
const_cast<LLDrawable*>(mDrawablep.get())->updateTexture();
mDrawablep->updateTexture();
}
}

View File

@ -53,6 +53,7 @@ class LLDrawInfo;
const F32 MIN_ALPHA_SIZE = 1024.f;
const F32 MIN_TEX_ANIM_SIZE = 512.f;
const U8 FACE_DO_NOT_BATCH_TEXTURES = 255;
class LLFace : public LLTrace::MemTrackableNonVirtual<LLFace, 16>
{
@ -286,8 +287,13 @@ private:
LLXformMatrix* mXform;
LLPointer<LLViewerTexture> mTexture[LLRender::NUM_TEXTURE_CHANNELS];
LLPointer<LLDrawable> mDrawablep;
// mDrawablep is not supposed to be null, don't use LLPointer because
// mDrawablep owns LLFace and LLPointer is a good way to either cause a
// memory leak or a 'delete each other' situation if something deletes
// drawable wrongly.
LLDrawable* mDrawablep;
// LLViewerObject technically owns drawable, but also it should be strictly managed
LLPointer<LLViewerObject> mVObjp;
S32 mTEOffset;

View File

@ -74,7 +74,6 @@ public:
void onClickBuy();
void onClickCancel();
void onClickErrorWeb();
};
LLFloater* LLFloaterBuyCurrency::buildFloater(const LLSD& key)
@ -132,7 +131,6 @@ BOOL LLFloaterBuyCurrencyUI::postBuild()
getChild<LLUICtrl>("buy_btn")->setCommitCallback( boost::bind(&LLFloaterBuyCurrencyUI::onClickBuy, this));
getChild<LLUICtrl>("cancel_btn")->setCommitCallback( boost::bind(&LLFloaterBuyCurrencyUI::onClickCancel, this));
getChild<LLUICtrl>("error_web")->setCommitCallback( boost::bind(&LLFloaterBuyCurrencyUI::onClickErrorWeb, this));
center();
@ -173,7 +171,6 @@ void LLFloaterBuyCurrencyUI::updateUI()
// hide most widgets - we'll turn them on as needed next
getChildView("info_buying")->setVisible(FALSE);
getChildView("info_cannot_buy")->setVisible(FALSE);
getChildView("info_need_more")->setVisible(FALSE);
getChildView("purchase_warning_repurchase")->setVisible(FALSE);
getChildView("purchase_warning_notenough")->setVisible(FALSE);
@ -183,32 +180,16 @@ void LLFloaterBuyCurrencyUI::updateUI()
if (hasError)
{
// display an error from the server
getChildView("normal_background")->setVisible(FALSE);
getChildView("error_background")->setVisible(TRUE);
getChildView("info_cannot_buy")->setVisible(TRUE);
getChildView("cannot_buy_message")->setVisible(TRUE);
getChildView("balance_label")->setVisible(FALSE);
getChildView("balance_amount")->setVisible(FALSE);
getChildView("buying_label")->setVisible(FALSE);
getChildView("buying_amount")->setVisible(FALSE);
getChildView("total_label")->setVisible(FALSE);
getChildView("total_amount")->setVisible(FALSE);
LLTextBox* message = getChild<LLTextBox>("cannot_buy_message");
if (message)
{
message->setText(mManager.errorMessage());
}
getChildView("error_web")->setVisible( !mManager.errorURI().empty());
LLSD args;
args["TITLE"] = getString("info_cannot_buy");
args["MESSAGE"] = mManager.errorMessage();
LLNotificationsUtil::add("CouldNotBuyCurrency", args);
closeFloater();
}
else
{
// display the main Buy L$ interface
getChildView("normal_background")->setVisible(TRUE);
getChildView("error_background")->setVisible(FALSE);
getChildView("cannot_buy_message")->setVisible(FALSE);
getChildView("error_web")->setVisible(FALSE);
if (mHasTarget)
{
@ -283,14 +264,6 @@ void LLFloaterBuyCurrencyUI::onClickCancel()
LLStatusBar::sendMoneyBalanceRequest();
}
void LLFloaterBuyCurrencyUI::onClickErrorWeb()
{
LLWeb::loadURL(mManager.errorURI());
closeFloater();
// Update L$ balance
LLStatusBar::sendMoneyBalanceRequest();
}
// static
void LLFloaterBuyCurrency::buyCurrency()
{

View File

@ -101,12 +101,8 @@ BOOL LLFloaterConversationPreview::postBuild()
name = LLTrans::getString("NearbyChatTitle");
file = "chat";
}
// <FS:Ansariel> Remember used log file name
mChatHistoryFileName = file;
if (mIsGroup)
{
mChatHistoryFileName += GROUP_CHAT_SUFFIX;
}
LLStringUtil::format_map_t args;
args["[NAME]"] = name;
std::string title = getString("Title", args);

View File

@ -35,6 +35,7 @@
#include "llagent.h"
#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llcombobox.h"
#include "lldrawable.h"
#include "lldrawpoolavatar.h"
@ -120,17 +121,26 @@ BOOL LLFloaterImagePreview::postBuild()
mSculptedPreview->setPreviewTarget(mRawImagep, 2.0f);
// <FS:Beq> BUG-228331 - lossless_check is misleading don't show it if it won't be used.
// if (mRawImagep->getWidth() * mRawImagep->getHeight () <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF)
// getChildView("lossless_check")->setEnabled(TRUE);
//if (mRawImagep->getWidth() * mRawImagep->getHeight() <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF)
//{
// // We want "lossless_check" to be unchecked when it is disabled, regardless of
// // LosslessJ2CUpload state, so only assign control when enabling checkbox
// LLCheckBoxCtrl* check_box = getChild<LLCheckBoxCtrl>("lossless_check");
// check_box->setEnabled(TRUE);
// check_box->setControlVariable(gSavedSettings.getControl("LosslessJ2CUpload"));
//}
if (mRawImagep->getWidth() * mRawImagep->getHeight () <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF)
{
getChildView("lossless_check")->setEnabled(TRUE);
getChildView("lossless_check")->setVisible(TRUE);
LLCheckBoxCtrl* check_box = getChild<LLCheckBoxCtrl>("lossless_check");
check_box->setEnabled(TRUE);
check_box->setVisible(TRUE);
check_box->setControlVariable(gSavedSettings.getControl("LosslessJ2CUpload"));
}
else
{
getChildView("lossless_check")->setEnabled(FALSE);
getChildView("lossless_check")->setVisible(FALSE);
LLCheckBoxCtrl* check_box = getChild<LLCheckBoxCtrl>("lossless_check");
check_box->setEnabled(FALSE);
check_box->setVisible(FALSE);
}
//</FS:Beq>

View File

@ -57,6 +57,9 @@
#include "llsdserialize.h"
#include "llviewermenu.h" // is_agent_mappable
#include "llviewerobjectlist.h"
// [RLVa:KB] - @pay
#include "rlvactions.h"
// [/RLVa:KB]
#include "boost/foreach.hpp"
//
@ -457,7 +460,7 @@ void LLFloaterIMContainer::idleUpdate()
while (current_participant_model != end_participant_model)
{
LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model);
participant_model->setModeratorOptionsVisible(is_moderator && participant_model->getUUID() != gAgentID);
participant_model->setModeratorOptionsVisible(is_moderator);
participant_model->setGroupBanVisible(can_ban && participant_model->getUUID() != gAgentID);
current_participant_model++;
@ -1411,12 +1414,21 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
{
return is_single_select;
}
// Beyond that point, if only the user agent is selected, everything is disabled
if (is_single_select && (single_id == gAgentID))
{
return false;
}
bool is_moderator_option = ("can_moderate_voice" == item) || ("can_allow_text_chat" == item) || ("can_mute" == item) || ("can_unmute" == item);
// Beyond that point, if only the user agent is selected, everything is disabled
if (is_single_select && (single_id == gAgentID))
{
if (is_moderator_option)
{
return enableModerateContextMenuItem(item, true);
}
else
{
return false;
}
}
// If the user agent is selected with others, everything is disabled
for (uuid_vec_t::const_iterator id = uuids.begin(); id != uuids.end(); ++id)
@ -1428,11 +1440,20 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
}
// Handle all other options
if (("can_invite" == item) || ("can_chat_history" == item) || ("can_share" == item) || ("can_pay" == item))
// if (("can_invite" == item) || ("can_chat_history" == item) || ("can_share" == item) || ("can_pay" == item))
// [RLVa:KB] - @pay
if (("can_invite" == item) || ("can_chat_history" == item) || ("can_share" == item))
// [/RLVa:KB]
{
// Those menu items are enable only if a single avatar is selected
return is_single_select;
}
// [RLVa:KB] - @pay
else if ("can_pay" == item)
{
return is_single_select && RlvActions::canPayAvatar(single_id);
}
// [/RLVa:KB]
else if ("can_block" == item)
{
return (is_single_select ? LLAvatarActions::canBlock(single_id) : false);
@ -1482,11 +1503,11 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
{
return canBanSelectedMember(single_id);
}
else if (("can_moderate_voice" == item) || ("can_allow_text_chat" == item) || ("can_mute" == item) || ("can_unmute" == item))
{
// *TODO : get that out of here...
return enableModerateContextMenuItem(item);
}
else if (is_moderator_option)
{
// *TODO : get that out of here...
return enableModerateContextMenuItem(item);
}
// By default, options that not explicitely disabled are enabled
return true;
@ -1856,7 +1877,7 @@ LLConversationViewParticipant* LLFloaterIMContainer::createConversationViewParti
return LLUICtrlFactory::create<LLConversationViewParticipant>(params);
}
bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& userdata)
bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& userdata, bool is_self)
{
// only group moderators can perform actions related to this "enable callback"
if (!isGroupModerator())
@ -1876,7 +1897,7 @@ bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& user
{
return voice_channel;
}
else if ("can_mute" == userdata)
else if (("can_mute" == userdata) && !is_self)
{
return voice_channel && !isMuted(getCurSelectedViewModelItem()->getUUID());
}
@ -1886,7 +1907,7 @@ bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& user
}
// The last invoke is used to check whether the "can_allow_text_chat" will enabled
return LLVoiceClient::getInstance()->isParticipantAvatar(getCurSelectedViewModelItem()->getUUID());
return LLVoiceClient::getInstance()->isParticipantAvatar(getCurSelectedViewModelItem()->getUUID()) && !is_self;
}
bool LLFloaterIMContainer::isGroupModerator()

View File

@ -166,7 +166,7 @@ private:
void doToSelectedGroup(const LLSD& userdata);
static void confirmMuteAllCallback(const LLSD& notification, const LLSD& response);
bool enableModerateContextMenuItem(const std::string& userdata);
bool enableModerateContextMenuItem(const std::string& userdata, bool is_self = false);
LLSpeaker * getSpeakerOfSelectedParticipant(LLSpeakerMgr * speaker_managerp);
LLSpeakerMgr * getSpeakerMgrForSelectedParticipant();
bool isGroupModerator();

View File

@ -478,10 +478,7 @@ void LLFloaterIMNearbyChat::onChatBoxKeystroke()
S32 length = raw_text.length();
// if( (length > 0) && (raw_text[0] != '/') ) // forward slash is used for escape (eg. emote) sequences
// [RLVa:KB] - Checked: 2010-03-26 (RLVa-1.2.0b) | Modified: RLVa-1.0.0d
if ( (length > 0) && (raw_text[0] != '/') && (!RlvActions::hasBehaviour(RLV_BHVR_REDIRCHAT)) )
// [/RLVa:KB]
if( (length > 0) && (raw_text[0] != '/') ) // forward slash is used for escape (eg. emote) sequences
{
gAgent.startTyping();
}

View File

@ -322,7 +322,7 @@ void LLFloaterIMSession::sendMsg(const std::string& msg)
if (fRlvFilter)
{
utf8_text = RlvStrings::getString(RLV_STRING_BLOCKED_SENDIM);
utf8_text = RlvStrings::getString(RlvStringKeys::Blocked::SendIm);
}
}
// [/RLVa:KB]

View File

@ -184,8 +184,6 @@ void LLFloaterPermsDefault::sendInitialPerms()
// </FS:Ansariel>
{
updateCap();
// <FS:Ansariel> Set cap sent = true only on success to allow re-transmit on region change
//setCapSent(true);
}
}
@ -247,7 +245,10 @@ void LLFloaterPermsDefault::updateCapCoro(std::string url)
{
const std::string& reason = status.toString();
// Do not display the same error more than once in a row
if (reason != previousReason)
// <FS:Ansariel> Getter for CapSent
//if ((reason != previousReason) && mCapSent)
if ((reason != previousReason) && sCapSent)
// </FS:Ansariel>
{
previousReason = reason;
LLSD args;

View File

@ -1632,6 +1632,7 @@ void LLFloaterPreference::onBtnCancel(const LLSD& userdata)
if (userdata.asString() == "closeadvanced")
{
LLFloaterReg::hideInstance("prefs_graphics_advanced");
updateMaxComplexity();
}
else
{
@ -3128,6 +3129,9 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im
// <FS:Ansariel> Clear Cache button actually clears per-account cache items
getChildView("clear_webcache")->setEnabled(TRUE);
getChild<LLUICtrl>("voice_call_friends_only_check")->setEnabled(TRUE);
getChild<LLUICtrl>("voice_call_friends_only_check")->setValue(gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly"));
}
@ -3318,6 +3322,14 @@ void LLFloaterPreference::updateMaxComplexity()
LLAvatarComplexityControls::updateMax(
getChild<LLSliderCtrl>("IndirectMaxComplexity"),
getChild<LLTextBox>("IndirectMaxComplexityText"));
LLFloaterPreferenceGraphicsAdvanced* floater_graphics_advanced = LLFloaterReg::findTypedInstance<LLFloaterPreferenceGraphicsAdvanced>("prefs_graphics_advanced");
if (floater_graphics_advanced)
{
LLAvatarComplexityControls::updateMax(
floater_graphics_advanced->getChild<LLSliderCtrl>("IndirectMaxComplexity"),
floater_graphics_advanced->getChild<LLTextBox>("IndirectMaxComplexityText"));
}
}
bool LLFloaterPreference::loadFromFilename(const std::string& filename, std::map<std::string, std::string> &label_map)
@ -3365,6 +3377,14 @@ void LLFloaterPreferenceGraphicsAdvanced::updateMaxComplexity()
LLAvatarComplexityControls::updateMax(
getChild<LLSliderCtrl>("IndirectMaxComplexity"),
getChild<LLTextBox>("IndirectMaxComplexityText"));
LLFloaterPreference* floater_preferences = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
if (floater_preferences)
{
LLAvatarComplexityControls::updateMax(
floater_preferences->getChild<LLSliderCtrl>("IndirectMaxComplexity"),
floater_preferences->getChild<LLTextBox>("IndirectMaxComplexityText"));
}
}
void LLFloaterPreference::onChangeMaturity()
@ -3986,9 +4006,13 @@ void LLPanelPreference::showMultipleViewersWarning(LLUICtrl* checkbox, const LLS
void LLPanelPreference::showFriendsOnlyWarning(LLUICtrl* checkbox, const LLSD& value)
{
if (checkbox && checkbox->getValue())
if (checkbox)
{
LLNotificationsUtil::add("FriendsAndGroupsOnly");
gSavedPerAccountSettings.setBOOL("VoiceCallsFriendsOnly", checkbox->getValue().asBoolean());
if (checkbox->getValue())
{
LLNotificationsUtil::add("FriendsAndGroupsOnly");
}
}
}
// Manage the custom port alert, fixes Cant Close bug. -WoLf
@ -4159,7 +4183,6 @@ class LLPanelPreferencePrivacy : public LLPanelPreference
public:
LLPanelPreferencePrivacy()
{
mAccountIndependentSettings.push_back("VoiceCallsFriendsOnly");
mAccountIndependentSettings.push_back("AutoDisengageMic");
mAutoresponseItem = gSavedPerAccountSettings.getString("FSAutoresponseItemUUID");
@ -4557,6 +4580,7 @@ void LLFloaterPreferenceGraphicsAdvanced::onClickCloseBtn(bool app_quitting)
{
instance->cancel();
}
updateMaxComplexity();
}
LLFloaterPreferenceProxy::~LLFloaterPreferenceProxy()

View File

@ -948,7 +948,7 @@ void LLFloaterReporter::takeNewSnapshot(bool refresh)
// Take a screenshot, but don't draw this floater.
setVisible(FALSE);
if (!gViewerWindow->rawSnapshot(mImageRaw, IMAGE_WIDTH, IMAGE_HEIGHT, TRUE, FALSE, gSavedSettings.getBOOL("RenderHUDInSnapshot"), TRUE, FALSE))
if (!gViewerWindow->rawSnapshot(mImageRaw,IMAGE_WIDTH, IMAGE_HEIGHT, TRUE, FALSE, TRUE /*UI*/, TRUE, FALSE))
{
LL_WARNS() << "Unable to take screenshot" << LL_ENDL;
setVisible(TRUE);

View File

@ -880,7 +880,7 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)
std::string tooltip("");
mTrackedStatus = LLTracker::TRACKING_LOCATION;
// [RLVa:KB] - Checked: 2012-02-08 (RLVa-1.4.5) | Added: RLVa-1.4.5
LLTracker::trackLocation(pos_global, (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ? full_name : RlvStrings::getString(RLV_STRING_HIDDEN).c_str(), tooltip);
LLTracker::trackLocation(pos_global, (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ? full_name : RlvStrings::getString(RlvStringKeys::Hidden::Generic).c_str(), tooltip);
// [/RLVa:KB]
// LLTracker::trackLocation(pos_global, full_name, tooltip);
LLWorldMap::getInstance()->cancelTracking(); // The floater is taking over the tracking
@ -983,7 +983,7 @@ void LLFloaterWorldMap::updateLocation()
mSetToUserPosition = FALSE;
// Fill out the location field
getChild<LLUICtrl>("location")->setValue(RlvStrings::getString(RLV_STRING_HIDDEN_REGION));
getChild<LLUICtrl>("location")->setValue(RlvStrings::getString(RlvStringKeys::Hidden::Region));
// update the coordinate display with location of avatar in region
updateTeleportCoordsDisplay( agentPos );
@ -1045,7 +1045,7 @@ void LLFloaterWorldMap::updateLocation()
{
mSLURL = LLSLURL();
childSetValue("location", RlvStrings::getString(RLV_STRING_HIDDEN_REGION));
childSetValue("location", RlvStrings::getString(RlvStringKeys::Hidden::Region));
}
else if (gotSimName)
// [/RLVa:KB]

View File

@ -240,7 +240,7 @@ void LLGroupActions::startCall(const LLUUID& group_id)
if (!RlvActions::canStartIM(group_id))
{
make_ui_sound("UISndInvalidOp");
RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_STARTIM, LLSD().with("RECIPIENT", LLSLURL("group", group_id, "about").getSLURLString()));
RlvUtil::notifyBlocked(RlvStringKeys::Blocked::StartIm, LLSD().with("RECIPIENT", LLSLURL("group", group_id, "about").getSLURLString()));
return;
}
// [/RLVa:KB]
@ -626,7 +626,7 @@ LLUUID LLGroupActions::startIM(const LLUUID& group_id)
if (!RlvActions::canStartIM(group_id))
{
make_ui_sound("UISndInvalidOp");
RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_STARTIM, LLSD().with("RECIPIENT", LLSLURL("group", group_id, "about").getSLURLString()));
RlvUtil::notifyBlocked(RlvStringKeys::Blocked::StartIm, LLSD().with("RECIPIENT", LLSLURL("group", group_id, "about").getSLURLString()));
return LLUUID::null;
}
// [/RLVa:KB]

View File

@ -965,7 +965,7 @@ static void formatDateString(std::string &date_string)
// static
void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
{
LL_DEBUGS() << "LLGroupMgr::processGroupMembersReply" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupMembersReply" << LL_ENDL;
LLUUID agent_id;
msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
if (gAgent.getID() != agent_id)
@ -1071,7 +1071,7 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
//static
void LLGroupMgr::processGroupPropertiesReply(LLMessageSystem* msg, void** data)
{
LL_DEBUGS() << "LLGroupMgr::processGroupPropertiesReply" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupPropertiesReply" << LL_ENDL;
if (!msg)
{
LL_ERRS() << "Can't access the messaging system" << LL_ENDL;
@ -1136,24 +1136,23 @@ void LLGroupMgr::processGroupPropertiesReply(LLMessageSystem* msg, void** data)
group_datap->mGroupPropertiesDataComplete = true;
group_datap->mChanged = TRUE;
// <FS:Beq> FIRE-19734/BUG-227094 stop persistent notification recovery spam
auto request = LLGroupMgr::getInstance()->mPropRequests.find(group_id);
if (request != LLGroupMgr::getInstance()->mPropRequests.end())
{
LLGroupMgr::getInstance()->mPropRequests.erase(request);
}
else
{
LL_DEBUGS() << "GroupPropertyResponse received with no pending request. Response was slow." << LL_ENDL;
}
//</FS:Beq>
properties_request_map_t::iterator request = LLGroupMgr::getInstance()->mPropRequests.find(group_id);
if (request != LLGroupMgr::getInstance()->mPropRequests.end())
{
LLGroupMgr::getInstance()->mPropRequests.erase(request);
}
else
{
LL_DEBUGS("GrpMgr") << "GroupPropertyResponse received with no pending request. Response was slow." << LL_ENDL;
}
LLGroupMgr::getInstance()->notifyObservers(GC_PROPERTIES);
}
// static
void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)
{
LL_DEBUGS() << "LLGroupMgr::processGroupRoleDataReply" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupRoleDataReply" << LL_ENDL;
LLUUID agent_id;
msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
if (gAgent.getID() != agent_id)
@ -1214,7 +1213,7 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)
LL_DEBUGS() << "Adding role data: " << name << " {" << role_id << "}" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "Adding role data: " << name << " {" << role_id << "}" << LL_ENDL;
LLGroupRoleData* rd = new LLGroupRoleData(role_id,name,title,desc,powers,member_count);
group_datap->mRoles[role_id] = rd;
}
@ -1238,7 +1237,7 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)
// static
void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
{
LL_DEBUGS() << "LLGroupMgr::processGroupRoleMembersReply" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupRoleMembersReply" << LL_ENDL;
LLUUID agent_id;
msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
if (gAgent.getID() != agent_id)
@ -1299,7 +1298,7 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
if (rd && md)
{
LL_DEBUGS() << "Adding role-member pair: " << role_id << ", " << member_id << LL_ENDL;
LL_DEBUGS("GrpMgr") << "Adding role-member pair: " << role_id << ", " << member_id << LL_ENDL;
rd->addMember(member_id);
md->addRole(role_id,rd);
}
@ -1351,7 +1350,7 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
// static
void LLGroupMgr::processGroupTitlesReply(LLMessageSystem* msg, void** data)
{
LL_DEBUGS() << "LLGroupMgr::processGroupTitlesReply" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupTitlesReply" << LL_ENDL;
LLUUID agent_id;
msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
if (gAgent.getID() != agent_id)
@ -1384,7 +1383,7 @@ void LLGroupMgr::processGroupTitlesReply(LLMessageSystem* msg, void** data)
if (!title.mTitle.empty())
{
LL_DEBUGS() << "LLGroupMgr adding title: " << title.mTitle << ", " << title.mRoleID << ", " << (title.mSelected ? 'Y' : 'N') << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr adding title: " << title.mTitle << ", " << title.mRoleID << ", " << (title.mSelected ? 'Y' : 'N') << LL_ENDL;
group_datap->mTitles.push_back(title);
}
}
@ -1396,7 +1395,7 @@ void LLGroupMgr::processGroupTitlesReply(LLMessageSystem* msg, void** data)
// static
void LLGroupMgr::processEjectGroupMemberReply(LLMessageSystem* msg, void ** data)
{
LL_DEBUGS() << "processEjectGroupMemberReply" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "processEjectGroupMemberReply" << LL_ENDL;
LLUUID group_id;
msg->getUUIDFast(_PREHASH_GroupData, _PREHASH_GroupID, group_id);
BOOL success;
@ -1412,7 +1411,7 @@ void LLGroupMgr::processEjectGroupMemberReply(LLMessageSystem* msg, void ** data
// static
void LLGroupMgr::processJoinGroupReply(LLMessageSystem* msg, void ** data)
{
LL_DEBUGS() << "processJoinGroupReply" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "processJoinGroupReply" << LL_ENDL;
LLUUID group_id;
BOOL success;
msg->getUUIDFast(_PREHASH_GroupData, _PREHASH_GroupID, group_id);
@ -1432,7 +1431,7 @@ void LLGroupMgr::processJoinGroupReply(LLMessageSystem* msg, void ** data)
// static
void LLGroupMgr::processLeaveGroupReply(LLMessageSystem* msg, void ** data)
{
LL_DEBUGS() << "processLeaveGroupReply" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "processLeaveGroupReply" << LL_ENDL;
LLUUID group_id;
BOOL success;
msg->getUUIDFast(_PREHASH_GroupData, _PREHASH_GroupID, group_id);
@ -1516,29 +1515,27 @@ LLGroupMgrGroupData* LLGroupMgr::createGroupData(const LLUUID& id)
return group_datap;
}
// <FS:Beq> FIRE-19734/BUG-227094 stop persistent notification recovery spam
bool LLGroupMgr::hasPendingPropertyRequest(const LLUUID & id)
{
auto existing_req = LLGroupMgr::getInstance()->mPropRequests.find(id);
if (existing_req != LLGroupMgr::getInstance()->mPropRequests.end())
{
if (gFrameTime - existing_req->second < MIN_GROUP_PROPERTY_REQUEST_FREQ)
{
return true;
}
else
{
LLGroupMgr::getInstance()->mPropRequests.erase(existing_req);
}
}
return false;
properties_request_map_t::iterator existing_req = LLGroupMgr::getInstance()->mPropRequests.find(id);
if (existing_req != LLGroupMgr::getInstance()->mPropRequests.end())
{
if (gFrameTime - existing_req->second < MIN_GROUP_PROPERTY_REQUEST_FREQ)
{
return true;
}
else
{
LLGroupMgr::getInstance()->mPropRequests.erase(existing_req);
}
}
return false;
}
void LLGroupMgr::addPendingPropertyRequest(const LLUUID& id)
{
LLGroupMgr::getInstance()->mPropRequests[id] = gFrameTime;
LLGroupMgr::getInstance()->mPropRequests[id] = gFrameTime;
}
//</FS:Beq>
void LLGroupMgr::notifyObservers(LLGroupChange gc)
{
@ -1622,16 +1619,17 @@ void LLGroupMgr::addGroup(LLGroupMgrGroupData* group_datap)
void LLGroupMgr::sendGroupPropertiesRequest(const LLUUID& group_id)
{
LL_DEBUGS() << "LLGroupMgr::sendGroupPropertiesRequest" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupPropertiesRequest" << LL_ENDL;
// This will happen when we get the reply
//LLGroupMgrGroupData* group_datap = createGroupData(group_id);
// <FS:Beq> FIRE-19734/BUG-227094 stop persistent notification recovery spam
if (LLGroupMgr::getInstance()->hasPendingPropertyRequest(group_id))
{
LL_DEBUGS() << "LLGroupMgr::sendGroupPropertiesRequest suppressed repeat for " << group_id << LL_ENDL;
return;
}
// </FS:Beq>
if (LLGroupMgr::getInstance()->hasPendingPropertyRequest(group_id))
{
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupPropertiesRequest suppressed repeat for " << group_id << LL_ENDL;
return;
}
LLGroupMgr::getInstance()->addPendingPropertyRequest(group_id);
LLMessageSystem* msg = gMessageSystem;
msg->newMessage("GroupProfileRequest");
msg->nextBlock("AgentData");
@ -1640,14 +1638,11 @@ void LLGroupMgr::sendGroupPropertiesRequest(const LLUUID& group_id)
msg->nextBlock("GroupData");
msg->addUUID("GroupID",group_id);
gAgent.sendReliableMessage();
// <FS:Beq> FIRE-19734/BUG-227094 stop persistent notification recovery spam
LLGroupMgr::getInstance()->addPendingPropertyRequest(group_id);
// </FS:Beq>
}
void LLGroupMgr::sendGroupMembersRequest(const LLUUID& group_id)
{
LL_DEBUGS() << "LLGroupMgr::sendGroupMembersRequest" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupMembersRequest" << LL_ENDL;
LLGroupMgrGroupData* group_datap = createGroupData(group_id);
if (group_datap->mMemberRequestID.isNull())
{
@ -1669,7 +1664,7 @@ void LLGroupMgr::sendGroupMembersRequest(const LLUUID& group_id)
void LLGroupMgr::sendGroupRoleDataRequest(const LLUUID& group_id)
{
LL_DEBUGS() << "LLGroupMgr::sendGroupRoleDataRequest" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupRoleDataRequest" << LL_ENDL;
LLGroupMgrGroupData* group_datap = createGroupData(group_id);
if (group_datap->mRoleDataRequestID.isNull())
{
@ -1690,7 +1685,7 @@ void LLGroupMgr::sendGroupRoleDataRequest(const LLUUID& group_id)
void LLGroupMgr::sendGroupRoleMembersRequest(const LLUUID& group_id)
{
LL_DEBUGS() << "LLGroupMgr::sendGroupRoleMembersRequest" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupRoleMembersRequest" << LL_ENDL;
LLGroupMgrGroupData* group_datap = createGroupData(group_id);
if (group_datap->mRoleMembersRequestID.isNull())
@ -1700,7 +1695,7 @@ void LLGroupMgr::sendGroupRoleMembersRequest(const LLUUID& group_id)
|| !group_datap->isRoleDataComplete())
{
// *TODO: KLW FIXME: Should we start a member or role data request?
LL_INFOS() << " Pending: " << (group_datap->mPendingRoleMemberRequest ? "Y" : "N")
LL_INFOS("GrpMgr") << " Pending: " << (group_datap->mPendingRoleMemberRequest ? "Y" : "N")
<< " MemberDataComplete: " << (group_datap->mMemberDataComplete ? "Y" : "N")
<< " RoleDataComplete: " << (group_datap->mRoleDataComplete ? "Y" : "N") << LL_ENDL;
group_datap->mPendingRoleMemberRequest = true;
@ -1724,7 +1719,7 @@ void LLGroupMgr::sendGroupRoleMembersRequest(const LLUUID& group_id)
void LLGroupMgr::sendGroupTitlesRequest(const LLUUID& group_id)
{
LL_DEBUGS() << "LLGroupMgr::sendGroupTitlesRequest" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupTitlesRequest" << LL_ENDL;
LLGroupMgrGroupData* group_datap = createGroupData(group_id);
group_datap->mTitles.clear();
@ -1743,7 +1738,7 @@ void LLGroupMgr::sendGroupTitlesRequest(const LLUUID& group_id)
void LLGroupMgr::sendGroupTitleUpdate(const LLUUID& group_id, const LLUUID& title_role_id)
{
LL_DEBUGS() << "LLGroupMgr::sendGroupTitleUpdate" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupTitleUpdate" << LL_ENDL;
LLMessageSystem* msg = gMessageSystem;
msg->newMessage("GroupTitleUpdate");
@ -1802,7 +1797,7 @@ void LLGroupMgr::sendCreateGroupRequest(const std::string& name,
void LLGroupMgr::sendUpdateGroupInfo(const LLUUID& group_id)
{
LL_DEBUGS() << "LLGroupMgr::sendUpdateGroupInfo" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendUpdateGroupInfo" << LL_ENDL;
LLGroupMgrGroupData* group_datap = createGroupData(group_id);
LLMessageSystem* msg = gMessageSystem;
@ -1831,7 +1826,7 @@ void LLGroupMgr::sendUpdateGroupInfo(const LLUUID& group_id)
void LLGroupMgr::sendGroupRoleMemberChanges(const LLUUID& group_id)
{
LL_DEBUGS() << "LLGroupMgr::sendGroupRoleMemberChanges" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupRoleMemberChanges" << LL_ENDL;
LLGroupMgrGroupData* group_datap = createGroupData(group_id);
if (group_datap->mRoleMemberChanges.empty()) return;
@ -2399,7 +2394,7 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id)
{
LL_DEBUGS() << "LLGroupMgr::sendGroupRoleChanges" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupRoleChanges" << LL_ENDL;
LLGroupMgrGroupData* group_datap = getGroupData(group_id);
if (group_datap && group_datap->pendingRoleChanges())
@ -2414,7 +2409,7 @@ void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id)
void LLGroupMgr::cancelGroupRoleChanges(const LLUUID& group_id)
{
LL_DEBUGS() << "LLGroupMgr::cancelGroupRoleChanges" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::cancelGroupRoleChanges" << LL_ENDL;
LLGroupMgrGroupData* group_datap = getGroupData(group_id);
if (group_datap) group_datap->cancelRoleChanges();
@ -2448,7 +2443,7 @@ bool LLGroupMgr::parseRoleActions(const std::string& xml_filename)
std::string action_set_name;
if (action_set->getAttributeString("name", action_set_name))
{
LL_DEBUGS() << "Loading action set " << action_set_name << LL_ENDL;
LL_DEBUGS("GrpMgr") << "Loading action set " << action_set_name << LL_ENDL;
role_action_data->mName = action_set_name;
}
else
@ -2489,7 +2484,7 @@ bool LLGroupMgr::parseRoleActions(const std::string& xml_filename)
std::string action_name;
if (action->getAttributeString("name", action_name))
{
LL_DEBUGS() << "Loading action " << action_name << LL_ENDL;
LL_DEBUGS("GrpMgr") << "Loading action " << action_name << LL_ENDL;
role_action->mName = action_name;
}
else

View File

@ -458,20 +458,19 @@ private:
void notifyObserver(const LLUUID& group_id, LLGroupChange gc);
void addGroup(LLGroupMgrGroupData* group_datap);
LLGroupMgrGroupData* createGroupData(const LLUUID &id);
// <FS:Beq> FIRE-19734/BUG-227094 stop persistent notification recovery spam
bool hasPendingPropertyRequest(const LLUUID& id);
void addPendingPropertyRequest(const LLUUID& id);
// </FS:Beq>
typedef std::multimap<LLUUID,LLGroupMgrObserver*> observer_multimap_t;
observer_multimap_t mObservers;
typedef std::map<LLUUID, LLGroupMgrGroupData*> group_map_t;
group_map_t mGroups;
// <FS:Beq> FIRE-19734/BUG-227094 stop persistent notification recovery spam
const U64MicrosecondsImplicit MIN_GROUP_PROPERTY_REQUEST_FREQ = 100000;//100ms between requests should be enough to avoid spamming.
typedef std::map<LLUUID, U64MicrosecondsImplicit> properties_request_map_t;
properties_request_map_t mPropRequests;
// </FS:Beq>
typedef std::set<LLParticularGroupObserver*> observer_set_t;
typedef std::map<LLUUID,observer_set_t> observer_map_t;
observer_map_t mParticularObservers;

View File

@ -438,7 +438,8 @@ void LLHUDNameTag::clearString()
void LLHUDNameTag::addLine(const std::string &text_utf8,
const LLColor4& color,
const LLFontGL::StyleFlags style,
const LLFontGL* font)
const LLFontGL* font,
const bool use_ellipses)
{
LLWString wline = utf8str_to_wstring(text_utf8);
if (!wline.empty())
@ -455,18 +456,52 @@ void LLHUDNameTag::addLine(const std::string &text_utf8,
tokenizer tokens(wline, sep);
tokenizer::iterator iter = tokens.begin();
while (iter != tokens.end())
{
U32 line_length = 0;
do
{
F32 max_pixels = HUD_TEXT_MAX_WIDTH;
S32 segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels, wline.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE);
LLHUDTextSegment segment(iter->substr(line_length, segment_length), style, color, font);
mTextSegments.push_back(segment);
line_length += segment_length;
}
while (line_length != iter->size());
const F32 max_pixels = HUD_TEXT_MAX_WIDTH;
while (iter != tokens.end())
{
U32 line_length = 0;
if (use_ellipses)
{
// "QualityAssuranceAssuresQuality1" will end up like "QualityAssuranceAssuresQual..."
// "QualityAssuranceAssuresQuality QualityAssuranceAssuresQuality" will end up like "QualityAssuranceAssuresQual..."
// "QualityAssurance AssuresQuality1" will end up as "QualityAssurance AssuresQua..." because we are enforcing single line
do
{
S32 segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels, wline.length(), LLFontGL::ANYWHERE);
if (segment_length + line_length < wline.length()) // since we only draw one string, line_length should be 0
{
// token does does not fit into signle line, need to draw "...".
// Use four dots for ellipsis width to generate padding
const LLWString dots_pad(utf8str_to_wstring(std::string("....")));
S32 elipses_width = font->getWidthF32(dots_pad.c_str());
// truncated string length
segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels - elipses_width, wline.length(), LLFontGL::ANYWHERE);
const LLWString dots(utf8str_to_wstring(std::string("...")));
LLHUDTextSegment segment(iter->substr(line_length, segment_length) + dots, style, color, font);
mTextSegments.push_back(segment);
break; // consider it to be complete
}
else
{
// token fits fully into string
LLHUDTextSegment segment(iter->substr(line_length, segment_length), style, color, font);
mTextSegments.push_back(segment);
line_length += segment_length;
}
} while (line_length != iter->size());
}
else
{
// "QualityAssuranceAssuresQuality 1" will be split into two lines "QualityAssuranceAssuresQualit" and "y 1"
// "QualityAssurance AssuresQuality 1" will be split into two lines "QualityAssurance" and "AssuresQuality"
do
{
S32 segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels, wline.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE);
LLHUDTextSegment segment(iter->substr(line_length, segment_length), style, color, font);
mTextSegments.push_back(segment);
line_length += segment_length;
} while (line_length != iter->size());
}
++iter;
}
}

View File

@ -94,7 +94,7 @@ public:
void clearString();
// Add text a line at a time, allowing custom formatting
void addLine(const std::string &text_utf8, const LLColor4& color, const LLFontGL::StyleFlags style = LLFontGL::NORMAL, const LLFontGL* font = NULL);
void addLine(const std::string &text_utf8, const LLColor4& color, const LLFontGL::StyleFlags style = LLFontGL::NORMAL, const LLFontGL* font = NULL, const bool use_ellipses = false);
// For bubble chat, set the part above the chat text
void setLabel(const std::string& label_utf8);

View File

@ -522,7 +522,7 @@ static void teleport_region_info_cb(const std::string& slurl, LLSD args, const L
{
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
{
args["POS_SLURL"] = RlvStrings::getString(RLV_STRING_HIDDEN);
args["POS_SLURL"] = RlvStrings::getString(RlvStringKeys::Hidden::Generic);
}
else
{
@ -690,7 +690,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
|| (dialog == IM_FROM_TASK && LLMuteList::getInstance()->isMuted(session_id));
BOOL is_owned_by_me = FALSE;
BOOL is_friend = (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL) ? false : true;
static LLCachedControl<bool> accept_im_from_only_friend(gSavedSettings, "VoiceCallsFriendsOnly");
static LLCachedControl<bool> accept_im_from_only_friend(gSavedPerAccountSettings, "VoiceCallsFriendsOnly");
//BOOL is_linden = chat.mSourceType != CHAT_SOURCE_OBJECT &&
// LLMuteList::getInstance()->isLinden(name); <:FS:TM> Bear compie fix - is_linden not referenced
@ -984,8 +984,8 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
if ( (rlv_handler_t::isEnabled()) && (offline != IM_OFFLINE) && (!RlvActions::canReceiveIM(from_id)) && (!LLMuteList::getInstance()->isLinden(original_name) ))
{
if (!mute_im)
RlvUtil::sendBusyMessage(from_id, RlvStrings::getString(RLV_STRING_BLOCKED_RECVIM_REMOTE), session_id);
message = RlvStrings::getString(RLV_STRING_BLOCKED_RECVIM);
RlvUtil::sendBusyMessage(from_id, RlvStrings::getString(RlvStringKeys::Blocked::RecvImRemote), session_id);
message = RlvStrings::getString(RlvStringKeys::Blocked::RecvIm);
}
// [/RLVa:KB]
@ -1550,7 +1550,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
{
std::string::size_type idxPos = location.find('/');
if ( (std::string::npos != idxPos) && (RlvUtil::isNearbyRegion(location.substr(0, idxPos))) )
location = RlvStrings::getString(RLV_STRING_HIDDEN_REGION);
location = RlvStrings::getString(RlvStringKeys::Hidden::Region);
}
}
// [/RLVa:KB]
@ -1761,7 +1761,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
}
// <FS:PP> FIRE-1245: Option to block/reject teleport offers
//else if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL))
//else if (gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL))
//{
// return;
//}
@ -1839,7 +1839,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
if ( ((IM_LURE_USER == dialog) && (!RlvActions::canAcceptTpOffer(from_id))) ||
((IM_TELEPORT_REQUEST == dialog) && (!RlvActions::canAcceptTpRequest(from_id))) )
{
RlvUtil::sendBusyMessage(from_id, RlvStrings::getString(RLV_STRING_BLOCKED_TPLUREREQ_REMOTE));
RlvUtil::sendBusyMessage(from_id, RlvStrings::getString(RlvStringKeys::Blocked::TpLureRequestRemote));
if (is_do_not_disturb)
send_do_not_disturb_message(gMessageSystem, from_id);
return;
@ -1849,7 +1849,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
if ( (!RlvActions::canReceiveIM(from_id)) ||
((gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) && (IM_LURE_USER == dialog || IM_TELEPORT_REQUEST == dialog)) )
{
message = RlvStrings::getString(RLV_STRING_HIDDEN);
message = RlvStrings::getString(RlvStringKeys::Hidden::Generic);
}
}
// [/RLVa:KB]

View File

@ -652,7 +652,7 @@ LLIMModel::LLIMModel()
addNewMsgCallback(boost::bind(&FSFloaterIM::newIMCallback, _1));
// </FS:Ansariel> [FS communication UI]
addNewMsgCallback(boost::bind(&on_new_message, _1));
LLCallDialogManager::instance();
}
LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const uuid_vec_t& ids, bool voice, bool has_offline_msg)
@ -2975,8 +2975,8 @@ void LLIMMgr::addMessage(
bool skip_message = false;
bool from_linden = LLMuteList::getInstance()->isLinden(from);
// <FS:Ansariel> FIRE-14564: VoiceCallFriendsOnly prevents receiving of
//if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && !from_linden)
if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && !from_linden &&
//if (gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly") && !from_linden)
if (gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly") && !from_linden &&
(dialog == IM_NOTHING_SPECIAL || (dialog == IM_SESSION_INVITE && !gAgent.isInGroup(new_session_id))) )
// </FS:Ansariel>
{
@ -3012,7 +3012,7 @@ void LLIMMgr::addMessage(
// session id, so we can leave it!
if (is_group_chat && !exoGroupMuteList::instance().isLoaded())
{
LL_INFOS() << "Received group chat from " << fixed_session_name << " (" << new_session_id.asString() << ") before must list has been loaded - skipping message" << LL_ENDL;
LL_INFOS() << "Received group chat from " << fixed_session_name << " (" << new_session_id.asString() << ") before mute list has been loaded - skipping message" << LL_ENDL;
exoGroupMuteList::instance().addDeferredGroupChat(new_session_id);
return;
}
@ -3039,7 +3039,7 @@ void LLIMMgr::addMessage(
if (IM_NOTHING_SPECIAL != dialog && IM_SESSION_P2P_INVITE != dialog &&
gAgent.isInGroup(new_session_id) && LLMuteList::getInstance()->isMuted(other_participant_id) && !from_linden)
{
LL_INFOS() << "Ignoring group chat initiated by muted resident." << LL_ENDL;
LL_INFOS() << "Ignoring group chat from " << fixed_session_name << " (" << new_session_id.asString() << ") initiated by muted resident." << LL_ENDL;
exoGroupMuteList::instance().addDeferredGroupChat(new_session_id);
return;
}
@ -3090,7 +3090,7 @@ void LLIMMgr::addMessage(
// <FS:PP> Configurable IM sounds
// //Play sound for new conversations
// if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation") == TRUE))
// if (!skip_message & !gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation") == TRUE))
// <FS:PP> Option to automatically ignore and leave all conference (ad-hoc) chats
static LLCachedControl<bool> ignoreAdHocSessions(gSavedSettings, "FSIgnoreAdHocSessions");
@ -3563,7 +3563,7 @@ void LLIMMgr::inviteToSession(
if (voice_invite)
{
bool isRejectGroupCall = (gSavedSettings.getBOOL("VoiceCallsRejectGroup") && (notify_box_type == "VoiceInviteGroup"));
bool isRejectNonFriendCall = (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL));
bool isRejectNonFriendCall = (gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL));
// <FS:PP> FIRE-6522: Options to automatically decline all group and personal voice chat requests
// if (isRejectGroupCall || isRejectNonFriendCall || gAgent.isDoNotDisturb())
bool isRejectAdHocCall = (gSavedSettings.getBOOL("VoiceCallsRejectAdHoc") && (notify_box_type == "VoiceInviteAdHoc"));
@ -4023,7 +4023,7 @@ void typingNameCallback(const LLUUID& av_id, const LLAvatarName& av_name, const
BOOL is_muted = LLMuteList::getInstance()->isMuted(av_id, av_name.getCompleteName(), LLMute::flagTextChat);
bool is_friend = (LLAvatarTracker::instance().getBuddyInfo(av_id) == NULL) ? false : true;
static LLCachedControl<bool> VoiceCallsFriendsOnly(gSavedSettings, "VoiceCallsFriendsOnly");
static LLCachedControl<bool> VoiceCallsFriendsOnly(gSavedPerAccountSettings, "VoiceCallsFriendsOnly");
if (!is_muted && ( (VoiceCallsFriendsOnly && is_friend) || !VoiceCallsFriendsOnly ))
{
@ -4365,7 +4365,7 @@ public:
}
else if (!RlvActions::canReceiveIM(from_id)) // Conference chat: don't block; censor if not an exception
{
message = RlvStrings::getString(RLV_STRING_BLOCKED_RECVIM);
message = RlvStrings::getString(RlvStringKeys::Blocked::RecvIm);
}
}
// [/RLVa:KB]

View File

@ -63,6 +63,7 @@
#include "lltoggleablemenu.h"
#include "lluictrl.h"
#include "llviewerregion.h"
#include "rlvactions.h"
// </FS:Ansariel>
class LLFetchAvatarData;
@ -152,6 +153,7 @@ private:
bool enableUnmute();
bool enableTeleportOffer();
bool enableTeleportRequest();
bool enablePay();
bool godModeEnabled();
// Is used to determine if "Add friend" option should be enabled in gear menu
@ -257,6 +259,7 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableCall", boost::bind(&LLAvatarActions::canCall));
mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableTeleportOffer", boost::bind(&LLInspectAvatar::enableTeleportOffer, this));
mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableTeleportRequest", boost::bind(&LLInspectAvatar::enableTeleportRequest, this));
mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnablePay", boost::bind(&LLInspectAvatar::enablePay, this));
mEnableCallbackRegistrar.add("InspectAvatar.EnableMute", boost::bind(&LLInspectAvatar::enableMute, this));
mEnableCallbackRegistrar.add("InspectAvatar.EnableUnmute", boost::bind(&LLInspectAvatar::enableUnmute, this));
// </FS:Ansariel>
@ -859,6 +862,11 @@ bool LLInspectAvatar::enableTeleportRequest()
return LLAvatarActions::canRequestTeleport(mAvatarID);
}
bool LLInspectAvatar::enablePay()
{
return RlvActions::canPayAvatar(mAvatarID);
}
bool LLInspectAvatar::godModeEnabled()
{
return gAgent.isGodlike();

View File

@ -200,7 +200,7 @@ void LLInspectRemoteObject::update()
getChild<LLUICtrl>("block_btn")->setEnabled(!mObjectID.isNull() && !LLMuteList::getInstance()->isMuted(mObjectID));
// [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.0f) | Added: RLVa-1.2.0f
if ( (rlv_handler_t::isEnabled()) && (RlvStrings::getString(RLV_STRING_HIDDEN_REGION) == mSLurl) )
if ( (rlv_handler_t::isEnabled()) && (RlvStrings::getString(RlvStringKeys::Hidden::Region) == mSLurl) )
{
getChild<LLUICtrl>("object_slurl")->setValue(mSLurl);
getChild<LLUICtrl>("map_btn")->setEnabled(false);

View File

@ -4102,7 +4102,7 @@ void LLFolderBridge::perform_pasteFromClipboard()
// [RLVa:KB] - Checked: RLVa-2.1.0
if ( ((item) && (!RlvActions::canPasteInventory(item, dest_folder))) || ((cat) && (!RlvActions::canPasteInventory(cat, dest_folder))) )
{
RlvActions::notifyBlocked(RLV_STRING_BLOCKED_INVFOLDER);
RlvActions::notifyBlocked(RlvStringKeys::Blocked::InvFolder);
return;
}
// [/RLVa:KB]
@ -4512,12 +4512,6 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
items.push_back(std::string("New Body Parts"));
items.push_back(std::string("New Settings"));
items.push_back(std::string("upload_def"));
if (!LLEnvironment::instance().isInventoryEnabled())
{
disabled_items.push_back("New Settings");
}
}
}
getClipboardEntries(false, items, disabled_items, flags);

View File

@ -1798,7 +1798,10 @@ void LLInventoryModel::idleNotifyObservers()
}
// Call this method when it's time to update everyone on a new state.
void LLInventoryModel::notifyObservers()
//void LLInventoryModel::notifyObservers()
// [SL:KB] - Patch: UI-Notifications | Checked: Catznip-6.5
void LLInventoryModel::notifyObservers(const LLUUID& transaction_id)
// [/SL:KB]
{
if (mIsNotifyObservers)
{
@ -1810,6 +1813,9 @@ void LLInventoryModel::notifyObservers()
}
mIsNotifyObservers = TRUE;
// [SL:KB] - Patch: UI-Notifications | Checked: Catznip-6.5
mTransactionId = transaction_id;
// [/SL:KB]
for (observer_list_t::iterator iter = mObservers.begin();
iter != mObservers.end(); )
{
@ -1823,6 +1829,9 @@ void LLInventoryModel::notifyObservers()
mModifyMask = LLInventoryObserver::NONE;
mChangedItemIDs.clear();
mAddedItemIDs.clear();
// [SL:KB] - Patch: UI-Notifications | Checked: Catznip-6.5
mTransactionId.setNull();
// [/SL:KB]
mIsNotifyObservers = FALSE;
}
@ -3531,7 +3540,10 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
{
gInventory.updateItem(*iit);
}
gInventory.notifyObservers();
// [SL:KB] - Patch: UI-Notifications | Checked: Catznip-6.5
gInventory.notifyObservers(tid);
// [/SL:KB]
// gInventory.notifyObservers();
// The incoming inventory could span more than one BulkInventoryUpdate packet,
// so record the transaction ID for this purchase, then wear all clothing

View File

@ -564,7 +564,10 @@ public:
void idleNotifyObservers();
// Call to explicitly update everyone on a new state.
void notifyObservers();
// [SL:KB] - Patch: UI-Notifications | Checked: Catznip-6.5
void notifyObservers(const LLUUID& transaction_id = LLUUID::null);
// [/SL:KB]
// void notifyObservers();
// Allows outsiders to tell the inventory if something has
// been changed 'under the hood', but outside the control of the
@ -573,6 +576,9 @@ public:
const changed_items_t& getChangedIDs() const { return mChangedItemIDs; }
const changed_items_t& getAddedIDs() const { return mAddedItemIDs; }
// [SL:KB] - Patch: UI-Notifications | Checked: Catznip-6.5
const LLUUID& getTransactionId() const { return mTransactionId; }
// [/SL:KB]
protected:
// Updates all linked items pointing to this id.
void addChangedMaskForLinks(const LLUUID& object_id, U32 mask);
@ -584,6 +590,9 @@ private:
U32 mModifyMask;
changed_items_t mChangedItemIDs;
changed_items_t mAddedItemIDs;
// [SL:KB] - Patch: UI-Notifications | Checked: Catznip-6.5
LLUUID mTransactionId;
// [/SL:KB]
//--------------------------------------------------------------------

View File

@ -1542,7 +1542,7 @@ bool LLInventoryPanel::beginIMSession()
if (!fRlvCanStartIM)
{
make_ui_sound("UISndInvalidOp");
RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_STARTCONF);
RlvUtil::notifyBlocked(RlvStringKeys::Blocked::StartConference);
return true;
}
// [/RLVa:KB]

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