merging into latest changes

master
MaximB ProductEngine 2012-11-01 20:22:55 +02:00
commit b9116764a9
22 changed files with 281 additions and 206 deletions

View File

@ -325,7 +325,9 @@ fba99f381b8d4ad1b7b42fa4993b29998d95be18 DRTVWR-179
173c2809f9873499c4b9d6bc044ec941c954d3fb DRTVWR-228
1dc94555582f52718834081e7659e973ae4521f7 3.4.1-beta8
52c164c8023a5e65f3dc1b0bbb7fa1dd0c631b6b DRTVWR-231
9c4519aa5c70f7560111fb5c740d3a7dc20a845a 3.4.1-beta9
464cf7a63a9a2f95bc4972dc022ca765e93de7d3 DRTVWR-233
9c4519aa5c70f7560111fb5c740d3a7dc20a845a 3.4.1-beta9
637fe8bbee5e24940448198c221d5ee0fa3247b4 3.4.1-beta9
4e0d84e92132e9e95a1d52a1e49bad69c278ea05 3.4.1-beta10
f7cbd60a3f57ff1101157eeb79ea21e8898bedae DRTVWR-235
baf97f06ae17223614c5e31aa42e71d87cff07fe DRTVWR-236
18498afcdb835d6fc4d36ed935347d3b65307bad 3.4.1-beta11

View File

@ -20,8 +20,13 @@ email_status_this_is_os = true
# Limit extent of codeticket updates to revisions after...
codeticket_since = 3.3.0-release
clean_on_success = false
run_tests = false
build_Darwin_Debug = false
build_Darwin_RelWithDebInfo = false
# ========================================
# Viewer Development
# Viewer Development --
# ========================================
# Report changes since...

View File

@ -199,7 +199,7 @@ if (DARWIN)
add_definitions(-DLL_DARWIN=1 -D_XOPEN_SOURCE)
set(CMAKE_CXX_LINK_FLAGS "-Wl,-headerpad_max_install_names,-search_paths_first")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
set(DARWIN_extra_cstar_flags "-mlong-branch")
set(DARWIN_extra_cstar_flags "-mlong-branch -g")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${DARWIN_extra_cstar_flags}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${DARWIN_extra_cstar_flags}")
# NOTE: it's critical that the optimization flag is put in front.

View File

@ -3,7 +3,7 @@ include(Prebuilt)
# If you want to enable or disable TCMALLOC in viewer builds, this is the place.
# set ON or OFF as desired.
set (USE_TCMALLOC OFF)
set (USE_TCMALLOC ON)
if (STANDALONE)
include(FindGooglePerfTools)

View File

@ -78,7 +78,7 @@ public:
typedef LLOctreeTraveler<T> oct_traveler;
typedef LLTreeTraveler<T> tree_traveler;
typedef LLPointer<T>* element_list;
typedef std::vector<LLPointer<T> > element_list;
typedef LLPointer<T>* element_iter;
typedef const LLPointer<T>* const_element_iter;
typedef typename std::vector<LLTreeListener<T>*>::iterator tree_listener_iter;
@ -106,8 +106,9 @@ public:
: mParent((oct_node*)parent),
mOctant(octant)
{
mData = NULL;
mDataEnd = NULL;
//always keep a NULL terminated list to avoid out of bounds exceptions in debug builds
mData.push_back(NULL);
mDataEnd = &mData[0];
mCenter = center;
mSize = size;
@ -133,9 +134,9 @@ public:
mData[i] = NULL;
}
free(mData);
mData = NULL;
mDataEnd = NULL;
mData.clear();
mData.push_back(NULL);
mDataEnd = &mData[0];
for (U32 i = 0; i < getChildCount(); i++)
{
@ -239,9 +240,9 @@ public:
bool isEmpty() const { return mElementCount == 0; }
element_list& getData() { return mData; }
const element_list& getData() const { return mData; }
element_iter getDataBegin() { return mData; }
element_iter getDataBegin() { return &mData[0]; }
element_iter getDataEnd() { return mDataEnd; }
const_element_iter getDataBegin() const { return mData; }
const_element_iter getDataBegin() const { return &mData[0]; }
const_element_iter getDataEnd() const { return mDataEnd; }
U32 getChildCount() const { return mChildCount; }
@ -321,14 +322,10 @@ public:
if ((getElementCount() < gOctreeMaxCapacity && contains(data->getBinRadius()) ||
(data->getBinRadius() > getSize()[0] && parent && parent->getElementCount() >= gOctreeMaxCapacity)))
{ //it belongs here
mData.push_back(NULL);
mData[mElementCount] = data;
mElementCount++;
mData = (element_list) realloc(mData, sizeof(LLPointer<T>)*mElementCount);
//avoid unref on uninitialized memory
memset(mData+mElementCount-1, 0, sizeof(LLPointer<T>));
mData[mElementCount-1] = data;
mDataEnd = mData + mElementCount;
mDataEnd = &mData[mElementCount];
data->setBinIndex(mElementCount-1);
BaseType::insert(data);
return true;
@ -364,14 +361,10 @@ public:
if( lt == 0x7 )
{
mData.push_back(NULL);
mData[mElementCount] = data;
mElementCount++;
mData = (element_list) realloc(mData, sizeof(LLPointer<T>)*mElementCount);
//avoid unref on uninitialized memory
memset(mData+mElementCount-1, 0, sizeof(LLPointer<T>));
mData[mElementCount-1] = data;
mDataEnd = mData + mElementCount;
mDataEnd = &mData[mElementCount];
data->setBinIndex(mElementCount-1);
BaseType::insert(data);
return true;
@ -436,16 +429,15 @@ public:
mData[i]->setBinIndex(i);
}
mData[mElementCount] = NULL; //needed for unref
mData = (element_list) realloc(mData, sizeof(LLPointer<T>)*mElementCount);
mDataEnd = mData+mElementCount;
mData[mElementCount] = NULL;
mData.pop_back();
mDataEnd = &mData[mElementCount];
}
else
{
mData[0] = NULL; //needed for unref
free(mData);
mData = NULL;
mDataEnd = NULL;
mData.clear();
mData.push_back(NULL);
mDataEnd = &mData[0];
}
notifyRemoval(data);
@ -491,7 +483,7 @@ public:
}
//node is now root
llwarns << "!!! OCTREE REMOVING FACE BY ADDRESS, SEVERE PERFORMANCE PENALTY |||" << llendl;
llwarns << "!!! OCTREE REMOVING ELEMENT BY ADDRESS, SEVERE PERFORMANCE PENALTY |||" << llendl;
node->removeByAddress(data);
llassert(data->getBinIndex() == -1);
return true;

View File

@ -2003,8 +2003,9 @@ if (INSTALL)
endif (INSTALL)
if (PACKAGE)
set(SYMBOL_SEARCH_DIRS "")
if (WINDOWS)
set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}")
list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}")
set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-windows.tar.bz2")
# slplugin.exe failing symbols dump - need to debug, might have to do with updated version of google breakpad
# set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX} slplugin.exe")
@ -2013,13 +2014,20 @@ if (PACKAGE)
set(VIEWER_COPY_MANIFEST copy_w_viewer_manifest)
endif (WINDOWS)
if (DARWIN)
set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app")
list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}")
# *TODO: Generate these search dirs in the cmake files related to each binary.
list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/llplugin/slplugin/${CMAKE_CFG_INTDIR}")
list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/mac_crash_logger/${CMAKE_CFG_INTDIR}")
list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/mac_updater/${CMAKE_CFG_INTDIR}")
list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/gstreamer010/${CMAKE_CFG_INTDIR}")
list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}")
list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/webkit/${CMAKE_CFG_INTDIR}")
set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-darwin.tar.bz2")
set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin")
set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin mac-updater mac-crash-logger")
set(VIEWER_LIB_GLOB "*.dylib")
endif (DARWIN)
if (LINUX)
set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/packaged")
list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/packaged")
set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-linux.tar.bz2")
set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin SLPlugin")
set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*")
@ -2039,7 +2047,7 @@ if (PACKAGE)
ARGS
"${CMAKE_CURRENT_SOURCE_DIR}/generate_breakpad_symbols.py"
"${LLBUILD_CONFIG}"
"${VIEWER_DIST_DIR}"
"${SYMBOL_SEARCH_DIRS}"
"${VIEWER_EXE_GLOBS}"
"${VIEWER_LIB_GLOB}"
"${AUTOBUILD_INSTALL_DIR}/bin/dump_syms"

View File

@ -69,7 +69,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>0.95</real>
<real>1</real>
</map>
<key>AdvanceSnapshot</key>
<map>
@ -4302,7 +4302,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>0.65</real>
<real>0.95</real>
</map>
<key>InBandwidth</key>
<map>

View File

@ -39,17 +39,20 @@ import shlex
import subprocess
import tarfile
import StringIO
import pprint
DEBUG=False
def usage():
print >>sys.stderr, "usage: %s viewer_dir viewer_exes libs_suffix dump_syms_tool viewer_symbol_file" % sys.argv[0]
print >>sys.stderr, "usage: %s search_dirs viewer_exes libs_suffix dump_syms_tool viewer_symbol_file" % sys.argv[0]
class MissingModuleError(Exception):
def __init__(self, modules):
Exception.__init__(self, "Failed to find required modules: %r" % modules)
self.modules = modules
def main(configuration, viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file):
print "generate_breakpad_symbols run with args: %s" % str((configuration, viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file))
def main(configuration, search_dirs, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file):
print "generate_breakpad_symbols run with args: %s" % str((configuration, search_dirs, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file))
if not re.match("release", configuration, re.IGNORECASE):
print "skipping breakpad symbol generation for non-release build."
@ -67,21 +70,49 @@ def main(configuration, viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, vi
return True
return fnmatch.fnmatch(f, libs_suffix)
search_dirs = search_dirs.split(";")
def list_files():
for (dirname, subdirs, filenames) in os.walk(viewer_dir):
#print "scanning '%s' for modules..." % dirname
for f in itertools.ifilter(matches, filenames):
yield os.path.join(dirname, f)
for search_dir in search_dirs:
for (dirname, subdirs, filenames) in os.walk(search_dir):
if DEBUG:
print "scanning '%s' for modules..." % dirname
for f in itertools.ifilter(matches, filenames):
yield os.path.join(dirname, f)
def dump_module(m):
print "dumping module '%s' with '%s'..." % (m, dump_syms_tool)
child = subprocess.Popen([dump_syms_tool, m] , stdout=subprocess.PIPE)
dsym_full_path = m
child = subprocess.Popen([dump_syms_tool, dsym_full_path] , stdout=subprocess.PIPE)
out, err = child.communicate()
return (m,child.returncode, out, err)
out = tarfile.open(viewer_symbol_file, 'w:bz2')
modules = {}
for m in list_files():
if DEBUG:
print "examining module '%s' ... " % m,
filename=os.path.basename(m)
if -1 != m.find("DWARF"):
# Just use this module; it has the symbols we want.
modules[filename] = m
if DEBUG:
print "found dSYM entry"
elif filename not in modules:
# Only use this if we don't already have a (possibly better) entry.
modules[filename] = m
if DEBUG:
print "found new entry"
elif DEBUG:
print "ignoring entry"
for (filename,status,symbols,err) in itertools.imap(dump_module, list_files()):
print "Found these following modules:"
pprint.pprint( modules )
out = tarfile.open(viewer_symbol_file, 'w:bz2')
for (filename,status,symbols,err) in itertools.imap(dump_module, modules.values()):
if status == 0:
module_line = symbols[:symbols.index('\n')]
module_line = module_line.split()

View File

@ -97,7 +97,7 @@ void LLChicletBar::sessionAdded(const LLUUID& session_id, const std::string& nam
// Do not spawn chiclet when using the new multitab conversation UI
if (LLIMConversation::isChatMultiTab())
{
LLIMFloater::addToHost(session_id);
LLIMConversation::addToHost(session_id);
return;
}

View File

@ -369,7 +369,8 @@ LLConversationItemParticipant::LLConversationItemParticipant(std::string display
LLConversationItem(display_name,uuid,root_view_model),
mIsMuted(false),
mIsModerator(false),
mDistToAgent(-1.0)
mDistToAgent(-1.0),
mAvatarNameCacheConnection()
{
mConvType = CONV_PARTICIPANT;
}
@ -378,11 +379,38 @@ LLConversationItemParticipant::LLConversationItemParticipant(const LLUUID& uuid,
LLConversationItem(uuid,root_view_model),
mIsMuted(false),
mIsModerator(false),
mDistToAgent(-1.0)
mDistToAgent(-1.0),
mAvatarNameCacheConnection()
{
mConvType = CONV_PARTICIPANT;
}
LLConversationItemParticipant::~LLConversationItemParticipant()
{
// Disconnect any previous avatar name cache connection to ensure
// that the callback method is not called after destruction
if (mAvatarNameCacheConnection.connected())
{
mAvatarNameCacheConnection.disconnect();
}
}
void LLConversationItemParticipant::fetchAvatarName()
{
// Disconnect any previous avatar name cache connection
if (mAvatarNameCacheConnection.connected())
{
mAvatarNameCacheConnection.disconnect();
}
// Request the avatar name from the cache
llassert(getUUID().notNull());
if (getUUID().notNull())
{
mAvatarNameCacheConnection = LLAvatarNameCache::get(getUUID(), boost::bind(&LLConversationItemParticipant::onAvatarNameCache, this, _2));
}
}
void LLConversationItemParticipant::buildContextMenu(LLMenuGL& menu, U32 flags)
{
menuentry_vec_t items;
@ -400,14 +428,16 @@ void LLConversationItemParticipant::onAvatarNameCache(const LLAvatarName& av_nam
mName = (av_name.mUsername.empty() ? av_name.mDisplayName : av_name.mUsername);
mDisplayName = (av_name.mDisplayName.empty() ? av_name.mUsername : av_name.mDisplayName);
mNeedsRefresh = true;
LLConversationItemSession* parent_session = dynamic_cast<LLConversationItemSession*>(mParent);
if (parent_session != NULL)
if(mParent != NULL)
{
parent_session->requestSort();
parent_session->updateParticipantName(this);
postEvent("update_participant", parent_session, this);
LLConversationItemSession* parent_session = dynamic_cast<LLConversationItemSession*>(mParent);
if (parent_session != NULL)
{
parent_session->requestSort();
parent_session->updateParticipantName(this);
postEvent("update_participant", parent_session, this);
}
}
}
void LLConversationItemParticipant::dumpDebugData()

View File

@ -27,9 +27,11 @@
#ifndef LL_LLCONVERSATIONMODEL_H
#define LL_LLCONVERSATIONMODEL_H
#include <boost/signals2.hpp>
#include "llavatarname.h"
#include "llfolderviewitem.h"
#include "llfolderviewmodel.h"
#include "llavatarname.h"
#include "llviewerfoldertype.h"
// Implementation of conversations list
@ -177,7 +179,7 @@ class LLConversationItemParticipant : public LLConversationItem
public:
LLConversationItemParticipant(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);
LLConversationItemParticipant(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);
virtual ~LLConversationItemParticipant() {}
virtual ~LLConversationItemParticipant();
virtual const std::string& getDisplayName() const { return mDisplayName; }
@ -189,17 +191,21 @@ public:
void setDistance(F64 dist) { mDistToAgent = dist; mNeedsRefresh = true; }
void buildContextMenu(LLMenuGL& menu, U32 flags);
void onAvatarNameCache(const LLAvatarName& av_name);
virtual const bool getDistanceToAgent(F64& dist) const { dist = mDistToAgent; return (dist >= 0.0); }
void fetchAvatarName();
void dumpDebugData();
private:
void onAvatarNameCache(const LLAvatarName& av_name);
bool mIsMuted; // default is false
bool mIsModerator; // default is false
std::string mDisplayName;
F64 mDistToAgent; // Distance to the agent. A negative (meaningless) value means the distance has not been set.
boost::signals2::connection mAvatarNameCacheConnection;
};
// We don't want to ever filter conversations but we need to declare that class to create a conversation view model.

View File

@ -116,6 +116,55 @@ LLIMConversation* LLIMConversation::getConversation(const LLUUID& uuid)
return conv;
};
void LLIMConversation::setVisible(BOOL visible)
{
LLTransientDockableFloater::setVisible(visible);
if(visible)
{
LLIMConversation::addToHost(mSessionID);
}
setFocus(visible);
}
void LLIMConversation::addToHost(const LLUUID& session_id)
{
if ((session_id.notNull() && !gIMMgr->hasSession(session_id))
|| !LLIMConversation::isChatMultiTab())
{
return;
}
// Get the floater: this will create the instance if it didn't exist
LLIMConversation* conversp = LLIMConversation::getConversation(session_id);
if (conversp)
{
LLIMFloaterContainer* floater_container = LLIMFloaterContainer::getInstance();
// Do not add again existing floaters
if (floater_container && !conversp->isHostAttached())
{
conversp->setHostAttached(true);
if (!conversp->isNearbyChat()
|| gSavedSettings.getBOOL("NearbyChatIsNotTornOff"))
{
floater_container->addFloater(conversp, TRUE, LLTabContainer::END);
}
else
{
// setting of the "potential" host for Nearby Chat: this sequence sets
// LLFloater::mHostHandle = NULL (a current host), but
// LLFloater::mLastHostHandle = floater_container (a "future" host)
conversp->setHost(floater_container);
conversp->setHost(NULL);
}
}
}
}
BOOL LLIMConversation::postBuild()
{

View File

@ -59,17 +59,27 @@ public:
*/
static bool isChatMultiTab();
// add conversation to container
static void addToHost(const LLUUID& session_id);
bool isHostAttached() {return mIsHostAttached;}
void setHostAttached(bool is_attached) {mIsHostAttached = is_attached;}
static LLIMConversation* findConversation(const LLUUID& uuid);
static LLIMConversation* getConversation(const LLUUID& uuid);
// show/hide the translation check box
void showTranslationCheckbox(const BOOL visible = FALSE);
bool isNearbyChat() {return mIsNearbyChat;}
// LLFloater overrides
/*virtual*/ void onOpen(const LLSD& key);
/*virtual*/ void onClose(bool app_quitting);
/*virtual*/ BOOL postBuild();
/*virtual*/ void draw();
/*virtual*/ void setVisible(BOOL visible);
protected:
@ -139,6 +149,7 @@ private:
void reshapeChatHistory();
bool checkIfTornOff();
bool mIsHostAttached;
LLTimer* mRefreshTimer; ///< Defines the rate at which refresh() is called.
};

View File

@ -582,37 +582,6 @@ void LLIMFloater::onParticipantsListChanged(LLUICtrl* ctrl)
}
}
void LLIMFloater::addToHost(const LLUUID& session_id)
{
if (!LLIMConversation::isChatMultiTab() || !gIMMgr->hasSession(session_id))
{
return;
}
// Test the existence of the floater before we try to create it
bool exist = findInstance(session_id);
// Get the floater: this will create the instance if it didn't exist
LLIMFloater* floater = getInstance(session_id);
if (floater)
{
LLIMFloaterContainer* floater_container = LLIMFloaterContainer::getInstance();
// Do not add again existing floaters
if (!exist)
{
// LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END;
// TODO: mantipov: use LLTabContainer::RIGHT_OF_CURRENT if it exists
LLTabContainer::eInsertionPoint i_pt = LLTabContainer::END;
if (floater_container)
{
floater_container->addFloater(floater, FALSE, i_pt);
}
}
}
}
//static
LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
@ -721,7 +690,7 @@ void LLIMFloater::setVisible(BOOL visible)
(LLNotificationsUI::LLChannelManager::getInstance()->
findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
LLTransientDockableFloater::setVisible(visible);
LLIMConversation::setVisible(visible);
// update notification channel state
if(channel)
@ -1309,6 +1278,7 @@ void LLIMFloater::sRemoveTypingIndicator(const LLSD& data)
floater->removeTypingIndicator();
}
// static
void LLIMFloater::onIMChicletCreated( const LLUUID& session_id )
{
LLIMFloater::addToHost(session_id);

View File

@ -72,7 +72,6 @@ public:
static LLIMFloater* findInstance(const LLUUID& session_id);
static LLIMFloater* getInstance(const LLUUID& session_id);
static void addToHost(const LLUUID& session_id);
// LLFloater overrides
/*virtual*/ void onClose(bool app_quitting);

View File

@ -98,7 +98,7 @@ LLIMFloaterContainer::~LLIMFloaterContainer()
void LLIMFloaterContainer::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
{
LLIMFloater::addToHost(session_id);
LLIMConversation::addToHost(session_id);
addConversationListItem(session_id);
}
@ -109,7 +109,7 @@ void LLIMFloaterContainer::sessionActivated(const LLUUID& session_id, const std:
void LLIMFloaterContainer::sessionVoiceOrIMStarted(const LLUUID& session_id)
{
LLIMFloater::addToHost(session_id);
LLIMConversation::addToHost(session_id);
addConversationListItem(session_id);
}
@ -358,16 +358,7 @@ void LLIMFloaterContainer::processParticipantsStyleUpdate()
{
LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model);
// Get the avatar name for this participant id from the cache and update the model
LLUUID participant_id = participant_model->getUUID();
LLAvatarName av_name;
LLAvatarNameCache::get(participant_id,&av_name);
// Avoid updating the model though if the cache is still waiting for its first update
if (!av_name.mDisplayName.empty())
{
participant_model->onAvatarNameCache(av_name);
}
// Bind update to the next cache name signal
LLAvatarNameCache::get(participant_id, boost::bind(&LLConversationItemParticipant::onAvatarNameCache, participant_model, _2));
participant_model->fetchAvatarName();
// Next participant
current_participant_model++;
}
@ -499,9 +490,9 @@ void LLIMFloaterContainer::setVisible(BOOL visible)
}
nearby_chat = LLFloaterReg::findTypedInstance<LLNearbyChat>("nearby_chat");
if (nearby_chat && !nearby_chat->isHostSet())
if (nearby_chat)
{
nearby_chat->addToHost();
LLIMConversation::addToHost(LLUUID());
}
// We need to show/hide all the associated conversations that have been torn off
@ -1215,6 +1206,7 @@ bool LLIMFloaterContainer::removeConversationListItem(const LLUUID& uuid, bool c
// Note : since the mConversationsItems is also the listener to the widget, deleting
// the widget will also delete its listener
bool isWidgetSelected = false;
LLFolderViewItem* new_selection = NULL;
conversations_widgets_map::iterator widget_it = mConversationsWidgets.find(uuid);
if (widget_it != mConversationsWidgets.end())
{
@ -1222,6 +1214,11 @@ bool LLIMFloaterContainer::removeConversationListItem(const LLUUID& uuid, bool c
if (widget)
{
isWidgetSelected = widget->isSelected();
new_selection = mConversationsRoot->getNextFromChild(widget);
if(new_selection == NULL)
{
new_selection = mConversationsRoot->getPreviousFromChild(widget);
}
widget->destroyView();
}
}
@ -1234,12 +1231,13 @@ bool LLIMFloaterContainer::removeConversationListItem(const LLUUID& uuid, bool c
if (change_focus)
{
setFocus(TRUE);
conversations_widgets_map::iterator widget_it = mConversationsWidgets.begin();
if (widget_it != mConversationsWidgets.end())
if(new_selection != NULL)
{
mSelectedSession = widget_it->first;
LLFolderViewItem* widget = widget_it->second;
widget->selectItem();
LLConversationItem* vmi = dynamic_cast<LLConversationItem*>(new_selection->getViewModelItem());
if(vmi != NULL)
{
selectConversation(vmi->getUUID());
}
}
}
return isWidgetSelected;

View File

@ -91,8 +91,7 @@ LLNearbyChat::LLNearbyChat(const LLSD& llsd)
: LLIMConversation(llsd),
//mOutputMonitor(NULL),
mSpeakerMgr(NULL),
mExpandedHeight(COLLAPSED_HEIGHT + EXPANDED_HEIGHT),
mIsHostSet(false)
mExpandedHeight(COLLAPSED_HEIGHT + EXPANDED_HEIGHT)
{
mIsP2PChat = false;
mIsNearbyChat = true;
@ -283,7 +282,7 @@ void LLNearbyChat::setFocus(BOOL focusFlag)
}
void LLNearbyChat::setVisible(BOOL visible)
void LLNearbyChat::setVisible(BOOL visible)
{
LLIMConversation::setVisible(visible);
@ -304,35 +303,6 @@ void LLNearbyChat::onTearOffClicked()
gSavedSettings.setBOOL("NearbyChatIsNotTornOff", in_the_multifloater);
}
void LLNearbyChat::addToHost()
{
if ( LLIMConversation::isChatMultiTab())
{
LLIMFloaterContainer* im_box = LLIMFloaterContainer::getInstance();
if (im_box)
{
if (gSavedSettings.getBOOL("NearbyChatIsNotTornOff"))
{
im_box->addFloater(this, TRUE, LLTabContainer::END);
}
else
{
// setting of the "potential" host: this sequence sets
// LLFloater::mHostHandle = NULL (a current host), but
// LLFloater::mLastHostHandle = im_box (a "future" host)
setHost(im_box);
setHost(NULL);
}
}
mIsHostSet = true;
}
}
bool LLNearbyChat::isHostSet()
{
return mIsHostSet;
}
// virtual
void LLNearbyChat::onOpen(const LLSD& key)

View File

@ -53,7 +53,7 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
/*virtual*/ void setFocus(BOOL focusFlag);
/*virtual*/ void setVisible(BOOL visible);
/*virtual*/ void setVisible(BOOL visible);
void loadHistory();
void reloadMessages();
@ -78,8 +78,6 @@ public:
static void startChat(const char* line);
static void stopChat();
bool isHostSet();
static void sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate);
static void sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate);
@ -121,7 +119,6 @@ private:
LLHandle<LLView> mPopupMenuHandle;
std::vector<LLChat> mMessageArchive;
bool mIsHostSet;
};
#endif

View File

@ -676,8 +676,7 @@ void LLParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id)
LLAvatarName avatar_name;
bool has_name = LLAvatarNameCache::get(avatar_id, &avatar_name);
participant = new LLConversationItemParticipant(!has_name ? LLTrans::getString("AvatarNameWaiting") : avatar_name.mDisplayName , avatar_id, mRootViewModel);
// Binds avatar's name update callback
LLAvatarNameCache::get(avatar_id, boost::bind(&LLConversationItemParticipant::onAvatarNameCache, participant, _2));
participant->fetchAvatarName();
if (mAvatarList)
{
mAvatarList->getIDs().push_back(avatar_id);

View File

@ -4716,55 +4716,63 @@ LLCullResult::LLCullResult()
mVisibleListAllocated = 0;
mVisibleBridgeAllocated = 0;
mVisibleGroups = NULL;
mVisibleGroupsEnd = NULL;
mAlphaGroups = NULL;
mAlphaGroupsEnd = NULL;
mOcclusionGroups = NULL;
mOcclusionGroupsEnd = NULL;
mDrawableGroups = NULL;
mDrawableGroupsEnd = NULL;
mVisibleList = NULL;
mVisibleListEnd = NULL;
mVisibleBridge = NULL;
mVisibleBridgeEnd = NULL;
mVisibleGroups.clear();
mVisibleGroups.push_back(NULL);
mVisibleGroupsEnd = &mVisibleGroups[0];
mAlphaGroups.clear();
mAlphaGroups.push_back(NULL);
mAlphaGroupsEnd = &mAlphaGroups[0];
mOcclusionGroups.clear();
mOcclusionGroups.push_back(NULL);
mOcclusionGroupsEnd = &mOcclusionGroups[0];
mDrawableGroups.clear();
mDrawableGroups.push_back(NULL);
mDrawableGroupsEnd = &mDrawableGroups[0];
mVisibleList.clear();
mVisibleList.push_back(NULL);
mVisibleListEnd = &mVisibleList[0];
mVisibleBridge.clear();
mVisibleBridge.push_back(NULL);
mVisibleBridgeEnd = &mVisibleBridge[0];
for (U32 i = 0; i < LLRenderPass::NUM_RENDER_TYPES; i++)
{
mRenderMap[i] = NULL;
mRenderMapEnd[i] = NULL;
mRenderMap[i].clear();
mRenderMap[i].push_back(NULL);
mRenderMapEnd[i] = &mRenderMap[i][0];
mRenderMapAllocated[i] = 0;
}
clear();
}
void LLCullResult::pushBack(void**& head, U32& count, void* val)
template <class T, class V>
void LLCullResult::pushBack(T& head, U32& count, V* val)
{
head[count] = val;
head.push_back(NULL);
count++;
head = (void**) realloc((void*) head, sizeof(void*) * count);
head[count-1] = val;
}
void LLCullResult::clear()
{
mVisibleGroupsSize = 0;
mVisibleGroupsEnd = mVisibleGroups;
mVisibleGroupsEnd = &mVisibleGroups[0];
mAlphaGroupsSize = 0;
mAlphaGroupsEnd = mAlphaGroups;
mAlphaGroupsEnd = &mAlphaGroups[0];
mOcclusionGroupsSize = 0;
mOcclusionGroupsEnd = mOcclusionGroups;
mOcclusionGroupsEnd = &mOcclusionGroups[0];
mDrawableGroupsSize = 0;
mDrawableGroupsEnd = mDrawableGroups;
mDrawableGroupsEnd = &mDrawableGroups[0];
mVisibleListSize = 0;
mVisibleListEnd = mVisibleList;
mVisibleListEnd = &mVisibleList[0];
mVisibleBridgeSize = 0;
mVisibleBridgeEnd = mVisibleBridge;
mVisibleBridgeEnd = &mVisibleBridge[0];
for (U32 i = 0; i < LLRenderPass::NUM_RENDER_TYPES; i++)
@ -4774,13 +4782,13 @@ void LLCullResult::clear()
mRenderMap[i][j] = 0;
}
mRenderMapSize[i] = 0;
mRenderMapEnd[i] = mRenderMap[i];
mRenderMapEnd[i] = &(mRenderMap[i][0]);
}
}
LLCullResult::sg_iterator LLCullResult::beginVisibleGroups()
{
return mVisibleGroups;
return &mVisibleGroups[0];
}
LLCullResult::sg_iterator LLCullResult::endVisibleGroups()
@ -4790,7 +4798,7 @@ LLCullResult::sg_iterator LLCullResult::endVisibleGroups()
LLCullResult::sg_iterator LLCullResult::beginAlphaGroups()
{
return mAlphaGroups;
return &mAlphaGroups[0];
}
LLCullResult::sg_iterator LLCullResult::endAlphaGroups()
@ -4800,7 +4808,7 @@ LLCullResult::sg_iterator LLCullResult::endAlphaGroups()
LLCullResult::sg_iterator LLCullResult::beginOcclusionGroups()
{
return mOcclusionGroups;
return &mOcclusionGroups[0];
}
LLCullResult::sg_iterator LLCullResult::endOcclusionGroups()
@ -4810,7 +4818,7 @@ LLCullResult::sg_iterator LLCullResult::endOcclusionGroups()
LLCullResult::sg_iterator LLCullResult::beginDrawableGroups()
{
return mDrawableGroups;
return &mDrawableGroups[0];
}
LLCullResult::sg_iterator LLCullResult::endDrawableGroups()
@ -4820,7 +4828,7 @@ LLCullResult::sg_iterator LLCullResult::endDrawableGroups()
LLCullResult::drawable_iterator LLCullResult::beginVisibleList()
{
return mVisibleList;
return &mVisibleList[0];
}
LLCullResult::drawable_iterator LLCullResult::endVisibleList()
@ -4830,7 +4838,7 @@ LLCullResult::drawable_iterator LLCullResult::endVisibleList()
LLCullResult::bridge_iterator LLCullResult::beginVisibleBridge()
{
return mVisibleBridge;
return &mVisibleBridge[0];
}
LLCullResult::bridge_iterator LLCullResult::endVisibleBridge()
@ -4840,7 +4848,7 @@ LLCullResult::bridge_iterator LLCullResult::endVisibleBridge()
LLCullResult::drawinfo_iterator LLCullResult::beginRenderMap(U32 type)
{
return mRenderMap[type];
return &mRenderMap[type][0];
}
LLCullResult::drawinfo_iterator LLCullResult::endRenderMap(U32 type)
@ -4856,10 +4864,10 @@ void LLCullResult::pushVisibleGroup(LLSpatialGroup* group)
}
else
{
pushBack((void**&) mVisibleGroups, mVisibleGroupsAllocated, (void*) group);
pushBack(mVisibleGroups, mVisibleGroupsAllocated, group);
}
++mVisibleGroupsSize;
mVisibleGroupsEnd = mVisibleGroups+mVisibleGroupsSize;
mVisibleGroupsEnd = &mVisibleGroups[mVisibleGroupsSize];
}
void LLCullResult::pushAlphaGroup(LLSpatialGroup* group)
@ -4870,10 +4878,10 @@ void LLCullResult::pushAlphaGroup(LLSpatialGroup* group)
}
else
{
pushBack((void**&) mAlphaGroups, mAlphaGroupsAllocated, (void*) group);
pushBack(mAlphaGroups, mAlphaGroupsAllocated, group);
}
++mAlphaGroupsSize;
mAlphaGroupsEnd = mAlphaGroups+mAlphaGroupsSize;
mAlphaGroupsEnd = &mAlphaGroups[mAlphaGroupsSize];
}
void LLCullResult::pushOcclusionGroup(LLSpatialGroup* group)
@ -4884,10 +4892,10 @@ void LLCullResult::pushOcclusionGroup(LLSpatialGroup* group)
}
else
{
pushBack((void**&) mOcclusionGroups, mOcclusionGroupsAllocated, (void*) group);
pushBack(mOcclusionGroups, mOcclusionGroupsAllocated, group);
}
++mOcclusionGroupsSize;
mOcclusionGroupsEnd = mOcclusionGroups+mOcclusionGroupsSize;
mOcclusionGroupsEnd = &mOcclusionGroups[mOcclusionGroupsSize];
}
void LLCullResult::pushDrawableGroup(LLSpatialGroup* group)
@ -4898,10 +4906,10 @@ void LLCullResult::pushDrawableGroup(LLSpatialGroup* group)
}
else
{
pushBack((void**&) mDrawableGroups, mDrawableGroupsAllocated, (void*) group);
pushBack(mDrawableGroups, mDrawableGroupsAllocated, group);
}
++mDrawableGroupsSize;
mDrawableGroupsEnd = mDrawableGroups+mDrawableGroupsSize;
mDrawableGroupsEnd = &mDrawableGroups[mDrawableGroupsSize];
}
void LLCullResult::pushDrawable(LLDrawable* drawable)
@ -4912,10 +4920,10 @@ void LLCullResult::pushDrawable(LLDrawable* drawable)
}
else
{
pushBack((void**&) mVisibleList, mVisibleListAllocated, (void*) drawable);
pushBack(mVisibleList, mVisibleListAllocated, drawable);
}
++mVisibleListSize;
mVisibleListEnd = mVisibleList+mVisibleListSize;
mVisibleListEnd = &mVisibleList[mVisibleListSize];
}
void LLCullResult::pushBridge(LLSpatialBridge* bridge)
@ -4926,10 +4934,10 @@ void LLCullResult::pushBridge(LLSpatialBridge* bridge)
}
else
{
pushBack((void**&) mVisibleBridge, mVisibleBridgeAllocated, (void*) bridge);
pushBack(mVisibleBridge, mVisibleBridgeAllocated, bridge);
}
++mVisibleBridgeSize;
mVisibleBridgeEnd = mVisibleBridge+mVisibleBridgeSize;
mVisibleBridgeEnd = &mVisibleBridge[mVisibleBridgeSize];
}
void LLCullResult::pushDrawInfo(U32 type, LLDrawInfo* draw_info)
@ -4940,10 +4948,10 @@ void LLCullResult::pushDrawInfo(U32 type, LLDrawInfo* draw_info)
}
else
{
pushBack((void**&) mRenderMap[type], mRenderMapAllocated[type], (void*) draw_info);
pushBack(mRenderMap[type], mRenderMapAllocated[type], draw_info);
}
++mRenderMapSize[type];
mRenderMapEnd[type] = mRenderMap[type] + mRenderMapSize[type];
mRenderMapEnd[type] = &(mRenderMap[type][mRenderMapSize[type]]);
}

View File

@ -569,10 +569,10 @@ class LLCullResult
public:
LLCullResult();
typedef LLSpatialGroup** sg_list_t;
typedef LLDrawable** drawable_list_t;
typedef LLSpatialBridge** bridge_list_t;
typedef LLDrawInfo** drawinfo_list_t;
typedef std::vector<LLSpatialGroup*> sg_list_t;
typedef std::vector<LLDrawable*> drawable_list_t;
typedef std::vector<LLSpatialBridge*> bridge_list_t;
typedef std::vector<LLDrawInfo*> drawinfo_list_t;
typedef LLSpatialGroup** sg_iterator;
typedef LLSpatialBridge** bridge_iterator;
@ -622,7 +622,7 @@ public:
private:
void pushBack(void** &head, U32& count, void* val);
template <class T, class V> void pushBack(T &head, U32& count, V* val);
U32 mVisibleGroupsSize;
U32 mAlphaGroupsSize;

View File

@ -362,7 +362,7 @@
follows="left|top"
height="16"
increment="0.01"
initial_value="0.8"
initial_value="1.0"
layout="topleft"
label_width="115"
label="Active:"
@ -380,7 +380,7 @@
follows="left|top"
height="16"
increment="0.01"
initial_value="0.5"
initial_value="0.95"
layout="topleft"
label_width="115"
label="Inactive:"