summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xdoc/contributions.txt9
-rwxr-xr-xindra/llmath/llvolume.cpp2
-rw-r--r--indra/llwindow/llopenglview-objc.mm7
-rwxr-xr-xindra/newview/app_settings/settings.xml11
-rwxr-xr-xindra/newview/llfloaterimsession.cpp82
-rwxr-xr-xindra/newview/llfloaterimsession.h4
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_people.xml1
7 files changed, 88 insertions, 28 deletions
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 99527c0587..5f963ac7df 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -180,6 +180,8 @@ Ansariel Hiller
MAINT-2368
STORM-1931
MAINT-2773
+ BUG-3764
+ STORM-1979
Aralara Rajal
Arare Chantilly
CHUIBUG-191
@@ -307,6 +309,7 @@ Christopher Organiser
Ciaran Laval
Cinder Roxley
BUG-2326
+ BUG-3863
OPEN-185
STORM-1703
STORM-1948
@@ -347,6 +350,8 @@ Dimitrio Lewis
Dirk
Draconis Neurocam
STORM-1259
+Drake Arconis
+ OPEN-195
Drew Dri
VWR-19683
Drew Dwi
@@ -674,6 +679,8 @@ Jonathan Yap
OPEN-161
STORM-1953
STORM-1957
+ STORM-1975
+ STORM-1982
Kadah Coba
STORM-1060
STORM-1843
@@ -1258,6 +1265,8 @@ Tofu Buzzard
Tony Kembia
Tonya Souther
STORM-1905
+ BUG-3875
+ BUG-3968
Torben Trautman
TouchaHoney Perhaps
TraductoresAnonimos Alter
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index f74c934b21..cc5742ff7a 100755
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -6747,7 +6747,7 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
return TRUE;
}
-//adapted from Lengyel, Eric. “Computing Tangent Space Basis Vectors for an Arbitrary Mesh”. Terathon Software 3D Graphics Library, 2001. http://www.terathon.com/code/tangent.html
+//adapted from Lengyel, Eric. "Computing Tangent Space Basis Vectors for an Arbitrary Mesh". Terathon Software 3D Graphics Library, 2001. http://www.terathon.com/code/tangent.html
void CalculateTangentArray(U32 vertexCount, const LLVector4a *vertex, const LLVector4a *normal,
const LLVector2 *texcoord, U32 triangleCount, const U16* index_array, LLVector4a *tangent)
{
diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm
index 7415c9d8dc..b393a3796d 100644
--- a/indra/llwindow/llopenglview-objc.mm
+++ b/indra/llwindow/llopenglview-objc.mm
@@ -376,13 +376,6 @@ attributedStringInfo getSegments(NSAttributedString *str)
[[self inputContext] handleEvent:theEvent];
}
- if ([[theEvent charactersIgnoringModifiers] characterAtIndex:0] == NSCarriageReturnCharacter ||
- [[theEvent charactersIgnoringModifiers] characterAtIndex:0] == NSEnterCharacter)
- {
- // callKeyDown won't return the value we expect for enter or return. Handle them as a separate case.
- [[self inputContext] handleEvent:theEvent];
- }
-
// OS X intentionally does not send us key-up information on cmd-key combinations.
// This behaviour is not a bug, and only applies to cmd-combinations (no others).
// Since SL assumes we receive those, we fake it here.
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index d9093c2a6d..bf34fea635 100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -14871,17 +14871,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>DisablePrecacheDelayAfterTeleporting</key>
- <map>
- <key>Comment</key>
- <string>Disables the artificial delay in the viewer that precaches some incoming assets</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>FMODExProfilerEnable</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp
index 14e1a486d3..84921849d0 100755
--- a/indra/newview/llfloaterimsession.cpp
+++ b/indra/newview/llfloaterimsession.cpp
@@ -61,6 +61,9 @@
#include "llnotificationmanager.h"
#include "llautoreplace.h"
+const F32 ME_TYPING_TIMEOUT = 4.0f;
+const F32 OTHER_TYPING_TIMEOUT = 9.0f;
+
floater_showed_signal_t LLFloaterIMSession::sIMFloaterShowedSignal;
LLFloaterIMSession::LLFloaterIMSession(const LLUUID& session_id)
@@ -75,7 +78,10 @@ LLFloaterIMSession::LLFloaterIMSession(const LLUUID& session_id)
mTypingTimer(),
mTypingTimeoutTimer(),
mPositioned(false),
- mSessionInitialized(false)
+ mSessionInitialized(false),
+ mMeTypingTimer(),
+ mOtherTypingTimer(),
+ mImInfo()
{
mIsNearbyChat = false;
@@ -96,13 +102,31 @@ LLFloaterIMSession::LLFloaterIMSession(const LLUUID& session_id)
void LLFloaterIMSession::refresh()
{
if (mMeTyping)
-{
+ {
+ // Send an additional Start Typing packet every ME_TYPING_TIMEOUT seconds
+ if (mMeTypingTimer.getElapsedTimeF32() > ME_TYPING_TIMEOUT && false == mShouldSendTypingState)
+ {
+ LL_DEBUGS("TypingMsgs") << "Send additional Start Typing packet" << LL_ENDL;
+ LLIMModel::instance().sendTypingState(mSessionID, mOtherParticipantUUID, TRUE);
+ mMeTypingTimer.reset();
+ }
+
// Time out if user hasn't typed for a while.
if (mTypingTimeoutTimer.getElapsedTimeF32() > LLAgent::TYPING_TIMEOUT_SECS)
{
- setTyping(false);
+ setTyping(false);
+ LL_DEBUGS("TypingMsgs") << "Send stop typing due to timeout" << LL_ENDL;
}
}
+
+ // Clear <name is typing> message if no data received for OTHER_TYPING_TIMEOUT seconds
+ if (mOtherTyping && mOtherTypingTimer.getElapsedTimeF32() > OTHER_TYPING_TIMEOUT)
+ {
+ LL_DEBUGS("TypingMsgs") << "Received: is typing cleared due to timeout" << LL_ENDL;
+ removeTypingIndicator(mImInfo);
+ mOtherTyping = false;
+ }
+
}
// virtual
@@ -953,13 +977,21 @@ void LLFloaterIMSession::setTyping(bool typing)
// much network traffic. Only send in person-to-person IMs.
if ( mShouldSendTypingState && mDialog == IM_NOTHING_SPECIAL )
{
- // Still typing, send 'start typing' notification or
- // send 'stop typing' notification immediately
- if (!mMeTyping || mTypingTimer.getElapsedTimeF32() > 1.f)
+ if ( mMeTyping )
{
- LLIMModel::instance().sendTypingState(mSessionID,
- mOtherParticipantUUID, mMeTyping);
- mShouldSendTypingState = false;
+ if ( mTypingTimer.getElapsedTimeF32() > 1.f )
+ {
+ // Still typing, send 'start typing' notification
+ LLIMModel::instance().sendTypingState(mSessionID, mOtherParticipantUUID, TRUE);
+ mShouldSendTypingState = false;
+ mMeTypingTimer.reset();
+ }
+ }
+ else
+ {
+ // Send 'stop typing' notification immediately
+ LLIMModel::instance().sendTypingState(mSessionID, mOtherParticipantUUID, FALSE);
+ mShouldSendTypingState = false;
}
}
@@ -975,10 +1007,12 @@ void LLFloaterIMSession::setTyping(bool typing)
void LLFloaterIMSession::processIMTyping(const LLIMInfo* im_info, BOOL typing)
{
+ LL_DEBUGS("TypingMsgs") << "typing=" << typing << LL_ENDL;
if ( typing )
{
// other user started typing
addTypingIndicator(im_info);
+ mOtherTypingTimer.reset();
}
else
{
@@ -1202,10 +1236,40 @@ BOOL LLFloaterIMSession::inviteToSession(const uuid_vec_t& ids)
void LLFloaterIMSession::addTypingIndicator(const LLIMInfo* im_info)
{
+/* Operation of "<name> is typing" state machine:
+Not Typing state:
+
+ User types in P2P IM chat ... Send Start Typing, save Started time,
+ start Idle Timer (N seconds) go to Typing state
+
+Typing State:
+
+ User enters a non-return character: if Now - Started > ME_TYPING_TIMEOUT, send
+ Start Typing, restart Idle Timer
+ User enters a return character: stop Idle Timer, send IM and Stop
+ Typing, go to Not Typing state
+ Idle Timer expires: send Stop Typing, go to Not Typing state
+
+The recipient has a complementary state machine in which a Start Typing
+that is not followed by either an IM or another Start Typing within OTHER_TYPING_TIMEOUT
+seconds switches the sender out of typing state.
+
+This has the nice quality of being self-healing for lost start/stop
+messages while adding messages only for the (relatively rare) case of a
+user who types a very long message (one that takes more than ME_TYPING_TIMEOUT seconds
+to type).
+
+Note: OTHER_TYPING_TIMEOUT must be > ME_TYPING_TIMEOUT for proper operation of the state machine
+
+*/
+
// We may have lost a "stop-typing" packet, don't add it twice
if (im_info && !mOtherTyping)
{
mOtherTyping = true;
+ mOtherTypingTimer.reset();
+ // Save im_info so that removeTypingIndicator can be properly called because a timeout has occurred
+ mImInfo = im_info;
// Update speaker
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
diff --git a/indra/newview/llfloaterimsession.h b/indra/newview/llfloaterimsession.h
index d6718843ca..2b9d06e744 100755
--- a/indra/newview/llfloaterimsession.h
+++ b/indra/newview/llfloaterimsession.h
@@ -187,6 +187,8 @@ private:
LLFrameTimer mTypingTimer;
LLFrameTimer mTypingTimeoutTimer;
bool mSessionNameUpdatedForTyping;
+ LLFrameTimer mMeTypingTimer;
+ LLFrameTimer mOtherTypingTimer;
bool mSessionInitialized;
LLSD mQueuedMsgsForInit;
@@ -196,6 +198,8 @@ private:
// connection to voice channel state change signal
boost::signals2::connection mVoiceChannelStateChangeConnection;
+
+ const LLIMInfo* mImInfo;
};
#endif // LL_FLOATERIMSESSION_H
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 3caf2b3d7e..9282a291ba 100755
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -507,6 +507,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
right="-10"
top_pad="4"
left="3"
+ use_ellipses="true"
name="groupcount">
You belong to [COUNT] groups, and can join [REMAINING] more.
</text>