master
richard 2009-12-17 10:03:56 -08:00
commit 724f5fbb7f
258 changed files with 3211 additions and 2194 deletions

View File

@ -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

View File

@ -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");

View File

@ -47,7 +47,6 @@
#include "llquaternion.h"
#include "v3dmath.h"
#include "v3math.h"
#include "llapr.h"
#include "llbvhconsts.h"
class LLKeyframeDataCache;

View File

@ -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();

View File

@ -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>

View File

@ -33,7 +33,6 @@
#define LL_COMMON_H
// *TODO: remove these?
#include "llapr.h"
#include "lltimer.h"
#include "llfile.h"

View File

@ -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"

View File

@ -34,6 +34,7 @@
#define LL_LLTHREAD_H
#include "llapp.h"
#include "llapr.h"
#include "apr_thread_cond.h"
class LLThread;

View File

@ -34,7 +34,6 @@
#ifndef LL_LLIOHTTPSERVER_H
#define LL_LLIOHTTPSERVER_H
#include "llapr.h"
#include "llchainio.h"
#include "llhttpnode.h"

View File

@ -34,6 +34,7 @@
#ifndef LL_LLPLUGINPROCESSPARENT_H
#define LL_LLPLUGINPROCESSPARENT_H
#include "llapr.h"
#include "llprocesslauncher.h"
#include "llpluginmessage.h"
#include "llpluginmessagepipe.h"

View File

@ -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

View File

@ -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();
}

View File

@ -37,7 +37,6 @@
#define LLPANEL_CPP
#include "llpanel.h"
#include "llalertdialog.h"
#include "llfocusmgr.h"
#include "llfontgl.h"
#include "llrect.h"

View File

@ -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)
}
}
}

View File

@ -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;

View File

@ -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)

View File

@ -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);
}

View File

@ -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())
{

View File

@ -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);

View File

@ -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
{

View File

@ -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

View File

@ -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)

View File

@ -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]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;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]&amp;s=[COLLECTION]&amp;</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]&amp;mat=[MATURITY]&amp;t=[TEEN]&amp;region=[REGION]&amp;x=[X]&amp;y=[Y]&amp;z=[Z]&amp;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>

View File

@ -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.

View File

@ -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)

View File

@ -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"

View File

@ -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"

View File

@ -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)

View File

@ -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();
}

View File

@ -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;

View File

@ -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"

View File

@ -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)
{

View File

@ -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.
*/

View File

@ -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)
{

View File

@ -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();

View File

@ -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

View File

@ -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;
};

View File

@ -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"

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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();
}

View File

@ -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)

View File

@ -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;
};

View File

@ -36,7 +36,6 @@
#include <list>
#include "llnotificationsutil.h"
#include "llnotify.h"
#include "llcallbacklist.h"
#include "llinventory.h"
#include "llviewerinventory.h"

View File

@ -37,7 +37,6 @@
#include "llnotificationsutil.h"
#include "message.h"
#include "llnotify.h"
#include "lleventinfo.h"
#include "llfloaterreg.h"
#include "llfloaterworldmap.h"

View File

@ -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

View File

@ -40,7 +40,6 @@
// viewer includes
#include "llagent.h" // for gAgent.inPrelude()
#include "llnotify.h"
#include "llviewercontrol.h"
#include "llui.h"
#include "llappviewer.h"

View File

@ -33,6 +33,7 @@
#ifndef LL_LLFLOATERANIMPREVIEW_H
#define LL_LLFLOATERANIMPREVIEW_H
#include "llassettype.h"
#include "llfloaternamedesc.h"
#include "lldynamictexture.h"
#include "llcharacter.h"

View File

@ -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"

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -37,7 +37,6 @@
// Viewer libs
#include "llviewercontrol.h"
#include "llmediactrl.h"
#include "llalertdialog.h"
// Linden libs
#include "llnotificationsutil.h"

View File

@ -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"

View File

@ -44,7 +44,6 @@
#include "llnotificationsutil.h"
#include "lltextbox.h"
#include "llalertdialog.h"
#include "llinventorybridge.h"
#include "llfloaterinventory.h"
#include "llinventorymodel.h"

View File

@ -32,7 +32,6 @@
*/
#include "llviewerprecompiledheaders.h"
#include "llalertdialog.h"
#include "llcheckboxctrl.h"
#include "llfloaterperms.h"
#include "llviewercontrol.h"

View File

@ -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"

View File

@ -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;
};

View File

@ -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);

View 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"

View File

@ -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;

View File

@ -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"

View File

@ -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);

View File

@ -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"

View File

@ -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();

View File

@ -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

View File

@ -32,6 +32,8 @@
#include "llviewerprecompiledheaders.h"
#include "llhttpclient.h"
#include "llfloaterurlentry.h"
#include "llpanellandmedia.h"

View File

@ -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

View File

@ -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;

View File

@ -74,8 +74,8 @@
#include "llmapimagetype.h"
#include "llweb.h"
#include "llslider.h"
#include "message.h"
#include "llglheaders.h"
#include "llwindow.h" // copyTextToClipboard()
//---------------------------------------------------------------------------

View File

@ -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();

View File

@ -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);

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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();

View File

@ -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)

View File

@ -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; }

View File

@ -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();
}

View File

@ -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();

View File

@ -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"

View File

@ -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

View File

@ -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;

View File

@ -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
//////////////////////////////////////////////////////////////////////////////

View File

@ -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());

View File

@ -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();

View File

@ -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

View File

@ -38,6 +38,7 @@
#include "llinventory.h"
#include "lllandmark.h"
#include "llparcel.h"
#include "llregionhandle.h"
#include "llnotificationsutil.h"

View File

@ -39,7 +39,6 @@
#include "llappviewer.h"
#include "llagent.h"
#include "llnotify.h"
#include "llvfile.h"
#include "llviewerstats.h"

View File

@ -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>

View File

@ -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"

View File

@ -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)
{

View File

@ -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);
}
}

View File

@ -32,6 +32,8 @@
#include "llviewerprecompiledheaders.h"
#include "message.h"
#include "llfloaterreg.h"
#include "lltrans.h"

View File

@ -39,6 +39,7 @@
//#include "llnotificationsutil.h"
#include "llchannelmanager.h"
#include "llchat.h"
#include "llinstantmessage.h"
#include "llnotificationptr.h"
namespace LLNotificationsUI

View File

@ -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()));
}
//////////////////////////////////////////////////////////////////////////

View File

@ -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