Merge viewer-neko

master
Ansariel 2019-08-04 12:09:33 +02:00
commit 529569cdd9
61 changed files with 895 additions and 460 deletions

View File

@ -107,11 +107,11 @@ BOOL LLGesture::trigger(const std::string& trigger_string)
// NOT endian-neutral
U8 *LLGesture::serialize(U8 *buffer) const
{
htonmemcpy(buffer, &mKey, MVT_S8, 1);
htolememcpy(buffer, &mKey, MVT_S8, 1);
buffer += sizeof(mKey);
htonmemcpy(buffer, &mMask, MVT_U32, 4);
htolememcpy(buffer, &mMask, MVT_U32, 4);
buffer += sizeof(mMask);
htonmemcpy(buffer, mSoundItemID.mData, MVT_LLUUID, 16);
htolememcpy(buffer, mSoundItemID.mData, MVT_LLUUID, 16);
buffer += 16;
memcpy(buffer, mTrigger.c_str(), mTrigger.length() + 1); /* Flawfinder: ignore */
@ -134,11 +134,11 @@ U8 *LLGesture::deserialize(U8 *buffer, S32 max_size)
return buffer;
}
htonmemcpy(&mKey, tmp, MVT_S8, 1);
htolememcpy(&mKey, tmp, MVT_S8, 1);
tmp += sizeof(mKey);
htonmemcpy(&mMask, tmp, MVT_U32, 4);
htolememcpy(&mMask, tmp, MVT_U32, 4);
tmp += sizeof(mMask);
htonmemcpy(mSoundItemID.mData, tmp, MVT_LLUUID, 16);
htolememcpy(mSoundItemID.mData, tmp, MVT_LLUUID, 16);
tmp += 16;
mTrigger.assign((char *)tmp);
@ -284,7 +284,7 @@ U8 *LLGestureList::serialize(U8 *buffer) const
{
// a single S32 serves as the header that tells us how many to read
U32 count = mList.size();
htonmemcpy(buffer, &count, MVT_S32, 4);
htolememcpy(buffer, &count, MVT_S32, 4);
buffer += sizeof(count);
for (S32 i = 0; i < count; i++)
@ -310,7 +310,7 @@ U8 *LLGestureList::deserialize(U8 *buffer, S32 max_size)
return buffer;
}
htonmemcpy(&count, tmp, MVT_S32, 4);
htolememcpy(&count, tmp, MVT_S32, 4);
if (count > MAX_GESTURES)
{

View File

@ -187,7 +187,7 @@ BOOL LLDataPackerBinaryBuffer::packString(const std::string& value, const char *
if (mWriteEnabled)
{
htonmemcpy(mCurBufferp, value.c_str(), MVT_VARIABLE, length);
htolememcpy(mCurBufferp, value.c_str(), MVT_VARIABLE, length);
}
mCurBufferp += length;
return TRUE;
@ -218,12 +218,12 @@ BOOL LLDataPackerBinaryBuffer::packBinaryData(const U8 *value, S32 size, const c
if (mWriteEnabled)
{
htonmemcpy(mCurBufferp, &size, MVT_S32, 4);
htolememcpy(mCurBufferp, &size, MVT_S32, 4);
}
mCurBufferp += 4;
if (mWriteEnabled)
{
htonmemcpy(mCurBufferp, value, MVT_VARIABLE, size);
htolememcpy(mCurBufferp, value, MVT_VARIABLE, size);
}
mCurBufferp += size;
return TRUE;
@ -238,7 +238,7 @@ BOOL LLDataPackerBinaryBuffer::unpackBinaryData(U8 *value, S32 &size, const char
return FALSE;
}
htonmemcpy(&size, mCurBufferp, MVT_S32, 4);
htolememcpy(&size, mCurBufferp, MVT_S32, 4);
mCurBufferp += 4;
if (!verifyLength(size, name))
@ -247,7 +247,7 @@ BOOL LLDataPackerBinaryBuffer::unpackBinaryData(U8 *value, S32 &size, const char
return FALSE;
}
htonmemcpy(value, mCurBufferp, MVT_VARIABLE, size);
htolememcpy(value, mCurBufferp, MVT_VARIABLE, size);
mCurBufferp += size;
return TRUE;
@ -263,7 +263,7 @@ BOOL LLDataPackerBinaryBuffer::packBinaryDataFixed(const U8 *value, S32 size, co
if (mWriteEnabled)
{
htonmemcpy(mCurBufferp, value, MVT_VARIABLE, size);
htolememcpy(mCurBufferp, value, MVT_VARIABLE, size);
}
mCurBufferp += size;
return TRUE;
@ -276,7 +276,7 @@ BOOL LLDataPackerBinaryBuffer::unpackBinaryDataFixed(U8 *value, S32 size, const
{
return FALSE;
}
htonmemcpy(value, mCurBufferp, MVT_VARIABLE, size);
htolememcpy(value, mCurBufferp, MVT_VARIABLE, size);
mCurBufferp += size;
return TRUE;
}
@ -320,7 +320,7 @@ BOOL LLDataPackerBinaryBuffer::packU16(const U16 value, const char *name)
if (mWriteEnabled)
{
htonmemcpy(mCurBufferp, &value, MVT_U16, 2);
htolememcpy(mCurBufferp, &value, MVT_U16, 2);
}
mCurBufferp += 2;
return TRUE;
@ -334,7 +334,7 @@ BOOL LLDataPackerBinaryBuffer::unpackU16(U16 &value, const char *name)
return FALSE;
}
htonmemcpy(&value, mCurBufferp, MVT_U16, 2);
htolememcpy(&value, mCurBufferp, MVT_U16, 2);
mCurBufferp += 2;
return TRUE;
}
@ -349,7 +349,7 @@ BOOL LLDataPackerBinaryBuffer::packU32(const U32 value, const char *name)
if (mWriteEnabled)
{
htonmemcpy(mCurBufferp, &value, MVT_U32, 4);
htolememcpy(mCurBufferp, &value, MVT_U32, 4);
}
mCurBufferp += 4;
return TRUE;
@ -363,7 +363,7 @@ BOOL LLDataPackerBinaryBuffer::unpackU32(U32 &value, const char *name)
return FALSE;
}
htonmemcpy(&value, mCurBufferp, MVT_U32, 4);
htolememcpy(&value, mCurBufferp, MVT_U32, 4);
mCurBufferp += 4;
return TRUE;
}
@ -378,7 +378,7 @@ BOOL LLDataPackerBinaryBuffer::packS32(const S32 value, const char *name)
if (mWriteEnabled)
{
htonmemcpy(mCurBufferp, &value, MVT_S32, 4);
htolememcpy(mCurBufferp, &value, MVT_S32, 4);
}
mCurBufferp += 4;
return TRUE;
@ -392,7 +392,7 @@ BOOL LLDataPackerBinaryBuffer::unpackS32(S32 &value, const char *name)
return FALSE;
}
htonmemcpy(&value, mCurBufferp, MVT_S32, 4);
htolememcpy(&value, mCurBufferp, MVT_S32, 4);
mCurBufferp += 4;
return TRUE;
}
@ -407,7 +407,7 @@ BOOL LLDataPackerBinaryBuffer::packF32(const F32 value, const char *name)
if (mWriteEnabled)
{
htonmemcpy(mCurBufferp, &value, MVT_F32, 4);
htolememcpy(mCurBufferp, &value, MVT_F32, 4);
}
mCurBufferp += 4;
return TRUE;
@ -421,7 +421,7 @@ BOOL LLDataPackerBinaryBuffer::unpackF32(F32 &value, const char *name)
return FALSE;
}
htonmemcpy(&value, mCurBufferp, MVT_F32, 4);
htolememcpy(&value, mCurBufferp, MVT_F32, 4);
mCurBufferp += 4;
return TRUE;
}
@ -436,7 +436,7 @@ BOOL LLDataPackerBinaryBuffer::packColor4(const LLColor4 &value, const char *nam
if (mWriteEnabled)
{
htonmemcpy(mCurBufferp, value.mV, MVT_LLVector4, 16);
htolememcpy(mCurBufferp, value.mV, MVT_LLVector4, 16);
}
mCurBufferp += 16;
return TRUE;
@ -450,7 +450,7 @@ BOOL LLDataPackerBinaryBuffer::unpackColor4(LLColor4 &value, const char *name)
return FALSE;
}
htonmemcpy(value.mV, mCurBufferp, MVT_LLVector4, 16);
htolememcpy(value.mV, mCurBufferp, MVT_LLVector4, 16);
mCurBufferp += 16;
return TRUE;
}
@ -465,7 +465,7 @@ BOOL LLDataPackerBinaryBuffer::packColor4U(const LLColor4U &value, const char *n
if (mWriteEnabled)
{
htonmemcpy(mCurBufferp, value.mV, MVT_VARIABLE, 4);
htolememcpy(mCurBufferp, value.mV, MVT_VARIABLE, 4);
}
mCurBufferp += 4;
return TRUE;
@ -479,7 +479,7 @@ BOOL LLDataPackerBinaryBuffer::unpackColor4U(LLColor4U &value, const char *name)
return FALSE;
}
htonmemcpy(value.mV, mCurBufferp, MVT_VARIABLE, 4);
htolememcpy(value.mV, mCurBufferp, MVT_VARIABLE, 4);
mCurBufferp += 4;
return TRUE;
}
@ -495,8 +495,8 @@ BOOL LLDataPackerBinaryBuffer::packVector2(const LLVector2 &value, const char *n
if (mWriteEnabled)
{
htonmemcpy(mCurBufferp, &value.mV[0], MVT_F32, 4);
htonmemcpy(mCurBufferp+4, &value.mV[1], MVT_F32, 4);
htolememcpy(mCurBufferp, &value.mV[0], MVT_F32, 4);
htolememcpy(mCurBufferp+4, &value.mV[1], MVT_F32, 4);
}
mCurBufferp += 8;
return TRUE;
@ -510,8 +510,8 @@ BOOL LLDataPackerBinaryBuffer::unpackVector2(LLVector2 &value, const char *name)
return FALSE;
}
htonmemcpy(&value.mV[0], mCurBufferp, MVT_F32, 4);
htonmemcpy(&value.mV[1], mCurBufferp+4, MVT_F32, 4);
htolememcpy(&value.mV[0], mCurBufferp, MVT_F32, 4);
htolememcpy(&value.mV[1], mCurBufferp+4, MVT_F32, 4);
mCurBufferp += 8;
return TRUE;
}
@ -526,7 +526,7 @@ BOOL LLDataPackerBinaryBuffer::packVector3(const LLVector3 &value, const char *n
if (mWriteEnabled)
{
htonmemcpy(mCurBufferp, value.mV, MVT_LLVector3, 12);
htolememcpy(mCurBufferp, value.mV, MVT_LLVector3, 12);
}
mCurBufferp += 12;
return TRUE;
@ -540,7 +540,7 @@ BOOL LLDataPackerBinaryBuffer::unpackVector3(LLVector3 &value, const char *name)
return FALSE;
}
htonmemcpy(value.mV, mCurBufferp, MVT_LLVector3, 12);
htolememcpy(value.mV, mCurBufferp, MVT_LLVector3, 12);
mCurBufferp += 12;
return TRUE;
}
@ -554,7 +554,7 @@ BOOL LLDataPackerBinaryBuffer::packVector4(const LLVector4 &value, const char *n
if (mWriteEnabled)
{
htonmemcpy(mCurBufferp, value.mV, MVT_LLVector4, 16);
htolememcpy(mCurBufferp, value.mV, MVT_LLVector4, 16);
}
mCurBufferp += 16;
return TRUE;
@ -568,7 +568,7 @@ BOOL LLDataPackerBinaryBuffer::unpackVector4(LLVector4 &value, const char *name)
return FALSE;
}
htonmemcpy(value.mV, mCurBufferp, MVT_LLVector4, 16);
htolememcpy(value.mV, mCurBufferp, MVT_LLVector4, 16);
mCurBufferp += 16;
return TRUE;
}
@ -582,7 +582,7 @@ BOOL LLDataPackerBinaryBuffer::packUUID(const LLUUID &value, const char *name)
if (mWriteEnabled)
{
htonmemcpy(mCurBufferp, value.mData, MVT_LLUUID, 16);
htolememcpy(mCurBufferp, value.mData, MVT_LLUUID, 16);
}
mCurBufferp += 16;
return TRUE;
@ -596,7 +596,7 @@ BOOL LLDataPackerBinaryBuffer::unpackUUID(LLUUID &value, const char *name)
return FALSE;
}
htonmemcpy(value.mData, mCurBufferp, MVT_LLUUID, 16);
htolememcpy(value.mData, mCurBufferp, MVT_LLUUID, 16);
mCurBufferp += 16;
return TRUE;
}

View File

@ -373,7 +373,7 @@ std::string LLMail::encryptIMEmailAddress(const LLUUID& from_agent_id,
// Convert input data into a binary blob
std::vector<U8> data;
data.resize(data_size);
// *NOTE: This may suffer from endian issues. Could be htonmemcpy.
// *NOTE: This may suffer from endian issues. Could be htolememcpy.
memcpy(&data[0], &time, 4);
memcpy(&data[4], &from_agent_id.mData[0], UUID_BYTES);
memcpy(&data[4 + UUID_BYTES], &to_agent_id.mData[0], UUID_BYTES);

View File

@ -47,7 +47,7 @@ void LLMsgVarData::addData(const void *data, S32 size, EMsgVariableType type, S3
{
delete[] mData; // Delete it if it already exists
mData = new U8[size];
htonmemcpy(mData, data, mType, size);
htolememcpy(mData, data, mType, size);
}
}

View File

@ -689,14 +689,14 @@ static S32 buildBlock(U8* buffer, S32 buffer_size, const LLMessageBlock* templat
{
case 1:
sizeb = size;
htonmemcpy(&buffer[result], &sizeb, MVT_U8, 1);
htolememcpy(&buffer[result], &sizeb, MVT_U8, 1);
break;
case 2:
sizeh = size;
htonmemcpy(&buffer[result], &sizeh, MVT_U16, 2);
htolememcpy(&buffer[result], &sizeh, MVT_U16, 2);
break;
case 4:
htonmemcpy(&buffer[result], &size, MVT_S32, 4);
htolememcpy(&buffer[result], &size, MVT_S32, 4);
break;
default:
LL_ERRS() << "Attempting to build variable field with unknown size of " << size << LL_ENDL;

View File

@ -647,15 +647,15 @@ BOOL LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender
switch(data_size)
{
case 1:
htonmemcpy(&tsizeb, &buffer[decode_pos], MVT_U8, 1);
htolememcpy(&tsizeb, &buffer[decode_pos], MVT_U8, 1);
tsize = tsizeb;
break;
case 2:
htonmemcpy(&tsizeh, &buffer[decode_pos], MVT_U16, 2);
htolememcpy(&tsizeh, &buffer[decode_pos], MVT_U16, 2);
tsize = tsizeh;
break;
case 4:
htonmemcpy(&tsize, &buffer[decode_pos], MVT_U32, 4);
htolememcpy(&tsize, &buffer[decode_pos], MVT_U32, 4);
break;
default:
LL_ERRS() << "Attempting to read variable field with unknown size of " << data_size << LL_ENDL;

View File

@ -245,7 +245,7 @@ void LLXfer::sendPacket(S32 packet_num)
num_copy);
}
fdata_size += sizeof(S32);
htonmemcpy(fdata_buf,&mXferSize, MVT_S32, sizeof(S32));
htolememcpy(fdata_buf,&mXferSize, MVT_S32, sizeof(S32));
}
S32 encoded_packetnum = encodePacketNum(packet_num,last_packet);

View File

@ -866,10 +866,10 @@ void null_message_callback(LLMessageSystem *msg, void **data);
//
#if !defined( LL_BIG_ENDIAN ) && !defined( LL_LITTLE_ENDIAN )
#error Unknown endianness for htonmemcpy. Did you miss a common include?
#error Unknown endianness for htolememcpy. Did you miss a common include?
#endif
static inline void *htonmemcpy(void *vs, const void *vct, EMsgVariableType type, size_t n)
static inline void *htolememcpy(void *vs, const void *vct, EMsgVariableType type, size_t n)
{
char *s = (char *)vs;
const char *ct = (const char *)vct;
@ -892,7 +892,7 @@ static inline void *htonmemcpy(void *vs, const void *vct, EMsgVariableType type,
case MVT_S16:
if (n != 2)
{
LL_ERRS() << "Size argument passed to htonmemcpy doesn't match swizzle type size" << LL_ENDL;
LL_ERRS() << "Size argument passed to htolememcpy doesn't match swizzle type size" << LL_ENDL;
}
#ifdef LL_BIG_ENDIAN
*(s + 1) = *(ct);
@ -907,7 +907,7 @@ static inline void *htonmemcpy(void *vs, const void *vct, EMsgVariableType type,
case MVT_F32:
if (n != 4)
{
LL_ERRS() << "Size argument passed to htonmemcpy doesn't match swizzle type size" << LL_ENDL;
LL_ERRS() << "Size argument passed to htolememcpy doesn't match swizzle type size" << LL_ENDL;
}
#ifdef LL_BIG_ENDIAN
*(s + 3) = *(ct);
@ -924,7 +924,7 @@ static inline void *htonmemcpy(void *vs, const void *vct, EMsgVariableType type,
case MVT_F64:
if (n != 8)
{
LL_ERRS() << "Size argument passed to htonmemcpy doesn't match swizzle type size" << LL_ENDL;
LL_ERRS() << "Size argument passed to htolememcpy doesn't match swizzle type size" << LL_ENDL;
}
#ifdef LL_BIG_ENDIAN
*(s + 7) = *(ct);
@ -944,12 +944,12 @@ static inline void *htonmemcpy(void *vs, const void *vct, EMsgVariableType type,
case MVT_LLQuaternion: // We only send x, y, z and infer w (we set x, y, z to ensure that w >= 0)
if (n != 12)
{
LL_ERRS() << "Size argument passed to htonmemcpy doesn't match swizzle type size" << LL_ENDL;
LL_ERRS() << "Size argument passed to htolememcpy doesn't match swizzle type size" << LL_ENDL;
}
#ifdef LL_BIG_ENDIAN
htonmemcpy(s + 8, ct + 8, MVT_F32, 4);
htonmemcpy(s + 4, ct + 4, MVT_F32, 4);
return(htonmemcpy(s, ct, MVT_F32, 4));
htolememcpy(s + 8, ct + 8, MVT_F32, 4);
htolememcpy(s + 4, ct + 4, MVT_F32, 4);
return(htolememcpy(s, ct, MVT_F32, 4));
#else
return(memcpy(s,ct,n)); /* Flawfinder: ignore */
#endif
@ -957,12 +957,12 @@ static inline void *htonmemcpy(void *vs, const void *vct, EMsgVariableType type,
case MVT_LLVector3d:
if (n != 24)
{
LL_ERRS() << "Size argument passed to htonmemcpy doesn't match swizzle type size" << LL_ENDL;
LL_ERRS() << "Size argument passed to htolememcpy doesn't match swizzle type size" << LL_ENDL;
}
#ifdef LL_BIG_ENDIAN
htonmemcpy(s + 16, ct + 16, MVT_F64, 8);
htonmemcpy(s + 8, ct + 8, MVT_F64, 8);
return(htonmemcpy(s, ct, MVT_F64, 8));
htolememcpy(s + 16, ct + 16, MVT_F64, 8);
htolememcpy(s + 8, ct + 8, MVT_F64, 8);
return(htolememcpy(s, ct, MVT_F64, 8));
#else
return(memcpy(s,ct,n)); /* Flawfinder: ignore */
#endif
@ -970,13 +970,13 @@ static inline void *htonmemcpy(void *vs, const void *vct, EMsgVariableType type,
case MVT_LLVector4:
if (n != 16)
{
LL_ERRS() << "Size argument passed to htonmemcpy doesn't match swizzle type size" << LL_ENDL;
LL_ERRS() << "Size argument passed to htolememcpy doesn't match swizzle type size" << LL_ENDL;
}
#ifdef LL_BIG_ENDIAN
htonmemcpy(s + 12, ct + 12, MVT_F32, 4);
htonmemcpy(s + 8, ct + 8, MVT_F32, 4);
htonmemcpy(s + 4, ct + 4, MVT_F32, 4);
return(htonmemcpy(s, ct, MVT_F32, 4));
htolememcpy(s + 12, ct + 12, MVT_F32, 4);
htolememcpy(s + 8, ct + 8, MVT_F32, 4);
htolememcpy(s + 4, ct + 4, MVT_F32, 4);
return(htolememcpy(s, ct, MVT_F32, 4));
#else
return(memcpy(s,ct,n)); /* Flawfinder: ignore */
#endif
@ -984,12 +984,12 @@ static inline void *htonmemcpy(void *vs, const void *vct, EMsgVariableType type,
case MVT_U16Vec3:
if (n != 6)
{
LL_ERRS() << "Size argument passed to htonmemcpy doesn't match swizzle type size" << LL_ENDL;
LL_ERRS() << "Size argument passed to htolememcpy doesn't match swizzle type size" << LL_ENDL;
}
#ifdef LL_BIG_ENDIAN
htonmemcpy(s + 4, ct + 4, MVT_U16, 2);
htonmemcpy(s + 2, ct + 2, MVT_U16, 2);
return(htonmemcpy(s, ct, MVT_U16, 2));
htolememcpy(s + 4, ct + 4, MVT_U16, 2);
htolememcpy(s + 2, ct + 2, MVT_U16, 2);
return(htolememcpy(s, ct, MVT_U16, 2));
#else
return(memcpy(s,ct,n)); /* Flawfinder: ignore */
#endif
@ -997,13 +997,13 @@ static inline void *htonmemcpy(void *vs, const void *vct, EMsgVariableType type,
case MVT_U16Quat:
if (n != 8)
{
LL_ERRS() << "Size argument passed to htonmemcpy doesn't match swizzle type size" << LL_ENDL;
LL_ERRS() << "Size argument passed to htolememcpy doesn't match swizzle type size" << LL_ENDL;
}
#ifdef LL_BIG_ENDIAN
htonmemcpy(s + 6, ct + 6, MVT_U16, 2);
htonmemcpy(s + 4, ct + 4, MVT_U16, 2);
htonmemcpy(s + 2, ct + 2, MVT_U16, 2);
return(htonmemcpy(s, ct, MVT_U16, 2));
htolememcpy(s + 6, ct + 6, MVT_U16, 2);
htolememcpy(s + 4, ct + 4, MVT_U16, 2);
htolememcpy(s + 2, ct + 2, MVT_U16, 2);
return(htolememcpy(s, ct, MVT_U16, 2));
#else
return(memcpy(s,ct,n)); /* Flawfinder: ignore */
#endif
@ -1011,15 +1011,15 @@ static inline void *htonmemcpy(void *vs, const void *vct, EMsgVariableType type,
case MVT_S16Array:
if (n % 2)
{
LL_ERRS() << "Size argument passed to htonmemcpy doesn't match swizzle type size" << LL_ENDL;
LL_ERRS() << "Size argument passed to htolememcpy doesn't match swizzle type size" << LL_ENDL;
}
#ifdef LL_BIG_ENDIAN
length = n % 2;
for (i = 1; i < length; i++)
{
htonmemcpy(s + i*2, ct + i*2, MVT_S16, 2);
htolememcpy(s + i*2, ct + i*2, MVT_S16, 2);
}
return(htonmemcpy(s, ct, MVT_S16, 2));
return(htolememcpy(s, ct, MVT_S16, 2));
#else
return(memcpy(s,ct,n));
#endif
@ -1031,7 +1031,7 @@ static inline void *htonmemcpy(void *vs, const void *vct, EMsgVariableType type,
inline void *ntohmemcpy(void *s, const void *ct, EMsgVariableType type, size_t n)
{
return(htonmemcpy(s,ct,type, n));
return(htolememcpy(s,ct,type, n));
}
inline const LLHost& LLMessageSystem::getReceivingInterface() const {return mLastReceivingIF;}

View File

@ -33,7 +33,7 @@
#include "llpluginmessagepipe.h"
#include "llpluginmessageclasses.h"
static const F32 GOODBYE_SECONDS = 20.0f;
static const F32 GOODBYE_SECONDS = 12.0f; // Do not set it to be bigger than mPluginLockupTimeout or parent will kill LLPluginProcessChild
static const F32 HEARTBEAT_SECONDS = 1.0f;
static const F32 PLUGIN_IDLE_SECONDS = 1.0f / 100.0f; // Each call to idle will give the plugin this much time.
@ -218,6 +218,11 @@ void LLPluginProcessChild::idle(void)
if (mWaitGoodbye.hasExpired())
{
LL_WARNS() << "Wait for goodbye expired. Advancing to UNLOADED" << LL_ENDL;
if (mInstance != NULL)
{
// Something went wrong, at least make sure plugin will terminate
sendMessageToPlugin(LLPluginMessage("base", "force_exit"));
}
setState(STATE_UNLOADED);
}
break;

View File

@ -1026,7 +1026,7 @@ S32 LLPrimitive::packTEField(U8 *cur_ptr, U8 *data_ptr, U8 data_size, U8 last_fa
U64 exception_faces;
U8 *start_loc = cur_ptr;
htonmemcpy(cur_ptr,data_ptr + (last_face_index * data_size), type, data_size);
htolememcpy(cur_ptr,data_ptr + (last_face_index * data_size), type, data_size);
cur_ptr += data_size;
for (face_index = last_face_index-1; face_index >= 0; face_index--)
@ -1072,7 +1072,7 @@ S32 LLPrimitive::packTEField(U8 *cur_ptr, U8 *data_ptr, U8 data_size, U8 last_fa
*cur_ptr++ = (U8)(exception_faces & 0x7F);
htonmemcpy(cur_ptr,data_ptr + (face_index * data_size), type, data_size);
htolememcpy(cur_ptr,data_ptr + (face_index * data_size), type, data_size);
cur_ptr += data_size;
}
}
@ -1083,7 +1083,7 @@ S32 LLPrimitive::unpackTEField(U8 *cur_ptr, U8 *buffer_end, U8 *data_ptr, U8 dat
{
U8 *start_loc = cur_ptr;
U64 i;
htonmemcpy(data_ptr,cur_ptr, type,data_size);
htolememcpy(data_ptr,cur_ptr, type,data_size);
cur_ptr += data_size;
for (i = 1; i < face_count; i++)
@ -1108,7 +1108,7 @@ S32 LLPrimitive::unpackTEField(U8 *cur_ptr, U8 *buffer_end, U8 *data_ptr, U8 dat
{
if (i & 0x01)
{
htonmemcpy(data_ptr+(j*data_size),cur_ptr,type,data_size);
htolememcpy(data_ptr+(j*data_size),cur_ptr,type,data_size);
LL_DEBUGS("TEFieldDecode") << "Assigning " ;
char foo[64];
sprintf(foo,"%x %x",*(data_ptr+(j*data_size)), *(data_ptr+(j*data_size)+1));

View File

@ -94,9 +94,9 @@ void LLTextureAnim::packTAMessage(LLMessageSystem *mesgsys) const
data[1] = mFace;
data[2] = mSizeX;
data[3] = mSizeY;
htonmemcpy(data + 4, &mStart, MVT_F32, sizeof(F32));
htonmemcpy(data + 8, &mLength, MVT_F32, sizeof(F32));
htonmemcpy(data + 12, &mRate, MVT_F32, sizeof(F32));
htolememcpy(data + 4, &mStart, MVT_F32, sizeof(F32));
htolememcpy(data + 8, &mLength, MVT_F32, sizeof(F32));
htolememcpy(data + 12, &mRate, MVT_F32, sizeof(F32));
mesgsys->addBinaryDataFast(_PREHASH_TextureAnim, data, TA_BLOCK_SIZE);
}
@ -109,9 +109,9 @@ void LLTextureAnim::packTAMessage(LLDataPacker &dp) const
data[1] = mFace;
data[2] = mSizeX;
data[3] = mSizeY;
htonmemcpy(data + 4, &mStart, MVT_F32, sizeof(F32));
htonmemcpy(data + 8, &mLength, MVT_F32, sizeof(F32));
htonmemcpy(data + 12, &mRate, MVT_F32, sizeof(F32));
htolememcpy(data + 4, &mStart, MVT_F32, sizeof(F32));
htolememcpy(data + 8, &mLength, MVT_F32, sizeof(F32));
htolememcpy(data + 12, &mRate, MVT_F32, sizeof(F32));
dp.packBinaryData(data, TA_BLOCK_SIZE, "TextureAnimation");
}
@ -146,9 +146,9 @@ void LLTextureAnim::unpackTAMessage(LLMessageSystem *mesgsys, const S32 block_nu
mSizeX = llmax((U8)1, data[2]);
mSizeY = llmax((U8)1, data[3]);
}
htonmemcpy(&mStart, data + 4, MVT_F32, sizeof(F32));
htonmemcpy(&mLength, data + 8, MVT_F32, sizeof(F32));
htonmemcpy(&mRate, data + 12, MVT_F32, sizeof(F32));
htolememcpy(&mStart, data + 4, MVT_F32, sizeof(F32));
htolememcpy(&mLength, data + 8, MVT_F32, sizeof(F32));
htolememcpy(&mRate, data + 12, MVT_F32, sizeof(F32));
}
void LLTextureAnim::unpackTAMessage(LLDataPacker &dp)
@ -170,9 +170,9 @@ void LLTextureAnim::unpackTAMessage(LLDataPacker &dp)
mFace = data[1];
mSizeX = data[2];
mSizeY = data[3];
htonmemcpy(&mStart, data + 4, MVT_F32, sizeof(F32));
htonmemcpy(&mLength, data + 8, MVT_F32, sizeof(F32));
htonmemcpy(&mRate, data + 12, MVT_F32, sizeof(F32));
htolememcpy(&mStart, data + 4, MVT_F32, sizeof(F32));
htolememcpy(&mLength, data + 8, MVT_F32, sizeof(F32));
htolememcpy(&mRate, data + 12, MVT_F32, sizeof(F32));
}
LLSD LLTextureAnim::asLLSD() const

View File

@ -936,10 +936,16 @@ BOOL LLView::handleToolTip(S32 x, S32 y, MASK mask)
F32 timeout = LLToolTipMgr::instance().toolTipVisible()
? LLUI::sSettingGroups["config"]->getF32( "ToolTipFastDelay" )
: LLUI::sSettingGroups["config"]->getF32( "ToolTipDelay" );
LLToolTipMgr::instance().show(LLToolTip::Params()
.message(tooltip)
.sticky_rect(calcScreenRect())
.delay_time(timeout));
// Even if we don't show tooltips, consume the event, nothing below should show tooltip
bool allow_ui_tooltips = LLUI::sSettingGroups["config"]->getBOOL( "BasicUITooltips" );
if (allow_ui_tooltips)
{
LLToolTipMgr::instance().show(LLToolTip::Params()
.message(tooltip)
.sticky_rect(calcScreenRect())
.delay_time(timeout));
}
handled = TRUE;
}

View File

@ -38,6 +38,10 @@ BOOL LLMouseHandler::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType cli
case CLICK_RIGHT: handled = handleRightMouseDown(x, y, mask); break;
case CLICK_MIDDLE: handled = handleMiddleMouseDown(x, y, mask); break;
case CLICK_DOUBLELEFT: handled = handleDoubleClick(x, y, mask); break;
case CLICK_BUTTON4:
case CLICK_BUTTON5:
LL_INFOS() << "Handle mouse button " << clicktype + 1 << " down." << LL_ENDL;
break;
default:
LL_WARNS() << "Unhandled enum." << LL_ENDL;
}
@ -50,6 +54,10 @@ BOOL LLMouseHandler::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType cli
case CLICK_RIGHT: handled = handleRightMouseUp(x, y, mask); break;
case CLICK_MIDDLE: handled = handleMiddleMouseUp(x, y, mask); break;
case CLICK_DOUBLELEFT: handled = handleDoubleClick(x, y, mask); break;
case CLICK_BUTTON4:
case CLICK_BUTTON5:
LL_INFOS() << "Handle mouse button " << clicktype + 1 << " up." << LL_ENDL;
break;
default:
LL_WARNS() << "Unhandled enum." << LL_ENDL;
}

View File

@ -50,6 +50,8 @@ public:
CLICK_LEFT,
CLICK_MIDDLE,
CLICK_RIGHT,
CLICK_BUTTON4,
CLICK_BUTTON5,
CLICK_DOUBLELEFT
} EClickType;

View File

@ -454,7 +454,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
mMousePos[0] = mPoint.x;
mMousePos[1] = mPoint.y;
callMiddleMouseDown(mMousePos, [theEvent modifierFlags]);
callOtherMouseDown(mMousePos, [theEvent modifierFlags], [theEvent buttonNumber]);
}
- (void) otherMouseUp:(NSEvent *)theEvent
@ -462,7 +462,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
mMousePos[0] = mPoint.x;
mMousePos[1] = mPoint.y;
callMiddleMouseUp(mMousePos, [theEvent modifierFlags]);
callOtherMouseUp(mMousePos, [theEvent modifierFlags], [theEvent buttonNumber]);
}
- (void) rightMouseDragged:(NSEvent *)theEvent

View File

@ -98,6 +98,16 @@ BOOL LLWindowCallbacks::handleMiddleMouseUp(LLWindow *window, const LLCoordGL po
return FALSE;
}
BOOL LLWindowCallbacks::handleOtherMouseDown(LLWindow *window, const LLCoordGL pos, MASK mask, S32 button)
{
return FALSE;
}
BOOL LLWindowCallbacks::handleOtherMouseUp(LLWindow *window, const LLCoordGL pos, MASK mask, S32 button)
{
return FALSE;
}
BOOL LLWindowCallbacks::handleActivate(LLWindow *window, BOOL activated)
{
return FALSE;

View File

@ -49,6 +49,8 @@ public:
virtual BOOL handleRightMouseUp(LLWindow *window, LLCoordGL pos, MASK mask);
virtual BOOL handleMiddleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask);
virtual BOOL handleMiddleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask);
virtual BOOL handleOtherMouseDown(LLWindow *window, LLCoordGL pos, MASK mask, S32 button);
virtual BOOL handleOtherMouseUp(LLWindow *window, LLCoordGL pos, MASK mask, S32 button);
virtual BOOL handleActivate(LLWindow *window, BOOL activated);
virtual BOOL handleActivateApp(LLWindow *window, BOOL activating);
virtual void handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask);

View File

@ -151,8 +151,8 @@ void callWindowHide();
void callWindowUnhide();
void callWindowDidChangeScreen();
void callDeltaUpdate(float *delta, unsigned int mask);
void callMiddleMouseDown(float *pos, unsigned int mask);
void callMiddleMouseUp(float *pos, unsigned int mask);
void callOtherMouseDown(float *pos, unsigned int mask, int button);
void callOtherMouseUp(float *pos, unsigned int mask, int button);
void callFocus();
void callFocusLost();
void callModifier(unsigned int mask);

View File

@ -426,7 +426,7 @@ void callDeltaUpdate(float *delta, MASK mask)
gWindowImplementation->updateMouseDeltas(delta);
}
void callMiddleMouseDown(float *pos, MASK mask)
void callOtherMouseDown(float *pos, MASK mask, int button)
{
LLCoordGL outCoords;
outCoords.mX = ll_round(pos[0]);
@ -435,10 +435,18 @@ void callMiddleMouseDown(float *pos, MASK mask)
gWindowImplementation->getMouseDeltas(deltas);
outCoords.mX += deltas[0];
outCoords.mY += deltas[1];
gWindowImplementation->getCallbacks()->handleMiddleMouseDown(gWindowImplementation, outCoords, mask);
if (button == 2)
{
gWindowImplementation->getCallbacks()->handleMiddleMouseDown(gWindowImplementation, outCoords, mask);
}
else
{
gWindowImplementation->getCallbacks()->handleOtherMouseDown(gWindowImplementation, outCoords, mask, button + 1);
}
}
void callMiddleMouseUp(float *pos, MASK mask)
void callOtherMouseUp(float *pos, MASK mask, int button)
{
LLCoordGL outCoords;
outCoords.mX = ll_round(pos[0]);
@ -446,8 +454,15 @@ void callMiddleMouseUp(float *pos, MASK mask)
float deltas[2];
gWindowImplementation->getMouseDeltas(deltas);
outCoords.mX += deltas[0];
outCoords.mY += deltas[1];
gWindowImplementation->getCallbacks()->handleMiddleMouseUp(gWindowImplementation, outCoords, mask);
outCoords.mY += deltas[1];
if (button == 2)
{
gWindowImplementation->getCallbacks()->handleMiddleMouseUp(gWindowImplementation, outCoords, mask);
}
else
{
gWindowImplementation->getCallbacks()->handleOtherMouseUp(gWindowImplementation, outCoords, mask, button + 1);
}
}
void callModifier(MASK mask)

View File

@ -2558,6 +2558,72 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
}
}
break;
case WM_XBUTTONDOWN:
{
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_MBUTTONDOWN");
LL_RECORD_BLOCK_TIME(FTM_MOUSEHANDLER);
S32 button = GET_XBUTTON_WPARAM(w_param);
if (LLWinImm::isAvailable() && window_imp->mPreeditor)
{
window_imp->interruptLanguageTextInput();
}
// Because we move the cursor position in tllviewerhe app, we need to query
// to find out where the cursor at the time the event is handled.
// If we don't do this, many clicks could get buffered up, and if the
// first click changes the cursor position, all subsequent clicks
// will occur at the wrong location. JC
if (window_imp->mMousePositionModified)
{
LLCoordWindow cursor_coord_window;
window_imp->getCursorPosition(&cursor_coord_window);
gl_coord = cursor_coord_window.convert();
}
else
{
gl_coord = window_coord.convert();
}
MASK mask = gKeyboard->currentMask(TRUE);
// generate move event to update mouse coordinates
window_imp->mCallbacks->handleMouseMove(window_imp, gl_coord, mask);
// Windows uses numbers 1 and 2 for buttons, remap to 4, 5
if (window_imp->mCallbacks->handleOtherMouseDown(window_imp, gl_coord, mask, button + 3))
{
return 0;
}
}
break;
case WM_XBUTTONUP:
{
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_MBUTTONUP");
LL_RECORD_BLOCK_TIME(FTM_MOUSEHANDLER);
S32 button = GET_XBUTTON_WPARAM(w_param);
// Because we move the cursor position in the llviewer app, we need to query
// to find out where the cursor at the time the event is handled.
// If we don't do this, many clicks could get buffered up, and if the
// first click changes the cursor position, all subsequent clicks
// will occur at the wrong location. JC
if (window_imp->mMousePositionModified)
{
LLCoordWindow cursor_coord_window;
window_imp->getCursorPosition(&cursor_coord_window);
gl_coord = cursor_coord_window.convert();
}
else
{
gl_coord = window_coord.convert();
}
MASK mask = gKeyboard->currentMask(TRUE);
// generate move event to update mouse coordinates
window_imp->mCallbacks->handleMouseMove(window_imp, gl_coord, mask);
// Windows uses numbers 1 and 2 for buttons, remap to 4, 5
if (window_imp->mCallbacks->handleOtherMouseUp(window_imp, gl_coord, mask, button + 3))
{
return 0;
}
}
break;
case WM_MOUSEWHEEL:
{

View File

@ -72,6 +72,7 @@ private:
bool onHTTPAuthCallback(const std::string host, const std::string realm, std::string& username, std::string& password);
void onCursorChangedCallback(dullahan::ECursorType type);
const std::vector<std::string> onFileDialog(dullahan::EFileDialogType dialog_type, const std::string dialog_title, const std::string default_file, const std::string dialog_accept_filter, bool& use_default);
bool onJSDialogCallback(const std::string origin_url, const std::string message_text, const std::string default_prompt_text);
void postDebugMessage(const std::string& msg);
void authResponse(LLPluginMessage &message);
@ -249,6 +250,7 @@ void MediaPluginCEF::onRequestExitCallback()
LLPluginMessage message("base", "goodbye");
sendMessage(message);
// Will trigger delete on next staticReceiveMessage()
mDeleteMe = true;
}
@ -362,6 +364,14 @@ const std::vector<std::string> MediaPluginCEF::onFileDialog(dullahan::EFileDialo
return std::vector<std::string>();
}
////////////////////////////////////////////////////////////////////////////////
//
bool MediaPluginCEF::onJSDialogCallback(const std::string origin_url, const std::string message_text, const std::string default_prompt_text)
{
// return true indicates we suppress the JavaScript alert UI entirely
return true;
}
////////////////////////////////////////////////////////////////////////////////
//
void MediaPluginCEF::onCursorChangedCallback(dullahan::ECursorType type)
@ -445,9 +455,13 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
}
else if (message_name == "cleanup")
{
mVolumeCatcher.setVolume(0);
mVolumeCatcher.setVolume(0); // Hack: masks CEF exit issues
mCEFLib->requestExit();
}
else if (message_name == "force_exit")
{
mDeleteMe = true;
}
else if (message_name == "shm_added")
{
SharedSegmentInfo info;
@ -504,6 +518,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
mCEFLib->setOnFileDialogCallback(std::bind(&MediaPluginCEF::onFileDialog, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5));
mCEFLib->setOnCursorChangedCallback(std::bind(&MediaPluginCEF::onCursorChangedCallback, this, std::placeholders::_1));
mCEFLib->setOnRequestExitCallback(std::bind(&MediaPluginCEF::onRequestExitCallback, this));
mCEFLib->setOnJSDialogCallback(std::bind(&MediaPluginCEF::onJSDialogCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
dullahan::dullahan_settings settings;
settings.accept_language_list = mHostLanguage;

View File

@ -128,6 +128,10 @@ void mediaPluginExample::receiveMessage(const char* message_string)
mDeleteMe = true;
}
else if (message_name == "force_exit")
{
mDeleteMe = true;
}
else if (message_name == "shm_added")
{
SharedSegmentInfo info;

View File

@ -495,6 +495,10 @@ void MediaPluginLibVLC::receiveMessage(const char* message_string)
{
resetVLC();
}
else if (message_name == "force_exit")
{
mDeleteMe = true;
}
else if (message_name == "shm_added")
{
SharedSegmentInfo info;

View File

@ -14174,6 +14174,17 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>0</integer>
</map>
<key>BasicUITooltips</key>
<map>
<key>Comment</key>
<string>Show tooltips for various 2D UI elements like buttons or checkboxes, won't supress tooltips like drag'n'drop, inworld, links or media</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>ShowHoverTips</key>
<map>
<key>Comment</key>
@ -16200,6 +16211,17 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<real>1.0</real>
</map>
<key>HUDScaleFactor</key>
<map>
<key>Comment</key>
<string>Scale of HUD attachments</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>1.0</real>
</map>
<key>UIScaleFactor</key>
<map>
<key>Comment</key>

View File

@ -1166,18 +1166,18 @@ void FSFloaterImport::setPrimPosition(U8 type, LLViewerObject* object, LLVector3
if (type & UPD_POSITION)
{
htonmemcpy(&data[offset], &(position.mV), MVT_LLVector3, 12);
htolememcpy(&data[offset], &(position.mV), MVT_LLVector3, 12);
offset += 12;
}
if (type & UPD_ROTATION)
{
LLVector3 vec = rotation.packToVector3();
htonmemcpy(&data[offset], &(vec.mV), MVT_LLQuaternion, 12);
htolememcpy(&data[offset], &(vec.mV), MVT_LLQuaternion, 12);
offset += 12;
}
if (type & UPD_SCALE)
{
htonmemcpy(&data[offset], &(scale.mV), MVT_LLVector3, 12);
htolememcpy(&data[offset], &(scale.mV), MVT_LLVector3, 12);
offset += 12;
}
gMessageSystem->addBinaryDataFast(_PREHASH_Data, data, offset);

View File

@ -1110,8 +1110,8 @@ void FSLSLBridge::setupBridgePrim(LLViewerObject* object)
gAgentAvatarp->clampAttachmentPositions();
U8 data[24];
htonmemcpy(&data[0], &(object->getPosition().mV), MVT_LLVector3, 12);
htonmemcpy(&data[12], &(object->getScale().mV), MVT_LLVector3, 12);
htolememcpy(&data[0], &(object->getPosition().mV), MVT_LLVector3, 12);
htolememcpy(&data[12], &(object->getScale().mV), MVT_LLVector3, 12);
gMessageSystem->newMessage("MultipleObjectUpdate");
gMessageSystem->nextBlockFast(_PREHASH_AgentData);

View File

@ -74,10 +74,6 @@ BOOL LLFloaterExperiences::postBuild()
getChild<LLTabContainer>("xp_tabs")->addTabPanel(new LLPanelExperienceLog());
resizeToTabs();
LLEventPumps::instance().obtain("experience_permission").listen("LLFloaterExperiences",
boost::bind(&LLFloaterExperiences::updatePermissions, this, _1));
return TRUE;
}
@ -163,6 +159,10 @@ void LLFloaterExperiences::refreshContents()
void LLFloaterExperiences::onOpen( const LLSD& key )
{
LLEventPumps::instance().obtain("experience_permission").stopListening("LLFloaterExperiences");
LLEventPumps::instance().obtain("experience_permission").listen("LLFloaterExperiences",
boost::bind(&LLFloaterExperiences::updatePermissions, this, _1));
LLViewerRegion* region = gAgent.getRegion();
if(region)
{

View File

@ -41,6 +41,7 @@
#include "llkeyboard.h"
#include "llmenugl.h"
#include "llmultigesture.h"
#include "llnotificationsutil.h"
#include "llpreviewgesture.h"
#include "llscrolllistctrl.h"
#include "lltrans.h"
@ -125,6 +126,7 @@ LLFloaterGesture::LLFloaterGesture(const LLSD& key)
mCommitCallbackRegistrar.add("Gesture.Action.ShowPreview", boost::bind(&LLFloaterGesture::onClickEdit, this));
mCommitCallbackRegistrar.add("Gesture.Action.CopyPaste", boost::bind(&LLFloaterGesture::onCopyPasteAction, this, _2));
mCommitCallbackRegistrar.add("Gesture.Action.SaveToCOF", boost::bind(&LLFloaterGesture::addToCurrentOutFit, this));
mCommitCallbackRegistrar.add("Gesture.Action.Rename", boost::bind(&LLFloaterGesture::onRenameSelected, this));
mCommitCallbackRegistrar.add("Gesture.Action.RefreshList", boost::bind(&LLFloaterGesture::refreshForActiveSort, this)); // <FS:PP> FIRE-5646: Option to show only active gestures
mEnableCallbackRegistrar.add("Gesture.EnableAction", boost::bind(&LLFloaterGesture::isActionEnabled, this, _2));
@ -471,6 +473,19 @@ bool LLFloaterGesture::isActionEnabled(const LLSD& command)
{
return mGestureList->getAllSelected().size() == 1;
}
else if ("rename_gesture" == command_name)
{
if (mGestureList->getAllSelected().size() == 1)
{
LLViewerInventoryItem* item = gInventory.getItem(mGestureList->getCurrentID());
if (item && item->getPermissions().allowModifyBy(gAgentID))
{
return true;
}
}
return false;
}
return true;
}
@ -555,6 +570,44 @@ void LLFloaterGesture::onActivateBtnClick()
}
}
void LLFloaterGesture::onRenameSelected()
{
LLViewerInventoryItem* gesture = gInventory.getItem(mGestureList->getCurrentID());
if (!gesture)
{
return;
}
LLSD args;
args["NAME"] = gesture->getName();
LLSD payload;
payload["gesture_id"] = mGestureList->getCurrentID();
LLNotificationsUtil::add("RenameGesture", args, payload, boost::bind(onGestureRename, _1, _2));
}
void LLFloaterGesture::onGestureRename(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option != 0) return; // canceled
std::string new_name = response["new_name"].asString();
LLInventoryObject::correctInventoryName(new_name);
if (!new_name.empty())
{
LLUUID item_id = notification["payload"]["gesture_id"].asUUID();
LLViewerInventoryItem* gesture = gInventory.getItem(item_id);
if (gesture && (gesture->getName() != new_name))
{
LLSD updates;
updates["name"] = new_name;
update_inventory_item(item_id, updates, NULL);
}
}
}
void LLFloaterGesture::onCopyPasteAction(const LLSD& command)
{
std::string command_name = command.asString();

View File

@ -96,6 +96,9 @@ private:
void onCommitList();
void onCopyPasteAction(const LLSD& command);
void onDeleteSelected();
void onRenameSelected();
static void onGestureRename(const LLSD& notification, const LLSD& response);
LLUUID mSelectedID;
LLUUID mGestureFolderID;

View File

@ -175,7 +175,9 @@ char const* const VISIBILITY_DEFAULT = "default";
char const* const VISIBILITY_HIDDEN = "hidden";
//control value for middle mouse as talk2push button
const static std::string MIDDLE_MOUSE_CV = "MiddleMouse";
const static std::string MIDDLE_MOUSE_CV = "MiddleMouse"; // for voice client and redability
const static std::string MOUSE_BUTTON_4_CV = "MouseButton4";
const static std::string MOUSE_BUTTON_5_CV = "MouseButton5";
/// This must equal the maximum value set for the IndirectMaxComplexity slider in panel_preferences_graphics1.xml
static const U32 INDIRECT_MAX_ARC_OFF = 101; // all the way to the right == disabled
@ -219,6 +221,7 @@ public:
void setParent(LLFloaterPreference* parent) { mParent = parent; }
BOOL handleKeyHere(KEY key, MASK mask);
BOOL handleAnyMouseClick(S32 x, S32 y, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down);
static void onCancel(void* user_data);
private:
@ -262,6 +265,25 @@ BOOL LLVoiceSetKeyDialog::handleKeyHere(KEY key, MASK mask)
return result;
}
BOOL LLVoiceSetKeyDialog::handleAnyMouseClick(S32 x, S32 y, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down)
{
BOOL result = FALSE;
if (down
&& (clicktype == LLMouseHandler::CLICK_MIDDLE || clicktype == LLMouseHandler::CLICK_BUTTON4 || clicktype == LLMouseHandler::CLICK_BUTTON5)
&& mask == 0)
{
mParent->setMouse(clicktype);
result = TRUE;
closeFloater();
}
else
{
result = LLMouseHandler::handleAnyMouseClick(x, y, mask, clicktype, down);
}
return result;
}
//static
void LLVoiceSetKeyDialog::onCancel(void* user_data)
{
@ -2843,6 +2865,41 @@ void LLFloaterPreference::setKey(KEY key)
getChild<LLUICtrl>("modifier_combo")->onCommit();
}
void LLFloaterPreference::setMouse(LLMouseHandler::EClickType click)
{
std::string bt_name;
std::string ctrl_value;
switch (click)
{
case LLMouseHandler::CLICK_MIDDLE:
bt_name = "middle_mouse";
ctrl_value = MIDDLE_MOUSE_CV;
break;
case LLMouseHandler::CLICK_BUTTON4:
bt_name = "button4_mouse";
ctrl_value = MOUSE_BUTTON_4_CV;
break;
case LLMouseHandler::CLICK_BUTTON5:
bt_name = "button5_mouse";
ctrl_value = MOUSE_BUTTON_5_CV;
break;
default:
break;
}
if (!ctrl_value.empty())
{
LLUICtrl* p2t_line_editor = getChild<LLUICtrl>("modifier_combo");
// We are using text control names for readability and compatibility with voice
p2t_line_editor->setControlValue(ctrl_value);
LLPanel* advanced_preferences = dynamic_cast<LLPanel*>(p2t_line_editor->getParent());
if (advanced_preferences)
{
p2t_line_editor->setValue(advanced_preferences->getString(bt_name));
}
}
}
void LLFloaterPreference::onClickSetMiddleMouse()
{
LLUICtrl* p2t_line_editor = getChild<LLUICtrl>("modifier_combo");
@ -3839,10 +3896,19 @@ BOOL LLPanelPreference::postBuild()
if (hasChild("modifier_combo", TRUE))
{
//localizing if push2talk button is set to middle mouse
if (MIDDLE_MOUSE_CV == getChild<LLUICtrl>("modifier_combo")->getValue().asString())
std::string modifier_value = getChild<LLUICtrl>("modifier_combo")->getValue().asString();
if (MIDDLE_MOUSE_CV == modifier_value)
{
getChild<LLUICtrl>("modifier_combo")->setValue(getString("middle_mouse"));
}
else if (MOUSE_BUTTON_4_CV == modifier_value)
{
getChild<LLUICtrl>("modifier_combo")->setValue(getString("button4_mouse"));
}
else if (MOUSE_BUTTON_5_CV == modifier_value)
{
getChild<LLUICtrl>("modifier_combo")->setValue(getString("button5_mouse"));
}
}
// Panel Setup (Network) -WoLf
if (hasChild("connection_port_enabled"))

View File

@ -195,6 +195,7 @@ public:
void onClickSetKey();
void onClickClearKey(); // <FS:Ansariel> FIRE-3803: Clear voice toggle button
void setKey(KEY key);
void setMouse(LLMouseHandler::EClickType click);
void onClickSetMiddleMouse();
// void onClickSetSounds(); //<FS:KC> Handled centrally now
void onClickPreviewUISound(const LLSD& ui_sound_id); // <FS:PP> FIRE-8190: Preview function for "UI Sounds" Panel

View File

@ -92,7 +92,7 @@ public:
}
virtual void changed(U32 mask);
private:
LLFloaterProperties* mFloater;
LLFloaterProperties* mFloater; // Not a handle because LLFloaterProperties is managing LLPropertiesObserver
};
void LLPropertiesObserver::changed(U32 mask)

View File

@ -110,7 +110,7 @@ void LLHUDEffectBeam::packData(LLMessageSystem *mesgsys)
memset(packed_data, 0, 41);
if (mSourceObject)
{
htonmemcpy(packed_data, mSourceObject->mID.mData, MVT_LLUUID, 16);
htolememcpy(packed_data, mSourceObject->mID.mData, MVT_LLUUID, 16);
}
if (mTargetObject)
@ -124,11 +124,11 @@ void LLHUDEffectBeam::packData(LLMessageSystem *mesgsys)
if (mTargetObject)
{
htonmemcpy(&(packed_data[17]), mTargetObject->mID.mData, MVT_LLUUID, 16);
htolememcpy(&(packed_data[17]), mTargetObject->mID.mData, MVT_LLUUID, 16);
}
else
{
htonmemcpy(&(packed_data[17]), mTargetPos.mdV, MVT_LLVector3d, 24);
htolememcpy(&(packed_data[17]), mTargetPos.mdV, MVT_LLVector3d, 24);
}
mesgsys->addBinaryDataFast(_PREHASH_TypeData, packed_data, 41);
}
@ -151,7 +151,7 @@ void LLHUDEffectBeam::unpackData(LLMessageSystem *mesgsys, S32 blocknum)
}
mesgsys->getBinaryDataFast(_PREHASH_Effect, _PREHASH_TypeData, packed_data, 41, blocknum);
htonmemcpy(source_id.mData, packed_data, MVT_LLUUID, 16);
htolememcpy(source_id.mData, packed_data, MVT_LLUUID, 16);
LLViewerObject *objp = gObjectList.findObject(source_id);
if (objp)
@ -163,7 +163,7 @@ void LLHUDEffectBeam::unpackData(LLMessageSystem *mesgsys, S32 blocknum)
if (use_target_object)
{
htonmemcpy(target_id.mData, &packed_data[17], MVT_LLUUID, 16);
htolememcpy(target_id.mData, &packed_data[17], MVT_LLUUID, 16);
LLViewerObject *objp = gObjectList.findObject(target_id);
if (objp)
@ -173,7 +173,7 @@ void LLHUDEffectBeam::unpackData(LLMessageSystem *mesgsys, S32 blocknum)
}
else
{
htonmemcpy(new_target.mdV, &(packed_data[17]), MVT_LLVector3d, 24);
htolememcpy(new_target.mdV, &(packed_data[17]), MVT_LLVector3d, 24);
setTargetPos(new_target);
}

View File

@ -328,29 +328,29 @@ void LLHUDEffectLookAt::packData(LLMessageSystem *mesgsys)
if (mSourceObject)
{
htonmemcpy(&(packed_data[SOURCE_AVATAR]), mSourceObject->mID.mData, MVT_LLUUID, 16);
htolememcpy(&(packed_data[SOURCE_AVATAR]), mSourceObject->mID.mData, MVT_LLUUID, 16);
}
else
{
htonmemcpy(&(packed_data[SOURCE_AVATAR]), LLUUID::null.mData, MVT_LLUUID, 16);
htolememcpy(&(packed_data[SOURCE_AVATAR]), LLUUID::null.mData, MVT_LLUUID, 16);
}
// pack both target object and position
// position interpreted as offset if target object is non-null
if (mTargetObject)
{
htonmemcpy(&(packed_data[TARGET_OBJECT]), target_object->mID.mData, MVT_LLUUID, 16);
htolememcpy(&(packed_data[TARGET_OBJECT]), target_object->mID.mData, MVT_LLUUID, 16);
}
else
{
htonmemcpy(&(packed_data[TARGET_OBJECT]), LLUUID::null.mData, MVT_LLUUID, 16);
htolememcpy(&(packed_data[TARGET_OBJECT]), LLUUID::null.mData, MVT_LLUUID, 16);
}
htonmemcpy(&(packed_data[TARGET_POS]), target_offset_global.mdV, MVT_LLVector3d, 24);
htolememcpy(&(packed_data[TARGET_POS]), target_offset_global.mdV, MVT_LLVector3d, 24);
U8 lookAtTypePacked = (U8)target_type;
htonmemcpy(&(packed_data[LOOKAT_TYPE]), &lookAtTypePacked, MVT_U8, 1);
htolememcpy(&(packed_data[LOOKAT_TYPE]), &lookAtTypePacked, MVT_U8, 1);
mesgsys->addBinaryDataFast(_PREHASH_TypeData, packed_data, PKT_SIZE);
@ -384,7 +384,7 @@ void LLHUDEffectLookAt::unpackData(LLMessageSystem *mesgsys, S32 blocknum)
}
mesgsys->getBinaryDataFast(_PREHASH_Effect, _PREHASH_TypeData, packed_data, PKT_SIZE, blocknum);
htonmemcpy(source_id.mData, &(packed_data[SOURCE_AVATAR]), MVT_LLUUID, 16);
htolememcpy(source_id.mData, &(packed_data[SOURCE_AVATAR]), MVT_LLUUID, 16);
LLViewerObject *objp = gObjectList.findObject(source_id);
if (objp && objp->isAvatar())
@ -397,11 +397,11 @@ void LLHUDEffectLookAt::unpackData(LLMessageSystem *mesgsys, S32 blocknum)
return;
}
htonmemcpy(target_id.mData, &(packed_data[TARGET_OBJECT]), MVT_LLUUID, 16);
htolememcpy(target_id.mData, &(packed_data[TARGET_OBJECT]), MVT_LLUUID, 16);
objp = gObjectList.findObject(target_id);
htonmemcpy(new_target.mdV, &(packed_data[TARGET_POS]), MVT_LLVector3d, 24);
htolememcpy(new_target.mdV, &(packed_data[TARGET_POS]), MVT_LLVector3d, 24);
if (objp)
{
@ -417,7 +417,7 @@ void LLHUDEffectLookAt::unpackData(LLMessageSystem *mesgsys, S32 blocknum)
}
U8 lookAtTypeUnpacked = 0;
htonmemcpy(&lookAtTypeUnpacked, &(packed_data[LOOKAT_TYPE]), MVT_U8, 1);
htolememcpy(&lookAtTypeUnpacked, &(packed_data[LOOKAT_TYPE]), MVT_U8, 1);
if ((U8)LOOKAT_NUM_TARGETS > lookAtTypeUnpacked)
{
mTargetType = (ELookAtType)lookAtTypeUnpacked;

View File

@ -131,28 +131,28 @@ void LLHUDEffectPointAt::packData(LLMessageSystem *mesgsys)
if (mSourceObject)
{
htonmemcpy(&(packed_data[SOURCE_AVATAR]), mSourceObject->mID.mData, MVT_LLUUID, 16);
htolememcpy(&(packed_data[SOURCE_AVATAR]), mSourceObject->mID.mData, MVT_LLUUID, 16);
}
else
{
htonmemcpy(&(packed_data[SOURCE_AVATAR]), LLUUID::null.mData, MVT_LLUUID, 16);
htolememcpy(&(packed_data[SOURCE_AVATAR]), LLUUID::null.mData, MVT_LLUUID, 16);
}
// pack both target object and position
// position interpreted as offset if target object is non-null
if (mTargetObject)
{
htonmemcpy(&(packed_data[TARGET_OBJECT]), mTargetObject->mID.mData, MVT_LLUUID, 16);
htolememcpy(&(packed_data[TARGET_OBJECT]), mTargetObject->mID.mData, MVT_LLUUID, 16);
}
else
{
htonmemcpy(&(packed_data[TARGET_OBJECT]), LLUUID::null.mData, MVT_LLUUID, 16);
htolememcpy(&(packed_data[TARGET_OBJECT]), LLUUID::null.mData, MVT_LLUUID, 16);
}
htonmemcpy(&(packed_data[TARGET_POS]), mTargetOffsetGlobal.mdV, MVT_LLVector3d, 24);
htolememcpy(&(packed_data[TARGET_POS]), mTargetOffsetGlobal.mdV, MVT_LLVector3d, 24);
U8 pointAtTypePacked = (U8)mTargetType;
htonmemcpy(&(packed_data[POINTAT_TYPE]), &pointAtTypePacked, MVT_U8, 1);
htolememcpy(&(packed_data[POINTAT_TYPE]), &pointAtTypePacked, MVT_U8, 1);
mesgsys->addBinaryDataFast(_PREHASH_TypeData, packed_data, PKT_SIZE);
@ -188,10 +188,10 @@ void LLHUDEffectPointAt::unpackData(LLMessageSystem *mesgsys, S32 blocknum)
}
mesgsys->getBinaryDataFast(_PREHASH_Effect, _PREHASH_TypeData, packed_data, PKT_SIZE, blocknum);
htonmemcpy(source_id.mData, &(packed_data[SOURCE_AVATAR]), MVT_LLUUID, 16);
htonmemcpy(target_id.mData, &(packed_data[TARGET_OBJECT]), MVT_LLUUID, 16);
htonmemcpy(new_target.mdV, &(packed_data[TARGET_POS]), MVT_LLVector3d, 24);
htonmemcpy(&pointAtTypeUnpacked, &(packed_data[POINTAT_TYPE]), MVT_U8, 1);
htolememcpy(source_id.mData, &(packed_data[SOURCE_AVATAR]), MVT_LLUUID, 16);
htolememcpy(target_id.mData, &(packed_data[TARGET_OBJECT]), MVT_LLUUID, 16);
htolememcpy(new_target.mdV, &(packed_data[TARGET_POS]), MVT_LLVector3d, 24);
htolememcpy(&pointAtTypeUnpacked, &(packed_data[POINTAT_TYPE]), MVT_U8, 1);
LLViewerObject *objp = gObjectList.findObject(source_id);
if (objp && objp->isAvatar())

View File

@ -87,15 +87,15 @@ void LLHUDEffectSpiral::packData(LLMessageSystem *mesgsys)
if (mSourceObject)
{
htonmemcpy(packed_data, mSourceObject->mID.mData, MVT_LLUUID, 16);
htolememcpy(packed_data, mSourceObject->mID.mData, MVT_LLUUID, 16);
}
if (mTargetObject)
{
htonmemcpy(packed_data + 16, mTargetObject->mID.mData, MVT_LLUUID, 16);
htolememcpy(packed_data + 16, mTargetObject->mID.mData, MVT_LLUUID, 16);
}
if (!mPositionGlobal.isExactlyZero())
{
htonmemcpy(packed_data + 32, mPositionGlobal.mdV, MVT_LLVector3d, 24);
htolememcpy(packed_data + 32, mPositionGlobal.mdV, MVT_LLVector3d, 24);
}
mesgsys->addBinaryDataFast(_PREHASH_TypeData, packed_data, 56);
}
@ -116,9 +116,9 @@ void LLHUDEffectSpiral::unpackData(LLMessageSystem *mesgsys, S32 blocknum)
mesgsys->getBinaryDataFast(_PREHASH_Effect, _PREHASH_TypeData,
packed_data, EFFECT_SIZE, blocknum, EFFECT_SIZE);
htonmemcpy(object_id.mData, packed_data, MVT_LLUUID, 16);
htonmemcpy(target_object_id.mData, packed_data + 16, MVT_LLUUID, 16);
htonmemcpy(mPositionGlobal.mdV, packed_data + 32, MVT_LLVector3d, 24);
htolememcpy(object_id.mData, packed_data, MVT_LLUUID, 16);
htolememcpy(target_object_id.mData, packed_data + 16, MVT_LLUUID, 16);
htolememcpy(mPositionGlobal.mdV, packed_data + 32, MVT_LLVector3d, 24);
LLViewerObject *objp = NULL;

View File

@ -5067,7 +5067,7 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response
{
LLInventoryObject::object_list_t inventory_objects;
object->getInventoryContents(inventory_objects);
int contents_count = inventory_objects.size()-1; //subtract one for containing folder
int contents_count = inventory_objects.size();
LLInventoryCopyAndWearObserver* inventoryObserver = new LLInventoryCopyAndWearObserver(cat_and_wear->mCatID, contents_count, cat_and_wear->mFolderResponded,
cat_and_wear->mReplace);

View File

@ -42,7 +42,7 @@
#include "llviewerfoldertype.h"
#include "llradiogroup.h"
#include "llstartup.h"
#include <boost/regex.hpp>
// linden library includes
#include "llclipboard.h"
#include "lltrans.h"
@ -84,11 +84,6 @@ LLInventoryFilter::LLInventoryFilter(const Params& p)
mFirstSuccessGeneration(0),
mSearchType(SEARCHTYPE_NAME)
{
// <FS:Zi> Begin Multi-substring inventory search
mSubStringMatchOffsets.clear();
mFilterSubStrings.clear();
// </FS:Zi> End Multi-substring inventory search
// copy mFilterOps into mDefaultFilterOps
markDefault();
mUsername = gAgentUsername;
@ -106,79 +101,66 @@ bool LLInventoryFilter::check(const LLFolderViewModelItem* item)
return true;
}
// <FS:Zi> Multi-substring inventory search
//std::string desc = listener->getSearchableCreatorName();
//switch(mSearchType)
//{
// case SEARCHTYPE_CREATOR:
// desc = listener->getSearchableCreatorName();
// break;
// case SEARCHTYPE_DESCRIPTION:
// desc = listener->getSearchableDescription();
// break;
// case SEARCHTYPE_UUID:
// desc = listener->getSearchableUUIDString();
// break;
// case SEARCHTYPE_NAME:
// default:
// desc = listener->getSearchableName();
// break;
//}
//bool passed = (mFilterSubString.size() ? desc.find(mFilterSubString) != std::string::npos : true);
std::string::size_type string_offset = std::string::npos;
if (mFilterSubStrings.size())
std::string desc = listener->getSearchableCreatorName();
switch(mSearchType)
{
std::string searchLabel;
switch (mSearchType)
case SEARCHTYPE_CREATOR:
desc = listener->getSearchableCreatorName();
break;
case SEARCHTYPE_DESCRIPTION:
desc = listener->getSearchableDescription();
break;
case SEARCHTYPE_UUID:
desc = listener->getSearchableUUIDString();
break;
// <FS:Ansariel> Allow searching by all
case SEARCHTYPE_ALL:
desc = listener->getSearchableAll();
break;
// </FS:Ansariel>
case SEARCHTYPE_NAME:
default:
desc = listener->getSearchableName();
break;
}
bool passed = true;
// <FS:Ansariel> Allow searching by all
//if (!mExactToken.empty() && (mSearchType == SEARCHTYPE_NAME))
if (!mExactToken.empty() && ((mSearchType == SEARCHTYPE_NAME) || (mSearchType == SEARCHTYPE_ALL)))
// </FS:Ansariel>
{
passed = false;
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
boost::char_separator<char> sep(" ");
tokenizer tokens(desc, sep);
for (auto token_iter : tokens)
{
case SEARCHTYPE_NAME:
searchLabel = listener->getSearchableName();
break;
case SEARCHTYPE_DESCRIPTION:
searchLabel = listener->getSearchableDescription();
break;
case SEARCHTYPE_CREATOR:
searchLabel = listener->getSearchableCreatorName();
break;
case SEARCHTYPE_UUID:
searchLabel = listener->getSearchableUUIDString();
break;
case SEARCHTYPE_ALL:
searchLabel = listener->getSearchableAll();
break;
default:
LL_WARNS("LLInventoryFilter") << "Unknown search substring target: " << mSearchType << LL_ENDL;
searchLabel = listener->getSearchableName();
break;
}
U32 index = 0;
for (std::vector<std::string>::iterator it = mFilterSubStrings.begin();
it < mFilterSubStrings.end(); it++, index++)
{
std::string::size_type sub_string_offset = searchLabel.find(*it);
mSubStringMatchOffsets[index] = sub_string_offset;
if (sub_string_offset == std::string::npos)
if (token_iter == mExactToken)
{
string_offset = std::string::npos;
for (std::vector<std::string::size_type>::iterator it = mSubStringMatchOffsets.begin();
it < mSubStringMatchOffsets.end(); it++)
{
*it = std::string::npos;
}
passed = true;
break;
}
else if (string_offset == std::string::npos)
}
}
// <FS:Ansariel> Allow searching by all
//else if ((mFilterTokens.size() > 0) && (mSearchType == SEARCHTYPE_NAME))
else if ((mFilterTokens.size() > 0) && ((mSearchType == SEARCHTYPE_NAME) || (mSearchType == SEARCHTYPE_ALL)))
// </FS:Ansariel>
{
for (auto token_iter : mFilterTokens)
{
if (desc.find(token_iter) == std::string::npos)
{
string_offset = sub_string_offset;
return false;
}
}
}
bool passed = (mFilterSubString.size() == 0 || string_offset != std::string::npos);
// </FS:Zi> Multi-substring inventory search
else
{
passed = (mFilterSubString.size() ? desc.find(mFilterSubString) != std::string::npos : true);
}
passed = passed && checkAgainstFilterType(listener);
passed = passed && checkAgainstPermissions(listener);
@ -794,34 +776,41 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)
mFilterSubStringOrig = string;
LLStringUtil::trimHead(filter_sub_string_new);
LLStringUtil::toUpper(filter_sub_string_new);
// <FS:Zi> Multi-substring inventory search
// Cut filter string into several substrings, separated by +
{
mFilterSubStrings.clear();
mSubStringMatchOffsets.clear();
std::string::size_type frm = 0;
std::string::size_type to;
do
{
to = filter_sub_string_new.find_first_of('+',frm);
std::string subSubString = (to == std::string::npos) ? filter_sub_string_new.substr(frm, to) : filter_sub_string_new.substr(frm, to-frm);
if (subSubString.size())
{
mFilterSubStrings.push_back(subSubString);
mSubStringMatchOffsets.push_back(std::string::npos);
}
frm = to+1;
}
while (to != std::string::npos);
}
// </FS:Zi> Multi-substring inventory search
if (mFilterSubString != filter_sub_string_new)
{
mFilterTokens.clear();
if (filter_sub_string_new.find_first_of("+") != std::string::npos)
{
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
boost::char_separator<char> sep("+");
tokenizer tokens(filter_sub_string_new, sep);
for (auto token_iter : tokens)
{
mFilterTokens.push_back(token_iter);
}
}
std::string old_token = mExactToken;
mExactToken.clear();
bool exact_token_changed = false;
if (mFilterTokens.empty() && filter_sub_string_new.size() > 2)
{
boost::regex mPattern = boost::regex("\"\\s*([^<]*)?\\s*\"",
boost::regex::perl | boost::regex::icase);
boost::match_results<std::string::const_iterator> matches;
mExactToken = (boost::regex_match(filter_sub_string_new, matches, mPattern) && matches[1].matched)
? matches[1]
: LLStringUtil::null;
if ((old_token.empty() && !mExactToken.empty())
|| (!old_token.empty() && mExactToken.empty()))
{
exact_token_changed = true;
}
}
// hitting BACKSPACE, for example
const BOOL less_restrictive = mFilterSubString.size() >= filter_sub_string_new.size()
&& !mFilterSubString.substr(0, filter_sub_string_new.size()).compare(filter_sub_string_new);
@ -831,7 +820,11 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)
&& !filter_sub_string_new.substr(0, mFilterSubString.size()).compare(mFilterSubString);
mFilterSubString = filter_sub_string_new;
if (less_restrictive)
if (exact_token_changed)
{
setModified(FILTER_RESTART);
}
else if (less_restrictive)
{
setModified(FILTER_LESS_RESTRICTIVE);
}
@ -1595,25 +1588,3 @@ bool LLInventoryFilter::FilterOps::DateRange::validateBlock( bool emit_errors
}
return valid;
}
// <FS:Zi> Multi-substring inventory search
// For use by LLFolderViewItem for highlighting
U32 LLInventoryFilter::getFilterSubStringCount() const
{
return mFilterSubStrings.size();
}
std::string::size_type LLInventoryFilter::getFilterSubStringPos(U32 index) const
{
if (index >= mSubStringMatchOffsets.size()) return std::string::npos;
return mSubStringMatchOffsets[index];
}
std::string::size_type LLInventoryFilter::getFilterSubStringLen(U32 index) const
{
if (index >= mFilterSubStrings.size()) return 0;
return mFilterSubStrings[index].size();
}
// </FS:Zi> Multi-substring inventory search

View File

@ -330,11 +330,6 @@ private:
FilterOps mBackupFilterOps; // for backup purposes when leaving 'search link' mode
std::string mFilterSubString;
// <FS:Zi> Multi-substring inventory search
std::vector<std::string::size_type> mSubStringMatchOffsets;
std::vector<std::string> mFilterSubStrings;
// </FS:Zi> Multi-substring inventory search
std::string mFilterSubStringOrig;
std::string mUsername;
@ -354,6 +349,9 @@ private:
std::string mEmptyLookupMessage;
ESearchType mSearchType;
std::vector<std::string> mFilterTokens;
std::string mExactToken;
};
#endif

View File

@ -274,6 +274,7 @@ std::set<std::string> LLTransactionNotificationListItem::getTypes()
std::set<std::string> types;
types.insert("PaymentReceived");
types.insert("PaymentSent");
types.insert("UploadPayment");
return types;
}

View File

@ -4301,20 +4301,20 @@ void LLSelectMgr::packMultipleUpdate(LLSelectNode* node, void *user_data)
if (type & UPD_POSITION)
{
htonmemcpy(&data[offset], &(object->getPosition().mV), MVT_LLVector3, 12);
htolememcpy(&data[offset], &(object->getPosition().mV), MVT_LLVector3, 12);
offset += 12;
}
if (type & UPD_ROTATION)
{
LLQuaternion quat = object->getRotation();
LLVector3 vec = quat.packToVector3();
htonmemcpy(&data[offset], &(vec.mV), MVT_LLQuaternion, 12);
htolememcpy(&data[offset], &(vec.mV), MVT_LLQuaternion, 12);
offset += 12;
}
if (type & UPD_SCALE)
{
//LL_INFOS() << "Sending object scale " << object->getScale() << LL_ENDL;
htonmemcpy(&data[offset], &(object->getScale().mV), MVT_LLVector3, 12);
htolememcpy(&data[offset], &(object->getScale().mV), MVT_LLVector3, 12);
offset += 12;
}
gMessageSystem->addBinaryDataFast(_PREHASH_Data, data, offset);

View File

@ -52,6 +52,29 @@
#include "rlvcommon.h"
// [/RLVa:KB]
class PropertiesChangedCallback : public LLInventoryCallback
{
public:
PropertiesChangedCallback(LLHandle<LLPanel> sidepanel_handle, LLUUID &item_id, S32 id)
: mHandle(sidepanel_handle), mItemId(item_id), mId(id)
{}
void fire(const LLUUID &inv_item)
{
// inv_item can be null for some reason
LLSidepanelItemInfo* sidepanel = dynamic_cast<LLSidepanelItemInfo*>(mHandle.get());
if (sidepanel)
{
// sidepanel waits only for most recent update
sidepanel->onUpdateCallback(mItemId, mId);
}
}
private:
LLHandle<LLPanel> mHandle;
LLUUID mItemId;
S32 mId;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLItemPropertiesObserver
//
@ -71,7 +94,7 @@ public:
}
virtual void changed(U32 mask);
private:
LLSidepanelItemInfo* mFloater;
LLSidepanelItemInfo* mFloater; // Not a handle because LLSidepanelItemInfo is managing LLItemPropertiesObserver
};
void LLItemPropertiesObserver::changed(U32 mask)
@ -118,7 +141,7 @@ public:
S32 serial_num,
void* user_data);
private:
LLSidepanelItemInfo* mFloater;
LLSidepanelItemInfo* mFloater; // Not a handle because LLSidepanelItemInfo is managing LLObjectInventoryObserver
};
/*virtual*/
@ -141,6 +164,7 @@ LLSidepanelItemInfo::LLSidepanelItemInfo(const LLPanel::Params& p)
: LLSidepanelInventorySubpanel(p)
, mItemID(LLUUID::null)
, mObjectInventoryObserver(NULL)
, mUpdatePendingId(-1)
{
mPropertiesObserver = new LLItemPropertiesObserver(this);
}
@ -171,19 +195,19 @@ BOOL LLSidepanelItemInfo::postBuild()
// owner permissions
// Permissions debug text
// group permissions
getChild<LLUICtrl>("CheckShareWithGroup")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
getChild<LLUICtrl>("CheckShareWithGroup")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this, _1));
// everyone permissions
getChild<LLUICtrl>("CheckEveryoneCopy")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
getChild<LLUICtrl>("CheckEveryoneCopy")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this, _1));
// next owner permissions
getChild<LLUICtrl>("CheckNextOwnerModify")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
getChild<LLUICtrl>("CheckNextOwnerCopy")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
getChild<LLUICtrl>("CheckNextOwnerTransfer")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
getChild<LLUICtrl>("CheckNextOwnerModify")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this, _1));
getChild<LLUICtrl>("CheckNextOwnerCopy")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this, _1));
getChild<LLUICtrl>("CheckNextOwnerTransfer")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this, _1));
// Mark for sale or not, and sale info
getChild<LLUICtrl>("CheckPurchase")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this));
getChild<LLUICtrl>("CheckPurchase")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this, _1));
// Change sale type, and sale info
getChild<LLUICtrl>("ComboBoxSaleType")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this));
getChild<LLUICtrl>("ComboBoxSaleType")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this, _1));
// "Price" label for edit
getChild<LLUICtrl>("Edit Cost")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this));
getChild<LLUICtrl>("Edit Cost")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this, _1));
refresh();
return TRUE;
}
@ -195,11 +219,16 @@ void LLSidepanelItemInfo::setObjectID(const LLUUID& object_id)
// Start monitoring changes in the object inventory to update
// selected inventory item properties in Item Profile panel. See STORM-148.
startObjectInventoryObserver();
mUpdatePendingId = -1;
}
void LLSidepanelItemInfo::setItemID(const LLUUID& item_id)
{
mItemID = item_id;
if (mItemID != item_id)
{
mItemID = item_id;
mUpdatePendingId = -1;
}
}
const LLUUID& LLSidepanelItemInfo::getObjectID() const
@ -212,6 +241,15 @@ const LLUUID& LLSidepanelItemInfo::getItemID() const
return mItemID;
}
void LLSidepanelItemInfo::onUpdateCallback(const LLUUID& item_id, S32 received_update_id)
{
if (mItemID == item_id && mUpdatePendingId == received_update_id)
{
mUpdatePendingId = -1;
refresh();
}
}
void LLSidepanelItemInfo::reset()
{
LLSidepanelInventorySubpanel::reset();
@ -245,24 +283,16 @@ void LLSidepanelItemInfo::refresh()
"LabelItemName",
"LabelItemDesc",
"LabelCreatorName",
"LabelOwnerName",
"CheckOwnerModify",
"CheckOwnerCopy",
"CheckOwnerTransfer",
"CheckShareWithGroup",
"CheckEveryoneCopy",
"CheckNextOwnerModify",
"CheckNextOwnerCopy",
"CheckNextOwnerTransfer",
"CheckPurchase",
"Edit Cost"
"LabelOwnerName"
};
for(size_t t=0; t<LL_ARRAY_SIZE(no_item_names); ++t)
{
getChildView(no_item_names[t])->setEnabled(false);
}
setPropertiesFieldsEnabled(false);
const std::string hide_names[]={
"BaseMaskDebug",
"OwnerMaskDebug",
@ -300,6 +330,11 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
llassert(item);
if (!item) return;
if (mUpdatePendingId != -1)
{
return;
}
// do not enable the UI for incomplete items.
BOOL is_complete = item->isFinished();
const BOOL cannot_restrict_permissions = LLInventoryType::cannotRestrictPermissions(item->getInventoryType());
@ -750,6 +785,26 @@ void LLSidepanelItemInfo::stopObjectInventoryObserver()
mObjectInventoryObserver = NULL;
}
void LLSidepanelItemInfo::setPropertiesFieldsEnabled(bool enabled)
{
const std::string fields[] = {
"CheckOwnerModify",
"CheckOwnerCopy",
"CheckOwnerTransfer",
"CheckShareWithGroup",
"CheckEveryoneCopy",
"CheckNextOwnerModify",
"CheckNextOwnerCopy",
"CheckNextOwnerTransfer",
"CheckPurchase",
"Edit Cost"
};
for (size_t t = 0; t<LL_ARRAY_SIZE(fields); ++t)
{
getChildView(fields[t])->setEnabled(false);
}
}
void LLSidepanelItemInfo::onClickCreator()
{
LLViewerInventoryItem* item = findItem();
@ -832,10 +887,18 @@ void LLSidepanelItemInfo::onCommitDescription()
}
}
// static
void LLSidepanelItemInfo::onCommitPermissions()
void LLSidepanelItemInfo::onCommitPermissions(LLUICtrl* ctrl)
{
if (ctrl)
{
// will be enabled by response from server
ctrl->setEnabled(false);
}
updatePermissions();
}
void LLSidepanelItemInfo::updatePermissions()
{
//LL_INFOS() << "LLSidepanelItemInfo::onCommitPermissions()" << LL_ENDL;
LLViewerInventoryItem* item = findItem();
if(!item) return;
@ -923,19 +986,17 @@ void LLSidepanelItemInfo::onCommitPermissions()
}
// static
void LLSidepanelItemInfo::onCommitSaleInfo()
void LLSidepanelItemInfo::onCommitSaleInfo(LLUICtrl* ctrl)
{
if (ctrl)
{
// will be enabled by response from server
ctrl->setEnabled(false);
}
//LL_INFOS() << "LLSidepanelItemInfo::onCommitSaleInfo()" << LL_ENDL;
updateSaleInfo();
}
// static
void LLSidepanelItemInfo::onCommitSaleType()
{
//LL_INFOS() << "LLSidepanelItemInfo::onCommitSaleType()" << LL_ENDL;
updateSaleInfo();
}
void LLSidepanelItemInfo::updateSaleInfo()
{
LLViewerInventoryItem* item = findItem();
@ -1016,7 +1077,12 @@ void LLSidepanelItemInfo::onCommitChanges(LLPointer<LLViewerInventoryItem> item)
if (mObjectID.isNull())
{
// This is in the agent's inventory.
item->updateServer(FALSE);
// Mark update as pending and wait only for most recent one in case user requested for couple
// Once update arrives or any of ids change drop pending id.
mUpdatePendingId++;
LLPointer<LLInventoryCallback> callback = new PropertiesChangedCallback(getHandle(), mItemID, mUpdatePendingId);
update_inventory_item(item.get(), callback);
//item->updateServer(FALSE);
gInventory.updateItem(item);
gInventory.notifyObservers();
}
@ -1041,6 +1107,7 @@ void LLSidepanelItemInfo::onCommitChanges(LLPointer<LLViewerInventoryItem> item)
// prevents flashing in content tab and some duplicated request.
object->dirtyInventory();
}
setPropertiesFieldsEnabled(false);
}
}
}
@ -1069,7 +1136,6 @@ void LLSidepanelItemInfo::save()
{
onCommitName();
onCommitDescription();
onCommitPermissions();
onCommitSaleInfo();
onCommitSaleType();
updatePermissions();
updateSaleInfo();
}

View File

@ -57,6 +57,9 @@ public:
const LLUUID& getObjectID() const;
const LLUUID& getItemID() const;
// if received update and item id (from callback) matches internal ones, update UI
void onUpdateCallback(const LLUUID& item_id, S32 received_update_id);
protected:
/*virtual*/ void refresh();
/*virtual*/ void save();
@ -71,12 +74,16 @@ private:
void startObjectInventoryObserver();
void stopObjectInventoryObserver();
void setPropertiesFieldsEnabled(bool enabled);
LLUUID mItemID; // inventory UUID for the inventory item.
LLUUID mObjectID; // in-world task UUID, or null if in agent inventory.
LLItemPropertiesObserver* mPropertiesObserver; // for syncing changes to item
LLObjectInventoryObserver* mObjectInventoryObserver; // for syncing changes to items inside an object
// We can send multiple properties updates simultaneously, make sure only last response counts and there won't be a race condition.
S32 mUpdatePendingId;
//
// UI Elements
//
@ -85,9 +92,9 @@ protected:
void onClickOwner();
void onCommitName();
void onCommitDescription();
void onCommitPermissions();
void onCommitSaleInfo();
void onCommitSaleType();
void onCommitPermissions(LLUICtrl* ctrl);
void updatePermissions();
void onCommitSaleInfo(LLUICtrl* ctrl);
void updateSaleInfo();
void onCommitChanges(LLPointer<LLViewerInventoryItem> item);
};

View File

@ -178,9 +178,6 @@ BOOL LLSidepanelTaskInfo::postBuild()
void LLSidepanelTaskInfo::disableAll()
{
mDAPermModify->setEnabled(FALSE);
mDAPermModify->setValue(LLStringUtil::null);
mDACreatorName->setValue(LLStringUtil::null);
mDACreatorName->setEnabled(FALSE);
@ -188,18 +185,42 @@ void LLSidepanelTaskInfo::disableAll()
mDAOwnerName->setValue(LLStringUtil::null);
mDAOwnerName->setEnabled(FALSE);
mDAButtonSetGroup->setEnabled(FALSE);
mDAObjectName->setValue(LLStringUtil::null);
mDAObjectName->setEnabled(FALSE);
mDAName->setEnabled(FALSE);
mDADescription->setEnabled(FALSE);
mDAObjectDescription->setValue(LLStringUtil::null);
mDAObjectDescription->setEnabled(FALSE);
mDAPathfindingAttributes->setEnabled(FALSE);
mDAPathfindingAttributes->setValue(LLStringUtil::null);
mDAButtonSetGroup->setEnabled(FALSE);
mDAButtonDeed->setEnabled(FALSE);
mDAPermModify->setEnabled(FALSE);
mDAPermModify->setValue(LLStringUtil::null);
mDAEditCost->setValue(LLStringUtil::null);
mDAComboSaleType->setValue(LLSaleInfo::FS_COPY);
disablePermissions();
mDAB->setVisible(FALSE);
mDAO->setVisible(FALSE);
mDAG->setVisible(FALSE);
mDAE->setVisible(FALSE);
mDAN->setVisible(FALSE);
mDAF->setVisible(FALSE);
mOpenBtn->setEnabled(FALSE);
mPayBtn->setEnabled(FALSE);
mBuyBtn->setEnabled(FALSE);
}
void LLSidepanelTaskInfo::disablePermissions()
{
mDACheckboxShareWithGroup->setValue(FALSE);
mDACheckboxShareWithGroup->setEnabled(FALSE);
mDAButtonDeed->setEnabled(FALSE);
mDACheckboxAllowEveryoneMove->setValue(FALSE);
mDACheckboxAllowEveryoneMove->setEnabled(FALSE);
@ -221,33 +242,17 @@ void LLSidepanelTaskInfo::disableAll()
//checkbox include in search
mDASearchCheck->setValue(FALSE);
mDASearchCheck->setEnabled(FALSE);
mDAComboSaleType->setValue(LLSaleInfo::FS_COPY);
mDAComboSaleType->setEnabled(FALSE);
mDAEditCost->setValue(LLStringUtil::null);
mDAEditCost->setEnabled(FALSE);
mDALabelClickAction->setEnabled(FALSE);
if (mDAComboClickAction)
{
mDAComboClickAction->setEnabled(FALSE);
mDAComboClickAction->clear();
}
mDAPathfindingAttributes->setEnabled(FALSE);
mDAPathfindingAttributes->setValue(LLStringUtil::null);
mDAB->setVisible(FALSE);
mDAO->setVisible(FALSE);
mDAG->setVisible(FALSE);
mDAE->setVisible(FALSE);
mDAN->setVisible(FALSE);
mDAF->setVisible(FALSE);
mOpenBtn->setEnabled(FALSE);
mPayBtn->setEnabled(FALSE);
mBuyBtn->setEnabled(FALSE);
}
void LLSidepanelTaskInfo::refresh()
@ -1001,6 +1006,12 @@ void LLSidepanelTaskInfo::onCommitPerm(LLUICtrl *ctrl, void *data, U8 field, U32
BOOL new_state = check->get();
LLSelectMgr::getInstance()->selectionSetObjectPermissions(field, new_state, perm);
LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data;
if (self)
{
self->disablePermissions();
}
}
// static

View File

@ -95,6 +95,7 @@ protected:
static void doClickAction(U8 click_action);
void disableAll();
void disablePermissions();
private:
LLNameBox* mLabelGroupName; // group name

View File

@ -413,16 +413,24 @@ BOOL LLStatusBar::postBuild()
mPanelNearByMedia->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT);
mPanelNearByMedia->setVisible(FALSE);
updateBalancePanelPosition();
// Hook up and init for filtering
mFilterEdit = getChild<LLSearchEditor>( "search_menu_edit" );
mSearchPanel = getChild<LLPanel>( "menu_search_panel" );
mSearchPanel->setVisible(gSavedSettings.getBOOL("MenuSearch"));
BOOL search_panel_visible = gSavedSettings.getBOOL("MenuSearch");
mSearchPanel->setVisible(search_panel_visible);
mFilterEdit->setKeystrokeCallback(boost::bind(&LLStatusBar::onUpdateFilterTerm, this));
mFilterEdit->setCommitCallback(boost::bind(&LLStatusBar::onUpdateFilterTerm, this));
collectSearchableItems();
gSavedSettings.getControl("MenuSearch")->getCommitSignal()->connect(boost::bind(&LLStatusBar::updateMenuSearchVisibility, this, _2));
if (search_panel_visible)
{
updateMenuSearchPosition();
}
// <FS:Ansariel> Script debug
mScriptOut = getChild<LLIconCtrl>("scriptout");
mScriptOut->setMouseDownCallback(boost::bind(&LLFloaterScriptDebug::show, LLUUID::null));
@ -712,31 +720,7 @@ void LLStatusBar::setBalance(S32 balance)
std::string label_str = getString("buycurrencylabel", string_args);
mBoxBalance->setValue(label_str);
// <COLOSI opensim currency support>
// Unclear if call to getTextBoundingRect updates text but assuming it calls length()
// when getting the bounding box which will update the text and get the length of the
// wrapped (Tea::wrapCurrency) text (see lluistring). If not, and currency symbols
// that are not two characters have the wrong size bounding rect, then the correct
// place to fix this is in the getTextBoundingRect() function, not here.
// buy_rect below should be properly set to dirty() when we modify the currency and
// should also be updated and wrapped before width is determined.
// </COLOSI opensim currency support>
// Resize the L$ balance background to be wide enough for your balance plus the buy button
{
const S32 HPAD = 24;
LLRect balance_rect = mBoxBalance->getTextBoundingRect();
LLRect buy_rect = getChildView("buyL")->getRect();
// <FS:Ansariel> Not used in Firestorm
//LLRect shop_rect = getChildView("goShop")->getRect();
LLView* balance_bg_view = getChildView("balance_bg");
LLRect balance_bg_rect = balance_bg_view->getRect();
// <FS:Ansariel> Not used in Firestorm
//balance_bg_rect.mLeft = balance_bg_rect.mRight - (buy_rect.getWidth() + shop_rect.getWidth() + balance_rect.getWidth() + HPAD);
balance_bg_rect.mLeft = balance_bg_rect.mRight - (buy_rect.getWidth() + balance_rect.getWidth() + HPAD);
// </FS:Ansariel>
balance_bg_view->setShape(balance_bg_rect);
}
updateBalancePanelPosition();
// If the search panel is shown, move this according to the new balance width. Parcel text will reshape itself in setParcelInfoText
if (mSearchPanel && mSearchPanel->getVisible())
@ -1117,6 +1101,33 @@ void LLStatusBar::updateMenuSearchPosition()
mSearchPanel->setShape( searchRect );
}
void LLStatusBar::updateBalancePanelPosition()
{
// <COLOSI opensim currency support>
// Unclear if call to getTextBoundingRect updates text but assuming it calls length()
// when getting the bounding box which will update the text and get the length of the
// wrapped (Tea::wrapCurrency) text (see lluistring). If not, and currency symbols
// that are not two characters have the wrong size bounding rect, then the correct
// place to fix this is in the getTextBoundingRect() function, not here.
// buy_rect below should be properly set to dirty() when we modify the currency and
// should also be updated and wrapped before width is determined.
// </COLOSI opensim currency support>
// Resize the L$ balance background to be wide enough for your balance plus the buy button
const S32 HPAD = 24;
LLRect balance_rect = mBoxBalance->getTextBoundingRect();
LLRect buy_rect = getChildView("buyL")->getRect();
// <FS:Ansariel> Not used in Firestorm
//LLRect shop_rect = getChildView("goShop")->getRect();
LLView* balance_bg_view = getChildView("balance_bg");
LLRect balance_bg_rect = balance_bg_view->getRect();
// <FS:Ansariel> Not used in Firestorm
//balance_bg_rect.mLeft = balance_bg_rect.mRight - (buy_rect.getWidth() + shop_rect.getWidth() + balance_rect.getWidth() + HPAD);
balance_bg_rect.mLeft = balance_bg_rect.mRight - (buy_rect.getWidth() + balance_rect.getWidth() + HPAD);
// </FS:Ansariel>
balance_bg_view->setShape(balance_bg_rect);
}
//////////////////////////////////////////////////////////////////////////////
// Firestorm methods

View File

@ -179,7 +179,8 @@ private:
std::unique_ptr< ll::statusbar::SearchData > mSearchData;
void collectSearchableItems();
void updateMenuSearchVisibility( const LLSD& data );
void updateMenuSearchPosition();
void updateMenuSearchPosition(); // depends onto balance position
void updateBalancePanelPosition();
class LLParcelChangeObserver;

View File

@ -962,37 +962,9 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
static bool needs_tooltip(LLSelectNode* nodep)
{
if (!nodep)
if (!nodep || !nodep->mValid)
return false;
LLViewerObject* object = nodep->getObject();
LLViewerObject *parent = (LLViewerObject *)object->getParent();
if (object->flagHandleTouch()
|| (parent && parent->flagHandleTouch())
|| object->flagTakesMoney()
|| (parent && parent->flagTakesMoney())
|| object->flagAllowInventoryAdd()
)
{
return true;
}
U8 click_action = final_click_action(object);
if (click_action != 0)
{
return true;
}
if (nodep->mValid)
{
bool anyone_copy = anyone_copy_selection(nodep);
bool for_sale = for_sale_selection(nodep);
if (anyone_copy || for_sale)
{
return true;
}
}
return false;
return true;
}

View File

@ -5051,6 +5051,8 @@ void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data)
S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_AnimationList);
S32 num_source_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_AnimationSourceList);
LL_DEBUGS("Messaging", "Motion") << "Processing " << num_blocks << " Animations" << LL_ENDL;
//clear animation flags
avatarp->mSignaledAnimations.clear();
@ -5063,8 +5065,6 @@ void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data)
mesgsys->getUUIDFast(_PREHASH_AnimationList, _PREHASH_AnimID, animation_id, i);
mesgsys->getS32Fast(_PREHASH_AnimationList, _PREHASH_AnimSequenceID, anim_sequence_id, i);
LL_DEBUGS("Messaging") << "Anim sequence ID: " << anim_sequence_id << LL_ENDL;
avatarp->mSignaledAnimations[animation_id] = anim_sequence_id;
// *HACK: Disabling flying mode if it has been enabled shortly before the agent
@ -5109,6 +5109,14 @@ void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data)
// </FS:Zi>
}
}
LL_DEBUGS("Messaging", "Motion") << "Anim sequence ID: " << anim_sequence_id
<< " Animation id: " << animation_id
<< " From block: " << object_id << LL_ENDL;
}
else
{
LL_DEBUGS("Messaging", "Motion") << "Anim sequence ID: " << anim_sequence_id
<< " Animation id: " << animation_id << LL_ENDL;
}
}
}
@ -6380,12 +6388,27 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
}
}
// Error Notification can come with and without reason
if (notificationID == "JoinGroupError" && llsdBlock.has("reason"))
{
LLNotificationsUtil::add("JoinGroupErrorReason", llsdBlock);
return true;
}
// Error Notification can come with and without reason
if (notificationID == "JoinGroupError")
{
if (llsdBlock.has("reason"))
{
LLNotificationsUtil::add("JoinGroupErrorReason", llsdBlock);
return true;
}
if (llsdBlock.has("group_id"))
{
LLGroupData agent_gdatap;
bool is_member = gAgent.getGroupData(llsdBlock["group_id"].asUUID(), agent_gdatap);
if (is_member)
{
LLSD args;
args["reason"] = LLTrans::getString("AlreadyInGroup");
LLNotificationsUtil::add("JoinGroupErrorReason", args);
return true;
}
}
}
LLNotificationsUtil::add(notificationID, llsdBlock);
return true;

View File

@ -1312,7 +1312,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
{
case (60 + 16):
// pull out collision normal for avatar
htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
htolememcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
((LLVOAvatar*)this)->setFootPlane(collision_plane);
count += sizeof(LLVector4);
// fall through
@ -1320,23 +1320,23 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
this_update_precision = 32;
// this is a terse update
// pos
htonmemcpy(new_pos_parent.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
htolememcpy(new_pos_parent.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
count += sizeof(LLVector3);
// vel
htonmemcpy((void*)getVelocity().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
htolememcpy((void*)getVelocity().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
count += sizeof(LLVector3);
// acc
htonmemcpy((void*)getAcceleration().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
htolememcpy((void*)getAcceleration().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
count += sizeof(LLVector3);
// theta
{
LLVector3 vec;
htonmemcpy(vec.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
htolememcpy(vec.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
new_rot.unpackFromVector3(vec);
}
count += sizeof(LLVector3);
// omega
htonmemcpy((void*)new_angv.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
htolememcpy((void*)new_angv.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
if (new_angv.isExactlyZero())
{
// reset rotation time
@ -1352,7 +1352,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
break;
case(32 + 16):
// pull out collision normal for avatar
htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
htolememcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
((LLVOAvatar*)this)->setFootPlane(collision_plane);
count += sizeof(LLVector4);
// fall through
@ -1362,7 +1362,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
// This is a terse 16 update, so treat data as an array of U16's.
#ifdef LL_BIG_ENDIAN
htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
htolememcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
val = valswizzle;
#else
val = (U16 *) &data[count];
@ -1373,7 +1373,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
new_pos_parent.mV[VZ] = U16_to_F32(val[VZ], MIN_HEIGHT, MAX_HEIGHT);
#ifdef LL_BIG_ENDIAN
htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
htolememcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
val = valswizzle;
#else
val = (U16 *) &data[count];
@ -1384,7 +1384,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
U16_to_F32(val[VZ], -size, size)));
#ifdef LL_BIG_ENDIAN
htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
htolememcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
val = valswizzle;
#else
val = (U16 *) &data[count];
@ -1395,7 +1395,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
U16_to_F32(val[VZ], -size, size)));
#ifdef LL_BIG_ENDIAN
htonmemcpy(valswizzle, &data[count], MVT_U16Quat, 4);
htolememcpy(valswizzle, &data[count], MVT_U16Quat, 4);
val = valswizzle;
#else
val = (U16 *) &data[count];
@ -1407,7 +1407,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
new_rot.mQ[VW] = U16_to_F32(val[VW], -1.f, 1.f);
#ifdef LL_BIG_ENDIAN
htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
htolememcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
val = valswizzle;
#else
val = (U16 *) &data[count];
@ -1609,7 +1609,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
{
case(60 + 16):
// pull out collision normal for avatar
htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
htolememcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
((LLVOAvatar*)this)->setFootPlane(collision_plane);
count += sizeof(LLVector4);
// fall through
@ -1617,23 +1617,23 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
// this is a terse 32 update
// pos
this_update_precision = 32;
htonmemcpy(new_pos_parent.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
htolememcpy(new_pos_parent.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
count += sizeof(LLVector3);
// vel
htonmemcpy((void*)getVelocity().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
htolememcpy((void*)getVelocity().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
count += sizeof(LLVector3);
// acc
htonmemcpy((void*)getAcceleration().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
htolememcpy((void*)getAcceleration().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
count += sizeof(LLVector3);
// theta
{
LLVector3 vec;
htonmemcpy(vec.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
htolememcpy(vec.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
new_rot.unpackFromVector3(vec);
}
count += sizeof(LLVector3);
// omega
htonmemcpy((void*)new_angv.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
htolememcpy((void*)new_angv.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
if (new_angv.isExactlyZero())
{
// reset rotation time
@ -1649,7 +1649,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
break;
case(32 + 16):
// pull out collision normal for avatar
htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
htolememcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
((LLVOAvatar*)this)->setFootPlane(collision_plane);
count += sizeof(LLVector4);
// fall through
@ -1659,7 +1659,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
test_pos_parent.quantize16(-0.5f*size, 1.5f*size, MIN_HEIGHT, MAX_HEIGHT);
#ifdef LL_BIG_ENDIAN
htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
htolememcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
val = valswizzle;
#else
val = (U16 *) &data[count];
@ -1670,7 +1670,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
new_pos_parent.mV[VZ] = U16_to_F32(val[VZ], MIN_HEIGHT, MAX_HEIGHT);
#ifdef LL_BIG_ENDIAN
htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
htolememcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
val = valswizzle;
#else
val = (U16 *) &data[count];
@ -1681,7 +1681,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
U16_to_F32(val[VZ], -size, size));
#ifdef LL_BIG_ENDIAN
htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
htolememcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
val = valswizzle;
#else
val = (U16 *) &data[count];
@ -1692,7 +1692,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
U16_to_F32(val[VZ], -size, size));
#ifdef LL_BIG_ENDIAN
htonmemcpy(valswizzle, &data[count], MVT_U16Quat, 8);
htolememcpy(valswizzle, &data[count], MVT_U16Quat, 8);
val = valswizzle;
#else
val = (U16 *) &data[count];
@ -1704,7 +1704,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
new_rot.mQ[VW] = U16_to_F32(val[VW], -1.f, 1.f);
#ifdef LL_BIG_ENDIAN
htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
htolememcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
val = valswizzle;
#else
val = (U16 *) &data[count];

View File

@ -484,6 +484,8 @@ public:
void updateInventoryLocal(LLInventoryItem* item, U8 key); // Update without messaging.
void updateTextureInventory(LLViewerInventoryItem* item, U8 key, bool is_new);
LLInventoryObject* getInventoryObject(const LLUUID& item_id);
// Get content except for root category
void getInventoryContents(LLInventoryObject::object_list_t& objects);
LLInventoryObject* getInventoryRoot();
LLViewerInventoryItem* getInventoryItemByAsset(const LLUUID& asset_id);

View File

@ -1011,6 +1011,12 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK
mLeftMouseDown = down;
buttonname = "Left Double Click";
break;
case LLMouseHandler::CLICK_BUTTON4:
buttonname = "Button 4";
break;
case LLMouseHandler::CLICK_BUTTON5:
buttonname = "Button 5";
break;
}
LLView::sMouseHandlerMessage.clear();
@ -1188,7 +1194,7 @@ BOOL LLViewerWindow::handleRightMouseUp(LLWindow *window, LLCoordGL pos, MASK m
BOOL LLViewerWindow::handleMiddleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask)
{
BOOL down = TRUE;
LLVoiceClient::getInstance()->middleMouseState(true);
LLVoiceClient::getInstance()->updateMouseState(LLMouseHandler::CLICK_MIDDLE, true);
handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_MIDDLE,down);
// Always handled as far as the OS is concerned.
@ -1340,17 +1346,47 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi
return result;
}
BOOL LLViewerWindow::handleMiddleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask)
{
BOOL down = FALSE;
LLVoiceClient::getInstance()->middleMouseState(false);
LLVoiceClient::getInstance()->updateMouseState(LLMouseHandler::CLICK_MIDDLE, false);
handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_MIDDLE,down);
// Always handled as far as the OS is concerned.
return TRUE;
}
BOOL LLViewerWindow::handleOtherMouse(LLWindow *window, LLCoordGL pos, MASK mask, S32 button, bool down)
{
switch (button)
{
case 4:
LLVoiceClient::getInstance()->updateMouseState(LLMouseHandler::CLICK_BUTTON4, down);
handleAnyMouseClick(window, pos, mask, LLMouseHandler::CLICK_BUTTON4, down);
break;
case 5:
LLVoiceClient::getInstance()->updateMouseState(LLMouseHandler::CLICK_BUTTON5, down);
handleAnyMouseClick(window, pos, mask, LLMouseHandler::CLICK_BUTTON5, down);
break;
default:
break;
}
// Always handled as far as the OS is concerned.
return TRUE;
}
BOOL LLViewerWindow::handleOtherMouseDown(LLWindow *window, LLCoordGL pos, MASK mask, S32 button)
{
return handleOtherMouse(window, pos, mask, button, TRUE);
}
BOOL LLViewerWindow::handleOtherMouseUp(LLWindow *window, LLCoordGL pos, MASK mask, S32 button)
{
return handleOtherMouse(window, pos, mask, button, FALSE);
}
// WARNING: this is potentially called multiple times per frame
void LLViewerWindow::handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask)
{
@ -3775,9 +3811,8 @@ void LLViewerWindow::updateUI()
LLRect screen_sticky_rect = mRootView->getLocalRect();
S32 local_x, local_y;
//if (gSavedSettings.getBOOL("DebugShowXUINames"))
static LLCachedControl<bool> debugShowXUINames(gSavedSettings, "DebugShowXUINames");
if (debugShowXUINames)
static LLCachedControl<bool> debug_show_xui_names(gSavedSettings, "DebugShowXUINames", 0);
if (debug_show_xui_names)
{
LLToolTip::Params params;

View File

@ -193,7 +193,10 @@ public:
/*virtual*/ BOOL handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK mask);
/*virtual*/ BOOL handleRightMouseUp(LLWindow *window, LLCoordGL pos, MASK mask);
/*virtual*/ BOOL handleMiddleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask);
/*virtual*/ BOOL handleMiddleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask);
/*virtual*/ BOOL handleMiddleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask);
/*virtual*/ BOOL handleOtherMouseDown(LLWindow *window, LLCoordGL pos, MASK mask, S32 button);
/*virtual*/ BOOL handleOtherMouseUp(LLWindow *window, LLCoordGL pos, MASK mask, S32 button);
BOOL handleOtherMouse(LLWindow *window, LLCoordGL pos, MASK mask, S32 button, bool down);
/*virtual*/ LLWindowCallbacks::DragNDropResult handleDragNDrop(LLWindow *window, LLCoordGL pos, MASK mask, LLWindowCallbacks::DragNDropAction action, std::string data);
void handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask);
void handleMouseDragged(LLWindow *window, LLCoordGL pos, MASK mask);

View File

@ -6322,7 +6322,7 @@ BOOL LLVOAvatar::processSingleAnimationStateChange( const LLUUID& anim_id, BOOL
}
else
{
LL_WARNS() << "Failed to start motion!" << LL_ENDL;
LL_WARNS("Motion") << "Failed to start motion!" << LL_ENDL;
}
}
else //stop animation
@ -6429,7 +6429,7 @@ LLUUID LLVOAvatar::remapMotionID(const LLUUID& id)
//-----------------------------------------------------------------------------
BOOL LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset)
{
LL_DEBUGS() << "motion requested " << id.asString() << " " << gAnimLibrary.animationName(id) << LL_ENDL;
LL_DEBUGS("Motion") << "motion requested " << id.asString() << " " << gAnimLibrary.animationName(id) << LL_ENDL;
// <FS:Zi> Animation Overrider
//LLUUID remap_id = remapMotionID(id, getSex());
@ -6454,7 +6454,7 @@ BOOL LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset)
if (remap_id != id)
{
LL_DEBUGS() << "motion resultant " << remap_id.asString() << " " << gAnimLibrary.animationName(remap_id) << LL_ENDL;
LL_DEBUGS("Motion") << "motion resultant " << remap_id.asString() << " " << gAnimLibrary.animationName(remap_id) << LL_ENDL;
}
if (isSelf() && remap_id == ANIM_AGENT_AWAY)
@ -6470,7 +6470,7 @@ BOOL LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset)
//-----------------------------------------------------------------------------
BOOL LLVOAvatar::stopMotion(const LLUUID& id, BOOL stop_immediate)
{
LL_DEBUGS() << "motion requested " << id.asString() << " " << gAnimLibrary.animationName(id) << LL_ENDL;
LL_DEBUGS("Motion") << "Motion requested " << id.asString() << " " << gAnimLibrary.animationName(id) << LL_ENDL;
// <FS:Zi> Animation Overrider
//LLUUID remap_id = remapMotionID(id);
@ -6495,7 +6495,7 @@ BOOL LLVOAvatar::stopMotion(const LLUUID& id, BOOL stop_immediate)
if (remap_id != id)
{
LL_DEBUGS() << "motion resultant " << remap_id.asString() << " " << gAnimLibrary.animationName(remap_id) << LL_ENDL;
LL_DEBUGS("Motion") << "motion resultant " << remap_id.asString() << " " << gAnimLibrary.animationName(remap_id) << LL_ENDL;
}
if (isSelf())

View File

@ -130,7 +130,7 @@ LLVoiceClient::LLVoiceClient()
mPTTDirty(true),
mPTT(true),
mUsePTT(true),
mPTTIsMiddleMouse(false),
mPTTMouseButton(0),
mPTTKey(0),
mPTTIsToggle(false),
mUserPTTState(false),
@ -661,13 +661,22 @@ bool LLVoiceClient::getPTTIsToggle()
void LLVoiceClient::setPTTKey(std::string &key)
{
// Value is stored as text for readability
if(key == "MiddleMouse")
{
mPTTIsMiddleMouse = true;
mPTTMouseButton = LLMouseHandler::CLICK_MIDDLE;
}
else if(key == "MouseButton4")
{
mPTTMouseButton = LLMouseHandler::CLICK_BUTTON4;
}
else if (key == "MouseButton5")
{
mPTTMouseButton = LLMouseHandler::CLICK_BUTTON5;
}
else
{
mPTTIsMiddleMouse = false;
mPTTMouseButton = 0;
if(!LLKeyboard::keyFromString(key, &mPTTKey))
{
// If the call failed, don't match any key.
@ -704,7 +713,7 @@ void LLVoiceClient::keyDown(KEY key, MASK mask)
return;
}
if (!mPTTIsMiddleMouse && LLAgent::isActionAllowed("speak") && (key == mPTTKey))
if (mPTTMouseButton == 0 && LLAgent::isActionAllowed("speak") && (key == mPTTKey))
{
bool down = gKeyboard->getKeyDown(mPTTKey);
if (down)
@ -716,7 +725,7 @@ void LLVoiceClient::keyDown(KEY key, MASK mask)
}
void LLVoiceClient::keyUp(KEY key, MASK mask)
{
if (!mPTTIsMiddleMouse && (key == mPTTKey))
if (mPTTMouseButton == 0 && (key == mPTTKey))
{
bool down = gKeyboard->getKeyDown(mPTTKey);
if (!down)
@ -725,9 +734,9 @@ void LLVoiceClient::keyUp(KEY key, MASK mask)
}
}
}
void LLVoiceClient::middleMouseState(bool down)
void LLVoiceClient::updateMouseState(S32 click, bool down)
{
if(mPTTIsMiddleMouse && LLAgent::isActionAllowed("speak"))
if(mPTTMouseButton == click && LLAgent::isActionAllowed("speak"))
{
inputUserControlState(down);
}

View File

@ -447,8 +447,8 @@ public:
// PTT key triggering
void keyDown(KEY key, MASK mask);
void keyUp(KEY key, MASK mask);
void middleMouseState(bool down);
void updateMouseState(S32 click, bool down);
boost::signals2::connection MicroChangedCallback(const micro_changed_signal_t::slot_type& cb ) { return mMicroChangedSignal.connect(cb); }
// <FS:Ansariel> Add callback for user volume change
@ -520,7 +520,7 @@ protected:
bool mPTT;
bool mUsePTT;
bool mPTTIsMiddleMouse;
S32 mPTTMouseButton;
KEY mPTTKey;
bool mPTTIsToggle;
bool mUserPTTState;

View File

@ -11,6 +11,16 @@
<on_click
function="Gesture.Action.ToogleActiveState" />
</menu_item_call>
<menu_item_call
label="Rename"
layout="topleft"
name="rename">
<on_click
function="Gesture.Action.Rename" />
<on_enable
function="Gesture.EnableAction"
parameter="rename_gesture" />
</menu_item_call>
<menu_item_call
label="Copy"
layout="topleft"

View File

@ -3207,6 +3207,29 @@ See https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries
</form>
</notification>
<notification
icon="alertmodal.tga"
label="Rename Gesture"
name="RenameGesture"
type="alertmodal">
New gesture name:
<tag>confirm</tag>
<form name="form">
<input name="new_name" type="text" width="300">
[NAME]
</input>
<button
default="true"
index="0"
name="OK"
text="OK"/>
<button
index="1"
name="Cancel"
text="Cancel"/>
</form>
</notification>
<notification
icon="alertmodal.tga"
name="RemoveFromFriends"

View File

@ -13,6 +13,14 @@
name="middle_mouse">
Middle Mouse
</panel.string>
<panel.string
name="button4_mouse">
Mouse Button 4
</panel.string>
<panel.string
name="button5_mouse">
Mouse Button 5
</panel.string>
<tab_container
label="Firestorm Prefs"

View File

@ -1090,6 +1090,7 @@ If you continue to receive this message, please contact Second Life support for
<string name="Debits">Debits</string>
<string name="Total">Total</string>
<string name="NoGroupDataFound">No group data found for group </string>
<string name="AlreadyInGroup">You are already in this group </string>
<!-- floater IM bonus_info: When a Linden with Admin/god status receives a new IM this displays the estate (Mainland vs. teen grid) of the source avatar.
This is to help Lindens when answering questions. -->

View File

@ -1432,9 +1432,9 @@
<usetemplate name="okcancelbuttons" notext="Продолжить" yestext="Создать аккаунт..."/>
</notification>
<notification name="LoginPacketNeverReceived">
Возникли неполадки при подключении. Возможно, проблема с вашим подключением к интернету или [SECOND_LIFE_GRID].
Возникли неполадки при подключении. Возможно, проблема с вашим подключением к интернету или [SECOND_LIFE_GRID] временно недоступна.
Варианты ваших действий: проверьте подключение к интернету и повторите попытку через несколько минут, нажмите кнопку &quot;Справка&quot; для перехода к [SUPPORT_SITE] или кнопку &quot;Телепортация&quot;, чтобы телепортироваться домой.
Вы можете проверить подключение к интернету, повторить попытку через несколько минут, нажать кнопку «Справка» для перехода на [SUPPORT_SITE] или нажать кнопку «Телепортация», чтобы телепортироваться домой.
<url name="url">
http://secondlife.com/support/
</url>