merge
commit
724f5fbb7f
|
|
@ -5,7 +5,7 @@ include(Python)
|
|||
macro (check_message_template _target)
|
||||
add_custom_command(
|
||||
TARGET ${_target}
|
||||
PRE_LINK
|
||||
POST_BUILD
|
||||
COMMAND ${PYTHON_EXECUTABLE}
|
||||
ARGS ${SCRIPTS_DIR}/template_verifier.py
|
||||
--mode=development --cache_master
|
||||
|
|
|
|||
|
|
@ -85,7 +85,6 @@ void LLWidgetReg::initClass(bool register_widgets)
|
|||
LLDefaultChildRegistry::Register<LLLayoutStack> layout_stack("layout_stack", &LLLayoutStack::fromXML);
|
||||
LLDefaultChildRegistry::Register<LLProgressBar> progress_bar("progress_bar");
|
||||
LLDefaultChildRegistry::Register<LLRadioGroup> radio_group("radio_group");
|
||||
LLDefaultChildRegistry::Register<LLRadioCtrl> radio_item("radio_item");
|
||||
LLDefaultChildRegistry::Register<LLSearchEditor> search_editor("search_editor");
|
||||
LLDefaultChildRegistry::Register<LLScrollContainer> scroll_container("scroll_container");
|
||||
LLDefaultChildRegistry::Register<LLScrollingPanelList> scrolling_panel_list("scrolling_panel_list");
|
||||
|
|
|
|||
|
|
@ -47,7 +47,6 @@
|
|||
#include "llquaternion.h"
|
||||
#include "v3dmath.h"
|
||||
#include "v3math.h"
|
||||
#include "llapr.h"
|
||||
#include "llbvhconsts.h"
|
||||
|
||||
class LLKeyframeDataCache;
|
||||
|
|
|
|||
|
|
@ -34,14 +34,18 @@
|
|||
#define LL_LLAPP_H
|
||||
|
||||
#include <map>
|
||||
#include "llapr.h"
|
||||
#include "llrun.h"
|
||||
#include "llsd.h"
|
||||
#include "lloptioninterface.h"
|
||||
|
||||
// Forward declarations
|
||||
template <typename Type> class LLAtomic32;
|
||||
typedef LLAtomic32<U32> LLAtomicU32;
|
||||
class LLErrorThread;
|
||||
class LLLiveFile;
|
||||
#if LL_LINUX
|
||||
typedef struct siginfo siginfo_t;
|
||||
#endif
|
||||
|
||||
typedef void (*LLAppErrorHandler)();
|
||||
typedef void (*LLAppChildCallback)(int pid, bool exited, int status);
|
||||
|
|
@ -202,8 +206,6 @@ public:
|
|||
#if !LL_WINDOWS
|
||||
static U32 getSigChildCount();
|
||||
static void incSigChildCount();
|
||||
#else
|
||||
#define getpid GetCurrentProcessId
|
||||
#endif
|
||||
static int getPid();
|
||||
|
||||
|
|
|
|||
|
|
@ -38,6 +38,14 @@
|
|||
#if LL_LINUX || LL_SOLARIS
|
||||
#include <sys/param.h> // Need PATH_MAX in APR headers...
|
||||
#endif
|
||||
#if LL_WINDOWS
|
||||
// Limit Windows API to small and manageable set.
|
||||
// If you get undefined symbols, find the appropriate
|
||||
// Windows header file and include that in your .cpp file.
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <winsock2.h>
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#include <boost/noncopyable.hpp>
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,6 @@
|
|||
#define LL_COMMON_H
|
||||
|
||||
// *TODO: remove these?
|
||||
#include "llapr.h"
|
||||
#include "lltimer.h"
|
||||
#include "llfile.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -45,9 +45,6 @@
|
|||
# include <syslog.h>
|
||||
# include <unistd.h>
|
||||
#endif // !LL_WINDOWS
|
||||
#if LL_WINDOWS
|
||||
# include <windows.h>
|
||||
#endif // LL_WINDOWS
|
||||
#include <vector>
|
||||
|
||||
#include "llapp.h"
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
#define LL_LLTHREAD_H
|
||||
|
||||
#include "llapp.h"
|
||||
#include "llapr.h"
|
||||
#include "apr_thread_cond.h"
|
||||
|
||||
class LLThread;
|
||||
|
|
|
|||
|
|
@ -34,7 +34,6 @@
|
|||
#ifndef LL_LLIOHTTPSERVER_H
|
||||
#define LL_LLIOHTTPSERVER_H
|
||||
|
||||
#include "llapr.h"
|
||||
#include "llchainio.h"
|
||||
#include "llhttpnode.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
#ifndef LL_LLPLUGINPROCESSPARENT_H
|
||||
#define LL_LLPLUGINPROCESSPARENT_H
|
||||
|
||||
#include "llapr.h"
|
||||
#include "llprocesslauncher.h"
|
||||
#include "llpluginmessage.h"
|
||||
#include "llpluginmessagepipe.h"
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@ include_directories(
|
|||
)
|
||||
|
||||
set(llui_SOURCE_FILES
|
||||
llalertdialog.cpp
|
||||
llbutton.cpp
|
||||
llcheckboxctrl.cpp
|
||||
llclipboard.cpp
|
||||
|
|
@ -112,7 +111,6 @@ set(llui_SOURCE_FILES
|
|||
set(llui_HEADER_FILES
|
||||
CMakeLists.txt
|
||||
|
||||
llalertdialog.h
|
||||
llbutton.h
|
||||
llcallbackmap.h
|
||||
llcheckboxctrl.h
|
||||
|
|
|
|||
|
|
@ -38,6 +38,8 @@
|
|||
//static
|
||||
LLHandle<LLFloater> LLDockableFloater::sInstanceHandle;
|
||||
|
||||
static const std::string VOICE_FLOATER("floater_voice_controls"), IM_FLOATER("panel_im");
|
||||
|
||||
//static
|
||||
void LLDockableFloater::init(LLDockableFloater* thiz)
|
||||
{
|
||||
|
|
@ -98,8 +100,15 @@ void LLDockableFloater::toggleInstance(const LLSD& sdname)
|
|||
else if (instance != NULL)
|
||||
{
|
||||
instance->setMinimized(FALSE);
|
||||
instance->setVisible(TRUE);
|
||||
gFloaterView->bringToFront(instance);
|
||||
if (instance->getVisible())
|
||||
{
|
||||
instance->setVisible(FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
instance->setVisible(TRUE);
|
||||
gFloaterView->bringToFront(instance);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -107,9 +116,11 @@ void LLDockableFloater::resetInstance()
|
|||
{
|
||||
if (mUniqueDocking && sInstanceHandle.get() != this)
|
||||
{
|
||||
if (sInstanceHandle.get() != NULL && sInstanceHandle.get()->isDocked())
|
||||
if (sInstanceHandle.get() != NULL && sInstanceHandle.get()->isDocked()
|
||||
&& (getName() != VOICE_FLOATER || sInstanceHandle.get()->getName() != IM_FLOATER)
|
||||
&& (getName() != IM_FLOATER || sInstanceHandle.get()->getName() != VOICE_FLOATER))
|
||||
{
|
||||
sInstanceHandle.get()->setVisible(FALSE);
|
||||
sInstanceHandle.get()->setVisible(FALSE);
|
||||
}
|
||||
sInstanceHandle = getHandle();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@
|
|||
#define LLPANEL_CPP
|
||||
#include "llpanel.h"
|
||||
|
||||
#include "llalertdialog.h"
|
||||
#include "llfocusmgr.h"
|
||||
#include "llfontgl.h"
|
||||
#include "llrect.h"
|
||||
|
|
|
|||
|
|
@ -120,6 +120,8 @@ LLTabContainer::Params::Params()
|
|||
tab_min_width("tab_min_width"),
|
||||
tab_max_width("tab_max_width"),
|
||||
tab_height("tab_height"),
|
||||
label_pad_bottom("label_pad_bottom"),
|
||||
label_pad_left("label_pad_left"),
|
||||
tab_position("tab_position"),
|
||||
hide_tabs("hide_tabs", false),
|
||||
tab_padding_right("tab_padding_right"),
|
||||
|
|
@ -145,6 +147,8 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p)
|
|||
mMinTabWidth(0),
|
||||
mMaxTabWidth(p.tab_max_width),
|
||||
mTabHeight(p.tab_height),
|
||||
mLabelPadBottom(p.label_pad_bottom),
|
||||
mLabelPadLeft(p.label_pad_left),
|
||||
mPrevArrowBtn(NULL),
|
||||
mNextArrowBtn(NULL),
|
||||
mIsVertical( p.tab_position == LEFT ),
|
||||
|
|
@ -906,7 +910,7 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
|
|||
|
||||
if (placeholder)
|
||||
{
|
||||
btn_rect.translate(0, -3); // *TODO: make configurable
|
||||
btn_rect.translate(0, -6); // *TODO: make configurable
|
||||
LLTextBox::Params params;
|
||||
params.name(trimmed_label);
|
||||
params.rect(btn_rect);
|
||||
|
|
@ -933,6 +937,7 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
|
|||
p.image_selected(mMiddleTabParams.tab_left_image_selected);
|
||||
p.scale_image(true);
|
||||
p.font_halign = mFontHalign;
|
||||
p.pad_bottom( mLabelPadBottom );
|
||||
p.tab_stop(false);
|
||||
p.label_shadow(false);
|
||||
if (indent)
|
||||
|
|
@ -956,8 +961,9 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
|
|||
p.tab_stop(false);
|
||||
p.label_shadow(false);
|
||||
// Try to squeeze in a bit more text
|
||||
p.pad_left(4);
|
||||
p.pad_left( mLabelPadLeft );
|
||||
p.pad_right(2);
|
||||
p.pad_bottom( mLabelPadBottom );
|
||||
p.font_halign = mFontHalign;
|
||||
p.follows.flags = FOLLOWS_LEFT;
|
||||
p.follows.flags = FOLLOWS_LEFT;
|
||||
|
|
@ -1897,6 +1903,3 @@ void LLTabContainer::commitHoveredButton(S32 x, S32 y)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -79,7 +79,9 @@ public:
|
|||
Optional<S32> tab_width,
|
||||
tab_min_width,
|
||||
tab_max_width,
|
||||
tab_height;
|
||||
tab_height,
|
||||
label_pad_bottom,
|
||||
label_pad_left;
|
||||
|
||||
Optional<bool> hide_tabs;
|
||||
Optional<S32> tab_padding_right;
|
||||
|
|
@ -261,6 +263,11 @@ private:
|
|||
S32 mTotalTabWidth;
|
||||
S32 mTabHeight;
|
||||
|
||||
// Padding under the text labels of tab buttons
|
||||
S32 mLabelPadBottom;
|
||||
// Padding to the left of text labels of tab buttons
|
||||
S32 mLabelPadLeft;
|
||||
|
||||
LLFrameTimer mDragAndDropDelayTimer;
|
||||
|
||||
LLFontGL::HAlign mFontHalign;
|
||||
|
|
|
|||
|
|
@ -1138,6 +1138,8 @@ void LLTextBase::reflow(S32 start_index)
|
|||
line_height = llmax(line_height, segment_height);
|
||||
remaining_pixels -= segment_width;
|
||||
|
||||
// getNumChars() and getDimensions() should return consistent results
|
||||
llassert_always(remaining_pixels >= 0);
|
||||
seg_offset += character_count;
|
||||
|
||||
S32 last_segment_char_on_line = segment->getStart() + seg_offset;
|
||||
|
|
@ -2464,6 +2466,12 @@ S32 LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 lin
|
|||
{
|
||||
LLWString text = mEditor.getWText();
|
||||
|
||||
LLUIImagePtr image = mStyle->getImage();
|
||||
if( image.notNull())
|
||||
{
|
||||
num_pixels -= image->getWidth();
|
||||
}
|
||||
|
||||
// search for newline and if found, truncate there
|
||||
S32 last_char = mStart + segment_offset;
|
||||
for (; last_char != mEnd; ++last_char)
|
||||
|
|
|
|||
|
|
@ -396,6 +396,7 @@ BOOL LLUICtrlFactory::getAttributeColor(LLXMLNodePtr node, const std::string& na
|
|||
//static
|
||||
void LLUICtrlFactory::setCtrlParent(LLView* view, LLView* parent, S32 tab_group)
|
||||
{
|
||||
if (tab_group == S32_MAX) tab_group = parent->getLastTabGroup();
|
||||
parent->addChild(view, tab_group);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -201,7 +201,7 @@ public:
|
|||
|
||||
if (parent)
|
||||
{
|
||||
S32 tab_group = params.tab_group.isProvided() ? params.tab_group() : parent->getLastTabGroup();
|
||||
S32 tab_group = params.tab_group.isProvided() ? params.tab_group() : S32_MAX;
|
||||
setCtrlParent(widget, parent, tab_group);
|
||||
}
|
||||
return widget;
|
||||
|
|
@ -309,9 +309,29 @@ fail:
|
|||
// Apply layout transformations, usually munging rect
|
||||
T::setupParams(params, parent);
|
||||
|
||||
T* widget = createWidget<T>(params, parent);
|
||||
if (!params.validateBlock())
|
||||
{
|
||||
llwarns << getInstance()->getCurFileName() << ": Invalid parameter block for " << typeid(T).name() << llendl;
|
||||
}
|
||||
T* widget;
|
||||
{
|
||||
LLFastTimer timer(FTM_WIDGET_CONSTRUCTION);
|
||||
widget = new T(params);
|
||||
}
|
||||
{
|
||||
LLFastTimer timer(FTM_INIT_FROM_PARAMS);
|
||||
widget->initFromParams(params);
|
||||
}
|
||||
|
||||
createChildren(widget, node, typename T::child_registry_t::instance(), output_node);
|
||||
if (parent)
|
||||
{
|
||||
S32 tab_group = params.tab_group.isProvided() ? params.tab_group() : -1;
|
||||
setCtrlParent(widget, parent, tab_group);
|
||||
}
|
||||
|
||||
typedef typename T::child_registry_t registry_t;
|
||||
|
||||
createChildren(widget, node, registry_t::instance(), output_node);
|
||||
|
||||
if (widget && !widget->postBuild())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -41,6 +41,15 @@
|
|||
#include "llframetimer.h"
|
||||
|
||||
#if LL_WINDOWS //For windows platform.
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
namespace {
|
||||
inline DWORD getpid() {
|
||||
return GetCurrentProcessId();
|
||||
}
|
||||
}
|
||||
|
||||
bool isProcessAlive(U32 pid)
|
||||
{
|
||||
return (bool) GetProcessVersion((DWORD)pid);
|
||||
|
|
|
|||
|
|
@ -37,17 +37,9 @@
|
|||
class LLSD;
|
||||
class LLFrameTimer;
|
||||
|
||||
#if LL_WINDOWS //For windows platform.
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#define getpid GetCurrentProcessId
|
||||
|
||||
#else //Everyone Else
|
||||
|
||||
#if !LL_WINDOWS //For non-windows platforms.
|
||||
#include <signal.h>
|
||||
|
||||
#endif //Everyone else.
|
||||
#endif
|
||||
|
||||
namespace LLPidLock
|
||||
{
|
||||
|
|
|
|||
|
|
@ -211,7 +211,7 @@ private:
|
|||
LLQtWebKit::getInstance()->enablePlugins(true);
|
||||
#elif LL_DARWIN
|
||||
// Disable plugins
|
||||
LLQtWebKit::getInstance()->enablePlugins(false);
|
||||
LLQtWebKit::getInstance()->enablePlugins(true);
|
||||
#elif LL_LINUX
|
||||
// Disable plugins
|
||||
LLQtWebKit::getInstance()->enablePlugins(false);
|
||||
|
|
@ -626,7 +626,11 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
|
|||
}
|
||||
else if(message_name == "cleanup")
|
||||
{
|
||||
// TODO: clean up here
|
||||
// DTOR most likely won't be called but the recent change to the way this process
|
||||
// is (not) killed means we see this message and can do what we need to here.
|
||||
// Note: this cleanup is ultimately what writes cookies to the disk
|
||||
LLQtWebKit::getInstance()->remObserver( mBrowserWindowId, this );
|
||||
LLQtWebKit::getInstance()->reset();
|
||||
}
|
||||
else if(message_name == "shm_added")
|
||||
{
|
||||
|
|
@ -635,7 +639,6 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
|
|||
info.mSize = (size_t)message_in.getValueS32("size");
|
||||
std::string name = message_in.getValue("name");
|
||||
|
||||
|
||||
// std::cerr << "MediaPluginWebKit::receiveMessage: shared memory added, name: " << name
|
||||
// << ", size: " << info.mSize
|
||||
// << ", address: " << info.mAddress
|
||||
|
|
|
|||
|
|
@ -228,7 +228,6 @@ set(viewer_SOURCE_FILES
|
|||
llgroupactions.cpp
|
||||
llgrouplist.cpp
|
||||
llgroupmgr.cpp
|
||||
llgroupnotify.cpp
|
||||
llhomelocationresponder.cpp
|
||||
llhudeffect.cpp
|
||||
llhudeffectbeam.cpp
|
||||
|
|
@ -299,7 +298,6 @@ set(viewer_SOURCE_FILES
|
|||
llnotificationofferhandler.cpp
|
||||
llnotificationscripthandler.cpp
|
||||
llnotificationtiphandler.cpp
|
||||
llnotify.cpp
|
||||
lloutputmonitorctrl.cpp
|
||||
lloverlaybar.cpp
|
||||
llpanelavatar.cpp
|
||||
|
|
@ -738,7 +736,6 @@ set(viewer_HEADER_FILES
|
|||
llgroupactions.h
|
||||
llgrouplist.h
|
||||
llgroupmgr.h
|
||||
llgroupnotify.h
|
||||
llhomelocationresponder.h
|
||||
llhudeffect.h
|
||||
llhudeffectbeam.h
|
||||
|
|
@ -804,7 +801,6 @@ set(viewer_HEADER_FILES
|
|||
llnetmap.h
|
||||
llnotificationhandler.h
|
||||
llnotificationmanager.h
|
||||
llnotify.h
|
||||
lloutputmonitorctrl.h
|
||||
lloverlaybar.h
|
||||
llpanelavatar.h
|
||||
|
|
@ -1357,7 +1353,6 @@ add_executable(${VIEWER_BINARY_NAME}
|
|||
MACOSX_BUNDLE
|
||||
${viewer_SOURCE_FILES}
|
||||
)
|
||||
check_message_template(${VIEWER_BINARY_NAME})
|
||||
|
||||
if (LLKDU_LIBRARY)
|
||||
add_dependencies(${VIEWER_BINARY_NAME} ${LLKDU_LIBRARY})
|
||||
|
|
@ -1394,45 +1389,84 @@ if (WINDOWS)
|
|||
)
|
||||
endif(USE_PRECOMPILED_HEADERS)
|
||||
|
||||
# sets the 'working directory' for debugging from visual studio.
|
||||
if (NOT UNATTENDED)
|
||||
add_custom_command(
|
||||
TARGET ${VIEWER_BINARY_NAME} POST_BUILD
|
||||
COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe
|
||||
ARGS
|
||||
--solution
|
||||
${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln
|
||||
--workingdir
|
||||
${VIEWER_BINARY_NAME}
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging."
|
||||
)
|
||||
endif (NOT UNATTENDED)
|
||||
|
||||
add_custom_command(
|
||||
TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
ARGS
|
||||
-E
|
||||
copy_if_different
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/messages/message_template.msg
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message_template.msg
|
||||
COMMENT "Copying message_template.msg to the runtime folder."
|
||||
)
|
||||
|
||||
add_custom_command(
|
||||
TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
ARGS
|
||||
-E
|
||||
copy_if_different
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../etc/message.xml
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message.xml
|
||||
COMMENT "Copying message.xml to the runtime folder."
|
||||
# If adding a file to viewer_manifest.py in the WindowsManifest.construct() method, be sure to add the dependency
|
||||
# here.
|
||||
# *NOTE:Mani - This is a crappy hack to have important dependecies for the viewer_manifest copy action
|
||||
# be met. I'm looking forward to a source-code split-up project next year that will address this kind of thing.
|
||||
# In the meantime, if you have any ideas on how to easily maintain one list, either here or in viewer_manifest.py
|
||||
# and have the build deps get tracked *please* tell me about it.
|
||||
set(COPY_INPUT_DEPENDECIES
|
||||
# The following commented dependencies are determined at variably at build time. Can't do this here.
|
||||
#llkdu.dll => llkdu.dll
|
||||
#${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libtcmalloc_minimal.dll => None ... Skipping libtcmalloc_minimal.dll
|
||||
${CMAKE_SOURCE_DIR}/../etc/message.xml
|
||||
${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg
|
||||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/llcommon.dll
|
||||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libapr-1.dll
|
||||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libaprutil-1.dll
|
||||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libapriconv-1.dll
|
||||
${SHARED_LIB_STAGING_DIR}/Release/openjpeg.dll
|
||||
${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/openjpeg.dll
|
||||
${SHARED_LIB_STAGING_DIR}/Debug/openjpegd.dll
|
||||
${SHARED_LIB_STAGING_DIR}/Release/msvcr80.dll
|
||||
${SHARED_LIB_STAGING_DIR}/Release/msvcp80.dll
|
||||
${SHARED_LIB_STAGING_DIR}/Release/Microsoft.VC80.CRT.manifest
|
||||
${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/msvcr80.dll
|
||||
${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/msvcp80.dll
|
||||
${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/Microsoft.VC80.CRT.manifest
|
||||
${SHARED_LIB_STAGING_DIR}/Debug/msvcr80d.dll
|
||||
${SHARED_LIB_STAGING_DIR}/Debug/msvcp80d.dll
|
||||
${SHARED_LIB_STAGING_DIR}/Debug/Microsoft.VC80.DebugCRT.manifest
|
||||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/SLVoice.exe
|
||||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk.dll
|
||||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp.dll
|
||||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libsndfile-1.dll
|
||||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/zlib1.dll
|
||||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxplatform.dll
|
||||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxoal.dll
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/dbghelp.dll
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/fmod.dll
|
||||
${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}/media_plugin_quicktime.dll
|
||||
${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}/media_plugin_webkit.dll
|
||||
${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll
|
||||
${ARCH_PREBUILT_DIRS_RELEASE}/qtcore4.dll
|
||||
${ARCH_PREBUILT_DIRS_RELEASE}/qtgui4.dll
|
||||
${ARCH_PREBUILT_DIRS_RELEASE}/qtnetwork4.dll
|
||||
${ARCH_PREBUILT_DIRS_RELEASE}/qtopengl4.dll
|
||||
${ARCH_PREBUILT_DIRS_RELEASE}/qtwebkit4.dll
|
||||
${ARCH_PREBUILT_DIRS_RELEASE}/qtxmlpatterns4.dll
|
||||
${ARCH_PREBUILT_DIRS_RELEASE}/ssleay32.dll
|
||||
${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qgif4.dll
|
||||
${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qico4.dll
|
||||
${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qjpeg4.dll
|
||||
${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qmng4.dll
|
||||
${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qsvg4.dll
|
||||
${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qtiff4.dll
|
||||
${ARCH_PREBUILT_DIRS_DEBUG}/libeay32.dll
|
||||
${ARCH_PREBUILT_DIRS_DEBUG}/qtcored4.dll
|
||||
${ARCH_PREBUILT_DIRS_DEBUG}/qtguid4.dll
|
||||
${ARCH_PREBUILT_DIRS_DEBUG}/qtnetworkd4.dll
|
||||
${ARCH_PREBUILT_DIRS_DEBUG}/qtopengld4.dll
|
||||
${ARCH_PREBUILT_DIRS_DEBUG}/qtwebkitd4.dll
|
||||
${ARCH_PREBUILT_DIRS_DEBUG}/qtxmlpatternsd4.dll
|
||||
${ARCH_PREBUILT_DIRS_DEBUG}/ssleay32.dll
|
||||
${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qgifd4.dll
|
||||
${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qicod4.dll
|
||||
${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qjpegd4.dll
|
||||
${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qmngd4.dll
|
||||
${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qsvgd4.dll
|
||||
${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qtiffd4.dll
|
||||
SLPlugin
|
||||
media_plugin_quicktime
|
||||
media_plugin_webkit
|
||||
windows-crash-logger
|
||||
windows-updater
|
||||
)
|
||||
|
||||
|
||||
add_custom_command(
|
||||
TARGET ${VIEWER_BINARY_NAME} POST_BUILD
|
||||
OUTPUT ${CMAKE_CFG_INTDIR}/copy_touched.bat
|
||||
COMMAND ${PYTHON_EXECUTABLE}
|
||||
ARGS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
|
||||
|
|
@ -1443,11 +1477,17 @@ if (WINDOWS)
|
|||
--dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
|
||||
--grid=${GRID}
|
||||
--source=${CMAKE_CURRENT_SOURCE_DIR}
|
||||
DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
|
||||
--touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/copy_touched.bat
|
||||
DEPENDS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
|
||||
stage_third_party_libs
|
||||
${COPY_INPUT_DEPENDECIES}
|
||||
COMMENT "Performing viewer_manifest copy"
|
||||
)
|
||||
|
||||
add_custom_target(copy_w_viewer_manifest ALL DEPENDS ${CMAKE_CFG_INTDIR}/copy_touched.bat)
|
||||
|
||||
add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon)
|
||||
add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon copy_w_viewer_manifest)
|
||||
|
||||
if(LLKDU_LIBRARY)
|
||||
# kdu may not exist!
|
||||
|
|
@ -1466,6 +1506,21 @@ if (WINDOWS)
|
|||
windows-crash-logger
|
||||
)
|
||||
|
||||
# sets the 'working directory' for debugging from visual studio.
|
||||
if (NOT UNATTENDED)
|
||||
add_custom_command(
|
||||
TARGET ${VIEWER_BINARY_NAME} POST_BUILD
|
||||
COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe
|
||||
ARGS
|
||||
--solution
|
||||
${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln
|
||||
--workingdir
|
||||
${VIEWER_BINARY_NAME}
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging."
|
||||
)
|
||||
endif (NOT UNATTENDED)
|
||||
|
||||
if (PACKAGE)
|
||||
add_custom_command(
|
||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2
|
||||
|
|
@ -1480,7 +1535,7 @@ if (WINDOWS)
|
|||
${EVENT_HOST_SCRIPTS}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py
|
||||
)
|
||||
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${CMAKE_CFG_INTDIR}/touched.bat
|
||||
COMMAND ${PYTHON_EXECUTABLE}
|
||||
|
|
@ -1503,6 +1558,8 @@ if (WINDOWS)
|
|||
# sorted out on the parabuild cluster...
|
||||
#${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2)
|
||||
|
||||
check_message_template(package)
|
||||
|
||||
endif (PACKAGE)
|
||||
endif (WINDOWS)
|
||||
|
||||
|
|
@ -1584,6 +1641,7 @@ if (LINUX)
|
|||
add_custom_target(package ALL DEPENDS ${product}.tar.bz2)
|
||||
add_dependencies(package linux-crash-logger-strip-target)
|
||||
add_dependencies(package linux-updater-strip-target)
|
||||
check_message_template(package)
|
||||
endif (NOT INSTALL)
|
||||
endif (LINUX)
|
||||
|
||||
|
|
@ -1622,6 +1680,7 @@ if (DARWIN)
|
|||
|
||||
if (PACKAGE)
|
||||
add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME})
|
||||
check_message_template(package)
|
||||
add_dependencies(package mac-updater mac-crash-logger)
|
||||
|
||||
add_custom_command(
|
||||
|
|
@ -1725,119 +1784,3 @@ if (LL_TESTS)
|
|||
endif (LL_TESTS)
|
||||
|
||||
|
||||
# Don't do these for DARWIN or LINUX here -- they're taken care of by viewer_manifest.py
|
||||
if (WINDOWS)
|
||||
add_custom_command(
|
||||
TARGET ${VIEWER_BINARY_NAME} POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
ARGS
|
||||
-E
|
||||
make_directory
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin
|
||||
COMMENT "Creating llplugin dir."
|
||||
)
|
||||
|
||||
get_target_property(BUILT_SLPLUGIN SLPlugin LOCATION)
|
||||
add_custom_command(
|
||||
TARGET ${VIEWER_BINARY_NAME} POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
ARGS
|
||||
-E
|
||||
copy_if_different
|
||||
${BUILT_SLPLUGIN}
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
|
||||
COMMENT "Copying SLPlugin executable to the runtime folder."
|
||||
)
|
||||
|
||||
get_target_property(BUILT_WEBKIT_PLUGIN media_plugin_webkit LOCATION)
|
||||
add_custom_command(
|
||||
TARGET ${VIEWER_BINARY_NAME} POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
ARGS
|
||||
-E
|
||||
copy_if_different
|
||||
${BUILT_WEBKIT_PLUGIN}
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin
|
||||
COMMENT "Copying WebKit Plugin to the runtime folder."
|
||||
)
|
||||
|
||||
get_target_property(BUILT_QUICKTIME_PLUGIN media_plugin_quicktime LOCATION)
|
||||
add_custom_command(
|
||||
TARGET ${VIEWER_BINARY_NAME} POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
ARGS
|
||||
-E
|
||||
copy_if_different
|
||||
${BUILT_QUICKTIME_PLUGIN}
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin
|
||||
COMMENT "Copying Quicktime Plugin to the runtime folder."
|
||||
)
|
||||
|
||||
#*******************************
|
||||
# Copy media plugin support dlls
|
||||
# Debug config runtime files required for the plugins
|
||||
set(plugins_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug")
|
||||
set(plugins_debug_files
|
||||
libeay32.dll
|
||||
qtcored4.dll
|
||||
qtguid4.dll
|
||||
qtnetworkd4.dll
|
||||
qtopengld4.dll
|
||||
qtwebkitd4.dll
|
||||
ssleay32.dll
|
||||
)
|
||||
copy_if_different(
|
||||
${plugins_debug_src_dir}
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/Debug/llplugin"
|
||||
out_targets
|
||||
${plugins_debug_files}
|
||||
)
|
||||
set(media_plugin_targets ${media_plugin_targets} ${out_targets})
|
||||
|
||||
# Release & ReleaseDebInfo config runtime files required for the plugins
|
||||
set(plugins_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
|
||||
set(plugins_release_files
|
||||
libeay32.dll
|
||||
qtcore4.dll
|
||||
qtgui4.dll
|
||||
qtnetwork4.dll
|
||||
qtopengl4.dll
|
||||
qtwebkit4.dll
|
||||
ssleay32.dll
|
||||
)
|
||||
copy_if_different(
|
||||
${plugins_release_src_dir}
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/Release/llplugin"
|
||||
out_targets
|
||||
${plugins_release_files}
|
||||
)
|
||||
set(media_plugin_targets ${media_plugin_targets} ${out_targets})
|
||||
|
||||
copy_if_different(
|
||||
${plugins_release_src_dir}
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/llplugin"
|
||||
out_targets
|
||||
${plugins_release_files}
|
||||
)
|
||||
set(media_plugin_targets ${media_plugin_targets} ${out_targets})
|
||||
|
||||
add_custom_target(copy_media_plugin_libs ALL
|
||||
DEPENDS
|
||||
${media_plugin_targets}
|
||||
)
|
||||
|
||||
add_custom_command(
|
||||
TARGET ${VIEWER_BINARY_NAME} POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
ARGS
|
||||
-E
|
||||
copy_directory
|
||||
${CMAKE_BINARY_DIR}/test_apps/llplugintest/${CMAKE_CFG_INTDIR}/imageformats
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin/imageformats
|
||||
COMMENT "Copying llpluging imageformat libs."
|
||||
)
|
||||
|
||||
add_dependencies(${VIEWER_BINARY_NAME} llmediaplugintest copy_media_plugin_libs)
|
||||
|
||||
endif (WINDOWS)
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<real>300.0</real>
|
||||
</map>
|
||||
|
|
@ -45,17 +45,6 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>AllowIdleAFK</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Automatically set AFK (away from keyboard) mode when idle</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>AllowMultipleViewers</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -3585,7 +3574,18 @@
|
|||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>http://www.secondlife.com/</string>
|
||||
<string>http://lecs.viewer-sidebar.secondlife.com.s3.amazonaws.com/sidebar.html</string>
|
||||
</map>
|
||||
<key>SearchURL</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>URL for Search website, displayed in the Find floater</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>http://int.searchwww-phx0.damballah.lindenlab.com/viewer/[CATEGORY]?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]</string>
|
||||
</map>
|
||||
<key>HighResSnapshot</key>
|
||||
<map>
|
||||
|
|
@ -5459,6 +5459,17 @@
|
|||
<string>U32</string>
|
||||
<key>Value</key>
|
||||
<integer>13</integer>
|
||||
</map>
|
||||
<key>PrimMediaMasterEnabled</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Whether or not Media on a Prim is enabled.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>PrimMediaControlsUseHoverControlSet</key>
|
||||
<map>
|
||||
|
|
@ -7539,45 +7550,6 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>SearchURLDefault</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>URL to load for empty searches</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>HideFromEditor</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>http://search.secondlife.com/client_search.php?</string>
|
||||
</map>
|
||||
<key>SearchURLQuery</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>URL to use for searches</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>HideFromEditor</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>http://search.secondlife.com/client_search.php?q=[QUERY]&s=[COLLECTION]&</string>
|
||||
</map>
|
||||
<key>SearchURLSuffix2</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Parameters added to end of search queries</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>HideFromEditor</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>lang=[LANG]&mat=[MATURITY]&t=[TEEN]&region=[REGION]&x=[X]&y=[Y]&z=[Z]&session=[SESSION]</string>
|
||||
</map>
|
||||
<key>SelectMovableOnly</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -9303,7 +9275,7 @@
|
|||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<integer>4</integer>
|
||||
<integer>5</integer>
|
||||
</map>
|
||||
<key>UIMaxComboWidth</key>
|
||||
<map>
|
||||
|
|
|
|||
|
|
@ -4,36 +4,31 @@ Second Life - Linux Voice Support README
|
|||
WHAT IS IT?
|
||||
-=-=-=-=-=-
|
||||
|
||||
Linux Voice Support is a new feature in testing which allows users
|
||||
of the Linux Second Life client to participate in voice-chat with other
|
||||
residents and groups inside Second Life, with an appropriate
|
||||
headset/microphone.
|
||||
|
||||
Linux Voice Support is currently EXPERIMENTAL and is known to still
|
||||
have some compatibility issues.
|
||||
Linux Voice Support is a feature in testing which allows users of the Linux
|
||||
Second Life client to participate in voice-chat with other residents and
|
||||
groups inside Second Life, with an appropriate headset/microphone.
|
||||
|
||||
REQUIREMENTS
|
||||
-=-=-=-=-=-=
|
||||
|
||||
* A headset/microphone supported by your chosen version of Linux
|
||||
* The ALSA sound system (you probably already have this -
|
||||
i.e. the alsa-base and alsa-utils packages on Ubuntu)
|
||||
* At this time, the PulseAudio audio system is recommended; this software
|
||||
is already part of most modern (2009+) Linux desktop systems. Alternatively,
|
||||
the ALSA audio system may be used on systems installed from around
|
||||
2007 onwards (again this is likely already installed on your system).
|
||||
|
||||
Success with Linux Voice support has been reported on the following
|
||||
systems:
|
||||
* Ubuntu 6.06 (Dapper) with Intel ICH5/CMI9761A+ audio chipset
|
||||
* Ubuntu 6.06 (Dapper) with SigmaTel STAC2997 audio chipset
|
||||
* Ubuntu 6.06 (Dapper) with Creative EMU10K1 audio chipset
|
||||
* Ubuntu 7.04 (Feisty) with USB Plantronics headset
|
||||
* Ubuntu 7.04 (Feisty) with Intel HDA audio chipset
|
||||
* Fedora Core 6 with (unknown) audio chipset
|
||||
* Ubuntu 8.04 (Hardy) with (unknown) audio chipset
|
||||
TESTING YOUR SETTINGS
|
||||
-=-=-=-=-=-=-=-=-=-=-
|
||||
|
||||
* The Second Life region 'Voice Echo Canyon' is a great place for testing
|
||||
your hardware settings and quality - it will 'echo' your voice back to you
|
||||
when you speak.
|
||||
|
||||
KNOWN PROBLEMS
|
||||
-=-=-=-=-=-=-=
|
||||
|
||||
* The 'Input Level' meter in the Voice Chat Device Settings dialog
|
||||
does not respond to audio input.
|
||||
* Compatibility with old ALSA-based audio systems (such as Ubuntu Dapper
|
||||
from 2006) is poor.
|
||||
|
||||
TROUBLESHOOTING
|
||||
-=-=-=-=-=-=-=-
|
||||
|
|
@ -41,12 +36,11 @@ TROUBLESHOOTING
|
|||
PROBLEM 1: I don't see a white dot over the head of my avatar or other
|
||||
Voice-using avatars.
|
||||
SOLUTION:
|
||||
a. Ensure that 'Enable voice chat' is enabled in the Voice Chat
|
||||
preferences window and that you are in a voice-enabled area (you
|
||||
will see a blue headphone icon in the SL menu-bar).
|
||||
a. Ensure that 'Enable voice' is enabled in the 'Sound' section of the
|
||||
Preferences window, and that you are in a voice-enabled area.
|
||||
b. If the above does not help, exit Second Life and ensure that any
|
||||
remaining 'SLVoice' processes (as reported by 'ps', 'top' or similar)
|
||||
are killed.
|
||||
are killed before restarting.
|
||||
|
||||
PROBLEM 2: I have a white dot over my head but I never see (or hear!) anyone
|
||||
except myself listed in the Active Speakers dialog when I'm sure that other
|
||||
|
|
@ -65,12 +59,13 @@ c. Update to the latest version of ALSA manually. For a guide, see the
|
|||
|
||||
PROBLEM 3: I can hear other people, but they cannot hear me.
|
||||
SOLUTION:
|
||||
a. Ensure that you have the 'Talk' button activated while you are trying to
|
||||
speak.
|
||||
a. Ensure that you have the 'Speak' button (at the bottom of the Second Life
|
||||
window) activated while you are trying to speak.
|
||||
b. Ensure that your microphone jack is inserted into the correct socket of your
|
||||
sound card, where appropriate.
|
||||
c. Use your system mixer-setting program or the 'alsamixer' program to ensure
|
||||
that microphone input is set as the active input source and is not muted.
|
||||
c. Use your system mixer-setting program (such as the PulseAudio 'volume
|
||||
control' applet or the ALSA 'alsamixer' program) to ensure that microphone
|
||||
input is set as the active input source and is not muted.
|
||||
d. Verify that audio input works in other applications, i.e. Audacity
|
||||
|
||||
PROBLEM 4: Other people just hear bursts of loud noise when I speak.
|
||||
|
|
|
|||
|
|
@ -55,10 +55,13 @@ Minimum requirements:
|
|||
is required. If you are running a 64-bit Linux distribution then
|
||||
you will need its 32-bit compatibility environment installed, but
|
||||
this configuration is not currently supported.
|
||||
* PulseAudio or ALSA Linux system sound software. A recent PulseAudio
|
||||
is the recommended configuration; see README-linux-voice.txt for more
|
||||
information.
|
||||
* Video/Graphics Card:
|
||||
o nVidia GeForce 2, GeForce 4mx, or better (recommend one of the
|
||||
following: 6700, 6800, 7600, 7800, 7900, 8400, 8500, 8600,
|
||||
8800, Go 7400, Go 7600, Go 7800, Go 7900)
|
||||
8800, Go 7400, Go 7600, Go 7800, Go 7900, +)
|
||||
o OR ATI Radeon 8500, 9250, or better
|
||||
(nVidia cards are recommended for the Linux client)
|
||||
|
||||
|
|
|
|||
|
|
@ -38,7 +38,6 @@
|
|||
#include "llagentlistener.h"
|
||||
#include "llagentwearables.h"
|
||||
#include "llagentui.h"
|
||||
|
||||
#include "llanimationstates.h"
|
||||
#include "llbottomtray.h"
|
||||
#include "llcallingcard.h"
|
||||
|
|
@ -65,6 +64,7 @@
|
|||
#include "llsky.h"
|
||||
#include "llsmoothstep.h"
|
||||
#include "llstatusbar.h"
|
||||
#include "llteleportflags.h"
|
||||
#include "lltool.h"
|
||||
#include "lltoolmgr.h"
|
||||
#include "lltrans.h"
|
||||
|
|
|
|||
|
|
@ -41,7 +41,6 @@
|
|||
#include "llinventoryobserver.h"
|
||||
#include "llinventorypanel.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llnotify.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llvoavatarself.h"
|
||||
#include "llwearable.h"
|
||||
|
|
|
|||
|
|
@ -455,7 +455,10 @@ void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit
|
|||
LLViewerInventoryItem *item = items.get(i);
|
||||
if (keep_outfit_links && (item->getActualType() == LLAssetType::AT_LINK_FOLDER))
|
||||
continue;
|
||||
gInventory.purgeObject(item->getUUID());
|
||||
if (item->getIsLinkType())
|
||||
{
|
||||
gInventory.purgeObject(item->getUUID());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -871,10 +874,48 @@ bool areMatchingWearables(const LLViewerInventoryItem *a, const LLViewerInventor
|
|||
(a->getWearableType() == b->getWearableType()));
|
||||
}
|
||||
|
||||
class LLDeferredCOFLinkObserver: public LLInventoryObserver
|
||||
{
|
||||
public:
|
||||
LLDeferredCOFLinkObserver(const LLUUID& item_id, bool do_update):
|
||||
mItemID(item_id),
|
||||
mDoUpdate(do_update)
|
||||
{
|
||||
}
|
||||
|
||||
~LLDeferredCOFLinkObserver()
|
||||
{
|
||||
}
|
||||
|
||||
/* virtual */ void changed(U32 mask)
|
||||
{
|
||||
const LLInventoryItem *item = gInventory.getItem(mItemID);
|
||||
if (item)
|
||||
{
|
||||
gInventory.removeObserver(this);
|
||||
LLAppearanceManager::instance().addCOFItemLink(item,mDoUpdate);
|
||||
delete this;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
const LLUUID mItemID;
|
||||
bool mDoUpdate;
|
||||
};
|
||||
|
||||
|
||||
void LLAppearanceManager::addCOFItemLink(const LLUUID &item_id, bool do_update )
|
||||
{
|
||||
const LLInventoryItem *item = gInventory.getItem(item_id);
|
||||
addCOFItemLink(item, do_update);
|
||||
if (!item)
|
||||
{
|
||||
LLDeferredCOFLinkObserver *observer = new LLDeferredCOFLinkObserver(item_id, do_update);
|
||||
gInventory.addObserver(observer);
|
||||
}
|
||||
else
|
||||
{
|
||||
addCOFItemLink(item, do_update);
|
||||
}
|
||||
}
|
||||
|
||||
void LLAppearanceManager::addCOFItemLink(const LLInventoryItem *item, bool do_update )
|
||||
|
|
@ -909,7 +950,10 @@ void LLAppearanceManager::addCOFItemLink(const LLInventoryItem *item, bool do_up
|
|||
else if (areMatchingWearables(vitem,inv_item))
|
||||
{
|
||||
gAgentWearables.removeWearable(inv_item->getWearableType(),true,0);
|
||||
gInventory.purgeObject(inv_item->getUUID());
|
||||
if (inv_item->getIsLinkType())
|
||||
{
|
||||
gInventory.purgeObject(inv_item->getUUID());
|
||||
}
|
||||
}
|
||||
}
|
||||
if (linked_already)
|
||||
|
|
@ -958,10 +1002,9 @@ void LLAppearanceManager::removeCOFItemLinks(const LLUUID& item_id, bool do_upda
|
|||
for (S32 i=0; i<item_array.count(); i++)
|
||||
{
|
||||
const LLInventoryItem* item = item_array.get(i).get();
|
||||
if (item->getLinkedUUID() == item_id)
|
||||
if (item->getIsLinkType() && item->getLinkedUUID() == item_id)
|
||||
{
|
||||
const LLUUID& item_id = item_array.get(i)->getUUID();
|
||||
gInventory.purgeObject(item_id);
|
||||
gInventory.purgeObject(item->getUUID());
|
||||
}
|
||||
}
|
||||
if (do_update)
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@
|
|||
#include "llfeaturemanager.h"
|
||||
#include "lluictrlfactory.h"
|
||||
#include "lltexteditor.h"
|
||||
#include "llalertdialog.h"
|
||||
#include "llerrorcontrol.h"
|
||||
#include "llviewertexturelist.h"
|
||||
#include "llgroupmgr.h"
|
||||
|
|
@ -85,11 +84,14 @@
|
|||
#include "llsecondlifeurls.h"
|
||||
|
||||
// Linden library includes
|
||||
#include "llimagej2c.h"
|
||||
#include "llmemory.h"
|
||||
#include "llprimitive.h"
|
||||
#include "llurlaction.h"
|
||||
#include "llvfile.h"
|
||||
#include "llvfsthread.h"
|
||||
#include "llvolumemgr.h"
|
||||
#include "llxfermanager.h"
|
||||
|
||||
#include "llnotificationmanager.h"
|
||||
#include "llnotifications.h"
|
||||
|
|
@ -109,7 +111,6 @@
|
|||
#include "apr_dso.h"
|
||||
#include <boost/lexical_cast.hpp>
|
||||
|
||||
#include "llnotify.h"
|
||||
#include "llviewerkeyboard.h"
|
||||
#include "lllfsthread.h"
|
||||
#include "llworkerthread.h"
|
||||
|
|
@ -332,7 +333,7 @@ LLAppViewer::LLUpdaterInfo *LLAppViewer::sUpdaterInfo = NULL ;
|
|||
void idle_afk_check()
|
||||
{
|
||||
// check idle timers
|
||||
if (gSavedSettings.getBOOL("AllowIdleAFK") && (gAwayTriggerTimer.getElapsedTimeF32() > gSavedSettings.getF32("AFKTimeout")))
|
||||
if (gSavedSettings.getS32("AFKTimeout") && (gAwayTriggerTimer.getElapsedTimeF32() > gSavedSettings.getS32("AFKTimeout")))
|
||||
{
|
||||
gAgent.setAFK();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -325,6 +325,7 @@ extern BOOL gUseWireframe;
|
|||
// VFS globals - gVFS is for general use
|
||||
// gStaticVFS is read-only and is shipped w/ the viewer
|
||||
// it has pre-cache data like the UI .TGAs
|
||||
class LLVFS;
|
||||
extern LLVFS *gStaticVFS;
|
||||
|
||||
extern LLMemoryInfo gSysMemory;
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@
|
|||
#include "llcompilequeue.h"
|
||||
#include "llfloaterbuycurrency.h"
|
||||
#include "llfilepicker.h"
|
||||
#include "llnotify.h"
|
||||
#include "llinventoryobserver.h"
|
||||
#include "llinventorypanel.h"
|
||||
#include "llpermissionsflags.h"
|
||||
|
|
|
|||
|
|
@ -61,6 +61,7 @@
|
|||
#include "llviewerregion.h"
|
||||
#include "llimfloater.h"
|
||||
#include "lltrans.h"
|
||||
#include "llcallingcard.h"
|
||||
|
||||
// static
|
||||
void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::string& name)
|
||||
|
|
@ -210,11 +211,9 @@ void LLAvatarActions::startCall(const LLUUID& id)
|
|||
|
||||
std::string name;
|
||||
gCacheName->getFullName(id, name);
|
||||
LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id);
|
||||
LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id, true);
|
||||
if (session_id != LLUUID::null)
|
||||
{
|
||||
// always open IM window when connecting to voice
|
||||
LLIMFloater::show(session_id);
|
||||
gIMMgr->startCall(session_id);
|
||||
}
|
||||
make_ui_sound("UISndStartIM");
|
||||
|
|
@ -238,15 +237,12 @@ void LLAvatarActions::startAdhocCall(const std::vector<LLUUID>& ids)
|
|||
// create the new ad hoc voice session
|
||||
const std::string title = LLTrans::getString("conference-title");
|
||||
LLUUID session_id = gIMMgr->addSession(title, IM_SESSION_CONFERENCE_START,
|
||||
ids[0], id_array);
|
||||
ids[0], id_array, true);
|
||||
if (session_id == LLUUID::null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// always open IM window when connecting to voice
|
||||
LLIMFloater::show(session_id);
|
||||
|
||||
// start the call once the session has fully initialized
|
||||
gIMMgr->autoStartCallOnStartup(session_id);
|
||||
|
||||
|
|
@ -265,6 +261,24 @@ bool LLAvatarActions::isCalling(const LLUUID &id)
|
|||
return (LLIMModel::getInstance()->findIMSession(session_id) != NULL);
|
||||
}
|
||||
|
||||
//static
|
||||
bool LLAvatarActions::canCall(const LLUUID &id)
|
||||
{
|
||||
if(isFriend(id))
|
||||
{
|
||||
return LLAvatarTracker::instance().isBuddyOnline(id) && LLVoiceClient::voiceEnabled();
|
||||
}
|
||||
else
|
||||
{
|
||||
// don't need to check online/offline status because "usual resident" (resident that is not a friend)
|
||||
// can be only ONLINE. There is no way to see "usual resident" in OFFLINE status. If we see "usual
|
||||
// resident" it automatically means that the resident is ONLINE. So to make a call to the "usual resident"
|
||||
// we need to check only that "our" voice is enabled.
|
||||
return LLVoiceClient::voiceEnabled();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// static
|
||||
void LLAvatarActions::startConference(const std::vector<LLUUID>& ids)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -128,6 +128,11 @@ public:
|
|||
*/
|
||||
static bool isCalling(const LLUUID &id);
|
||||
|
||||
/**
|
||||
* @return true if call to the resident can be made (resident is online and voice is enabled)
|
||||
*/
|
||||
|
||||
static bool canCall(const LLUUID &id);
|
||||
/**
|
||||
* Invite avatar to a group.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -78,6 +78,9 @@ LLBottomTray::LLBottomTray(const LLSD&)
|
|||
LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraPresets, _2));
|
||||
LLIMMgr::getInstance()->addSessionObserver(this);
|
||||
|
||||
//managing chiclets for voice calls
|
||||
LLIMModel::getInstance()->addNewMsgCallback(boost::bind(&LLBottomTray::onNewIM, this, _1));
|
||||
|
||||
//this is to fix a crash that occurs because LLBottomTray is a singleton
|
||||
//and thus is deleted at the end of the viewers lifetime, but to be cleanly
|
||||
//destroyed LLBottomTray requires some subsystems that are long gone
|
||||
|
|
@ -143,25 +146,22 @@ LLIMChiclet* LLBottomTray::createIMChiclet(const LLUUID& session_id)
|
|||
//virtual
|
||||
void LLBottomTray::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
|
||||
{
|
||||
if(getChicletPanel())
|
||||
{
|
||||
if(getChicletPanel()->findChiclet<LLChiclet>(session_id))
|
||||
{
|
||||
if (!getChicletPanel()) return;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
LLIMChiclet* chiclet = createIMChiclet(session_id);
|
||||
if(chiclet)
|
||||
{
|
||||
chiclet->setIMSessionName(name);
|
||||
chiclet->setOtherParticipantId(other_participant_id);
|
||||
}
|
||||
else
|
||||
{
|
||||
llerrs << "Could not create chiclet" << llendl;
|
||||
}
|
||||
}
|
||||
if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return;
|
||||
|
||||
// For im sessions started as voice call chiclet gets created on the first incoming message
|
||||
if (gIMMgr->isVoiceCall(session_id)) return;
|
||||
|
||||
LLIMChiclet* chiclet = createIMChiclet(session_id);
|
||||
if(chiclet)
|
||||
{
|
||||
chiclet->setIMSessionName(name);
|
||||
chiclet->setOtherParticipantId(other_participant_id);
|
||||
}
|
||||
else
|
||||
{
|
||||
llerrs << "Could not create chiclet" << llendl;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -194,6 +194,28 @@ void LLBottomTray::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID&
|
|||
}
|
||||
}
|
||||
|
||||
void LLBottomTray::onNewIM(const LLSD& data)
|
||||
{
|
||||
LLUUID from_id = data["from_id"];
|
||||
if (from_id.isNull() || gAgentID == from_id) return;
|
||||
|
||||
LLUUID session_id = data["session_id"];
|
||||
if (session_id.isNull()) return;
|
||||
|
||||
if (!gIMMgr->isVoiceCall(session_id)) return;
|
||||
|
||||
if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return;
|
||||
|
||||
//first real message, time to create chiclet
|
||||
LLIMChiclet* chiclet = createIMChiclet(session_id);
|
||||
if(chiclet)
|
||||
{
|
||||
chiclet->setIMSessionName(LLIMModel::getInstance()->getName(session_id));
|
||||
chiclet->setOtherParticipantId(LLIMModel::getInstance()->getOtherParticipantID(session_id));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// virtual
|
||||
void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, bool proximal)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -75,6 +75,8 @@ public:
|
|||
virtual void sessionRemoved(const LLUUID& session_id);
|
||||
void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
|
||||
|
||||
void onNewIM(const LLSD& data);
|
||||
|
||||
virtual void reshape(S32 width, S32 height, BOOL called_from_parent);
|
||||
|
||||
virtual void onFocusLost();
|
||||
|
|
|
|||
|
|
@ -33,8 +33,12 @@
|
|||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llnotificationsutil.h"
|
||||
#include "lltrans.h"
|
||||
|
||||
#include "llcallfloater.h"
|
||||
|
||||
#include "llagent.h"
|
||||
#include "llagentdata.h" // for gAgentID
|
||||
#include "llavatarlist.h"
|
||||
#include "llbottomtray.h"
|
||||
|
|
@ -79,8 +83,12 @@ LLCallFloater::LLCallFloater(const LLSD& key)
|
|||
, mAvatarList(NULL)
|
||||
, mNonAvatarCaller(NULL)
|
||||
, mVoiceType(VC_LOCAL_CHAT)
|
||||
, mAgentPanel(NULL)
|
||||
, mSpeakingIndicator(NULL)
|
||||
, mIsModeratorMutedVoice(false)
|
||||
{
|
||||
mFactoryMap["non_avatar_caller"] = LLCallbackMap(create_non_avatar_caller, NULL);
|
||||
LLVoiceClient::getInstance()->addObserver(this);
|
||||
}
|
||||
|
||||
LLCallFloater::~LLCallFloater()
|
||||
|
|
@ -88,6 +96,13 @@ LLCallFloater::~LLCallFloater()
|
|||
mChannelChangedConnection.disconnect();
|
||||
delete mPaticipants;
|
||||
mPaticipants = NULL;
|
||||
|
||||
// Don't use LLVoiceClient::getInstance() here
|
||||
// singleton MAY have already been destroyed.
|
||||
if(gVoiceClient)
|
||||
{
|
||||
gVoiceClient->removeObserver(this);
|
||||
}
|
||||
}
|
||||
|
||||
// virtual
|
||||
|
|
@ -120,6 +135,34 @@ void LLCallFloater::onOpen(const LLSD& /*key*/)
|
|||
{
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLCallFloater::draw()
|
||||
{
|
||||
// we have to refresh participants to display ones not in voice as disabled.
|
||||
// It should be done only when she joins or leaves voice chat.
|
||||
// But seems that LLVoiceClientParticipantObserver is not enough to satisfy this requirement.
|
||||
// *TODO: mantipov: remove from draw()
|
||||
onChange();
|
||||
|
||||
bool is_moderator_muted = gVoiceClient->getIsModeratorMuted(gAgentID);
|
||||
|
||||
if (mIsModeratorMutedVoice != is_moderator_muted)
|
||||
{
|
||||
setModeratorMutedVoice(is_moderator_muted);
|
||||
}
|
||||
|
||||
LLDockableFloater::draw();
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLCallFloater::onChange()
|
||||
{
|
||||
if (NULL == mPaticipants) return;
|
||||
|
||||
mPaticipants->refreshVoiceState();
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
/// PRIVATE SECTION
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -165,9 +208,19 @@ void LLCallFloater::updateSession()
|
|||
mVoiceType = VC_PEER_TO_PEER;
|
||||
break;
|
||||
case IM_SESSION_CONFERENCE_START:
|
||||
mVoiceType = VC_AD_HOC_CHAT;
|
||||
case IM_SESSION_GROUP_START:
|
||||
case IM_SESSION_INVITE:
|
||||
if (gAgent.isInGroup(session_id))
|
||||
{
|
||||
mVoiceType = VC_GROUP_CHAT;
|
||||
}
|
||||
else
|
||||
{
|
||||
mVoiceType = VC_AD_HOC_CHAT;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
llwarning("Failed to determine voice call IM type", 0);
|
||||
mVoiceType = VC_GROUP_CHAT;
|
||||
break;
|
||||
}
|
||||
|
|
@ -188,6 +241,7 @@ void LLCallFloater::updateSession()
|
|||
childSetVisible("leave_btn_panel", !is_local_chat);
|
||||
|
||||
refreshPartisipantList();
|
||||
updateModeratorState();
|
||||
}
|
||||
|
||||
void LLCallFloater::refreshPartisipantList()
|
||||
|
|
@ -220,11 +274,20 @@ void LLCallFloater::refreshPartisipantList()
|
|||
{
|
||||
mAvatarList->setNoItemsCommentText(getString("no_one_near"));
|
||||
}
|
||||
mPaticipants->refreshVoiceState();
|
||||
}
|
||||
}
|
||||
|
||||
void LLCallFloater::onCurrentChannelChanged(const LLUUID& /*session_id*/)
|
||||
{
|
||||
// Don't update participant list if no channel info is available.
|
||||
// Fix for ticket EXT-3427
|
||||
// @see LLParticipantList::~LLParticipantList()
|
||||
if(LLVoiceChannel::getCurrentVoiceChannel() &&
|
||||
LLVoiceChannel::STATE_NO_CHANNEL_INFO == LLVoiceChannel::getCurrentVoiceChannel()->getState())
|
||||
{
|
||||
return;
|
||||
}
|
||||
// Forget speaker manager from the previous session to avoid using it after session was destroyed.
|
||||
mSpeakerManager = NULL;
|
||||
updateSession();
|
||||
|
|
@ -263,13 +326,52 @@ void LLCallFloater::updateTitle()
|
|||
|
||||
void LLCallFloater::initAgentData()
|
||||
{
|
||||
childSetValue("user_icon", gAgentID);
|
||||
mAgentPanel = getChild<LLPanel> ("my_panel");
|
||||
|
||||
if ( mAgentPanel )
|
||||
{
|
||||
mAgentPanel->childSetValue("user_icon", gAgentID);
|
||||
|
||||
std::string name;
|
||||
gCacheName->getFullName(gAgentID, name);
|
||||
mAgentPanel->childSetValue("user_text", name);
|
||||
|
||||
mSpeakingIndicator = mAgentPanel->getChild<LLOutputMonitorCtrl>("speaking_indicator");
|
||||
mSpeakingIndicator->setSpeakerId(gAgentID);
|
||||
}
|
||||
}
|
||||
|
||||
void LLCallFloater::setModeratorMutedVoice(bool moderator_muted)
|
||||
{
|
||||
mIsModeratorMutedVoice = moderator_muted;
|
||||
|
||||
if (moderator_muted)
|
||||
{
|
||||
LLNotificationsUtil::add("VoiceIsMutedByModerator");
|
||||
}
|
||||
mSpeakingIndicator->setIsMuted(moderator_muted);
|
||||
}
|
||||
|
||||
void LLCallFloater::updateModeratorState()
|
||||
{
|
||||
std::string name;
|
||||
gCacheName->getFullName(gAgentID, name);
|
||||
childSetValue("user_text", name);
|
||||
|
||||
LLOutputMonitorCtrl* speaking_indicator = getChild<LLOutputMonitorCtrl>("speaking_indicator");
|
||||
speaking_indicator->setSpeakerId(gAgentID);
|
||||
if(gAgent.isInGroup(mSpeakerManager->getSessionID()))
|
||||
{
|
||||
// This method can be called when LLVoiceChannel.mState == STATE_NO_CHANNEL_INFO
|
||||
// in this case there are no any speakers yet.
|
||||
if (mSpeakerManager->findSpeaker(gAgentID))
|
||||
{
|
||||
// Agent is Moderator
|
||||
if (mSpeakerManager->findSpeaker(gAgentID)->mIsModerator)
|
||||
|
||||
{
|
||||
const std::string moderator_indicator(LLTrans::getString("IM_moderator_label"));
|
||||
name += " " + moderator_indicator;
|
||||
}
|
||||
}
|
||||
}
|
||||
mAgentPanel->childSetValue("user_text", name);
|
||||
}
|
||||
//EOF
|
||||
|
|
|
|||
|
|
@ -35,12 +35,13 @@
|
|||
#define LL_LLCALLFLOATER_H
|
||||
|
||||
#include "lldockablefloater.h"
|
||||
#include "llvoiceclient.h"
|
||||
|
||||
class LLAvatarList;
|
||||
class LLNonAvatarCaller;
|
||||
class LLOutputMonitorCtrl;
|
||||
class LLParticipantList;
|
||||
class LLSpeakerMgr;
|
||||
|
||||
/**
|
||||
* The Voice Control Panel is an ambient window summoned by clicking the flyout chevron on the Speak button.
|
||||
* It can be torn-off and freely positioned onscreen.
|
||||
|
|
@ -52,7 +53,7 @@ class LLSpeakerMgr;
|
|||
* When the Resident is engaged in any chat except Nearby Chat, the Voice Control Panel also provides an
|
||||
* 'Leave Call' button to allow the Resident to leave that voice channel.
|
||||
*/
|
||||
class LLCallFloater : public LLDockableFloater
|
||||
class LLCallFloater : public LLDockableFloater, LLVoiceClientParticipantObserver
|
||||
{
|
||||
public:
|
||||
LLCallFloater(const LLSD& key);
|
||||
|
|
@ -60,6 +61,14 @@ public:
|
|||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
/*virtual*/ void onOpen(const LLSD& key);
|
||||
/*virtual*/ void draw();
|
||||
|
||||
/**
|
||||
* Is called by LLVoiceClient::notifyParticipantObservers when voice participant list is changed.
|
||||
*
|
||||
* Refreshes list to display participants not in voice as disabled.
|
||||
*/
|
||||
/*virtual*/ void onChange();
|
||||
|
||||
private:
|
||||
typedef enum e_voice_controls_type
|
||||
|
|
@ -87,6 +96,8 @@ private:
|
|||
void onCurrentChannelChanged(const LLUUID& session_id);
|
||||
void updateTitle();
|
||||
void initAgentData();
|
||||
void setModeratorMutedVoice(bool moderator_muted);
|
||||
void updateModeratorState();
|
||||
|
||||
private:
|
||||
LLSpeakerMgr* mSpeakerManager;
|
||||
|
|
@ -94,6 +105,9 @@ private:
|
|||
LLAvatarList* mAvatarList;
|
||||
LLNonAvatarCaller* mNonAvatarCaller;
|
||||
EVoiceControls mVoiceType;
|
||||
LLPanel* mAgentPanel;
|
||||
LLOutputMonitorCtrl* mSpeakingIndicator;
|
||||
bool mIsModeratorMutedVoice;
|
||||
|
||||
boost::signals2::connection mChannelChangedConnection;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -55,7 +55,6 @@
|
|||
#include "llinventorymodel.h"
|
||||
#include "llnotifications.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llnotify.h"
|
||||
#include "llresmgr.h"
|
||||
#include "llimview.h"
|
||||
#include "llviewercontrol.h"
|
||||
|
|
|
|||
|
|
@ -228,3 +228,14 @@ void LLChannelManager::muteAllChannels(bool mute)
|
|||
}
|
||||
}
|
||||
|
||||
void LLChannelManager::killToastsFromChannel(const LLUUID& channel_id, const LLScreenChannel::Matcher& matcher)
|
||||
{
|
||||
LLScreenChannel
|
||||
* screen_channel =
|
||||
dynamic_cast<LLScreenChannel*> (findChannelByID(channel_id));
|
||||
if (screen_channel != NULL)
|
||||
{
|
||||
screen_channel->killMatchedToasts(matcher);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -109,6 +109,11 @@ public:
|
|||
*/
|
||||
void muteAllChannels(bool mute);
|
||||
|
||||
/**
|
||||
* Kills matched toasts from specified toast screen channel.
|
||||
*/
|
||||
void killToastsFromChannel(const LLUUID& channel_id, const LLScreenChannel::Matcher& matcher);
|
||||
|
||||
private:
|
||||
|
||||
LLScreenChannel* createChannel(LLChannelManager::Params& p);
|
||||
|
|
|
|||
|
|
@ -49,6 +49,8 @@
|
|||
|
||||
static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history");
|
||||
|
||||
const static std::string NEW_LINE(rawstr_to_utf8("\n"));
|
||||
|
||||
class LLChatHistoryHeader: public LLPanel
|
||||
{
|
||||
public:
|
||||
|
|
@ -454,10 +456,21 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
|
|||
|
||||
if (chat.mFromName.size() > 0)
|
||||
appendText(chat.mFromName + " ", TRUE, style_params);
|
||||
appendText(chat.mText.substr(4), FALSE, style_params);
|
||||
// Ensure that message ends with NewLine, to avoid losing of new lines
|
||||
// while copy/paste from text chat. See EXT-3263.
|
||||
appendText(chat.mText.substr(4) + NEW_LINE, FALSE, style_params);
|
||||
}
|
||||
else
|
||||
appendText(chat.mText, FALSE, style_params);
|
||||
{
|
||||
std::string message(chat.mText);
|
||||
if ( message.size() > 0 && !LLStringOps::isSpace(message[message.size() - 1]) )
|
||||
{
|
||||
// Ensure that message ends with NewLine, to avoid losing of new lines
|
||||
// while copy/paste from text chat. See EXT-3263.
|
||||
message += NEW_LINE;
|
||||
}
|
||||
appendText(message, FALSE, style_params);
|
||||
}
|
||||
blockUndo();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@
|
|||
#include "llgroupmgr.h"
|
||||
#include "llnotificationmanager.h"
|
||||
#include "lltransientfloatermgr.h"
|
||||
#include "llsyswellwindow.h"
|
||||
|
||||
static LLDefaultChildRegistry::Register<LLChicletPanel> t1("chiclet_panel");
|
||||
static LLDefaultChildRegistry::Register<LLIMWellChiclet> t2_0("chiclet_im_well");
|
||||
|
|
@ -88,6 +89,14 @@ class LLSysWellChiclet::FlashToLitTimer : public LLEventTimer
|
|||
{
|
||||
public:
|
||||
typedef boost::function<void()> callback_t;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param count - how many times callback should be called (twice to not change original state)
|
||||
* @param period - how frequently callback should be called
|
||||
* @param cb - callback to be called each tick
|
||||
*/
|
||||
FlashToLitTimer(S32 count, F32 period, callback_t cb)
|
||||
: LLEventTimer(period)
|
||||
, mCallback(cb)
|
||||
|
|
@ -111,8 +120,17 @@ public:
|
|||
mEventTimer.start();
|
||||
}
|
||||
|
||||
void stopFlashing()
|
||||
{
|
||||
mEventTimer.stop();
|
||||
}
|
||||
|
||||
private:
|
||||
callback_t mCallback;
|
||||
|
||||
/**
|
||||
* How many times Well will blink.
|
||||
*/
|
||||
S32 mFlashCount;
|
||||
S32 mCurrentFlashCount;
|
||||
};
|
||||
|
|
@ -134,6 +152,7 @@ LLSysWellChiclet::LLSysWellChiclet(const Params& p)
|
|||
, mButton(NULL)
|
||||
, mCounter(0)
|
||||
, mMaxDisplayedCount(p.max_displayed_count)
|
||||
, mIsNewMessagesState(false)
|
||||
, mFlashToLitTimer(NULL)
|
||||
{
|
||||
LLButton::Params button_params = p.button;
|
||||
|
|
@ -163,20 +182,20 @@ void LLSysWellChiclet::setCounter(S32 counter)
|
|||
|
||||
mButton->setLabel(s_count);
|
||||
|
||||
/*
|
||||
Emulate 4 states of button by background images, see detains in EXT-3147
|
||||
xml attribute Description
|
||||
image_unselected "Unlit" - there are no new messages
|
||||
image_selected "Unlit" + "Selected" - there are no new messages and the Well is open
|
||||
image_pressed "Lit" - there are new messages
|
||||
image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open
|
||||
*/
|
||||
mButton->setForcePressedState(counter > 0);
|
||||
setNewMessagesState(counter > 0);
|
||||
|
||||
if (mCounter == 0 && counter > 0)
|
||||
// we have to flash to 'Lit' state each time new unread message is comming.
|
||||
if (counter > mCounter)
|
||||
{
|
||||
mFlashToLitTimer->flash();
|
||||
}
|
||||
else if (counter == 0)
|
||||
{
|
||||
// if notification is resolved while well is flashing it can leave in the 'Lit' state
|
||||
// when flashing finishes itself. Let break flashing here.
|
||||
mFlashToLitTimer->stopFlashing();
|
||||
}
|
||||
|
||||
mCounter = counter;
|
||||
}
|
||||
|
||||
|
|
@ -192,11 +211,22 @@ void LLSysWellChiclet::setToggleState(BOOL toggled) {
|
|||
|
||||
void LLSysWellChiclet::changeLitState()
|
||||
{
|
||||
static bool set_lit = false;
|
||||
setNewMessagesState(!mIsNewMessagesState);
|
||||
}
|
||||
|
||||
mButton->setForcePressedState(set_lit);
|
||||
void LLSysWellChiclet::setNewMessagesState(bool new_messages)
|
||||
{
|
||||
/*
|
||||
Emulate 4 states of button by background images, see detains in EXT-3147
|
||||
xml attribute Description
|
||||
image_unselected "Unlit" - there are no new messages
|
||||
image_selected "Unlit" + "Selected" - there are no new messages and the Well is open
|
||||
image_pressed "Lit" - there are new messages
|
||||
image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open
|
||||
*/
|
||||
mButton->setForcePressedState(new_messages);
|
||||
|
||||
set_lit ^= true;
|
||||
mIsNewMessagesState = new_messages;
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
|
|
@ -209,6 +239,8 @@ LLIMWellChiclet::LLIMWellChiclet(const Params& p)
|
|||
LLIMModel::instance().addNoUnreadMsgsCallback(boost::bind(&LLIMWellChiclet::messageCountChanged, this, _1));
|
||||
|
||||
LLIMMgr::getInstance()->addSessionObserver(this);
|
||||
|
||||
LLIMWellWindow::getInstance()->setSysWellChiclet(this);
|
||||
}
|
||||
|
||||
LLIMWellChiclet::~LLIMWellChiclet()
|
||||
|
|
@ -233,6 +265,10 @@ LLNotificationChiclet::LLNotificationChiclet(const Params& p)
|
|||
connectCounterUpdatersToSignal("notify");
|
||||
connectCounterUpdatersToSignal("groupnotify");
|
||||
connectCounterUpdatersToSignal("offer");
|
||||
|
||||
// ensure that notification well window exists, to synchronously
|
||||
// handle toast add/delete events.
|
||||
LLNotificationWellWindow::getInstance()->setSysWellChiclet(this);
|
||||
}
|
||||
|
||||
void LLNotificationChiclet::connectCounterUpdatersToSignal(const std::string& notification_type)
|
||||
|
|
|
|||
|
|
@ -791,6 +791,8 @@ public:
|
|||
|
||||
void setToggleState(BOOL toggled);
|
||||
|
||||
void setNewMessagesState(bool new_messages);
|
||||
|
||||
protected:
|
||||
|
||||
LLSysWellChiclet(const Params& p);
|
||||
|
|
@ -809,11 +811,8 @@ protected:
|
|||
LLButton* mButton;
|
||||
S32 mCounter;
|
||||
S32 mMaxDisplayedCount;
|
||||
bool mIsNewMessagesState;
|
||||
|
||||
/**
|
||||
* How many times Well will blink.
|
||||
*/
|
||||
S32 mFlashToLitCount;
|
||||
FlashToLitTimer* mFlashToLitTimer;
|
||||
|
||||
};
|
||||
|
|
|
|||
|
|
@ -36,7 +36,6 @@
|
|||
|
||||
#include <list>
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llnotify.h"
|
||||
#include "llcallbacklist.h"
|
||||
#include "llinventory.h"
|
||||
#include "llviewerinventory.h"
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@
|
|||
#include "llnotificationsutil.h"
|
||||
#include "message.h"
|
||||
|
||||
#include "llnotify.h"
|
||||
#include "lleventinfo.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfloaterworldmap.h"
|
||||
|
|
|
|||
|
|
@ -64,11 +64,6 @@ extern "C" {
|
|||
#if LL_GTK
|
||||
# include "gtk/gtk.h"
|
||||
#endif // LL_GTK
|
||||
|
||||
// also mostly for Linux, for some X11-specific filepicker usability tweaks
|
||||
#if LL_X11
|
||||
#include "SDL/SDL_syswm.h"
|
||||
#endif
|
||||
}
|
||||
|
||||
class LLFilePicker
|
||||
|
|
|
|||
|
|
@ -40,7 +40,6 @@
|
|||
|
||||
// viewer includes
|
||||
#include "llagent.h" // for gAgent.inPrelude()
|
||||
#include "llnotify.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llui.h"
|
||||
#include "llappviewer.h"
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@
|
|||
#ifndef LL_LLFLOATERANIMPREVIEW_H
|
||||
#define LL_LLFLOATERANIMPREVIEW_H
|
||||
|
||||
#include "llassettype.h"
|
||||
#include "llfloaternamedesc.h"
|
||||
#include "lldynamictexture.h"
|
||||
#include "llcharacter.h"
|
||||
|
|
|
|||
|
|
@ -35,7 +35,6 @@
|
|||
#include "llfloaterauction.h"
|
||||
#include "llfloaterregioninfo.h"
|
||||
|
||||
#include "lldir.h"
|
||||
#include "llgl.h"
|
||||
#include "llimagej2c.h"
|
||||
#include "llimagetga.h"
|
||||
|
|
@ -43,12 +42,12 @@
|
|||
#include "llvfile.h"
|
||||
#include "llvfs.h"
|
||||
#include "llwindow.h"
|
||||
#include "message.h"
|
||||
|
||||
#include "llagent.h"
|
||||
#include "llcombobox.h"
|
||||
#include "llnotifications.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llnotify.h"
|
||||
#include "llsavedsettingsglue.h"
|
||||
#include "llviewertexturelist.h"
|
||||
#include "llviewerparcelmgr.h"
|
||||
|
|
|
|||
|
|
@ -33,11 +33,11 @@
|
|||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llfloaterbump.h"
|
||||
|
||||
#include "llscrolllistctrl.h"
|
||||
|
||||
#include "llsd.h"
|
||||
#include "mean_collision_data.h"
|
||||
|
||||
#include "llfloaterbump.h"
|
||||
#include "llscrolllistctrl.h"
|
||||
#include "lluictrlfactory.h"
|
||||
#include "llviewermessage.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -41,7 +41,6 @@
|
|||
#include "llfloaterbuy.h"
|
||||
|
||||
#include "llagent.h" // for agent id
|
||||
#include "llalertdialog.h"
|
||||
#include "llinventorymodel.h" // for gInventory
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfloaterinventory.h" // for get_item_icon
|
||||
|
|
|
|||
|
|
@ -43,7 +43,6 @@
|
|||
#include "llcachename.h"
|
||||
|
||||
#include "llagent.h" // for agent id
|
||||
#include "llalertdialog.h"
|
||||
#include "llcheckboxctrl.h"
|
||||
#include "llinventoryfunctions.h"
|
||||
#include "llinventorymodel.h" // for gInventory
|
||||
|
|
|
|||
|
|
@ -49,7 +49,6 @@
|
|||
#include "lliconctrl.h"
|
||||
#include "lllineeditor.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llnotify.h"
|
||||
#include "llparcel.h"
|
||||
#include "llslurl.h"
|
||||
#include "llstatusbar.h"
|
||||
|
|
|
|||
|
|
@ -50,7 +50,6 @@
|
|||
#include "llinventorymodel.h"
|
||||
#include "llnamelistctrl.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llnotify.h"
|
||||
#include "llresmgr.h"
|
||||
#include "llscrolllistctrl.h"
|
||||
#include "llscrolllistitem.h"
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@
|
|||
#include "message.h"
|
||||
|
||||
#include "llagent.h"
|
||||
#include "llalertdialog.h"
|
||||
#include "llbutton.h"
|
||||
#include "llcheckboxctrl.h"
|
||||
#include "llcombobox.h"
|
||||
|
|
@ -69,7 +68,6 @@
|
|||
#include "llviewerwindow.h"
|
||||
#include "llworld.h"
|
||||
#include "llfloateravatarpicker.h"
|
||||
#include "llnotify.h"
|
||||
#include "llxfermanager.h"
|
||||
#include "llvlcomposition.h"
|
||||
#include "llsurface.h"
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@
|
|||
// Viewer libs
|
||||
#include "llviewercontrol.h"
|
||||
#include "llmediactrl.h"
|
||||
#include "llalertdialog.h"
|
||||
|
||||
// Linden libs
|
||||
#include "llnotificationsutil.h"
|
||||
|
|
|
|||
|
|
@ -55,7 +55,6 @@
|
|||
#include "llavataractions.h"
|
||||
#include "lllineeditor.h"
|
||||
#include "llnamelistctrl.h"
|
||||
#include "llnotify.h"
|
||||
#include "llpanellandaudio.h"
|
||||
#include "llpanellandmedia.h"
|
||||
#include "llradiogroup.h"
|
||||
|
|
|
|||
|
|
@ -44,7 +44,6 @@
|
|||
#include "llnotificationsutil.h"
|
||||
#include "lltextbox.h"
|
||||
|
||||
#include "llalertdialog.h"
|
||||
#include "llinventorybridge.h"
|
||||
#include "llfloaterinventory.h"
|
||||
#include "llinventorymodel.h"
|
||||
|
|
|
|||
|
|
@ -32,7 +32,6 @@
|
|||
*/
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
#include "llalertdialog.h"
|
||||
#include "llcheckboxctrl.h"
|
||||
#include "llfloaterperms.h"
|
||||
#include "llviewercontrol.h"
|
||||
|
|
|
|||
|
|
@ -56,9 +56,8 @@
|
|||
#include "llstatusbar.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "lleconomy.h"
|
||||
#include "message.h"
|
||||
|
||||
#include "llgl.h"
|
||||
#include "llglheaders.h"
|
||||
#include "llimagejpeg.h"
|
||||
#include "llimagej2c.h"
|
||||
#include "llvfile.h"
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ public:
|
|||
|
||||
void sendPostcard();
|
||||
|
||||
protected:
|
||||
private:
|
||||
|
||||
LLPointer<LLImageJPEG> mJPEGImage;
|
||||
LLPointer<LLViewerTexture> mViewerImage;
|
||||
|
|
@ -78,7 +78,7 @@ protected:
|
|||
LLAssetID mAssetID;
|
||||
LLVector2 mImageScale;
|
||||
LLVector3d mPosTakenGlobal;
|
||||
boolean mHasFirstMsgFocus;
|
||||
bool mHasFirstMsgFocus;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -588,6 +588,9 @@ void LLFloaterPreference::onOpen(const LLSD& key)
|
|||
// when the floater is opened. That will make cancel do its
|
||||
// job
|
||||
saveSettings();
|
||||
|
||||
// This is a "fresh" floater, closing floater shoud cancel any changes
|
||||
mCancelOnClose = true;
|
||||
}
|
||||
|
||||
void LLFloaterPreference::onVertexShaderEnable()
|
||||
|
|
@ -633,7 +636,11 @@ void LLFloaterPreference::onBtnOK()
|
|||
// that prevents cancel from undoing our changes when we hit OK
|
||||
mCancelOnClose = false;
|
||||
closeFloater(false);
|
||||
mCancelOnClose = true;
|
||||
|
||||
// closeFloater() will be called when viewer is quitting, leaving mCancelOnClose = true;
|
||||
// will cancel all changes we saved here, don't let this happen.
|
||||
// Fix for EXT-3465
|
||||
|
||||
gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
|
||||
LLUIColorTable::instance().saveUserSettings();
|
||||
std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
|
||||
|
|
|
|||
|
|
@ -42,18 +42,18 @@
|
|||
#include "llglheaders.h"
|
||||
#include "llregionflags.h"
|
||||
#include "llstl.h"
|
||||
#include "llvfile.h"
|
||||
#include "llxfermanager.h"
|
||||
#include "indra_constants.h"
|
||||
#include "message.h"
|
||||
|
||||
#include "llagent.h"
|
||||
#include "llalertdialog.h"
|
||||
#include "llappviewer.h"
|
||||
#include "llfloateravatarpicker.h"
|
||||
#include "llbutton.h"
|
||||
#include "llcheckboxctrl.h"
|
||||
#include "llcombobox.h"
|
||||
#include "llfilepicker.h"
|
||||
#include "llfloaterdaycycle.h"
|
||||
#include "llfloatergodtools.h" // for send_sim_wide_deletes()
|
||||
#include "llfloatertopobjects.h" // added to fix SL-32336
|
||||
#include "llfloatergroups.h"
|
||||
|
|
@ -62,7 +62,6 @@
|
|||
#include "llfloaterwindlight.h"
|
||||
#include "llinventorymodel.h"
|
||||
#include "lllineeditor.h"
|
||||
#include "llalertdialog.h"
|
||||
#include "llnamelistctrl.h"
|
||||
#include "llnotifications.h"
|
||||
#include "llnotificationsutil.h"
|
||||
|
|
|
|||
|
|
@ -35,9 +35,12 @@
|
|||
#define LL_LLFLOATERREGIONINFO_H
|
||||
|
||||
#include <vector>
|
||||
#include "llassettype.h"
|
||||
#include "llfloater.h"
|
||||
#include "llhost.h"
|
||||
#include "llpanel.h"
|
||||
|
||||
class LLDispatcher;
|
||||
class LLLineEditor;
|
||||
class LLMessageSystem;
|
||||
class LLPanelRegionInfo;
|
||||
|
|
@ -51,6 +54,7 @@ class LLNameListCtrl;
|
|||
class LLSliderCtrl;
|
||||
class LLSpinCtrl;
|
||||
class LLTextBox;
|
||||
class LLVFS;
|
||||
|
||||
class LLPanelRegionGeneralInfo;
|
||||
class LLPanelRegionDebugInfo;
|
||||
|
|
|
|||
|
|
@ -40,11 +40,14 @@
|
|||
// linden library includes
|
||||
#include "llassetstorage.h"
|
||||
#include "llfontgl.h"
|
||||
#include "llgl.h" // for renderer
|
||||
#include "llimagej2c.h"
|
||||
#include "llinventory.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llstring.h"
|
||||
#include "llsys.h"
|
||||
#include "llvfile.h"
|
||||
#include "llvfs.h"
|
||||
#include "mean_collision_data.h"
|
||||
#include "message.h"
|
||||
#include "v3math.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -38,6 +38,8 @@
|
|||
#include "lluri.h"
|
||||
#include "llagent.h"
|
||||
#include "llui.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llweb.h"
|
||||
|
||||
LLFloaterSearch::LLFloaterSearch(const LLSD& key) :
|
||||
LLFloater(key),
|
||||
|
|
@ -65,7 +67,6 @@ BOOL LLFloaterSearch::postBuild()
|
|||
{
|
||||
mBrowser->addObserver(this);
|
||||
mBrowser->setTrusted(true);
|
||||
mBrowser->setHomePageUrl(getString("search_url"));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
|
@ -113,33 +114,32 @@ void LLFloaterSearch::search(const LLSD &key)
|
|||
childHide("refresh_search");
|
||||
mSearchGodLevel = gAgent.getGodLevel();
|
||||
|
||||
// get the URL for the search page
|
||||
std::string url = getString("search_url");
|
||||
if (! LLStringUtil::endsWith(url, "/"))
|
||||
{
|
||||
url += "/";
|
||||
}
|
||||
|
||||
// work out the subdir to use based on the requested category
|
||||
LLSD subs;
|
||||
std::string category = key.has("category") ? key["category"].asString() : "";
|
||||
if (mCategoryPaths.has(category))
|
||||
{
|
||||
url += mCategoryPaths[category].asString();
|
||||
subs["CATEGORY"] = mCategoryPaths[category].asString();
|
||||
}
|
||||
else
|
||||
{
|
||||
url += mCategoryPaths["all"].asString();
|
||||
subs["CATEGORY"] = mCategoryPaths["all"].asString();
|
||||
}
|
||||
|
||||
// append the search query string
|
||||
// add the search query string
|
||||
std::string search_text = key.has("id") ? key["id"].asString() : "";
|
||||
url += std::string("?q=") + LLURI::escape(search_text);
|
||||
subs["QUERY"] = LLURI::escape(search_text);
|
||||
|
||||
// append the permissions token that login.cgi gave us
|
||||
// add the permissions token that login.cgi gave us
|
||||
// We use "search_token", and fallback to "auth_token" if not present.
|
||||
LLSD search_token = LLLoginInstance::getInstance()->getResponse("search_token");
|
||||
url += "&p=" + search_token.asString();
|
||||
if (search_token.asString().empty())
|
||||
{
|
||||
search_token = LLLoginInstance::getInstance()->getResponse("auth_token");
|
||||
}
|
||||
subs["AUTH_TOKEN"] = search_token.asString();
|
||||
|
||||
// also append the user's preferred maturity (can be changed via prefs)
|
||||
// add the user's preferred maturity (can be changed via prefs)
|
||||
std::string maturity;
|
||||
if (gAgent.prefersAdult())
|
||||
{
|
||||
|
|
@ -153,14 +153,15 @@ void LLFloaterSearch::search(const LLSD &key)
|
|||
{
|
||||
maturity = "13"; // PG
|
||||
}
|
||||
url += "&r=" + maturity;
|
||||
|
||||
// add the current localization information
|
||||
url += "&lang=" + LLUI::getLanguage();
|
||||
subs["MATURITY"] = maturity;
|
||||
|
||||
// add the user's god status
|
||||
std::string godlike = gAgent.isGodlike() ? "1" : "0";
|
||||
url += "&g=" + godlike;
|
||||
subs["GODLIKE"] = gAgent.isGodlike() ? "1" : "0";
|
||||
|
||||
// get the search URL and expand all of the substitutions
|
||||
// (also adds things like [LANGUAGE], [VERSION], [OS], etc.)
|
||||
std::string url = gSavedSettings.getString("SearchURL");
|
||||
url = LLWeb::expandURLSubstitutions(url, subs);
|
||||
|
||||
// and load the URL in the web view
|
||||
mBrowser->navigateTo(url);
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@
|
|||
#include "lllineeditor.h"
|
||||
#include "llnotifications.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llnotify.h"
|
||||
#include "llparcel.h"
|
||||
#include "llselectmgr.h"
|
||||
#include "lltexturectrl.h"
|
||||
|
|
|
|||
|
|
@ -84,17 +84,6 @@ void LLFloaterTelehub::onOpen(const LLSD& key)
|
|||
LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
|
||||
LLToolMgr::getInstance()->getCurrentToolset()->selectTool( LLToolCompTranslate::getInstance() );
|
||||
|
||||
// Find tools floater, glue to bottom
|
||||
if (gFloaterTools)
|
||||
{
|
||||
LLRect tools_rect = gFloaterTools->getRect();
|
||||
S32 our_width = getRect().getWidth();
|
||||
S32 our_height = getRect().getHeight();
|
||||
LLRect our_rect;
|
||||
our_rect.setLeftTopAndSize(tools_rect.mLeft, tools_rect.mBottom, our_width, our_height);
|
||||
setRect(our_rect);
|
||||
}
|
||||
|
||||
sendTelehubInfoRequest();
|
||||
|
||||
mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
|
||||
|
|
|
|||
|
|
@ -33,13 +33,14 @@
|
|||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llregionhandle.h"
|
||||
#include "v3dmath.h"
|
||||
|
||||
#include "llfloaterurldisplay.h"
|
||||
|
||||
#include "llpanelplace.h"
|
||||
#include "lluictrlfactory.h"
|
||||
|
||||
#include "v3dmath.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// LLFloaterURLDisplay
|
||||
|
||||
|
|
|
|||
|
|
@ -32,6 +32,8 @@
|
|||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llhttpclient.h"
|
||||
|
||||
#include "llfloaterurlentry.h"
|
||||
|
||||
#include "llpanellandmedia.h"
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@
|
|||
#include "llcombobox.h"
|
||||
#include "llfocusmgr.h"
|
||||
#include "lliconctrl.h"
|
||||
#include "llsliderctrl.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llvoiceclient.h"
|
||||
#include "llvoicechannel.h"
|
||||
|
|
@ -60,6 +61,9 @@ LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings()
|
|||
mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
|
||||
mDevicesUpdated = FALSE;
|
||||
|
||||
// grab "live" mic volume level
|
||||
mMicVolume = gSavedSettings.getF32("AudioLevelMic");
|
||||
|
||||
// ask for new device enumeration
|
||||
// now do this in onOpen() instead...
|
||||
//gVoiceClient->refreshDeviceLists();
|
||||
|
|
@ -71,6 +75,10 @@ LLPanelVoiceDeviceSettings::~LLPanelVoiceDeviceSettings()
|
|||
|
||||
BOOL LLPanelVoiceDeviceSettings::postBuild()
|
||||
{
|
||||
LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
|
||||
// set mic volume tuning slider based on last mic volume setting
|
||||
volume_slider->setValue(mMicVolume);
|
||||
|
||||
childSetCommitCallback("voice_input_device", onCommitInputDevice, this);
|
||||
childSetCommitCallback("voice_output_device", onCommitOutputDevice, this);
|
||||
|
||||
|
|
@ -149,6 +157,15 @@ void LLPanelVoiceDeviceSettings::apply()
|
|||
gSavedSettings.setString("VoiceOutputAudioDevice", s);
|
||||
mOutputDevice = s;
|
||||
}
|
||||
|
||||
// assume we are being destroyed by closing our embedding window
|
||||
LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
|
||||
if(volume_slider)
|
||||
{
|
||||
F32 slider_value = (F32)volume_slider->getValue().asReal();
|
||||
gSavedSettings.setF32("AudioLevelMic", slider_value);
|
||||
mMicVolume = slider_value;
|
||||
}
|
||||
}
|
||||
|
||||
void LLPanelVoiceDeviceSettings::cancel()
|
||||
|
|
@ -161,12 +178,22 @@ void LLPanelVoiceDeviceSettings::cancel()
|
|||
|
||||
if(mCtrlOutputDevices)
|
||||
mCtrlOutputDevices->setSimple(mOutputDevice);
|
||||
|
||||
gSavedSettings.setF32("AudioLevelMic", mMicVolume);
|
||||
LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
|
||||
if(volume_slider)
|
||||
{
|
||||
volume_slider->setValue(mMicVolume);
|
||||
}
|
||||
}
|
||||
|
||||
void LLPanelVoiceDeviceSettings::refresh()
|
||||
{
|
||||
// update the live input level display
|
||||
gVoiceClient->tuningSetMicVolume();
|
||||
//grab current volume
|
||||
LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
|
||||
// set mic volume tuning slider based on last mic volume setting
|
||||
F32 current_volume = (F32)volume_slider->getValue().asReal();
|
||||
gVoiceClient->tuningSetMicVolume(current_volume);
|
||||
|
||||
// Fill in popup menus
|
||||
mCtrlInputDevices = getChild<LLComboBox>("voice_input_device");
|
||||
|
|
@ -236,6 +263,7 @@ void LLPanelVoiceDeviceSettings::initialize()
|
|||
{
|
||||
mInputDevice = gSavedSettings.getString("VoiceInputAudioDevice");
|
||||
mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
|
||||
mMicVolume = gSavedSettings.getF32("AudioLevelMic");
|
||||
mDevicesUpdated = FALSE;
|
||||
|
||||
// ask for new device enumeration
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@ protected:
|
|||
static void onCommitInputDevice(LLUICtrl* ctrl, void* user_data);
|
||||
static void onCommitOutputDevice(LLUICtrl* ctrl, void* user_data);
|
||||
|
||||
F32 mMicVolume;
|
||||
std::string mInputDevice;
|
||||
std::string mOutputDevice;
|
||||
class LLComboBox *mCtrlInputDevices;
|
||||
|
|
|
|||
|
|
@ -74,8 +74,8 @@
|
|||
#include "llmapimagetype.h"
|
||||
#include "llweb.h"
|
||||
#include "llslider.h"
|
||||
#include "message.h"
|
||||
|
||||
#include "llglheaders.h"
|
||||
#include "llwindow.h" // copyTextToClipboard()
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -1939,6 +1939,26 @@ LLFolderViewItem* LLFolderView::getItemByID(const LLUUID& id)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
LLFolderViewFolder* LLFolderView::getFolderByID(const LLUUID& id)
|
||||
{
|
||||
if (id.isNull())
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
for (folders_t::iterator iter = mFolders.begin();
|
||||
iter != mFolders.end();
|
||||
++iter)
|
||||
{
|
||||
LLFolderViewFolder *folder = (*iter);
|
||||
if (folder->getListener()->getUUID() == id)
|
||||
{
|
||||
return folder;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool LLFolderView::doToSelected(LLInventoryModel* model, const LLSD& userdata)
|
||||
{
|
||||
std::string action = userdata.asString();
|
||||
|
|
|
|||
|
|
@ -248,6 +248,7 @@ public:
|
|||
void addItemID(const LLUUID& id, LLFolderViewItem* itemp);
|
||||
void removeItemID(const LLUUID& id);
|
||||
LLFolderViewItem* getItemByID(const LLUUID& id);
|
||||
LLFolderViewFolder* getFolderByID(const LLUUID& id);
|
||||
|
||||
bool doToSelected(LLInventoryModel* model, const LLSD& userdata);
|
||||
|
||||
|
|
|
|||
|
|
@ -52,7 +52,6 @@
|
|||
#include "llagent.h"
|
||||
#include "lldelayedgestureerror.h"
|
||||
#include "llinventorymodel.h"
|
||||
#include "llnotify.h"
|
||||
#include "llviewermessage.h"
|
||||
#include "llvoavatarself.h"
|
||||
#include "llviewerstats.h"
|
||||
|
|
|
|||
|
|
@ -35,6 +35,8 @@
|
|||
|
||||
#include "llgroupactions.h"
|
||||
|
||||
#include "message.h"
|
||||
|
||||
#include "llagent.h"
|
||||
#include "llcommandhandler.h"
|
||||
#include "llfloaterreg.h"
|
||||
|
|
@ -197,12 +199,12 @@ void LLGroupActions::activate(const LLUUID& group_id)
|
|||
gAgent.sendReliableMessage();
|
||||
}
|
||||
|
||||
bool isGroupUIVisible()
|
||||
static bool isGroupUIVisible()
|
||||
{
|
||||
LLPanel* panel = LLSideTray::getInstance()->findChild<LLPanel>("panel_group_info_sidetray");
|
||||
if(!panel)
|
||||
return false;
|
||||
return panel->getVisible();
|
||||
return panel->isInVisibleChain();
|
||||
}
|
||||
|
||||
// static
|
||||
|
|
|
|||
|
|
@ -225,6 +225,11 @@ mGroupID(LLUUID::null)
|
|||
}
|
||||
}
|
||||
|
||||
LLGroupListItem::~LLGroupListItem()
|
||||
{
|
||||
LLGroupMgr::getInstance()->removeObserver(this);
|
||||
}
|
||||
|
||||
//virtual
|
||||
BOOL LLGroupListItem::postBuild()
|
||||
{
|
||||
|
|
@ -277,8 +282,13 @@ void LLGroupListItem::setName(const std::string& name, const std::string& highli
|
|||
|
||||
void LLGroupListItem::setGroupID(const LLUUID& group_id)
|
||||
{
|
||||
LLGroupMgr::getInstance()->removeObserver(this);
|
||||
|
||||
mID = group_id;
|
||||
mGroupID = group_id;
|
||||
setActive(group_id == gAgent.getGroupID());
|
||||
|
||||
LLGroupMgr::getInstance()->addObserver(this);
|
||||
}
|
||||
|
||||
void LLGroupListItem::setGroupIconID(const LLUUID& group_icon_id)
|
||||
|
|
@ -337,4 +347,11 @@ void LLGroupListItem::onProfileBtnClick()
|
|||
LLGroupActions::show(mGroupID);
|
||||
}
|
||||
|
||||
void LLGroupListItem::changed(LLGroupChange gc)
|
||||
{
|
||||
LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(mID);
|
||||
if(group_data)
|
||||
setGroupIconID(group_data->mInsigniaID);
|
||||
}
|
||||
|
||||
//EOF
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@
|
|||
#include "llpanel.h"
|
||||
#include "llpointer.h"
|
||||
#include "llstyle.h"
|
||||
#include "llgroupmgr.h"
|
||||
|
||||
/**
|
||||
* Auto-updating list of agent groups.
|
||||
|
|
@ -80,9 +81,11 @@ class LLIconCtrl;
|
|||
class LLTextBox;
|
||||
|
||||
class LLGroupListItem : public LLPanel
|
||||
, public LLGroupMgrObserver
|
||||
{
|
||||
public:
|
||||
LLGroupListItem();
|
||||
~LLGroupListItem();
|
||||
/*virtual*/ BOOL postBuild();
|
||||
/*virtual*/ void setValue(const LLSD& value);
|
||||
void onMouseEnter(S32 x, S32 y, MASK mask);
|
||||
|
|
@ -96,6 +99,7 @@ public:
|
|||
void setGroupIconID(const LLUUID& group_icon_id);
|
||||
void setGroupIconVisible(bool visible);
|
||||
|
||||
virtual void changed(LLGroupChange gc);
|
||||
private:
|
||||
void setActive(bool active);
|
||||
void onInfoBtnClick();
|
||||
|
|
|
|||
|
|
@ -758,7 +758,8 @@ void LLGroupMgr::clearGroupData(const LLUUID& group_id)
|
|||
|
||||
void LLGroupMgr::addObserver(LLGroupMgrObserver* observer)
|
||||
{
|
||||
mObservers.insert(std::pair<LLUUID, LLGroupMgrObserver*>(observer->getID(), observer));
|
||||
if( observer->getID() != LLUUID::null )
|
||||
mObservers.insert(std::pair<LLUUID, LLGroupMgrObserver*>(observer->getID(), observer));
|
||||
}
|
||||
|
||||
void LLGroupMgr::removeObserver(LLGroupMgrObserver* observer)
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@ class LLGroupMgrObserver
|
|||
{
|
||||
public:
|
||||
LLGroupMgrObserver(const LLUUID& id) : mID(id){};
|
||||
LLGroupMgrObserver() : mID(LLUUID::null){};
|
||||
virtual ~LLGroupMgrObserver(){};
|
||||
virtual void changed(LLGroupChange gc) = 0;
|
||||
const LLUUID& getID() { return mID; }
|
||||
|
|
|
|||
|
|
@ -469,7 +469,7 @@ bool LLIMFloater::toggle(const LLUUID& session_id)
|
|||
if(!isChatMultiTab())
|
||||
{
|
||||
LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
|
||||
if (floater && floater->getVisible() && floater->isDocked())
|
||||
if (floater && floater->getVisible())
|
||||
{
|
||||
// clicking on chiclet to close floater just hides it to maintain existing
|
||||
// scroll/text entry state
|
||||
|
|
@ -947,3 +947,20 @@ void LLIMFloater::initIMFloater()
|
|||
// init chat window type before user changed it in preferences
|
||||
isChatMultiTab();
|
||||
}
|
||||
|
||||
//static
|
||||
void LLIMFloater::sRemoveTypingIndicator(const LLSD& data)
|
||||
{
|
||||
LLUUID session_id = data["session_id"];
|
||||
if (session_id.isNull()) return;
|
||||
|
||||
LLUUID from_id = data["from_id"];
|
||||
if (gAgentID == from_id || LLUUID::null == from_id) return;
|
||||
|
||||
LLIMFloater* floater = LLIMFloater::findInstance(session_id);
|
||||
if (!floater) return;
|
||||
|
||||
if (IM_NOTHING_SPECIAL != floater->mDialog) return;
|
||||
|
||||
floater->removeTypingIndicator();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,9 +33,10 @@
|
|||
#ifndef LL_IMFLOATER_H
|
||||
#define LL_IMFLOATER_H
|
||||
|
||||
#include "lltransientdockablefloater.h"
|
||||
#include "llinstantmessage.h"
|
||||
#include "lllogchat.h"
|
||||
#include "lltooldraganddrop.h"
|
||||
#include "lltransientdockablefloater.h"
|
||||
|
||||
class LLLineEditor;
|
||||
class LLPanelChatControlPanel;
|
||||
|
|
@ -109,6 +110,9 @@ public:
|
|||
|
||||
static void initIMFloater();
|
||||
|
||||
//used as a callback on receiving new IM message
|
||||
static void sRemoveTypingIndicator(const LLSD& data);
|
||||
|
||||
private:
|
||||
// process focus events to set a currently active session
|
||||
/* virtual */ void onFocusLost();
|
||||
|
|
|
|||
|
|
@ -66,7 +66,6 @@
|
|||
#include "llimview.h" // for LLIMModel to get other avatar id in chat
|
||||
#include "llkeyboard.h"
|
||||
#include "lllineeditor.h"
|
||||
#include "llnotify.h"
|
||||
#include "llpanelimcontrolpanel.h"
|
||||
#include "llrecentpeople.h"
|
||||
#include "llresmgr.h"
|
||||
|
|
|
|||
|
|
@ -72,7 +72,6 @@
|
|||
#include "llviewerwindow.h"
|
||||
#include "llnotifications.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llnotify.h"
|
||||
#include "llnearbychat.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llvoicechannel.h"
|
||||
|
|
@ -154,7 +153,7 @@ LLIMModel::LLIMModel()
|
|||
addNewMsgCallback(toast_callback);
|
||||
}
|
||||
|
||||
LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
|
||||
LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice)
|
||||
: mSessionID(session_id),
|
||||
mName(name),
|
||||
mType(type),
|
||||
|
|
@ -168,24 +167,42 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
|
|||
mCallBackEnabled(true),
|
||||
mTextIMPossible(true),
|
||||
mOtherParticipantIsAvatar(true),
|
||||
mStartCallOnInitialize(false)
|
||||
mStartCallOnInitialize(false),
|
||||
mStartedAsIMCall(voice)
|
||||
{
|
||||
// set P2P type by default
|
||||
mSessionType = P2P_SESSION;
|
||||
|
||||
if (IM_NOTHING_SPECIAL == type || IM_SESSION_P2P_INVITE == type)
|
||||
{
|
||||
mVoiceChannel = new LLVoiceChannelP2P(session_id, name, other_participant_id);
|
||||
|
||||
// check if it was AVALINE call
|
||||
if (!mOtherParticipantIsAvatar)
|
||||
{
|
||||
mSessionType = AVALINE_SESSION;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mVoiceChannel = new LLVoiceChannelGroup(session_id, name);
|
||||
|
||||
// determine whether it is group or conference session
|
||||
if (gAgent.isInGroup(mSessionID))
|
||||
{
|
||||
mSessionType = GROUP_SESSION;
|
||||
}
|
||||
else
|
||||
{
|
||||
mSessionType = ADHOC_SESSION;
|
||||
}
|
||||
}
|
||||
|
||||
if(mVoiceChannel)
|
||||
{
|
||||
mVoiceChannelStateChangeConnection = mVoiceChannel->setStateChangedCallback(boost::bind(&LLIMSession::onVoiceChannelStateChanged, this, _1, _2));
|
||||
mVoiceChannelStateChangeConnection = mVoiceChannel->setStateChangedCallback(boost::bind(&LLIMSession::onVoiceChannelStateChanged, this, _1, _2, _3));
|
||||
}
|
||||
// define what type of session was opened
|
||||
setSessionType();
|
||||
|
||||
|
||||
mSpeakers = new LLIMSpeakerMgr(mVoiceChannel);
|
||||
|
||||
// All participants will be added to the list of people we've recently interacted with.
|
||||
|
|
@ -218,53 +235,27 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
|
|||
}
|
||||
}
|
||||
|
||||
void LLIMModel::LLIMSession::setSessionType()
|
||||
void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction)
|
||||
{
|
||||
// set P2P type by default
|
||||
mSessionType = P2P_SESSION;
|
||||
|
||||
if (dynamic_cast<LLVoiceChannelP2P*>(mVoiceChannel) && !mOtherParticipantIsAvatar) // P2P AVALINE channel was opened
|
||||
{
|
||||
mSessionType = AVALINE_SESSION;
|
||||
return;
|
||||
}
|
||||
else if(dynamic_cast<LLVoiceChannelGroup*>(mVoiceChannel)) // GROUP channel was opened
|
||||
{
|
||||
if (mType == IM_SESSION_CONFERENCE_START)
|
||||
{
|
||||
mSessionType = ADHOC_SESSION;
|
||||
return;
|
||||
}
|
||||
else if(mType == IM_SESSION_GROUP_START)
|
||||
{
|
||||
mSessionType = GROUP_SESSION;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
|
||||
{
|
||||
// *TODO: remove hardcoded string!!!!!!!!!!!
|
||||
|
||||
bool is_p2p_session = dynamic_cast<LLVoiceChannelP2P*>(mVoiceChannel);
|
||||
bool is_incoming_call = false;
|
||||
std::string other_avatar_name;
|
||||
|
||||
if(is_p2p_session)
|
||||
{
|
||||
is_incoming_call = static_cast<LLVoiceChannelP2P*>(mVoiceChannel)->isIncomingCall();
|
||||
gCacheName->getFullName(mOtherParticipantID, other_avatar_name);
|
||||
std::string you = LLTrans::getString("You");
|
||||
std::string started_call = LLTrans::getString("started_call");
|
||||
std::string joined_call = LLTrans::getString("joined_call");
|
||||
|
||||
if(is_incoming_call)
|
||||
if(direction == LLVoiceChannel::INCOMING_CALL)
|
||||
{
|
||||
switch(new_state)
|
||||
{
|
||||
case LLVoiceChannel::STATE_CALL_STARTED :
|
||||
LLIMModel::getInstance()->addMessage(mSessionID, other_avatar_name, mOtherParticipantID, "Started a voice call");
|
||||
LLIMModel::getInstance()->addMessageSilently(mSessionID, other_avatar_name, mOtherParticipantID, started_call);
|
||||
break;
|
||||
case LLVoiceChannel::STATE_CONNECTED :
|
||||
LLIMModel::getInstance()->addMessage(mSessionID, "You", gAgent.getID(), "Joined the voice call");
|
||||
LLIMModel::getInstance()->addMessageSilently(mSessionID, you, gAgent.getID(), joined_call);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -274,10 +265,10 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
|
|||
switch(new_state)
|
||||
{
|
||||
case LLVoiceChannel::STATE_CALL_STARTED :
|
||||
LLIMModel::getInstance()->addMessage(mSessionID, "You", gAgent.getID(), "Started a voice call");
|
||||
LLIMModel::getInstance()->addMessageSilently(mSessionID, you, gAgent.getID(), started_call);
|
||||
break;
|
||||
case LLVoiceChannel::STATE_CONNECTED :
|
||||
LLIMModel::getInstance()->addMessage(mSessionID, other_avatar_name, mOtherParticipantID, "Joined the voice call");
|
||||
LLIMModel::getInstance()->addMessageSilently(mSessionID, other_avatar_name, mOtherParticipantID, joined_call);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -463,7 +454,7 @@ void LLIMModel::testMessages()
|
|||
|
||||
//session name should not be empty
|
||||
bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type,
|
||||
const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
|
||||
const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice)
|
||||
{
|
||||
if (name.empty())
|
||||
{
|
||||
|
|
@ -477,7 +468,7 @@ bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, co
|
|||
return false;
|
||||
}
|
||||
|
||||
LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids);
|
||||
LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids, voice);
|
||||
mId2SessionMap[session_id] = session;
|
||||
|
||||
LLIMMgr::getInstance()->notifyObserverSessionAdded(session_id, name, other_participant_id);
|
||||
|
|
@ -486,6 +477,12 @@ bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, co
|
|||
|
||||
}
|
||||
|
||||
bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, bool voice)
|
||||
{
|
||||
std::vector<LLUUID> no_ids;
|
||||
return newSession(session_id, name, type, other_participant_id, no_ids, voice);
|
||||
}
|
||||
|
||||
bool LLIMModel::clearSession(const LLUUID& session_id)
|
||||
{
|
||||
if (mId2SessionMap.find(session_id) == mId2SessionMap.end()) return false;
|
||||
|
|
@ -585,25 +582,9 @@ bool LLIMModel::proccessOnlineOfflineNotification(
|
|||
|
||||
bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,
|
||||
const std::string& utf8_text, bool log2file /* = true */) {
|
||||
LLIMSession* session = findIMSession(session_id);
|
||||
|
||||
if (!session)
|
||||
{
|
||||
llwarns << "session " << session_id << "does not exist " << llendl;
|
||||
return false;
|
||||
}
|
||||
|
||||
addToHistory(session_id, from, from_id, utf8_text);
|
||||
if (log2file) logToFile(session_id, from, from_id, utf8_text);
|
||||
|
||||
session->mNumUnread++;
|
||||
|
||||
//update count of unread messages from real participant
|
||||
if (!(from_id.isNull() || from_id == gAgentID || SYSTEM_FROM == from))
|
||||
{
|
||||
++(session->mParticipantUnreadMessageCount);
|
||||
}
|
||||
|
||||
LLIMSession* session = addMessageSilently(session_id, from, from_id, utf8_text, log2file);
|
||||
if (!session) return false;
|
||||
|
||||
// notify listeners
|
||||
LLSD arg;
|
||||
|
|
@ -619,6 +600,31 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co
|
|||
return true;
|
||||
}
|
||||
|
||||
LLIMModel::LLIMSession* LLIMModel::addMessageSilently(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,
|
||||
const std::string& utf8_text, bool log2file /* = true */)
|
||||
{
|
||||
LLIMSession* session = findIMSession(session_id);
|
||||
|
||||
if (!session)
|
||||
{
|
||||
llwarns << "session " << session_id << "does not exist " << llendl;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
addToHistory(session_id, from, from_id, utf8_text);
|
||||
if (log2file) logToFile(session_id, from, from_id, utf8_text);
|
||||
|
||||
session->mNumUnread++;
|
||||
|
||||
//update count of unread messages from real participant
|
||||
if (!(from_id.isNull() || from_id == gAgentID || SYSTEM_FROM == from))
|
||||
{
|
||||
++(session->mParticipantUnreadMessageCount);
|
||||
}
|
||||
|
||||
return session;
|
||||
}
|
||||
|
||||
|
||||
const std::string& LLIMModel::getName(const LLUUID& session_id) const
|
||||
{
|
||||
|
|
@ -1060,15 +1066,15 @@ public:
|
|||
|
||||
if (LLIMMgr::INVITATION_TYPE_VOICE == mInvitiationType)
|
||||
{
|
||||
gIMMgr->startCall(mSessionID);
|
||||
gIMMgr->startCall(mSessionID, LLVoiceChannel::INCOMING_CALL);
|
||||
}
|
||||
|
||||
if ((mInvitiationType == LLIMMgr::INVITATION_TYPE_VOICE
|
||||
|| mInvitiationType == LLIMMgr::INVITATION_TYPE_IMMEDIATE)
|
||||
&& LLIMModel::getInstance()->findIMSession(mSessionID))
|
||||
{
|
||||
// always open IM window when connecting to voice
|
||||
LLIMFloater::show(mSessionID);
|
||||
// TODO remove in 2010, for voice calls we do not open an IM window
|
||||
//LLIMFloater::show(mSessionID);
|
||||
}
|
||||
|
||||
gIMMgr->clearPendingAgentListUpdates(mSessionID);
|
||||
|
|
@ -1271,11 +1277,10 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id)
|
|||
sCurrentSessionlName = session->mName;
|
||||
}
|
||||
|
||||
void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
|
||||
void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction)
|
||||
{
|
||||
LLSD mCallDialogPayload;
|
||||
LLOutgoingCallDialog* ocd;
|
||||
bool is_incoming;
|
||||
|
||||
mCallDialogPayload["session_id"] = sSession->mSessionID;
|
||||
mCallDialogPayload["session_name"] = sSession->mName;
|
||||
|
|
@ -1286,9 +1291,7 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
|
|||
{
|
||||
case LLVoiceChannel::STATE_CALL_STARTED :
|
||||
// do not show "Calling to..." if it is incoming call
|
||||
is_incoming = LLVoiceClient::getInstance()->isSessionIncoming(sSession->mSessionID);
|
||||
// *TODO: implement for AdHoc and Group voice chats
|
||||
if(is_incoming)
|
||||
if(direction == LLVoiceChannel::INCOMING_CALL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -1470,6 +1473,7 @@ BOOL LLOutgoingCallDialog::postBuild()
|
|||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Class LLIncomingCallDialog
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
LLIncomingCallDialog::LLIncomingCallDialog(const LLSD& payload) :
|
||||
LLCallDialog(payload)
|
||||
{
|
||||
|
|
@ -1479,26 +1483,34 @@ BOOL LLIncomingCallDialog::postBuild()
|
|||
{
|
||||
LLDockableFloater::postBuild();
|
||||
|
||||
LLUUID session_id = mPayload["session_id"].asUUID();
|
||||
LLSD caller_id = mPayload["caller_id"];
|
||||
EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
|
||||
|
||||
std::string call_type = getString("VoiceInviteP2P");
|
||||
std::string caller_name = mPayload["caller_name"].asString();
|
||||
|
||||
std::string call_type;
|
||||
if (gAgent.isInGroup(session_id))
|
||||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
LLGroupData data;
|
||||
if (gAgent.getGroupData(session_id, data))
|
||||
{
|
||||
args["[GROUP]"] = data.mName;
|
||||
call_type = getString(mPayload["notify_box_type"], args);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
call_type = getString(mPayload["notify_box_type"]);
|
||||
}
|
||||
|
||||
if (caller_name == "anonymous")
|
||||
{
|
||||
caller_name = getString("anonymous");
|
||||
}
|
||||
|
||||
setTitle(caller_name + " " + call_type);
|
||||
|
||||
// If it is not a P2P invite, then it's an AdHoc invite
|
||||
if ( type != IM_SESSION_P2P_INVITE )
|
||||
{
|
||||
call_type = getString("VoiceInviteAdHoc");
|
||||
}
|
||||
|
||||
// check to see if this is an Avaline call
|
||||
LLUUID session_id = mPayload["session_id"].asUUID();
|
||||
bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
|
||||
childSetVisible("Start IM", is_avatar); // no IM for avaline
|
||||
|
||||
|
|
@ -1587,11 +1599,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
|
|||
|
||||
if (voice)
|
||||
{
|
||||
if (gIMMgr->startCall(session_id))
|
||||
{
|
||||
// always open IM window when connecting to voice
|
||||
LLIMFloater::show(session_id);
|
||||
}
|
||||
gIMMgr->startCall(session_id, LLVoiceChannel::INCOMING_CALL);
|
||||
}
|
||||
|
||||
gIMMgr->clearPendingAgentListUpdates(session_id);
|
||||
|
|
@ -1630,11 +1638,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
|
|||
}
|
||||
}
|
||||
|
||||
LLUUID new_session_id = gIMMgr->addSession(correct_session_name, type, session_id);
|
||||
if (new_session_id != LLUUID::null)
|
||||
{
|
||||
LLIMFloater::show(new_session_id);
|
||||
}
|
||||
LLUUID new_session_id = gIMMgr->addSession(correct_session_name, type, session_id, true);
|
||||
|
||||
std::string url = gAgent.getRegion()->getCapability(
|
||||
"ChatSessionRequest");
|
||||
|
|
@ -1710,11 +1714,7 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response)
|
|||
payload["session_handle"].asString(),
|
||||
payload["session_uri"].asString());
|
||||
|
||||
if (gIMMgr->startCall(session_id))
|
||||
{
|
||||
// always open IM window when connecting to voice
|
||||
LLIMFloater::show(session_id);
|
||||
}
|
||||
gIMMgr->startCall(session_id);
|
||||
|
||||
gIMMgr->clearPendingAgentListUpdates(session_id);
|
||||
gIMMgr->clearPendingInvitation(session_id);
|
||||
|
|
@ -1724,11 +1724,7 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response)
|
|||
LLUUID new_session_id = gIMMgr->addSession(
|
||||
payload["session_name"].asString(),
|
||||
type,
|
||||
session_id);
|
||||
if (new_session_id != LLUUID::null)
|
||||
{
|
||||
LLIMFloater::show(new_session_id);
|
||||
}
|
||||
session_id, true);
|
||||
|
||||
std::string url = gAgent.getRegion()->getCapability(
|
||||
"ChatSessionRequest");
|
||||
|
|
@ -1798,6 +1794,8 @@ LLIMMgr::LLIMMgr() :
|
|||
{
|
||||
mPendingInvitations = LLSD::emptyMap();
|
||||
mPendingAgentListUpdates = LLSD::emptyMap();
|
||||
|
||||
LLIMModel::getInstance()->addNewMsgCallback(boost::bind(&LLIMFloater::sRemoveTypingIndicator, _1));
|
||||
}
|
||||
|
||||
// Add a message to a session.
|
||||
|
|
@ -2021,11 +2019,7 @@ LLUUID LLIMMgr::addP2PSession(const std::string& name,
|
|||
const std::string& voice_session_handle,
|
||||
const std::string& caller_uri)
|
||||
{
|
||||
LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id);
|
||||
if (session_id != LLUUID::null)
|
||||
{
|
||||
LLIMFloater::show(session_id);
|
||||
}
|
||||
LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id, true);
|
||||
|
||||
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
|
||||
if (speaker_mgr)
|
||||
|
|
@ -2046,11 +2040,11 @@ LLUUID LLIMMgr::addP2PSession(const std::string& name,
|
|||
LLUUID LLIMMgr::addSession(
|
||||
const std::string& name,
|
||||
EInstantMessage dialog,
|
||||
const LLUUID& other_participant_id)
|
||||
const LLUUID& other_participant_id, bool voice)
|
||||
{
|
||||
LLDynamicArray<LLUUID> ids;
|
||||
ids.put(other_participant_id);
|
||||
return addSession(name, dialog, other_participant_id, ids);
|
||||
return addSession(name, dialog, other_participant_id, ids, voice);
|
||||
}
|
||||
|
||||
// Adds a session using the given session_id. If the session already exists
|
||||
|
|
@ -2059,7 +2053,7 @@ LLUUID LLIMMgr::addSession(
|
|||
const std::string& name,
|
||||
EInstantMessage dialog,
|
||||
const LLUUID& other_participant_id,
|
||||
const LLDynamicArray<LLUUID>& ids)
|
||||
const LLDynamicArray<LLUUID>& ids, bool voice)
|
||||
{
|
||||
if (0 == ids.getLength())
|
||||
{
|
||||
|
|
@ -2078,7 +2072,7 @@ LLUUID LLIMMgr::addSession(
|
|||
|
||||
if (new_session)
|
||||
{
|
||||
LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids);
|
||||
LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids, voice);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -2438,11 +2432,12 @@ void LLIMMgr::removeSessionObserver(LLIMSessionObserver *observer)
|
|||
mSessionObservers.remove(observer);
|
||||
}
|
||||
|
||||
bool LLIMMgr::startCall(const LLUUID& session_id)
|
||||
bool LLIMMgr::startCall(const LLUUID& session_id, LLVoiceChannel::EDirection direction)
|
||||
{
|
||||
LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(session_id);
|
||||
if (!voice_channel) return false;
|
||||
|
||||
voice_channel->setCallDirection(direction);
|
||||
voice_channel->activate();
|
||||
return true;
|
||||
}
|
||||
|
|
@ -2456,6 +2451,14 @@ bool LLIMMgr::endCall(const LLUUID& session_id)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool LLIMMgr::isVoiceCall(const LLUUID& session_id)
|
||||
{
|
||||
LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id);
|
||||
if (!im_session) return false;
|
||||
|
||||
return im_session->mStartedAsIMCall;
|
||||
}
|
||||
|
||||
// create a floater and update internal representation for
|
||||
// consistency. Returns the pointer, caller (the class instance since
|
||||
// it is a private method) is not responsible for deleting the
|
||||
|
|
|
|||
|
|
@ -65,14 +65,13 @@ public:
|
|||
} SType;
|
||||
|
||||
LLIMSession(const LLUUID& session_id, const std::string& name,
|
||||
const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids);
|
||||
const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice);
|
||||
virtual ~LLIMSession();
|
||||
|
||||
void sessionInitReplyReceived(const LLUUID& new_session_id);
|
||||
void setSessionType(); //define what type of session was opened
|
||||
void addMessagesFromHistory(const std::list<LLSD>& history);
|
||||
void addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time);
|
||||
void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);
|
||||
void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction);
|
||||
static void chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata);
|
||||
|
||||
LLUUID mSessionID;
|
||||
|
|
@ -105,6 +104,9 @@ public:
|
|||
bool mTextIMPossible;
|
||||
bool mOtherParticipantIsAvatar;
|
||||
bool mStartCallOnInitialize;
|
||||
|
||||
//if IM session is created for a voice call
|
||||
bool mStartedAsIMCall;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -144,7 +146,10 @@ public:
|
|||
* @param name session name should not be empty, will return false if empty
|
||||
*/
|
||||
bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id,
|
||||
const std::vector<LLUUID>& ids = std::vector<LLUUID>());
|
||||
const std::vector<LLUUID>& ids, bool voice = false);
|
||||
|
||||
bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type,
|
||||
const LLUUID& other_participant_id, bool voice = false);
|
||||
|
||||
/**
|
||||
* Remove all session data associated with a session specified by session_id
|
||||
|
|
@ -163,6 +168,12 @@ public:
|
|||
*/
|
||||
bool addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& other_participant_id, const std::string& utf8_text, bool log2file = true);
|
||||
|
||||
/**
|
||||
* Similar to addMessage(...) above but won't send a signal about a new message added
|
||||
*/
|
||||
LLIMModel::LLIMSession* addMessageSilently(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,
|
||||
const std::string& utf8_text, bool log2file = true);
|
||||
|
||||
/**
|
||||
* Add a system message to an IM Model
|
||||
*/
|
||||
|
|
@ -285,14 +296,14 @@ public:
|
|||
// session.
|
||||
LLUUID addSession(const std::string& name,
|
||||
EInstantMessage dialog,
|
||||
const LLUUID& other_participant_id);
|
||||
const LLUUID& other_participant_id, bool voice = false);
|
||||
|
||||
// Adds a session using a specific group of starting agents
|
||||
// the dialog type is assumed correct. Returns the uuid of the session.
|
||||
LLUUID addSession(const std::string& name,
|
||||
EInstantMessage dialog,
|
||||
const LLUUID& other_participant_id,
|
||||
const LLDynamicArray<LLUUID>& ids);
|
||||
const LLDynamicArray<LLUUID>& ids, bool voice = false);
|
||||
|
||||
/**
|
||||
* Creates a P2P session with the requisite handle for responding to voice calls.
|
||||
|
|
@ -384,7 +395,7 @@ public:
|
|||
* Start call in a session
|
||||
* @return false if voice channel doesn't exist
|
||||
**/
|
||||
bool startCall(const LLUUID& session_id);
|
||||
bool startCall(const LLUUID& session_id, LLVoiceChannel::EDirection direction = LLVoiceChannel::OUTGOING_CALL);
|
||||
|
||||
/**
|
||||
* End call in a session
|
||||
|
|
@ -392,6 +403,8 @@ public:
|
|||
**/
|
||||
bool endCall(const LLUUID& session_id);
|
||||
|
||||
bool isVoiceCall(const LLUUID& session_id);
|
||||
|
||||
private:
|
||||
|
||||
/**
|
||||
|
|
@ -448,7 +461,7 @@ public:
|
|||
|
||||
static void initClass();
|
||||
static void onVoiceChannelChanged(const LLUUID &session_id);
|
||||
static void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);
|
||||
static void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction);
|
||||
|
||||
protected:
|
||||
static std::string sPreviousSessionlName;
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@ private:
|
|||
void onClickTeleport();
|
||||
void onClickInviteToGroup();
|
||||
void onClickPay();
|
||||
void onClickBlock();
|
||||
void onToggleMute();
|
||||
void onClickReport();
|
||||
void onClickFreeze();
|
||||
void onClickEject();
|
||||
|
|
@ -126,6 +126,8 @@ private:
|
|||
bool onVisibleZoomIn();
|
||||
void onClickMuteVolume();
|
||||
void onVolumeChange(const LLSD& data);
|
||||
bool enableMute();
|
||||
bool enableUnmute();
|
||||
|
||||
// Is used to determine if "Add friend" option should be enabled in gear menu
|
||||
bool isNotFriend();
|
||||
|
|
@ -205,7 +207,7 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
|
|||
mCommitCallbackRegistrar.add("InspectAvatar.Teleport", boost::bind(&LLInspectAvatar::onClickTeleport, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.InviteToGroup", boost::bind(&LLInspectAvatar::onClickInviteToGroup, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Pay", boost::bind(&LLInspectAvatar::onClickPay, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Block", boost::bind(&LLInspectAvatar::onClickBlock, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.ToggleMute", boost::bind(&LLInspectAvatar::onToggleMute, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Freeze",
|
||||
boost::bind(&LLInspectAvatar::onClickFreeze, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Eject",
|
||||
|
|
@ -221,6 +223,8 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
|
|||
mEnableCallbackRegistrar.add("InspectAvatar.VisibleZoomIn",
|
||||
boost::bind(&LLInspectAvatar::onVisibleZoomIn, this));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.Gear.Enable", boost::bind(&LLInspectAvatar::isNotFriend, this));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.EnableMute", boost::bind(&LLInspectAvatar::enableMute, this));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.EnableUnmute", boost::bind(&LLInspectAvatar::enableUnmute, this));
|
||||
|
||||
// can't make the properties request until the widgets are constructed
|
||||
// as it might return immediately, so do it in postBuild.
|
||||
|
|
@ -625,10 +629,19 @@ void LLInspectAvatar::onClickPay()
|
|||
closeFloater();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickBlock()
|
||||
void LLInspectAvatar::onToggleMute()
|
||||
{
|
||||
LLMute mute(mAvatarID, mAvatarName, LLMute::AGENT);
|
||||
LLMuteList::getInstance()->add(mute);
|
||||
|
||||
if (LLMuteList::getInstance()->isMuted(mute.mID, mute.mName))
|
||||
{
|
||||
LLMuteList::getInstance()->remove(mute);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLMuteList::getInstance()->add(mute);
|
||||
}
|
||||
|
||||
LLPanelBlockedList::showPanelAndSelect(mute.mID);
|
||||
closeFloater();
|
||||
}
|
||||
|
|
@ -663,6 +676,37 @@ void LLInspectAvatar::onClickFindOnMap()
|
|||
LLFloaterReg::showInstance("world_map");
|
||||
}
|
||||
|
||||
|
||||
bool LLInspectAvatar::enableMute()
|
||||
{
|
||||
bool is_linden = LLStringUtil::endsWith(mAvatarName, " Linden");
|
||||
bool is_self = mAvatarID == gAgent.getID();
|
||||
|
||||
if (!is_linden && !is_self && !LLMuteList::getInstance()->isMuted(mAvatarID, mAvatarName))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool LLInspectAvatar::enableUnmute()
|
||||
{
|
||||
bool is_linden = LLStringUtil::endsWith(mAvatarName, " Linden");
|
||||
bool is_self = mAvatarID == gAgent.getID();
|
||||
|
||||
if (!is_linden && !is_self && LLMuteList::getInstance()->isMuted(mAvatarID, mAvatarName))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// LLInspectAvatarUtil
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -973,7 +973,7 @@ bool LLInvFVBridge::isInOutfitsSidePanel() const
|
|||
dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory"));
|
||||
if (!outfit_panel)
|
||||
return false;
|
||||
return outfit_panel->isAccordionPanel(my_panel);
|
||||
return outfit_panel->isTabPanel(my_panel);
|
||||
}
|
||||
|
||||
// +=================================================+
|
||||
|
|
@ -2496,7 +2496,10 @@ void LLFolderBridge::folderOptionsMenu()
|
|||
checkFolderForContentsOfType(model, is_object) ||
|
||||
checkFolderForContentsOfType(model, is_gesture) )
|
||||
{
|
||||
mItems.push_back(std::string("Folder Wearables Separator"));
|
||||
if (!is_sidepanel)
|
||||
{
|
||||
mItems.push_back(std::string("Folder Wearables Separator"));
|
||||
}
|
||||
|
||||
// Only enable add/replace outfit for non-default folders.
|
||||
if (!is_default_folder)
|
||||
|
|
@ -2902,6 +2905,9 @@ void saveItemsOrder(LLInventoryModel::item_array_t& items)
|
|||
item->updateServer(FALSE);
|
||||
|
||||
gInventory.updateItem(item);
|
||||
|
||||
// Tell the parent folder to refresh its sort order.
|
||||
gInventory.addChangedMask(LLInventoryObserver::SORT, item->getParentUUID());
|
||||
}
|
||||
|
||||
gInventory.notifyObservers();
|
||||
|
|
@ -2998,8 +3004,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
|
|||
}
|
||||
|
||||
const LLUUID& favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
|
||||
const LLUUID& landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
|
||||
const BOOL folder_allows_reorder = ((mUUID == landmarks_id) || (mUUID == favorites_id));
|
||||
const BOOL folder_allows_reorder = (mUUID == favorites_id);
|
||||
|
||||
// we can move item inside a folder only if this folder is Favorites. See EXT-719
|
||||
accept = is_movable && ((mUUID != inv_item->getParentUUID()) || folder_allows_reorder);
|
||||
|
|
@ -3014,7 +3019,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
|
|||
// everything in the active window so that we don't follow
|
||||
// the selection to its new location (which is very
|
||||
// annoying).
|
||||
LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
|
||||
LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
|
||||
if (active_panel)
|
||||
{
|
||||
LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@ public:
|
|||
STRUCTURE = 16, // structural change (eg item or folder moved)
|
||||
CALLING_CARD = 32, // (eg online, grant status, cancel)
|
||||
REBUILD = 64, // item UI changed (eg item type different)
|
||||
SORT = 128, // folder needs to be resorted.
|
||||
ALL = 0xffffffff
|
||||
};
|
||||
LLInventoryObserver();
|
||||
|
|
|
|||
|
|
@ -278,6 +278,7 @@ void LLInventoryPanel::modelChanged(U32 mask)
|
|||
const LLUUID& item_id = (*items_iter);
|
||||
const LLInventoryObject* model_item = model->getObject(item_id);
|
||||
LLFolderViewItem* view_item = mFolders->getItemByID(item_id);
|
||||
LLFolderViewFolder* view_folder = mFolders->getFolderByID(item_id);
|
||||
|
||||
//////////////////////////////
|
||||
// LABEL Operation
|
||||
|
|
@ -320,7 +321,18 @@ void LLInventoryPanel::modelChanged(U32 mask)
|
|||
view_item->refresh();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////
|
||||
// SORT Operation
|
||||
// Sort the folder.
|
||||
if (mask & LLInventoryObserver::SORT)
|
||||
{
|
||||
if (view_folder)
|
||||
{
|
||||
view_folder->requestSort();
|
||||
}
|
||||
}
|
||||
|
||||
// We don't typically care which of these masks the item is actually flagged with, since the masks
|
||||
// may not be accurate (e.g. in the main inventory panel, I move an item from My Inventory into
|
||||
// Landmarks; this is a STRUCTURE change for that panel but is an ADD change for the Landmarks
|
||||
|
|
@ -385,16 +397,6 @@ void LLInventoryPanel::modelChanged(U32 mask)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* I don't think we need this code, but not positive -- Seraph
|
||||
if (!handled)
|
||||
{
|
||||
// It's a small change that only requires a refresh.
|
||||
// *TODO: figure out a more efficient way to do the refresh
|
||||
// since it is expensive on large inventories
|
||||
mFolders->refresh();
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
// static
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@
|
|||
#include "llinventory.h"
|
||||
#include "lllandmark.h"
|
||||
#include "llparcel.h"
|
||||
#include "llregionhandle.h"
|
||||
|
||||
#include "llnotificationsutil.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@
|
|||
|
||||
#include "llappviewer.h"
|
||||
#include "llagent.h"
|
||||
#include "llnotify.h"
|
||||
#include "llvfile.h"
|
||||
#include "llviewerstats.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -39,6 +39,8 @@
|
|||
#include "lltrans.h"
|
||||
#include "llviewercontrol.h"
|
||||
|
||||
#include "llinstantmessage.h"
|
||||
|
||||
#include <boost/algorithm/string/trim.hpp>
|
||||
#include <boost/algorithm/string/replace.hpp>
|
||||
#include <boost/regex.hpp>
|
||||
|
|
|
|||
|
|
@ -49,7 +49,6 @@
|
|||
#include "llfloaterchat.h"
|
||||
#include "llfloaterworldmap.h"
|
||||
#include "lllineeditor.h"
|
||||
#include "llnotify.h"
|
||||
#include "llstatusbar.h"
|
||||
#include "llimview.h"
|
||||
#include "lltextbox.h"
|
||||
|
|
|
|||
|
|
@ -160,9 +160,12 @@ void LLFloaterMove::setEnabled(BOOL enabled)
|
|||
// virtual
|
||||
void LLFloaterMove::setVisible(BOOL visible)
|
||||
{
|
||||
// Ignore excessive calls of this method (from LLTransientFloaterMgr?).
|
||||
// Do nothing with Stand/Stop Flying panel in excessive calls of this method (from LLTransientFloaterMgr?).
|
||||
if (getVisible() == visible)
|
||||
{
|
||||
LLTransientDockableFloater::setVisible(visible);
|
||||
return;
|
||||
}
|
||||
|
||||
if (visible)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -34,10 +34,12 @@
|
|||
|
||||
#include "llnavigationbar.h"
|
||||
|
||||
#include <llfloaterreg.h>
|
||||
#include <llfocusmgr.h>
|
||||
#include <lliconctrl.h>
|
||||
#include <llmenugl.h>
|
||||
#include "llregionhandle.h"
|
||||
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfocusmgr.h"
|
||||
#include "lliconctrl.h"
|
||||
#include "llmenugl.h"
|
||||
|
||||
#include "llagent.h"
|
||||
#include "llviewerregion.h"
|
||||
|
|
@ -259,9 +261,14 @@ BOOL LLNavigationBar::postBuild()
|
|||
void LLNavigationBar::setVisible(BOOL visible)
|
||||
{
|
||||
// change visibility of grandparent layout_panel to animate in and out
|
||||
if (getParent() && getParent()->getParent())
|
||||
if (getParent())
|
||||
{
|
||||
getParent()->getParent()->setVisible(visible);
|
||||
//to avoid some mysterious bugs like EXT-3352, at least try to log an incorrect parent to ping about a problem.
|
||||
if(getParent()->getName() != "nav_bar_container")
|
||||
{
|
||||
LL_WARNS("LLNavigationBar")<<"NavigationBar has an unknown name of the parent: "<<getParent()->getName()<< LL_ENDL;
|
||||
}
|
||||
getParent()->setVisible(visible);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,6 +32,8 @@
|
|||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "message.h"
|
||||
|
||||
#include "llfloaterreg.h"
|
||||
#include "lltrans.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@
|
|||
//#include "llnotificationsutil.h"
|
||||
#include "llchannelmanager.h"
|
||||
#include "llchat.h"
|
||||
#include "llinstantmessage.h"
|
||||
#include "llnotificationptr.h"
|
||||
|
||||
namespace LLNotificationsUI
|
||||
|
|
|
|||
|
|
@ -396,7 +396,7 @@ void LLPanelProfileTab::updateButtons()
|
|||
&& gAgent.isGodlike() || is_agent_mappable(getAvatarId());
|
||||
|
||||
childSetEnabled("show_on_map_btn", enable_map_btn);
|
||||
childSetEnabled("call", LLVoiceClient::voiceEnabled());
|
||||
childSetEnabled("call", LLAvatarActions::canCall(getAvatarId()));
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -48,7 +48,6 @@
|
|||
#include "message.h"
|
||||
|
||||
#include "llagent.h"
|
||||
#include "llalertdialog.h"
|
||||
#include "llavataractions.h"
|
||||
#include "llbutton.h"
|
||||
#include "llcheckboxctrl.h"
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue