summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Litovchuk <slitovchuk@productengine.com>2009-12-01 20:29:26 +0200
committerSergei Litovchuk <slitovchuk@productengine.com>2009-12-01 20:29:26 +0200
commit57fca8d6e8c3c925fc3a3fff8833c4e43db8f24c (patch)
treeb5ac1efe546cedbf337d98a3d2ffbbb5b23e36d1
parent56504054d8e0cba815c25035ed7dd71015cf3222 (diff)
parent3385ce87f14f71d739a3834fbf3436a962fbdd9d (diff)
merge
--HG-- branch : product-engine
-rw-r--r--indra/cmake/00-Common.cmake8
-rw-r--r--indra/llaudio/CMakeLists.txt6
-rw-r--r--indra/llaudio/llaudiodecodemgr.cpp1
-rw-r--r--indra/llcommon/llstring.cpp2
-rw-r--r--indra/llplugin/llpluginclassmedia.cpp2
-rw-r--r--indra/llplugin/llpluginclassmedia.h2
-rw-r--r--indra/llplugin/llpluginclassmediaowner.h2
-rw-r--r--indra/llplugin/llplugininstance.cpp2
-rw-r--r--indra/llplugin/llplugininstance.h2
-rw-r--r--indra/llplugin/llpluginmessage.cpp2
-rw-r--r--indra/llplugin/llpluginmessage.h2
-rw-r--r--indra/llplugin/llpluginmessageclasses.h2
-rw-r--r--indra/llplugin/llpluginmessagepipe.cpp2
-rw-r--r--indra/llplugin/llpluginmessagepipe.h2
-rw-r--r--indra/llplugin/llpluginprocesschild.cpp2
-rw-r--r--indra/llplugin/llpluginprocesschild.h2
-rw-r--r--indra/llplugin/llpluginprocessparent.cpp2
-rw-r--r--indra/llplugin/llpluginprocessparent.h2
-rw-r--r--indra/llplugin/llpluginsharedmemory.cpp2
-rw-r--r--indra/llplugin/llpluginsharedmemory.h2
-rw-r--r--indra/llplugin/slplugin/slplugin.cpp104
-rw-r--r--indra/llui/llprogressbar.cpp9
-rw-r--r--indra/llui/llresizebar.cpp5
-rw-r--r--indra/llui/lltooltip.cpp2
-rw-r--r--indra/media_plugins/base/media_plugin_base.cpp2
-rw-r--r--indra/media_plugins/base/media_plugin_base.h2
-rw-r--r--indra/media_plugins/example/media_plugin_example.cpp2
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamer.h2
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp2
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h2
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h2
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp2
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h2
-rw-r--r--indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp2
-rw-r--r--indra/media_plugins/quicktime/media_plugin_quicktime.cpp2
-rw-r--r--indra/media_plugins/webkit/media_plugin_webkit.cpp2
-rw-r--r--indra/newview/CMakeLists.txt4
-rw-r--r--indra/newview/llappviewer.cpp5
-rw-r--r--indra/newview/llavatariconctrl.cpp4
-rw-r--r--indra/newview/llcallfloater.cpp80
-rw-r--r--indra/newview/llcallfloater.h19
-rw-r--r--indra/newview/llcallingcard.cpp13
-rw-r--r--indra/newview/llchathistory.cpp30
-rw-r--r--indra/newview/llchiclet.cpp41
-rw-r--r--indra/newview/llchiclet.h11
-rw-r--r--indra/newview/llfloaterabout.cpp4
-rw-r--r--indra/newview/llfloatermediasettings.cpp55
-rw-r--r--indra/newview/llfloatermediasettings.h12
-rw-r--r--indra/newview/llfloaterpreference.cpp3
-rw-r--r--indra/newview/llfloatersearch.cpp4
-rw-r--r--indra/newview/llgroupactions.cpp6
-rw-r--r--indra/newview/llimfloater.cpp5
-rw-r--r--indra/newview/llimview.cpp69
-rw-r--r--indra/newview/llimview.h16
-rw-r--r--indra/newview/lllogchat.cpp250
-rw-r--r--indra/newview/lllogchat.h55
-rw-r--r--indra/newview/llnearbychat.cpp26
-rw-r--r--indra/newview/llnearbychat.h8
-rw-r--r--indra/newview/llnotificationgrouphandler.cpp2
-rw-r--r--indra/newview/llnotificationhandler.h28
-rw-r--r--indra/newview/llnotificationhandlerutil.cpp130
-rw-r--r--indra/newview/llnotificationofferhandler.cpp24
-rw-r--r--indra/newview/llnotificationscripthandler.cpp5
-rw-r--r--indra/newview/llpanelavatar.cpp19
-rw-r--r--indra/newview/llpanelavatar.h4
-rw-r--r--indra/newview/llpanelmediasettingsgeneral.cpp18
-rw-r--r--indra/newview/llpanelmediasettingssecurity.cpp2
-rw-r--r--indra/newview/llpanelprimmediacontrols.cpp71
-rw-r--r--indra/newview/llpanelprimmediacontrols.h8
-rw-r--r--indra/newview/llparticipantlist.cpp23
-rw-r--r--indra/newview/llparticipantlist.h10
-rw-r--r--indra/newview/llscriptfloater.cpp3
-rw-r--r--indra/newview/llstatusbar.cpp11
-rw-r--r--indra/newview/llstatusbar.h3
-rw-r--r--indra/newview/llviewerfloaterreg.cpp2
-rw-r--r--indra/newview/llviewerinventory.cpp5
-rw-r--r--indra/newview/llviewermediafocus.cpp9
-rw-r--r--indra/newview/llviewermessage.cpp23
-rw-r--r--indra/newview/llvoicechannel.cpp6
-rw-r--r--indra/newview/llvoiceclient.cpp6
-rw-r--r--indra/newview/skins/default/xui/en/floater_nearby_chat.xml8
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_controls.xml70
-rw-r--r--indra/newview/skins/default/xui/en/menu_imchiclet_adhoc.xml19
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml35
-rw-r--r--indra/newview/skins/default/xui/en/panel_chat_header.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_im_control_panel.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_landmarks.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_media_settings_general.xml23
-rw-r--r--indra/newview/skins/default/xui/en/panel_prim_media_controls.xml39
-rw-r--r--indra/newview/skins/default/xui/en/panel_status_bar.xml11
-rw-r--r--indra/newview/skins/default/xui/en/panel_teleport_history.xml1
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml1
92 files changed, 1292 insertions, 244 deletions
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index b159092592..1f578eec5f 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -119,14 +119,14 @@ if (LINUX)
endif (${GXX_VERSION} STREQUAL ${CXX_VERSION})
# Let's actually get a numerical version of gxx's version
- STRING(REGEX REPLACE ".* ([0-9])\\.([0-9])\\.([0-9]).*" "\\1\\2\\3" CXX_VERSION ${CXX_VERSION})
+ STRING(REGEX REPLACE ".* ([0-9])\\.([0-9])\\.([0-9]).*" "\\1\\2\\3" CXX_VERSION_NUMBER ${CXX_VERSION})
- # gcc 4.3 and above don't like the LL boost and also
+ # gcc 4.3 and above don't like the LL boost and also
# cause warnings due to our use of deprecated headers
- if(${CXX_VERSION} GREATER 429)
+ if(${CXX_VERSION_NUMBER} GREATER 429)
add_definitions(-Wno-parentheses)
set(CMAKE_CXX_FLAGS "-Wno-deprecated ${CMAKE_CXX_FLAGS}")
- endif (${CXX_VERSION} GREATER 429)
+ endif (${CXX_VERSION_NUMBER} GREATER 429)
# End of hacks.
diff --git a/indra/llaudio/CMakeLists.txt b/indra/llaudio/CMakeLists.txt
index 9e9e1aaeae..bfa2c34c12 100644
--- a/indra/llaudio/CMakeLists.txt
+++ b/indra/llaudio/CMakeLists.txt
@@ -31,7 +31,6 @@ set(llaudio_SOURCE_FILES
llaudioengine.cpp
lllistener.cpp
llaudiodecodemgr.cpp
- llvorbisdecode.cpp
llvorbisencode.cpp
)
@@ -41,7 +40,6 @@ set(llaudio_HEADER_FILES
llaudioengine.h
lllistener.h
llaudiodecodemgr.h
- llvorbisdecode.h
llvorbisencode.h
llwindgen.h
)
@@ -60,11 +58,11 @@ if (FMOD)
)
if (LINUX)
- if (${CXX_VERSION} MATCHES "4.[23]")
+ if (${CXX_VERSION_NUMBER} GREATER 419)
set_source_files_properties(llaudioengine_fmod.cpp
llstreamingaudio_fmod.cpp
COMPILE_FLAGS -Wno-write-strings)
- endif (${CXX_VERSION} MATCHES "4.[23]")
+ endif (${CXX_VERSION_NUMBER} GREATER 419)
endif (LINUX)
endif (FMOD)
diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp
index ae959eaa81..6bbaad9cef 100644
--- a/indra/llaudio/llaudiodecodemgr.cpp
+++ b/indra/llaudio/llaudiodecodemgr.cpp
@@ -33,7 +33,6 @@
#include "llaudiodecodemgr.h"
-#include "llvorbisdecode.h"
#include "llaudioengine.h"
#include "lllfsthread.h"
#include "llvfile.h"
diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp
index 3030ae2c8b..c027aa7bdd 100644
--- a/indra/llcommon/llstring.cpp
+++ b/indra/llcommon/llstring.cpp
@@ -717,7 +717,7 @@ void LLStringOps::setupDatetimeInfo (bool daylight)
datetimeToCodes["day"] = "%d"; // 31
datetimeToCodes["hour24"] = "%H"; // 14
datetimeToCodes["hour"] = "%H"; // 14
- datetimeToCodes["hour12"] = "%l"; // 02
+ datetimeToCodes["hour12"] = "%I"; // 02
datetimeToCodes["min"] = "%M"; // 59
datetimeToCodes["ampm"] = "%p"; // AM
datetimeToCodes["second"] = "%S"; // 59
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index c3d8a5aa23..70d770ef7e 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -2,6 +2,7 @@
* @file llpluginclassmedia.cpp
* @brief LLPluginClassMedia handles a plugin which knows about the "media" message class.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index dcc4a3bd6a..6b64688718 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -2,6 +2,7 @@
* @file llpluginclassmedia.h
* @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINCLASSMEDIA_H
diff --git a/indra/llplugin/llpluginclassmediaowner.h b/indra/llplugin/llpluginclassmediaowner.h
index c798af29ca..6d369cd51a 100644
--- a/indra/llplugin/llpluginclassmediaowner.h
+++ b/indra/llplugin/llpluginclassmediaowner.h
@@ -2,6 +2,7 @@
* @file llpluginclassmediaowner.h
* @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINCLASSMEDIAOWNER_H
diff --git a/indra/llplugin/llplugininstance.cpp b/indra/llplugin/llplugininstance.cpp
index 58fb792d0d..16ba492669 100644
--- a/indra/llplugin/llplugininstance.cpp
+++ b/indra/llplugin/llplugininstance.cpp
@@ -2,6 +2,7 @@
* @file llplugininstance.cpp
* @brief LLPluginInstance handles loading the dynamic library of a plugin and setting up its entry points for message passing.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/llplugin/llplugininstance.h b/indra/llplugin/llplugininstance.h
index ba569df10c..02936f65fb 100644
--- a/indra/llplugin/llplugininstance.h
+++ b/indra/llplugin/llplugininstance.h
@@ -2,6 +2,7 @@
* @file llplugininstance.h
* @brief LLPluginInstance handles loading the dynamic library of a plugin and setting up its entry points for message passing.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGININSTANCE_H
diff --git a/indra/llplugin/llpluginmessage.cpp b/indra/llplugin/llpluginmessage.cpp
index 32601b47db..34e02c356e 100644
--- a/indra/llplugin/llpluginmessage.cpp
+++ b/indra/llplugin/llpluginmessage.cpp
@@ -2,6 +2,7 @@
* @file llpluginmessage.cpp
* @brief LLPluginMessage encapsulates the serialization/deserialization of messages passed to and from plugins.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/llplugin/llpluginmessage.h b/indra/llplugin/llpluginmessage.h
index 5e93d8b7a1..99f8d1194f 100644
--- a/indra/llplugin/llpluginmessage.h
+++ b/indra/llplugin/llpluginmessage.h
@@ -2,6 +2,7 @@
* @file llpluginmessage.h
* @brief LLPluginMessage encapsulates the serialization/deserialization of messages passed to and from plugins.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINMESSAGE_H
diff --git a/indra/llplugin/llpluginmessageclasses.h b/indra/llplugin/llpluginmessageclasses.h
index 927fcf2eb2..01fddb92c5 100644
--- a/indra/llplugin/llpluginmessageclasses.h
+++ b/indra/llplugin/llpluginmessageclasses.h
@@ -2,6 +2,7 @@
* @file llpluginmessageclasses.h
* @brief This file defines the versions of existing message classes for LLPluginMessage.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINMESSAGECLASSES_H
diff --git a/indra/llplugin/llpluginmessagepipe.cpp b/indra/llplugin/llpluginmessagepipe.cpp
index 31ea138912..cc193fca42 100644
--- a/indra/llplugin/llpluginmessagepipe.cpp
+++ b/indra/llplugin/llpluginmessagepipe.cpp
@@ -2,6 +2,7 @@
* @file llpluginmessagepipe.cpp
* @brief Classes that implement connections from the plugin system to pipes/pumps.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/llplugin/llpluginmessagepipe.h b/indra/llplugin/llpluginmessagepipe.h
index 4eb6575bd4..1ddb38de68 100644
--- a/indra/llplugin/llpluginmessagepipe.h
+++ b/indra/llplugin/llpluginmessagepipe.h
@@ -2,6 +2,7 @@
* @file llpluginmessagepipe.h
* @brief Classes that implement connections from the plugin system to pipes/pumps.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINMESSAGEPIPE_H
diff --git a/indra/llplugin/llpluginprocesschild.cpp b/indra/llplugin/llpluginprocesschild.cpp
index fc95136d9e..55cf11c620 100644
--- a/indra/llplugin/llpluginprocesschild.cpp
+++ b/indra/llplugin/llpluginprocesschild.cpp
@@ -2,6 +2,7 @@
* @file llpluginprocesschild.cpp
* @brief LLPluginProcessChild handles the child side of the external-process plugin API.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/llplugin/llpluginprocesschild.h b/indra/llplugin/llpluginprocesschild.h
index 75860bdf0a..f5c57c3d49 100644
--- a/indra/llplugin/llpluginprocesschild.h
+++ b/indra/llplugin/llpluginprocesschild.h
@@ -2,6 +2,7 @@
* @file llpluginprocesschild.h
* @brief LLPluginProcessChild handles the child side of the external-process plugin API.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINPROCESSCHILD_H
diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp
index b7ce800c3a..332ce288d7 100644
--- a/indra/llplugin/llpluginprocessparent.cpp
+++ b/indra/llplugin/llpluginprocessparent.cpp
@@ -2,6 +2,7 @@
* @file llpluginprocessparent.cpp
* @brief LLPluginProcessParent handles the parent side of the external-process plugin API.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h
index 1289e86c13..25669f5d78 100644
--- a/indra/llplugin/llpluginprocessparent.h
+++ b/indra/llplugin/llpluginprocessparent.h
@@ -2,6 +2,7 @@
* @file llpluginprocessparent.h
* @brief LLPluginProcessParent handles the parent side of the external-process plugin API.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINPROCESSPARENT_H
diff --git a/indra/llplugin/llpluginsharedmemory.cpp b/indra/llplugin/llpluginsharedmemory.cpp
index ce8b8e3e09..3c69a69d28 100644
--- a/indra/llplugin/llpluginsharedmemory.cpp
+++ b/indra/llplugin/llpluginsharedmemory.cpp
@@ -2,6 +2,7 @@
* @file llpluginsharedmemory.cpp
* @brief LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/llplugin/llpluginsharedmemory.h b/indra/llplugin/llpluginsharedmemory.h
index a4613b9a54..4014620c52 100644
--- a/indra/llplugin/llpluginsharedmemory.h
+++ b/indra/llplugin/llpluginsharedmemory.h
@@ -2,6 +2,7 @@
* @file llpluginsharedmemory.h
* @brief LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINSHAREDMEMORY_H
diff --git a/indra/llplugin/slplugin/slplugin.cpp b/indra/llplugin/slplugin/slplugin.cpp
index 005e427572..23dc532ba5 100644
--- a/indra/llplugin/slplugin/slplugin.cpp
+++ b/indra/llplugin/slplugin/slplugin.cpp
@@ -1,11 +1,13 @@
-/**
+/**
* @file slplugin.cpp
* @brief Loader shell for plugins, intended to be launched by the plugin host application, which directly loads a plugin dynamic library.
*
+ * @cond
+ *
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
- *
+ *
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
@@ -13,20 +15,22 @@
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlife.com/developers/opensource/gplv2
- *
+ *
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at http://secondlife.com/developers/opensource/flossexception
- *
+ *
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
- *
+ *
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ *
+ * @endcond
*/
@@ -48,15 +52,15 @@
/*
On Mac OS, since we call WaitNextEvent, this process will show up in the dock unless we set the LSBackgroundOnly flag in the Info.plist.
-
+
Normally non-bundled binaries don't have an info.plist file, but it's possible to embed one in the binary by adding this to the linker flags:
-
+
-sectcreate __TEXT __info_plist /path/to/slplugin_info.plist
-
+
which means adding this to the gcc flags:
-
+
-Wl,-sectcreate,__TEXT,__info_plist,/path/to/slplugin_info.plist
-
+
*/
#if LL_DARWIN || LL_LINUX
@@ -67,7 +71,7 @@ static void crash_handler(int sig)
// TODO: add our own crash reporting
_exit(1);
}
-#endif
+#endif
#if LL_WINDOWS
#include <windows.h>
@@ -80,7 +84,48 @@ LONG WINAPI myWin32ExceptionHandler( struct _EXCEPTION_POINTERS* exception_infop
//std::cerr << "intercepted an unhandled exception and will exit immediately." << std::endl;
// TODO: replace exception handler before we exit?
- return EXCEPTION_EXECUTE_HANDLER;
+ return EXCEPTION_EXECUTE_HANDLER;
+}
+
+// Taken from : http://blog.kalmbachnet.de/?postid=75
+// The MSVC 2005 CRT forces the call of the default-debugger (normally Dr.Watson)
+// even with the other exception handling code. This (terrifying) piece of code
+// patches things so that doesn't happen.
+LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(
+ LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter )
+{
+ return NULL;
+}
+
+BOOL PreventSetUnhandledExceptionFilter()
+{
+// WARNING: This won't work on 64-bit Windows systems so we turn it off it.
+// It should work for any flavor of 32-bit Windows we care about.
+// If it's off, sometimes you will see an OS message when a plugin crashes
+#ifndef _WIN64
+ HMODULE hKernel32 = LoadLibraryA( "kernel32.dll" );
+ if ( NULL == hKernel32 )
+ return FALSE;
+
+ void *pOrgEntry = GetProcAddress( hKernel32, "SetUnhandledExceptionFilter" );
+ if( NULL == pOrgEntry )
+ return FALSE;
+
+ unsigned char newJump[ 100 ];
+ DWORD dwOrgEntryAddr = (DWORD)pOrgEntry;
+ dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far
+ void *pNewFunc = &MyDummySetUnhandledExceptionFilter;
+ DWORD dwNewEntryAddr = (DWORD) pNewFunc;
+ DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr;
+
+ newJump[ 0 ] = 0xE9; // JMP absolute
+ memcpy( &newJump[ 1 ], &dwRelativeAddr, sizeof( pNewFunc ) );
+ SIZE_T bytesWritten;
+ BOOL bRet = WriteProcessMemory( GetCurrentProcess(), pOrgEntry, newJump, sizeof( pNewFunc ) + 1, &bytesWritten );
+ return bRet;
+#else
+ return FALSE;
+#endif
}
////////////////////////////////////////////////////////////////////////////////
@@ -91,6 +136,7 @@ void initExceptionHandler()
// save old exception handler in case we need to restore it at the end
prev_filter = SetUnhandledExceptionFilter( myWin32ExceptionHandler );
+ PreventSetUnhandledExceptionFilter();
}
bool checkExceptionHandler()
@@ -99,6 +145,8 @@ bool checkExceptionHandler()
LPTOP_LEVEL_EXCEPTION_FILTER prev_filter;
prev_filter = SetUnhandledExceptionFilter(myWin32ExceptionHandler);
+ PreventSetUnhandledExceptionFilter();
+
if (prev_filter != myWin32ExceptionHandler)
{
LL_WARNS("AppInit") << "Our exception handler (" << (void *)myWin32ExceptionHandler << ") replaced with " << prev_filter << "!" << LL_ENDL;
@@ -122,7 +170,7 @@ bool checkExceptionHandler()
}
#endif
-// If this application on Windows platform is a console application, a console is always
+// If this application on Windows platform is a console application, a console is always
// created which is bad. Making it a Windows "application" via CMake settings but not
// adding any code to explicitly create windows does the right thing.
#if LL_WINDOWS
@@ -133,7 +181,7 @@ int main(int argc, char **argv)
{
ll_init_apr();
- // Set up llerror logging
+ // Set up llerror logging
{
LLError::initForApplication(".");
LLError::setDefaultLevel(LLError::LEVEL_INFO);
@@ -146,14 +194,14 @@ int main(int argc, char **argv)
{
LL_ERRS("slplugin") << "usage: " << "SLPlugin" << " launcher_port" << LL_ENDL;
};
-
+
U32 port = 0;
if(!LLStringUtil::convertToU32(lpCmdLine, port))
{
LL_ERRS("slplugin") << "port number must be numeric" << LL_ENDL;
};
- // Insert our exception handler into the system so this plugin doesn't
+ // Insert our exception handler into the system so this plugin doesn't
// display a crash message if something bad happens. The host app will
// see the missing heartbeat and log appropriately.
initExceptionHandler();
@@ -162,7 +210,7 @@ int main(int argc, char **argv)
{
LL_ERRS("slplugin") << "usage: " << argv[0] << " launcher_port" << LL_ENDL;
}
-
+
U32 port = 0;
if(!LLStringUtil::convertToU32(argv[1], port))
{
@@ -183,17 +231,17 @@ int main(int argc, char **argv)
LLPluginProcessChild *plugin = new LLPluginProcessChild();
plugin->init(port);
-
+
LLTimer timer;
timer.start();
#if LL_WINDOWS
checkExceptionHandler();
#endif
-
+
while(!plugin->isDone())
{
- timer.reset();
+ timer.reset();
plugin->idle();
#if LL_DARWIN
{
@@ -204,7 +252,7 @@ int main(int argc, char **argv)
#endif
F64 elapsed = timer.getElapsedTimeF64();
F64 remaining = plugin->getSleepTime() - elapsed;
-
+
if(remaining <= 0.0f)
{
// We've already used our full allotment.
@@ -217,26 +265,26 @@ int main(int argc, char **argv)
{
// LL_INFOS("slplugin") << "elapsed = " << elapsed * 1000.0f << " ms, remaining = " << remaining * 1000.0f << " ms, sleeping for " << remaining * 1000.0f << " ms" << LL_ENDL;
-// timer.reset();
-
+// timer.reset();
+
// This also services the network as needed.
plugin->sleep(remaining);
-
+
// LL_INFOS("slplugin") << "slept for "<< timer.getElapsedTimeF64() * 1000.0f << " ms" << LL_ENDL;
}
#if LL_WINDOWS
// More agressive checking of interfering exception handlers.
- // Doesn't appear to be required so far - even for plugins
- // that do crash with a single call to the intercept
+ // Doesn't appear to be required so far - even for plugins
+ // that do crash with a single call to the intercept
// exception handler such as QuickTime.
//checkExceptionHandler();
#endif
}
delete plugin;
-
- ll_cleanup_apr();
+
+ ll_cleanup_apr();
return 0;
}
diff --git a/indra/llui/llprogressbar.cpp b/indra/llui/llprogressbar.cpp
index c8b6e814e1..62ca569e6c 100644
--- a/indra/llui/llprogressbar.cpp
+++ b/indra/llui/llprogressbar.cpp
@@ -72,12 +72,13 @@ LLProgressBar::~LLProgressBar()
void LLProgressBar::draw()
{
static LLTimer timer;
-
- LLUIImagePtr bar_fg_imagep = LLUI::getUIImage("progressbar_fill.tga");
+ F32 alpha = getDrawContext().mAlpha;
- mImageBar->draw(getLocalRect(), mColorBackground.get());
+ LLColor4 image_bar_color = mColorBackground.get();
+ image_bar_color.setAlpha(alpha);
+ mImageBar->draw(getLocalRect(), image_bar_color);
- F32 alpha = 0.5f + 0.5f*0.5f*(1.f + (F32)sin(3.f*timer.getElapsedTimeF32()));
+ alpha *= 0.5f + 0.5f*0.5f*(1.f + (F32)sin(3.f*timer.getElapsedTimeF32()));
LLColor4 bar_color = mColorBar.get();
bar_color.mV[VALPHA] *= alpha; // modulate alpha
LLRect progress_rect = getLocalRect();
diff --git a/indra/llui/llresizebar.cpp b/indra/llui/llresizebar.cpp
index a7cf9be277..0c46edf300 100644
--- a/indra/llui/llresizebar.cpp
+++ b/indra/llui/llresizebar.cpp
@@ -144,9 +144,10 @@ BOOL LLResizeBar::handleHover(S32 x, S32 y, MASK mask)
if( valid_rect.localPointInRect( screen_x, screen_y ) && mResizingView )
{
// undock floater when user resize it
- if (((LLFloater*)getParent())->isDocked())
+ LLFloater* parent = dynamic_cast<LLFloater*>( getParent());
+ if (parent && parent->isDocked())
{
- ((LLFloater*)getParent())->setDocked(false, false);
+ parent->setDocked( false, false);
}
// Resize the parent
diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
index 959313a5b6..d7228c78bd 100644
--- a/indra/llui/lltooltip.cpp
+++ b/indra/llui/lltooltip.cpp
@@ -228,7 +228,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
{
LLButton::Params p_button;
p_button.name(std::string("play_media"));
- p_button.label(""); // provid label but set to empty so name does not overwrite it -angela
+ p_button.label(""); // provide label but set to empty so name does not overwrite it -angela
TOOLTIP_PLAYBUTTON_SIZE = 16;
LLRect button_rect;
button_rect.setOriginAndSize((mPadding +TOOLTIP_ICON_SIZE+ mPadding ), mPadding, TOOLTIP_ICON_SIZE, TOOLTIP_ICON_SIZE);
diff --git a/indra/media_plugins/base/media_plugin_base.cpp b/indra/media_plugins/base/media_plugin_base.cpp
index 6acac07423..8c8fa24a65 100644
--- a/indra/media_plugins/base/media_plugin_base.cpp
+++ b/indra/media_plugins/base/media_plugin_base.cpp
@@ -2,6 +2,7 @@
* @file media_plugin_base.cpp
* @brief Media plugin base class for LLMedia API plugin system
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/media_plugins/base/media_plugin_base.h b/indra/media_plugins/base/media_plugin_base.h
index f1e96335f9..4dd157a07c 100644
--- a/indra/media_plugins/base/media_plugin_base.h
+++ b/indra/media_plugins/base/media_plugin_base.h
@@ -2,6 +2,7 @@
* @file media_plugin_base.h
* @brief Media plugin base class for LLMedia API plugin system
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/media_plugins/example/media_plugin_example.cpp b/indra/media_plugins/example/media_plugin_example.cpp
index 99e0199a29..f5b077fea0 100644
--- a/indra/media_plugins/example/media_plugin_example.cpp
+++ b/indra/media_plugins/example/media_plugin_example.cpp
@@ -2,6 +2,7 @@
* @file media_plugin_example.cpp
* @brief Example plugin for LLMedia API plugin system
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2009, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h
index ef41736c18..48accd3e66 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h
@@ -3,6 +3,7 @@
* @author Tofu Linden
* @brief implementation that supports media playback via GStreamer.
*
+ * @cond
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
* Copyright (c) 2007-2009, Linden Research, Inc.
@@ -29,6 +30,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
// header guard
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp
index cc52232496..52cea46d46 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp
@@ -2,6 +2,7 @@
* @file llmediaimplgstreamer_syms.cpp
* @brief dynamic GStreamer symbol-grabbing code
*
+ * @cond
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
* Copyright (c) 2007-2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#if LL_GSTREAMER010_ENABLED
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h
index ee7473d6d1..88f100af6e 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h
@@ -2,6 +2,7 @@
* @file llmediaimplgstreamer_syms.h
* @brief dynamic GStreamer symbol-grabbing code
*
+ * @cond
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
* Copyright (c) 2007-2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
index e31d4a3282..2244ccc146 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
@@ -2,6 +2,7 @@
* @file llmediaimplgstreamertriviallogging.h
* @brief minimal logging utilities.
*
+ * @cond
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
* Copyright (c) 2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef __LLMEDIAIMPLGSTREAMERTRIVIALLOGGING_H__
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp
index d8ccfaa702..5bb0ef5a99 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp
@@ -2,6 +2,7 @@
* @file llmediaimplgstreamervidplug.h
* @brief Video-consuming static GStreamer plugin for gst-to-LLMediaImpl
*
+ * @cond
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
* Copyright (c) 2007-2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#if LL_GSTREAMER010_ENABLED
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h
index f6d55b8758..208523e8d0 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h
@@ -2,6 +2,7 @@
* @file llmediaimplgstreamervidplug.h
* @brief Video-consuming static GStreamer plugin for gst-to-LLMediaImpl
*
+ * @cond
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
* Copyright (c) 2007-2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef __GST_SLVIDEO_H__
diff --git a/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
index a4c43988ba..d21ff26f83 100644
--- a/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
+++ b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
@@ -2,6 +2,7 @@
* @file media_plugin_gstreamer010.cpp
* @brief GStreamer-0.10 plugin for LLMedia API plugin system
*
+ * @cond
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
* Copyright (c) 2007, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
index 236f79978d..dbc44c8334 100644
--- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
+++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
@@ -2,6 +2,7 @@
* @file media_plugin_quicktime.cpp
* @brief QuickTime plugin for LLMedia API plugin system
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index 09348782a4..30c7483229 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -2,6 +2,7 @@
* @file media_plugin_webkit.cpp
* @brief Webkit plugin for LLMedia API plugin system
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "llqtwebkit.h"
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index e7e89d9701..91f43137c5 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -186,7 +186,7 @@ set(viewer_SOURCE_FILES
llfloatermediasettings.cpp
llfloatermemleak.cpp
llfloaternamedesc.cpp
- llfloaternearbymedia.cpp
+ llfloaternearbymedia.cpp
llfloaternotificationsconsole.cpp
llfloateropenobject.cpp
llfloaterparcel.cpp
@@ -213,6 +213,7 @@ set(viewer_SOURCE_FILES
llfloaterurldisplay.cpp
llfloaterurlentry.cpp
llfloatervoicedevicesettings.cpp
+ llfloatervolumepulldown.cpp
llfloaterwater.cpp
llfloaterwhitelistentry.cpp
llfloaterwindlight.cpp
@@ -292,6 +293,7 @@ set(viewer_SOURCE_FILES
llnetmap.cpp
llnotificationalerthandler.cpp
llnotificationgrouphandler.cpp
+ llnotificationhandlerutil.cpp
llnotificationmanager.cpp
llnotificationofferhandler.cpp
llnotificationscripthandler.cpp
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index f196ebbf93..eb08707b61 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -907,6 +907,7 @@ static LLFastTimer::DeclareTimer FTM_SLEEP("Sleep");
static LLFastTimer::DeclareTimer FTM_TEXTURE_CACHE("Texture Cache");
static LLFastTimer::DeclareTimer FTM_DECODE("Image Decode");
static LLFastTimer::DeclareTimer FTM_VFS("VFS Thread");
+static LLFastTimer::DeclareTimer FTM_LFS("LFS Thread");
static LLFastTimer::DeclareTimer FTM_PAUSE_THREADS("Pause Threads");
static LLFastTimer::DeclareTimer FTM_IDLE("Idle");
static LLFastTimer::DeclareTimer FTM_PUMP("Pump");
@@ -1123,6 +1124,10 @@ bool LLAppViewer::mainLoop()
LLFastTimer ftm(FTM_VFS);
io_pending += LLVFSThread::updateClass(1);
}
+ {
+ LLFastTimer ftm(FTM_LFS);
+ io_pending += LLLFSThread::updateClass(1);
+ }
if (io_pending > 1000)
{
diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index 8f3eba98a6..44cbbbb6b2 100644
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -303,5 +303,9 @@ void LLAvatarIconCtrl::nameUpdatedCallback(
{
setToolTip(mFirstName + " " + mLastName);
}
+ else
+ {
+ setToolTip(std::string(""));
+ }
}
}
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
index b41f962ffa..d6ae4603b4 100644
--- a/indra/newview/llcallfloater.cpp
+++ b/indra/newview/llcallfloater.cpp
@@ -35,6 +35,7 @@
#include "llcallfloater.h"
+#include "llagentdata.h" // for gAgentID
#include "llavatarlist.h"
#include "llbottomtray.h"
#include "llparticipantlist.h"
@@ -46,12 +47,14 @@ LLCallFloater::LLCallFloater(const LLSD& key)
, mSpeakerManager(NULL)
, mPaticipants(NULL)
, mAvatarList(NULL)
+, mVoiceType(VC_LOCAL_CHAT)
{
}
LLCallFloater::~LLCallFloater()
{
+ mChannelChangedConnection.disconnect();
delete mPaticipants;
mPaticipants = NULL;
}
@@ -61,6 +64,7 @@ BOOL LLCallFloater::postBuild()
{
LLDockableFloater::postBuild();
mAvatarList = getChild<LLAvatarList>("speakers_list");
+ childSetAction("leave_call_btn", boost::bind(&LLCallFloater::leaveCall, this));
LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_panel");
@@ -69,11 +73,13 @@ BOOL LLCallFloater::postBuild()
anchor_panel, this,
getDockTongue(), LLDockControl::TOP));
+ initAgentData();
+
// update list for current session
updateSession();
// subscribe to to be notified Voice Channel is changed
- LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::onCurrentChannelChanged, this, _1));
+ mChannelChangedConnection = LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::onCurrentChannelChanged, this, _1));
return TRUE;
}
@@ -85,6 +91,14 @@ void LLCallFloater::onOpen(const LLSD& /*key*/)
//////////////////////////////////////////////////////////////////////////
/// PRIVATE SECTION
//////////////////////////////////////////////////////////////////////////
+
+void LLCallFloater::leaveCall()
+{
+ LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel();
+ if (voice_channel && voice_channel->isActive())
+ voice_channel->deactivate();
+}
+
void LLCallFloater::updateSession()
{
LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel();
@@ -110,6 +124,19 @@ void LLCallFloater::updateSession()
if (im_session)
{
mSpeakerManager = LLIMModel::getInstance()->getSpeakerManager(session_id);
+ switch (im_session->mType)
+ {
+ case IM_NOTHING_SPECIAL:
+ case IM_SESSION_P2P_INVITE:
+ mVoiceType = VC_PEER_TO_PEER;
+ break;
+ case IM_SESSION_CONFERENCE_START:
+ mVoiceType = VC_AD_HOC_CHAT;
+ break;
+ default:
+ mVoiceType = VC_GROUP_CHAT;
+ break;
+ }
}
if (NULL == mSpeakerManager)
@@ -117,8 +144,15 @@ void LLCallFloater::updateSession()
// by default let show nearby chat participants
mSpeakerManager = LLLocalSpeakerMgr::getInstance();
lldebugs << "Set DEFAULT speaker manager" << llendl;
+ mVoiceType = VC_LOCAL_CHAT;
}
+ updateTitle();
+
+ //hide "Leave Call" button for nearby chat
+ bool isLocalChat = mVoiceType == VC_LOCAL_CHAT;
+ childSetVisible("leave_btn_panel", !isLocalChat);
+
refreshPartisipantList();
}
@@ -129,10 +163,54 @@ void LLCallFloater::refreshPartisipantList()
bool do_not_use_context_menu_in_local_chat = LLLocalSpeakerMgr::getInstance() != mSpeakerManager;
mPaticipants = new LLParticipantList(mSpeakerManager, mAvatarList, do_not_use_context_menu_in_local_chat);
+
+ if (!do_not_use_context_menu_in_local_chat)
+ {
+ mAvatarList->setNoItemsCommentText(getString("no_one_near"));
+ }
}
void LLCallFloater::onCurrentChannelChanged(const LLUUID& /*session_id*/)
{
+ // Forget speaker manager from the previous session to avoid using it after session was destroyed.
+ mSpeakerManager = NULL;
updateSession();
}
+
+void LLCallFloater::updateTitle()
+{
+ LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel();
+ std::string title;
+ switch (mVoiceType)
+ {
+ case VC_LOCAL_CHAT:
+ title = getString("title_nearby");
+ break;
+ case VC_PEER_TO_PEER:
+ title = voice_channel->getSessionName();
+ break;
+ case VC_AD_HOC_CHAT:
+ title = getString("title_adhoc");
+ break;
+ case VC_GROUP_CHAT:
+ LLStringUtil::format_map_t args;
+ args["[GROUP]"] = voice_channel->getSessionName();
+ title = getString("title_group", args);
+ break;
+ }
+
+ setTitle(title);
+}
+
+void LLCallFloater::initAgentData()
+{
+ childSetValue("user_icon", gAgentID);
+
+ std::string name;
+ gCacheName->getFullName(gAgentID, name);
+ childSetValue("user_text", name);
+
+ LLOutputMonitorCtrl* speaking_indicator = getChild<LLOutputMonitorCtrl>("speaking_indicator");
+ speaking_indicator->setSpeakerId(gAgentID);
+}
//EOF
diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h
index bfaa1075c4..d0a2ca5303 100644
--- a/indra/newview/llcallfloater.h
+++ b/indra/newview/llcallfloater.h
@@ -48,8 +48,8 @@ class LLSpeakerMgr;
* the Resident's own microphone input volume, the audible volume of each of the other participants,
* the Resident's own Voice Morphing settings (if she has subscribed to enable the feature), and Voice Recording.
*
- * When the Resident is engaged in Group Voice Chat, the Voice Control Panel also provides an
- * 'End Call' button to allow the Resident to leave that voice channel.
+ * 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
{
@@ -61,6 +61,16 @@ public:
/*virtual*/ void onOpen(const LLSD& key);
private:
+ typedef enum e_voice_controls_type
+ {
+ VC_LOCAL_CHAT,
+ VC_GROUP_CHAT,
+ VC_AD_HOC_CHAT,
+ VC_PEER_TO_PEER
+ }EVoiceControls;
+
+ void leaveCall();
+
/**
* Updates mSpeakerManager and list according to current Voice Channel
*
@@ -74,11 +84,16 @@ private:
*/
void refreshPartisipantList();
void onCurrentChannelChanged(const LLUUID& session_id);
+ void updateTitle();
+ void initAgentData();
private:
LLSpeakerMgr* mSpeakerManager;
LLParticipantList* mPaticipants;
LLAvatarList* mAvatarList;
+ EVoiceControls mVoiceType;
+
+ boost::signals2::connection mChannelChangedConnection;
};
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index 476f1f41ac..714bd20ab8 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -633,20 +633,21 @@ void LLAvatarTracker::processChange(LLMessageSystem* msg)
{
if((mBuddyInfo[agent_id]->getRightsGrantedFrom() ^ new_rights) & LLRelationship::GRANT_MODIFY_OBJECTS)
{
- std::string first, last;
+ std::string name;
LLSD args;
- if(gCacheName->getName(agent_id, first, last))
+ if(gCacheName->getFullName(agent_id, name))
{
- args["FIRST_NAME"] = first;
- args["LAST_NAME"] = last;
+ args["NAME"] = name;
}
+ LLSD payload;
+ payload["from_id"] = agent_id;
if(LLRelationship::GRANT_MODIFY_OBJECTS & new_rights)
{
- LLNotificationsUtil::add("GrantedModifyRights",args);
+ LLNotificationsUtil::add("GrantedModifyRights",args, payload);
}
else
{
- LLNotificationsUtil::add("RevokedModifyRights",args);
+ LLNotificationsUtil::add("RevokedModifyRights",args, payload);
}
}
(mBuddyInfo[agent_id])->setRightsFrom(new_rights);
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index caf9c08057..078c2518c6 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -267,20 +267,20 @@ protected:
}
private:
- std::string appendTime(const LLChat& chat)
- {
- time_t utc_time;
- utc_time = time_corrected();
- std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
- +LLTrans::getString("TimeMin")+"] ";
-
- LLSD substitution;
-
- substitution["datetime"] = (S32) utc_time;
- LLStringUtil::format (timeStr, substitution);
-
- return timeStr;
- }
+ std::string appendTime(const LLChat& chat)
+ {
+ time_t utc_time;
+ utc_time = time_corrected();
+ std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
+ +LLTrans::getString("TimeMin")+"] ";
+
+ LLSD substitution;
+
+ substitution["datetime"] = (S32) utc_time;
+ LLStringUtil::format (timeStr, substitution);
+
+ return timeStr;
+ }
void setTimeField(const LLChat& chat)
{
@@ -302,7 +302,7 @@ private:
time_box->translate(delta_pos_x, delta_pos_y);
//... & change width of the name control
- LLTextBox* user_name = getChild<LLTextBox>("user_name");
+ LLView* user_name = getChild<LLView>("user_name");
const LLRect& user_rect = user_name->getRect();
user_name->reshape(user_rect.getWidth() + delta_pos_x, user_rect.getHeight());
}
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index f41e326dd0..d533743cfc 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -595,8 +595,49 @@ void LLAdHocChiclet::setCounter(S32 counter)
setShowNewMessagesIcon(counter);
}
+void LLAdHocChiclet::createPopupMenu()
+{
+ if(mPopupMenu)
+ {
+ llwarns << "Menu already exists" << llendl;
+ return;
+ }
+ if(getSessionId().isNull())
+ {
+ return;
+ }
+
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ registrar.add("IMChicletMenu.Action", boost::bind(&LLAdHocChiclet::onMenuItemClicked, this, _2));
+
+ mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>
+ ("menu_imchiclet_adhoc.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+}
+
+void LLAdHocChiclet::onMenuItemClicked(const LLSD& user_data)
+{
+ std::string level = user_data.asString();
+ LLUUID group_id = getSessionId();
+
+ if("end" == level)
+ {
+ LLGroupActions::endIM(group_id);
+ }
+}
+
BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
+ if(!mPopupMenu)
+ {
+ createPopupMenu();
+ }
+
+ if (mPopupMenu)
+ {
+ mPopupMenu->arrangeAndClear();
+ LLMenuGL::showPopup(this, mPopupMenu, x, y);
+ }
+
return TRUE;
}
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index 1ea141e6c4..ed4bcbc6ac 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -518,6 +518,17 @@ protected:
friend class LLUICtrlFactory;
/**
+ * Creates chiclet popup menu. Will create AdHoc Chat menu
+ * based on other participant's id.
+ */
+ virtual void createPopupMenu();
+
+ /**
+ * Processes clicks on chiclet popup menu.
+ */
+ virtual void onMenuItemClicked(const LLSD& user_data);
+
+ /**
* Displays popup menu.
*/
virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index 80b0a430e0..58c0c19761 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -269,10 +269,10 @@ LLSD LLFloaterAbout::getInfo()
info["J2C_VERSION"] = LLImageJ2C::getEngineInfo();
bool want_fullname = true;
info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD();
- info["VIVOX_VERSION"] = gVoiceClient ? gVoiceClient->getAPIVersion() : "Unknown";
+ info["VIVOX_VERSION"] = gVoiceClient ? gVoiceClient->getAPIVersion() : LLTrans::getString("NotConnected");
// TODO: Implement media plugin version query
- info["QT_WEBKIT_VERSION"] = "4.5.2";
+ info["QT_WEBKIT_VERSION"] = "4.5.2 (version number hard-coded)";
if (gPacketsIn > 0)
{
diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp
index 44e68d7745..f7ce826a39 100644
--- a/indra/newview/llfloatermediasettings.cpp
+++ b/indra/newview/llfloatermediasettings.cpp
@@ -41,6 +41,7 @@
#include "lluictrlfactory.h"
#include "llbutton.h"
#include "llselectmgr.h"
+#include "llsdutil.h"
LLFloaterMediaSettings* LLFloaterMediaSettings::sInstance = NULL;
@@ -145,15 +146,15 @@ LLFloaterMediaSettings* LLFloaterMediaSettings::getInstance()
//static
void LLFloaterMediaSettings::apply()
{
- LLSD settings;
+ LLSD settings;
sInstance->mPanelMediaSettingsGeneral->preApply();
- sInstance->mPanelMediaSettingsGeneral->getValues( settings );
+ sInstance->mPanelMediaSettingsGeneral->getValues( settings );
sInstance->mPanelMediaSettingsSecurity->preApply();
sInstance->mPanelMediaSettingsSecurity->getValues( settings );
sInstance->mPanelMediaSettingsPermissions->preApply();
- sInstance->mPanelMediaSettingsPermissions->getValues( settings );
+ sInstance->mPanelMediaSettingsPermissions->getValues( settings );
LLSelectMgr::getInstance()->selectionSetMedia( LLTextureEntry::MF_HAS_MEDIA );
- LLSelectMgr::getInstance()->selectionSetMediaData(settings);
+ LLSelectMgr::getInstance()->selectionSetMediaData(settings);
sInstance->mPanelMediaSettingsGeneral->postApply();
sInstance->mPanelMediaSettingsSecurity->postApply();
sInstance->mPanelMediaSettingsPermissions->postApply();
@@ -183,7 +184,12 @@ void LLFloaterMediaSettings::initValues( const LLSD& media_settings, bool editab
sInstance->mPanelMediaSettingsPermissions->
initValues( sInstance->mPanelMediaSettingsPermissions, media_settings, editable );
-
+
+ // Squirrel away initial values
+ sInstance->mInitialValues.clear();
+ sInstance->mPanelMediaSettingsGeneral->getValues( sInstance->mInitialValues );
+ sInstance->mPanelMediaSettingsSecurity->getValues( sInstance->mInitialValues );
+ sInstance->mPanelMediaSettingsPermissions->getValues( sInstance->mInitialValues );
}
////////////////////////////////////////////////////////////////////////////////
@@ -206,7 +212,7 @@ void LLFloaterMediaSettings::clearValues( bool editable)
{
// clean up all panels before updating
sInstance->mPanelMediaSettingsGeneral ->clearValues(sInstance->mPanelMediaSettingsGeneral, editable);
- sInstance->mPanelMediaSettingsSecurity ->clearValues(sInstance->mPanelMediaSettingsSecurity, editable);
+ sInstance->mPanelMediaSettingsSecurity ->clearValues(sInstance->mPanelMediaSettingsSecurity, editable);
sInstance->mPanelMediaSettingsPermissions->clearValues(sInstance->mPanelMediaSettingsPermissions, editable);
}
@@ -235,7 +241,7 @@ void LLFloaterMediaSettings::onBtnApply( void* userdata )
// static
void LLFloaterMediaSettings::onBtnCancel( void* userdata )
{
- sInstance->closeFloater();
+ sInstance->closeFloater();
}
////////////////////////////////////////////////////////////////////////////////
@@ -250,7 +256,6 @@ void LLFloaterMediaSettings::onTabChanged(void* user_data, bool from_click)
//
void LLFloaterMediaSettings::enableOkApplyBtns( bool enable )
{
- setCtrlsEnabled( enable );
childSetEnabled( "OK", enable );
childSetEnabled( "Apply", enable );
}
@@ -265,7 +270,6 @@ const std::string LLFloaterMediaSettings::getHomeUrl()
return std::string( "" );
}
-
////////////////////////////////////////////////////////////////////////////////
//
bool LLFloaterMediaSettings::passesWhiteList( const std::string& test_url )
@@ -279,3 +283,36 @@ bool LLFloaterMediaSettings::passesWhiteList( const std::string& test_url )
// this is all we can do
return false;
}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+void LLFloaterMediaSettings::draw()
+{
+ // *NOTE: The code below is very inefficient. Better to do this
+ // only when data change.
+ // Every frame, check to see what the values are. If they are not
+ // the same as the default media data, enable the OK/Apply buttons
+ LLSD settings;
+ sInstance->mPanelMediaSettingsGeneral->getValues( settings );
+ sInstance->mPanelMediaSettingsSecurity->getValues( settings );
+ sInstance->mPanelMediaSettingsPermissions->getValues( settings );
+
+ bool values_changed = false;
+
+ LLSD::map_const_iterator iter = settings.beginMap();
+ LLSD::map_const_iterator end = settings.endMap();
+ for ( ; iter != end; ++iter )
+ {
+ const std::string &current_key = iter->first;
+ const LLSD &current_value = iter->second;
+ if ( ! llsd_equals(current_value, mInitialValues[current_key]))
+ {
+ values_changed = true;
+ break;
+ }
+ }
+
+ enableOkApplyBtns(values_changed);
+
+ LLFloater::draw();
+}
diff --git a/indra/newview/llfloatermediasettings.h b/indra/newview/llfloatermediasettings.h
index 17a47cb0f5..e2af1705bf 100644
--- a/indra/newview/llfloatermediasettings.h
+++ b/indra/newview/llfloatermediasettings.h
@@ -54,11 +54,13 @@ public:
static void apply();
static void initValues( const LLSD& media_settings , bool editable);
static void clearValues( bool editable);
- void enableOkApplyBtns( bool enable );
- LLPanelMediaSettingsSecurity* getPanelSecurity(){return mPanelMediaSettingsSecurity;};
- const std::string getHomeUrl();
+
+ LLPanelMediaSettingsSecurity* getPanelSecurity(){return mPanelMediaSettingsSecurity;};
+ const std::string getHomeUrl();
bool passesWhiteList( const std::string& test_url );
+ virtual void draw();
+
bool mIdenticalHasMediaInfo;
bool mMultipleMedia;
bool mMultipleValidMedia;
@@ -83,6 +85,10 @@ protected:
static LLFloaterMediaSettings* sInstance;
private:
+
+ void enableOkApplyBtns( bool enable );
+
+ LLSD mInitialValues;
bool mWaitingToClose;
};
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 83c784c1f7..5128a7b861 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -106,6 +106,7 @@
#include "llviewermedia.h"
#include "llpluginclassmedia.h"
#include "llteleporthistorystorage.h"
+#include "llnearbychat.h"
#include <boost/regex.hpp>
@@ -361,6 +362,8 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
BOOL LLFloaterPreference::postBuild()
{
gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&LLIMFloater::processChatHistoryStyleUpdate, _2));
+
+ gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&LLNearbyChat::processChatHistoryStyleUpdate, _2));
LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index e2df2ffdf7..c8ff36b4f4 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -37,6 +37,7 @@
#include "lllogininstance.h"
#include "lluri.h"
#include "llagent.h"
+#include "llui.h"
LLFloaterSearch::LLFloaterSearch(const LLSD& key) :
LLFloater(key),
@@ -139,6 +140,9 @@ void LLFloaterSearch::search(const LLSD &key)
}
url += "&r=" + maturity;
+ // add the current localization information
+ url += "&lang=" + LLUI::getLanguage();
+
// and load the URL in the web view
mBrowser->navigateTo(url);
}
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index 6fe8ed0e4d..99b58f2170 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -100,9 +100,9 @@ public:
}
if (tokens[1].asString() == "inspect")
{
- LLSD key;
- key["group_id"] = group_id;
- LLFloaterReg::showInstance("inspect_group", key);
+ if (group_id.isNull())
+ return true;
+ LLGroupActions::show(group_id);
return true;
}
return false;
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 310eaaec27..5e9ffdf410 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -34,6 +34,8 @@
#include "llimfloater.h"
+#include "llnotificationsutil.h"
+
#include "llagent.h"
#include "llappviewer.h"
#include "llbutton.h"
@@ -634,6 +636,9 @@ void LLIMFloater::processAgentListUpdates(const LLSD& body)
else
label = LLTrans::getString("IM_to_label") + " " + LLIMModel::instance().getName(mSessionID);
mInputEditor->setLabel(label);
+
+ if (moderator_muted_text)
+ LLNotificationsUtil::add("TextChatIsMutedByModerator");
}
}
}
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index dff339fa63..5481ca97cd 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -83,19 +83,16 @@
#include "llfirstuse.h"
#include "llagentui.h"
+const static std::string IM_TIME("time");
+const static std::string IM_TEXT("message");
+const static std::string IM_FROM("from");
+const static std::string IM_FROM_ID("from_id");
+
//
// Globals
//
LLIMMgr* gIMMgr = NULL;
-//
-// Statics
-//
-// *FIXME: make these all either UIStrings or Strings
-
-const static std::string IM_SEPARATOR(": ");
-
-
void toast_callback(const LLSD& msg){
// do not show toast in busy mode or it goes from agent
if (gAgent.getBusy() || gAgent.getID() == msg["from_id"])
@@ -193,7 +190,13 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
}
if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") )
- LLLogChat::loadHistory(mName, &chatFromLogFile, (void *)this);
+ {
+ std::list<LLSD> chat_history;
+
+ //involves parsing of a chat history
+ LLLogChat::loadAllHistory(mName, chat_history);
+ addMessagesFromHistory(chat_history);
+ }
}
void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
@@ -233,6 +236,12 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
break;
}
}
+
+ // Update speakers list when connected
+ if (LLVoiceChannel::STATE_CONNECTED == new_state)
+ {
+ mSpeakers->update(true);
+ }
}
else // group || ad-hoc calls
{
@@ -297,6 +306,30 @@ void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& f
}
}
+void LLIMModel::LLIMSession::addMessagesFromHistory(const std::list<LLSD>& history)
+{
+ std::list<LLSD>::const_iterator it = history.begin();
+ while (it != history.end())
+ {
+ const LLSD& msg = *it;
+
+ std::string from = msg[IM_FROM];
+ LLUUID from_id = LLUUID::null;
+ if (msg[IM_FROM_ID].isUndefined())
+ {
+ gCacheName->getUUID(from, from_id);
+ }
+
+
+ std::string timestamp = msg[IM_TIME];
+ std::string text = msg[IM_TEXT];
+
+ addMessage(from, from_id, text, timestamp);
+
+ it++;
+ }
+}
+
void LLIMModel::LLIMSession::chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata)
{
if (!userdata) return;
@@ -445,6 +478,19 @@ bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from,
return true;
}
+bool LLIMModel::logToFile(const std::string& session_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
+{
+ if (gSavedPerAccountSettings.getBOOL("LogInstantMessages"))
+ {
+ LLLogChat::saveHistory(session_name, from, from_id, utf8_text);
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
{
if (gSavedPerAccountSettings.getBOOL("LogInstantMessages"))
@@ -479,7 +525,7 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co
const std::string& utf8_text, bool log2file /* = true */) {
LLIMSession* session = findIMSession(session_id);
- if (!session)
+ if (!session)
{
llwarns << "session " << session_id << "does not exist " << llendl;
return false;
@@ -1329,7 +1375,8 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
session_id = gIMMgr->addP2PSession(
mPayload["session_name"].asString(),
mPayload["caller_id"].asUUID(),
- mPayload["session_handle"].asString());
+ mPayload["session_handle"].asString(),
+ mPayload["session_uri"].asString());
if (voice)
{
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 79b0acad69..66f92c83a5 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -60,6 +60,8 @@ public:
virtual ~LLIMSession();
void sessionInitReplyReceived(const LLUUID& new_session_id);
+
+ 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);
static void chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata);
@@ -200,6 +202,11 @@ public:
void testMessages();
+ /**
+ * Saves an IM message into a file
+ */
+ bool logToFile(const std::string& session_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text);
+
private:
/**
@@ -272,11 +279,16 @@ public:
const LLUUID& other_participant_id,
const LLDynamicArray<LLUUID>& ids);
- // Creates a P2P session with the requisite handle for responding to voice calls
+ /**
+ * Creates a P2P session with the requisite handle for responding to voice calls.
+ *
+ * @param caller_uri - sip URI of caller. It should be always be passed into the method to avoid
+ * incorrect working of LLVoiceChannel instances. See EXT-2985.
+ */
LLUUID addP2PSession(const std::string& name,
const LLUUID& other_participant_id,
const std::string& voice_session_handle,
- const std::string& caller_uri = LLStringUtil::null);
+ const std::string& caller_uri);
/**
* Leave the session with session id. Send leave session notification
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 9caa863bd8..33fd3e3bf1 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -32,15 +32,59 @@
#include "llviewerprecompiledheaders.h"
+#include "llagent.h"
+#include "llagentui.h"
#include "lllogchat.h"
-#include "llappviewer.h"
#include "llfloaterchat.h"
#include "lltrans.h"
#include "llviewercontrol.h"
-#include "llsdserialize.h"
+
+#include <boost/algorithm/string/trim.hpp>
+#include <boost/algorithm/string/replace.hpp>
+#include <boost/regex.hpp>
+#include <boost/regex/v4/match_results.hpp>
const S32 LOG_RECALL_SIZE = 2048;
+const static std::string IM_TIME("time");
+const static std::string IM_TEXT("message");
+const static std::string IM_FROM("from");
+const static std::string IM_FROM_ID("from_id");
+const static std::string IM_SEPARATOR(": ");
+
+const static std::string NEW_LINE("\n");
+const static std::string NEW_LINE_SPACE_PREFIX("\n ");
+const static std::string TWO_SPACES(" ");
+const static std::string MULTI_LINE_PREFIX(" ");
+
+//viewer 1.23 may have used "You" for Agent's entries
+const static std::string YOU("You");
+
+/**
+ * Chat log lines - timestamp and name are optional but message text is mandatory.
+ *
+ * Typical plain text chat log lines:
+ *
+ * SuperCar: You aren't the owner
+ * [2:59] SuperCar: You aren't the owner
+ * [2009/11/20 3:00] SuperCar: You aren't the owner
+ * Katar Ivercourt is Offline
+ * [3:00] Katar Ivercourt is Offline
+ * [2009/11/20 3:01] Corba ProductEngine is Offline
+ */
+const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}\\]\\s+|\\[\\d{1,2}:\\d{2}\\]\\s+)?(.*)$");
+
+/**
+ * Regular expression suitable to match names like
+ * "You", "Second Life", "Igor ProductEngine", "Object", "Mega House"
+ */
+const static boost::regex NAME_AND_TEXT("(You:|Second Life:|[^\\s:]+\\s*[:]{1}|\\S+\\s+[^\\s:]+[:]{1})?(\\s*)(.*)");
+
+const static int IDX_TIMESTAMP = 1;
+const static int IDX_STUFF = 2;
+const static int IDX_NAME = 1;
+const static int IDX_TEXT = 3;
+
//static
std::string LLLogChat::makeLogFileName(std::string filename)
{
@@ -118,7 +162,7 @@ void LLLogChat::saveHistory(const std::string& filename,
item["from_id"] = from_id;
item["message"] = line;
- file << LLSDOStreamer <LLSDNotationFormatter>(item) << std::endl;
+ file << LLChatLogFormatter(item) << std::endl;
file.close();
}
@@ -154,9 +198,6 @@ void LLLogChat::loadHistory(const std::string& filename, void (*callback)(ELogLi
}
}
- // the parser's destructor is protected so we cannot create in the stack.
- LLPointer<LLSDParser> parser = new LLSDNotationParser();
-
while ( fgets(buffer, LOG_RECALL_SIZE, fptr) && !feof(fptr) )
{
len = strlen(buffer) - 1; /*Flawfinder: ignore*/
@@ -167,7 +208,8 @@ void LLLogChat::loadHistory(const std::string& filename, void (*callback)(ELogLi
LLSD item;
std::string line(buffer);
std::istringstream iss(line);
- if (parser->parse(iss, item, line.length()) == LLSDParser::PARSE_FAILURE)
+
+ if (!LLChatLogParser::parse(line, item))
{
item["message"] = line;
callback(LOG_LINE, item, userdata);
@@ -187,3 +229,197 @@ void LLLogChat::loadHistory(const std::string& filename, void (*callback)(ELogLi
fclose(fptr);
}
}
+
+void append_to_last_message(std::list<LLSD>& messages, const std::string& line)
+{
+ if (!messages.size()) return;
+
+ std::string im_text = messages.back()[IM_TEXT].asString();
+ im_text.append(line);
+ messages.back()[IM_TEXT] = im_text;
+}
+
+void LLLogChat::loadAllHistory(const std::string& session_name, std::list<LLSD>& messages)
+{
+ if (session_name.empty())
+ {
+ llwarns << "Session name is Empty!" << llendl;
+ return ;
+ }
+
+ LLFILE* fptr = LLFile::fopen(makeLogFileName(session_name), "r"); /*Flawfinder: ignore*/
+ if (!fptr) return; //No previous conversation with this name.
+
+ char buffer[LOG_RECALL_SIZE]; /*Flawfinder: ignore*/
+ char *bptr;
+ S32 len;
+ bool firstline = TRUE;
+
+ if (fseek(fptr, (LOG_RECALL_SIZE - 1) * -1 , SEEK_END))
+ { //File is smaller than recall size. Get it all.
+ firstline = FALSE;
+ if (fseek(fptr, 0, SEEK_SET))
+ {
+ fclose(fptr);
+ return;
+ }
+ }
+
+ while (fgets(buffer, LOG_RECALL_SIZE, fptr) && !feof(fptr))
+ {
+ len = strlen(buffer) - 1; /*Flawfinder: ignore*/
+ for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--) *bptr='\0';
+
+ if (firstline)
+ {
+ firstline = FALSE;
+ continue;
+ }
+
+ std::string line(buffer);
+
+ //updated 1.23 plaint text log format requires a space added before subsequent lines in a multilined message
+ if (' ' == line[0])
+ {
+ line.erase(0, MULTI_LINE_PREFIX.length());
+ append_to_last_message(messages, '\n' + line);
+ }
+ else if (0 == len && ('\n' == line[0] || '\r' == line[0]))
+ {
+ //to support old format's multilined messages with new lines used to divide paragraphs
+ append_to_last_message(messages, line);
+ }
+ else
+ {
+ LLSD item;
+ if (!LLChatLogParser::parse(line, item))
+ {
+ item[IM_TEXT] = line;
+ }
+ messages.push_back(item);
+ }
+ }
+ fclose(fptr);
+}
+
+//*TODO mark object's names in a special way so that they will be distinguishable form avatar name
+//which are more strict by its nature (only firstname and secondname)
+//Example, an object's name can be writen like "Object <actual_object's_name>"
+void LLChatLogFormatter::format(const LLSD& im, std::ostream& ostr) const
+{
+ if (!im.isMap())
+ {
+ llwarning("invalid LLSD type of an instant message", 0);
+ return;
+ }
+
+ if (im[IM_TIME].isDefined())
+ {
+ std::string timestamp = im[IM_TIME].asString();
+ boost::trim(timestamp);
+ ostr << '[' << timestamp << ']' << TWO_SPACES;
+ }
+
+ //*TODO mark object's names in a special way so that they will be distinguishable form avatar name
+ //which are more strict by its nature (only firstname and secondname)
+ //Example, an object's name can be writen like "Object <actual_object's_name>"
+ if (im[IM_FROM].isDefined())
+ {
+ std::string from = im[IM_FROM].asString();
+ boost::trim(from);
+ if (from.size())
+ {
+ ostr << from << IM_SEPARATOR;
+ }
+ }
+
+ if (im[IM_TEXT].isDefined())
+ {
+ std::string im_text = im[IM_TEXT].asString();
+
+ //multilined text will be saved with prepended spaces
+ boost::replace_all(im_text, NEW_LINE, NEW_LINE_SPACE_PREFIX);
+ ostr << im_text;
+ }
+}
+
+bool LLChatLogParser::parse(std::string& raw, LLSD& im)
+{
+ if (!raw.length()) return false;
+
+ im = LLSD::emptyMap();
+
+ //matching a timestamp
+ boost::match_results<std::string::const_iterator> matches;
+ if (!boost::regex_match(raw, matches, TIMESTAMP_AND_STUFF)) return false;
+
+ bool has_timestamp = matches[IDX_TIMESTAMP].matched;
+ if (has_timestamp)
+ {
+ //timestamp was successfully parsed
+ std::string timestamp = matches[IDX_TIMESTAMP];
+ boost::trim(timestamp);
+ timestamp.erase(0, 1);
+ timestamp.erase(timestamp.length()-1, 1);
+ im[IM_TIME] = timestamp;
+ }
+ else
+ {
+ //timestamp is optional
+ im[IM_TIME] = "";
+ }
+
+ bool has_stuff = matches[IDX_STUFF].matched;
+ if (!has_stuff)
+ {
+ return false; //*TODO should return false or not?
+ }
+
+ //matching a name and a text
+ std::string stuff = matches[IDX_STUFF];
+ boost::match_results<std::string::const_iterator> name_and_text;
+ if (!boost::regex_match(stuff, name_and_text, NAME_AND_TEXT)) return false;
+
+ bool has_name = name_and_text[IDX_NAME].matched;
+ std::string name = name_and_text[IDX_NAME];
+
+ //we don't need a name/text separator
+ if (has_name && name.length() && name[name.length()-1] == ':')
+ {
+ name.erase(name.length()-1, 1);
+ }
+
+ if (!has_name || name == SYSTEM_FROM)
+ {
+ //name is optional too
+ im[IM_FROM] = SYSTEM_FROM;
+ im[IM_FROM_ID] = LLUUID::null;
+ }
+
+ if (!has_name)
+ {
+ //text is mandatory
+ im[IM_TEXT] = stuff;
+ return true; //parse as a message from Second Life
+ }
+
+ bool has_text = name_and_text[IDX_TEXT].matched;
+ if (!has_text) return false;
+
+ //for parsing logs created in very old versions of a viewer
+ if (name == "You")
+ {
+ std::string agent_name;
+ LLAgentUI::buildFullname(agent_name);
+ im[IM_FROM] = agent_name;
+ im[IM_FROM_ID] = gAgentID;
+ }
+ else
+ {
+ im[IM_FROM] = name;
+ }
+
+
+ im[IM_TEXT] = name_and_text[IDX_TEXT];
+ return true; //parsed name and message text, maybe have a timestamp too
+}
diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h
index e252cd7d41..3d3f5c4458 100644
--- a/indra/newview/lllogchat.h
+++ b/indra/newview/lllogchat.h
@@ -51,11 +51,66 @@ public:
const LLUUID& from_id,
const std::string& line);
+ /** @deprecated @see loadAllHistory() */
static void loadHistory(const std::string& filename,
void (*callback)(ELogLineType, const LLSD&, void*),
void* userdata);
+
+ static void loadAllHistory(const std::string& session_name, std::list<LLSD>& messages);
private:
static std::string cleanFileName(std::string filename);
};
+/**
+ * Formatter for the plain text chat log files
+ */
+class LLChatLogFormatter
+{
+public:
+ LLChatLogFormatter(const LLSD& im) : mIM(im) {}
+ virtual ~LLChatLogFormatter() {};
+
+ friend std::ostream& operator<<(std::ostream& str, const LLChatLogFormatter& formatter)
+ {
+ formatter.format(formatter.mIM, str);
+ return str;
+ }
+
+protected:
+
+ /**
+ * Format an instant message to a stream
+ * Timestamps and sender names are required
+ * New lines of multilined messages are prepended with a space
+ */
+ void format(const LLSD& im, std::ostream& ostr) const;
+
+ LLSD mIM;
+};
+
+/**
+ * Parser for the plain text chat log files
+ */
+class LLChatLogParser
+{
+public:
+
+ /**
+ * Parse a line from the plain text chat log file
+ * General plain text log format is like: "[timestamp] [name]: [message]"
+ * [timestamp] and [name] are optional
+ * Examples of plain text chat log lines:
+ * "[2009/11/20 2:53] Igor ProductEngine: howdy"
+ * "Igor ProductEngine: howdy"
+ * "Dserduk ProductEngine is Online"
+ *
+ * @return false if failed to parse mandatory data - message text
+ */
+ static bool parse(std::string& raw, LLSD& im);
+
+protected:
+ LLChatLogParser();
+ virtual ~LLChatLogParser() {};
+};
+
#endif
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 8f1dec1431..ee3be0a5e3 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -57,6 +57,7 @@
#include "lltrans.h"
#include "llbottomtray.h"
#include "llnearbychatbar.h"
+#include "llfloaterreg.h"
static const S32 RESIZE_BAR_THICKNESS = 3;
@@ -145,7 +146,7 @@ std::string appendTime()
return timeStr;
}
-void LLNearbyChat::addMessage(const LLChat& chat)
+void LLNearbyChat::addMessage(const LLChat& chat,bool archive)
{
if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
{
@@ -207,6 +208,13 @@ void LLNearbyChat::addMessage(const LLChat& chat)
mChatHistory->appendMessage(chat,use_plain_text_chat_history);
}
}
+
+ if(archive)
+ {
+ mMessageArchive.push_back(chat);
+ if(mMessageArchive.size()>200)
+ mMessageArchive.erase(mMessageArchive.begin());
+ }
}
void LLNearbyChat::onNearbySpeakers()
@@ -256,3 +264,19 @@ void LLNearbyChat::getAllowedRect(LLRect& rect)
{
rect = gViewerWindow->getWorldViewRectScaled();
}
+
+void LLNearbyChat::updateChatHistoryStyle()
+{
+ mChatHistory->clear();
+ for(std::vector<LLChat>::iterator it = mMessageArchive.begin();it!=mMessageArchive.end();++it)
+ {
+ addMessage(*it,false);
+ }
+}
+//static
+void LLNearbyChat::processChatHistoryStyleUpdate(const LLSD& newvalue)
+{
+ LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ if(nearby_chat)
+ nearby_chat->updateChatHistoryStyle();
+}
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
index efcaf4263b..1cbc2a3478 100644
--- a/indra/newview/llnearbychat.h
+++ b/indra/newview/llnearbychat.h
@@ -47,7 +47,7 @@ public:
~LLNearbyChat();
BOOL postBuild ();
- void addMessage (const LLChat& message);
+ void addMessage (const LLChat& message,bool archive = true);
void onNearbyChatContextMenuItemClicked(const LLSD& userdata);
bool onNearbyChatCheckContextMenuItem(const LLSD& userdata);
@@ -57,6 +57,10 @@ public:
virtual void setRect (const LLRect &rect);
+ virtual void updateChatHistoryStyle();
+
+ static void processChatHistoryStyleUpdate(const LLSD& newvalue);
+
private:
virtual void applySavedVariables();
@@ -68,6 +72,8 @@ private:
private:
LLHandle<LLView> mPopupMenuHandle;
LLChatHistory* mChatHistory;
+
+ std::vector<LLChat> mMessageArchive;
};
#endif
diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp
index 2e7f95660a..6889931956 100644
--- a/indra/newview/llnotificationgrouphandler.cpp
+++ b/indra/newview/llnotificationgrouphandler.cpp
@@ -88,6 +88,8 @@ bool LLGroupHandler::processNotification(const LLSD& notify)
if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
{
+ LLHandlerUtil::logGroupNoticeToIMGroup(notification);
+
LLPanel* notify_box = new LLToastGroupNotifyPanel(notification);
LLToast::Params p;
p.notif_id = notification->getID();
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index 29664e1919..da8928321a 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -39,6 +39,7 @@
//#include "llnotificationsutil.h"
#include "llchannelmanager.h"
#include "llchat.h"
+#include "llnotificationptr.h"
namespace LLNotificationsUI
{
@@ -256,6 +257,33 @@ protected:
void onRejectToast(LLUUID& id);
};
+class LLHandlerUtil
+{
+public:
+ /**
+ * Checks sufficient conditions to log notification message to IM session.
+ */
+ static bool canLogToIM(const LLNotificationPtr& notification);
+
+ /**
+ * Writes notification message to IM session.
+ */
+ static void logToIM(const EInstantMessage& session_type,
+ const std::string& session_name, const std::string& from_name,
+ const std::string& message, const LLUUID& session_owner_id,
+ const LLUUID& from_id);
+
+ /**
+ * Writes notification message to IM p2p session.
+ */
+ static void logToIMP2P(const LLNotificationPtr& notification);
+
+ /**
+ * Writes group notice notification message to IM group session.
+ */
+ static void logGroupNoticeToIMGroup(const LLNotificationPtr& notification);
+};
+
}
#endif
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
new file mode 100644
index 0000000000..857b7e9796
--- /dev/null
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -0,0 +1,130 @@
+/**
+ * @file llnotificationofferhandler.cpp
+ * @brief Provides set of utility methods for notifications processing.
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h" // must be first include
+
+#include "llnotificationhandler.h"
+#include "llnotifications.h"
+#include "llimview.h"
+#include "llagent.h"
+
+using namespace LLNotificationsUI;
+
+const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"),
+ REVOKED_MODIFY_RIGHTS("RevokedModifyRights"), OBJECT_GIVE_ITEM(
+ "ObjectGiveItem"), OBJECT_GIVE_ITEM_UNKNOWN_USER(
+ "ObjectGiveItemUnknownUser"), PAYMENT_RECIVED("PaymentRecived");
+
+// static
+bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification)
+{
+ return GRANTED_MODIFY_RIGHTS == notification->getName()
+ || REVOKED_MODIFY_RIGHTS == notification->getName()
+ || PAYMENT_RECIVED == notification->getName();
+}
+
+// static
+void LLHandlerUtil::logToIM(const EInstantMessage& session_type,
+ const std::string& session_name, const std::string& from_name,
+ const std::string& message, const LLUUID& session_owner_id,
+ const LLUUID& from_id)
+{
+ LLUUID session_id = LLIMMgr::computeSessionID(session_type,
+ session_owner_id);
+ LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(
+ session_id);
+ if (session == NULL)
+ {
+ LLIMModel::instance().logToFile(session_name, from_name, from_id, message);
+ }
+ else
+ {
+ // store active session id
+ const LLUUID & active_session_id =
+ LLIMModel::instance().getActiveSessionID();
+
+ // set searched session as active to avoid IM toast popup
+ LLIMModel::instance().setActiveSessionID(session_id);
+
+ LLIMModel::instance().addMessage(session_id, from_name, from_id,
+ message);
+
+ // restore active session id
+ LLIMModel::instance().setActiveSessionID(active_session_id);
+ }
+}
+
+// static
+void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification)
+{
+ const std::string
+ name =
+ notification->getSubstitutions().has("NAME") ? notification->getSubstitutions()["NAME"]
+ : notification->getSubstitutions()["[NAME]"];
+
+ // don't create IM p2p session with objects, it's necessary condition to log
+ if (notification->getName() != OBJECT_GIVE_ITEM && notification->getName()
+ != OBJECT_GIVE_ITEM_UNKNOWN_USER)
+ {
+ LLUUID from_id = notification->getPayload()["from_id"];
+
+ logToIM(IM_NOTHING_SPECIAL, name, name, notification->getMessage(),
+ from_id, from_id);
+ }
+}
+
+// static
+void LLHandlerUtil::logGroupNoticeToIMGroup(
+ const LLNotificationPtr& notification)
+{
+
+ const LLSD& payload = notification->getPayload();
+ LLGroupData groupData;
+ if (!gAgent.getGroupData(payload["group_id"].asUUID(), groupData))
+ {
+ llwarns
+ << "Group notice for unkown group: "
+ << payload["group_id"].asUUID() << llendl;
+ }
+
+ const std::string group_name = groupData.mName;
+ const std::string sender_name = payload["sender_name"].asString();
+
+ // we can't retrieve sender id from group notice system message, so try to lookup it from cache
+ LLUUID sender_id;
+ gCacheName->getUUID(sender_name, sender_id);
+
+ logToIM(IM_SESSION_GROUP_START, group_name, sender_name, payload["message"],
+ payload["group_id"], sender_id);
+}
+
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index 45b5e88472..c179a2cf90 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -37,8 +37,6 @@
#include "lltoastnotifypanel.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
-#include "llimview.h"
-#include "llimfloater.h"
#include "llnotificationmanager.h"
#include "llnotifications.h"
@@ -92,27 +90,7 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
{
- // add message to IM
- const std::string
- name =
- notification->getSubstitutions().has("NAME") ? notification->getSubstitutions()["NAME"]
- : notification->getSubstitutions()["[NAME]"];
-
- // don't create IM session with objects
- if (notification->getName() != "ObjectGiveItem"
- && notification->getName() != "ObjectGiveItemUnknownUser")
- {
- LLUUID from_id = notification->getPayload()["from_id"];
- LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL,
- from_id);
- if (!LLIMMgr::instance().hasSession(session_id))
- {
- session_id = LLIMMgr::instance().addSession(name,
- IM_NOTHING_SPECIAL, from_id);
- }
- LLIMMgr::instance().addMessage(session_id, LLUUID(), name,
- notification->getMessage());
- }
+ LLHandlerUtil::logToIMP2P(notification);
LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp
index 8c159b40e8..c7261199e3 100644
--- a/indra/newview/llnotificationscripthandler.cpp
+++ b/indra/newview/llnotificationscripthandler.cpp
@@ -96,6 +96,11 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
{
+ if (LLHandlerUtil::canLogToIM(notification))
+ {
+ LLHandlerUtil::logToIMP2P(notification);
+ }
+
if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName() || SCRIPT_LOAD_URL == notification->getName())
{
LLScriptFloaterManager::getInstance()->onAddNotification(notification->getID());
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 97c1e96175..eb9cb10d56 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -254,11 +254,19 @@ void LLPanelAvatarNotes::onCommitRights()
const LLRelationship* buddy_relationship =
LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
bool allow_modify_objects = childGetValue("objects_check").asBoolean();
+
+ // if modify objects checkbox clicked
if (buddy_relationship->isRightGrantedTo(
LLRelationship::GRANT_MODIFY_OBJECTS) != allow_modify_objects)
{
confirmModifyRights(allow_modify_objects, rights);
}
+ // only one checkbox can trigger commit, so store the rest of rights
+ else
+ {
+ LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(
+ getAvatarId(), rights);
+ }
}
void LLPanelAvatarNotes::processProperties(void* data, EAvatarProcessorType type)
@@ -522,20 +530,19 @@ void LLPanelAvatarProfile::processGroupProperties(const LLAvatarGroups* avatar_g
for(; it_end != it; ++it)
{
LLAvatarGroups::LLGroupData group_data = *it;
-
- // Check if there is no duplicates for this group
- if (std::find(mGroups.begin(), mGroups.end(), group_data.group_name) == mGroups.end())
- mGroups.push_back(group_data.group_name);
+ mGroups[group_data.group_name] = group_data.group_id;
}
// Creating string, containing group list
std::string groups = "";
- for (group_list_t::const_iterator it = mGroups.begin(); it != mGroups.end(); ++it)
+ for (group_map_t::iterator it = mGroups.begin(); it != mGroups.end(); ++it)
{
if (it != mGroups.begin())
groups += ", ";
- groups += *it;
+
+ std::string group_url="[secondlife:///app/group/" + it->second.asString() + "/about " + it->first + "]";
+ groups += group_url;
}
childSetValue("sl_groups", groups);
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index f54aeee4eb..b19c5cca49 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -192,8 +192,8 @@ protected:
private:
- typedef std::list<std::string> group_list_t;
- group_list_t mGroups;
+ typedef std::map< std::string,LLUUID> group_map_t;
+ group_map_t mGroups;
LLToggleableMenu* mProfileMenu;
};
diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp
index 5bb266a01d..b1e7dd3d50 100644
--- a/indra/newview/llpanelmediasettingsgeneral.cpp
+++ b/indra/newview/llpanelmediasettingsgeneral.cpp
@@ -392,19 +392,19 @@ void LLPanelMediaSettingsGeneral::preApply()
//
void LLPanelMediaSettingsGeneral::getValues( LLSD &fill_me_in )
{
- fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = mAutoLoop->getValue();
- fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = mAutoPlay->getValue();
- fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = mAutoScale->getValue();
- fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = mAutoZoom->getValue();
- fill_me_in[LLMediaEntry::CONTROLS_KEY] = mControls->getCurrentIndex();
+ fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = (LLSD::Boolean)mAutoLoop->getValue();
+ fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = (LLSD::Boolean)mAutoPlay->getValue();
+ fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = (LLSD::Boolean)mAutoScale->getValue();
+ fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = (LLSD::Boolean)mAutoZoom->getValue();
+ fill_me_in[LLMediaEntry::CONTROLS_KEY] = (LLSD::Integer)mControls->getCurrentIndex();
//Don't fill in current URL: this is only supposed to get changed via navigate
// fill_me_in[LLMediaEntry::CURRENT_URL_KEY] = mCurrentURL->getValue();
- fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = mHeightPixels->getValue();
+ fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = (LLSD::Integer)mHeightPixels->getValue();
// Don't fill in the home URL if it is the special "Multiple Media" string!
if (LLTrans::getString("Multiple Media") != mHomeURL->getValue())
- fill_me_in[LLMediaEntry::HOME_URL_KEY] = mHomeURL->getValue();
- fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = mFirstClick->getValue();
- fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = mWidthPixels->getValue();
+ fill_me_in[LLMediaEntry::HOME_URL_KEY] = (LLSD::String)mHomeURL->getValue();
+ fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = (LLSD::Boolean)mFirstClick->getValue();
+ fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = (LLSD::Integer)mWidthPixels->getValue();
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp
index 94e137b0f4..7ec53ed57a 100644
--- a/indra/newview/llpanelmediasettingssecurity.cpp
+++ b/indra/newview/llpanelmediasettingssecurity.cpp
@@ -213,7 +213,7 @@ void LLPanelMediaSettingsSecurity::preApply()
//
void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in )
{
- fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = mEnableWhiteList->getValue();
+ fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = (LLSD::Boolean)mEnableWhiteList->getValue();
// iterate over white list and extract items
std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData();
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 71c1b0cbb9..e86123d565 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -66,10 +66,6 @@
glh::matrix4f glh_get_current_modelview();
glh::matrix4f glh_get_current_projection();
-const F32 ZOOM_NEAR_PADDING = 1.0f;
-const F32 ZOOM_MEDIUM_PADDING = 1.15f;
-const F32 ZOOM_FAR_PADDING = 1.5f;
-
// Warning: make sure these two match!
const LLPanelPrimMediaControls::EZoomLevel LLPanelPrimMediaControls::kZoomLevels[] = { ZOOM_NONE, ZOOM_MEDIUM };
const int LLPanelPrimMediaControls::kNumZoomLevels = 2;
@@ -86,7 +82,13 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
mUpdateSlider(true),
mClearFaceOnFade(false),
mCurrentRate(0.0),
- mMovieDuration(0.0)
+ mMovieDuration(0.0),
+ mTargetObjectID(LLUUID::null),
+ mTargetObjectFace(0),
+ mTargetImplID(LLUUID::null),
+ mTargetObjectNormal(LLVector3::zero),
+ mZoomObjectID(LLUUID::null),
+ mZoomObjectFace(0)
{
mCommitCallbackRegistrar.add("MediaCtrl.Close", boost::bind(&LLPanelPrimMediaControls::onClickClose, this));
mCommitCallbackRegistrar.add("MediaCtrl.Back", boost::bind(&LLPanelPrimMediaControls::onClickBack, this));
@@ -152,6 +154,11 @@ BOOL LLPanelPrimMediaControls::postBuild()
mRightBookend = getChild<LLUICtrl>("right_bookend");
mBackgroundImage = LLUI::getUIImage(getString("control_background_image_name"));
LLStringUtil::convertToF32(getString("skip_step"), mSkipStep);
+ LLStringUtil::convertToS32(getString("min_width"), mMinWidth);
+ LLStringUtil::convertToS32(getString("min_height"), mMinHeight);
+ LLStringUtil::convertToF32(getString("zoom_near_padding"), mZoomNearPadding);
+ LLStringUtil::convertToF32(getString("zoom_medium_padding"), mZoomMediumPadding);
+ LLStringUtil::convertToF32(getString("zoom_far_padding"), mZoomFarPadding);
// These are currently removed...but getChild creates a "dummy" widget.
// This class handles them missing.
@@ -257,9 +264,6 @@ LLPluginClassMedia* LLPanelPrimMediaControls::getTargetMediaPlugin()
void LLPanelPrimMediaControls::updateShape()
{
- const S32 MIN_HUD_WIDTH=400;
- const S32 MIN_HUD_HEIGHT=120;
-
LLViewerMediaImpl* media_impl = getTargetMediaImpl();
LLViewerObject* objectp = getTargetObject();
@@ -279,7 +283,7 @@ void LLPanelPrimMediaControls::updateShape()
bool can_navigate = parcel->getMediaAllowNavigate();
bool enabled = false;
- bool is_zoomed = (mCurrentZoom != ZOOM_NONE);
+ bool is_zoomed = (mCurrentZoom != ZOOM_NONE) && (mTargetObjectID == mZoomObjectID) && (mTargetObjectFace == mZoomObjectFace);
// There is no such thing as "has_focus" being different from normal controls set
// anymore (as of user feedback from bri 10/09). So we cheat here and force 'has_focus'
// to 'true' (or, actually, we use a setting)
@@ -309,7 +313,7 @@ void LLPanelPrimMediaControls::updateShape()
mStopCtrl->setVisible(false);
mHomeCtrl->setVisible(has_focus);
mZoomCtrl->setVisible(!is_zoomed);
- mUnzoomCtrl->setVisible(has_focus && is_zoomed);
+ mUnzoomCtrl->setVisible(is_zoomed);
mOpenCtrl->setVisible(true);
mMediaAddressCtrl->setVisible(has_focus && !mini_controls);
mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
@@ -332,13 +336,12 @@ void LLPanelPrimMediaControls::updateShape()
if(media_plugin && media_plugin->pluginSupportsMediaTime())
{
- mReloadCtrl->setEnabled(FALSE);
- mReloadCtrl->setVisible(FALSE);
+ mReloadCtrl->setEnabled(false);
+ mReloadCtrl->setVisible(false);
mMediaStopCtrl->setVisible(has_focus);
- mHomeCtrl->setVisible(FALSE);
- // No nav controls
- mBackCtrl->setVisible(FALSE);
- mFwdCtrl->setEnabled(FALSE);
+ mHomeCtrl->setVisible(has_focus);
+ mBackCtrl->setVisible(false);
+ mFwdCtrl->setVisible(false);
mMediaAddressCtrl->setVisible(false);
mMediaAddressCtrl->setEnabled(false);
mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
@@ -416,7 +419,6 @@ void LLPanelPrimMediaControls::updateShape()
mPlayCtrl->setVisible(FALSE);
mPauseCtrl->setEnabled(TRUE);
mPauseCtrl->setVisible(has_focus);
- mMediaStopCtrl->setEnabled(TRUE);
break;
case LLPluginClassMediaOwner::MEDIA_PAUSED:
@@ -425,7 +427,6 @@ void LLPanelPrimMediaControls::updateShape()
mPauseCtrl->setVisible(FALSE);
mPlayCtrl->setEnabled(TRUE);
mPlayCtrl->setVisible(has_focus);
- mMediaStopCtrl->setEnabled(FALSE);
break;
}
}
@@ -508,12 +509,10 @@ void LLPanelPrimMediaControls::updateShape()
{
mMediaProgressPanel->setVisible(true);
mMediaProgressBar->setPercent(media_plugin->getProgressPercent());
- gFocusMgr.setTopCtrl(mMediaProgressPanel);
}
- else if (mMediaProgressPanel->getVisible())
+ else
{
mMediaProgressPanel->setVisible(false);
- gFocusMgr.setTopCtrl(NULL);
}
}
@@ -599,12 +598,12 @@ void LLPanelPrimMediaControls::updateShape()
}
LLCoordGL screen_min;
- screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidthRaw() * (min.mV[VX] + 1.f) * 0.5f);
- screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeightRaw() * (min.mV[VY] + 1.f) * 0.5f);
+ screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidthScaled() * (min.mV[VX] + 1.f) * 0.5f);
+ screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeightScaled() * (min.mV[VY] + 1.f) * 0.5f);
LLCoordGL screen_max;
- screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidthRaw() * (max.mV[VX] + 1.f) * 0.5f);
- screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeightRaw() * (max.mV[VY] + 1.f) * 0.5f);
+ screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidthScaled() * (max.mV[VX] + 1.f) * 0.5f);
+ screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeightScaled() * (max.mV[VY] + 1.f) * 0.5f);
// grow panel so that screenspace bounding box fits inside "media_region" element of HUD
LLRect media_controls_rect;
@@ -613,14 +612,15 @@ void LLPanelPrimMediaControls::updateShape()
media_controls_rect.mBottom -= mMediaRegion->getRect().mBottom;
media_controls_rect.mTop += getRect().getHeight() - mMediaRegion->getRect().mTop;
media_controls_rect.mRight += getRect().getWidth() - mMediaRegion->getRect().mRight;
-
- LLRect old_hud_rect = media_controls_rect;
+
// keep all parts of HUD on-screen
media_controls_rect.intersectWith(getParent()->getLocalRect());
+ if (mCurrentZoom != ZOOM_NONE)
+ media_controls_rect.mBottom -= mMediaControlsStack->getRect().getHeight() + mMediaProgressPanel->getRect().getHeight();
// clamp to minimum size, keeping centered
media_controls_rect.setCenterAndSize(media_controls_rect.getCenterX(), media_controls_rect.getCenterY(),
- llmax(MIN_HUD_WIDTH, media_controls_rect.getWidth()), llmax(MIN_HUD_HEIGHT, media_controls_rect.getHeight()));
+ llmax(mMinWidth, media_controls_rect.getWidth()), llmax(mMinHeight, media_controls_rect.getHeight()));
setShape(media_controls_rect, true);
@@ -968,17 +968,17 @@ void LLPanelPrimMediaControls::updateZoom()
}
case ZOOM_FAR:
{
- zoom_padding = ZOOM_FAR_PADDING;
+ zoom_padding = mZoomFarPadding;
break;
}
case ZOOM_MEDIUM:
{
- zoom_padding = ZOOM_MEDIUM_PADDING;
+ zoom_padding = mZoomMediumPadding;
break;
}
case ZOOM_NEAR:
{
- zoom_padding = ZOOM_NEAR_PADDING;
+ zoom_padding = mZoomNearPadding;
break;
}
default:
@@ -988,9 +988,16 @@ void LLPanelPrimMediaControls::updateZoom()
}
}
- if (zoom_padding > 0.0f)
+ if (zoom_padding > 0.0f)
+ {
LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding);
+ }
+
+ // Remember the object ID/face we zoomed into, so we can update the zoom icon appropriately
+ mZoomObjectID = mTargetObjectID;
+ mZoomObjectFace = mTargetObjectFace;
}
+
void LLPanelPrimMediaControls::onScrollUp(void* user_data)
{
LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data);
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index accfb72a04..fe8f100abe 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -160,6 +160,11 @@ private:
LLUICtrl *mRightBookend;
LLUIImage* mBackgroundImage;
F32 mSkipStep;
+ S32 mMinWidth;
+ S32 mMinHeight;
+ F32 mZoomNearPadding;
+ F32 mZoomMediumPadding;
+ F32 mZoomFarPadding;
LLUICtrl *mMediaPanelScroll;
LLButton *mScrollUpCtrl;
@@ -190,6 +195,9 @@ private:
S32 mTargetObjectFace;
LLUUID mTargetImplID;
LLVector3 mTargetObjectNormal;
+
+ LLUUID mZoomObjectID;
+ S32 mZoomObjectFace;
};
#endif // LL_PANELPRIMMEDIACONTROLS_H
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 68dc1b511f..13f195a1be 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -64,10 +64,10 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
mSpeakerMgr->addListener(mSpeakerModeratorListener, "update_moderator");
mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData"));
- mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
- mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2));
+ mAvatarListDoubleClickConnection = mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
+ mAvatarListRefreshConnection = mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2));
// Set onAvatarListDoubleClicked as default on_return action.
- mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
+ mAvatarListReturnConnection = mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
if (use_context_menu)
{
@@ -87,7 +87,7 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++)
{
const LLPointer<LLSpeaker>& speakerp = *it;
- group_members.push_back(speakerp->mID);
+ addAvatarIDExceptAgent(group_members, speakerp->mID);
if ( speakerp->mIsModerator )
{
mModeratorList.insert(speakerp->mID);
@@ -99,6 +99,10 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
LLParticipantList::~LLParticipantList()
{
+ mAvatarListDoubleClickConnection.disconnect();
+ mAvatarListRefreshConnection.disconnect();
+ mAvatarListReturnConnection.disconnect();
+
delete mParticipantListMenu;
mParticipantListMenu = NULL;
}
@@ -192,7 +196,7 @@ bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, co
return true;
}
- group_members.push_back(uu_id);
+ addAvatarIDExceptAgent(group_members, uu_id);
// Mark AvatarList as dirty one
mAvatarList->setDirty();
sort();
@@ -260,6 +264,15 @@ void LLParticipantList::sort()
}
}
+// static
+void LLParticipantList::addAvatarIDExceptAgent(std::vector<LLUUID>& existing_list, const LLUUID& avatar_id)
+{
+ if (gAgent.getID() != avatar_id)
+ {
+ existing_list.push_back(avatar_id);
+ }
+}
+
//
// LLParticipantList::SpeakerAddListener
//
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
index ce61dd9b96..86b38f5f1e 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -132,6 +132,11 @@ class LLParticipantList
void onAvatarListDoubleClicked(LLAvatarList* list);
void onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param);
+ /**
+ * Adds specified avatar ID to the existing list if it is not Agent's ID
+ */
+ static void addAvatarIDExceptAgent(std::vector<LLUUID>& existing_list, const LLUUID& avatar_id);
+
LLSpeakerMgr* mSpeakerMgr;
LLAvatarList* mAvatarList;
@@ -146,4 +151,9 @@ class LLParticipantList
LLParticipantListMenu* mParticipantListMenu;
EParticipantSortOrder mSortOrder;
+
+ // boost::connections
+ boost::signals2::connection mAvatarListDoubleClickConnection;
+ boost::signals2::connection mAvatarListRefreshConnection;
+ boost::signals2::connection mAvatarListReturnConnection;
};
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
index c58caf9c60..7c4f3d3608 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -41,6 +41,7 @@
#include "llscreenchannel.h"
#include "lltoastnotifypanel.h"
#include "llviewerwindow.h"
+#include "llimfloater.h"
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -212,6 +213,8 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
mNotifications.insert(std::make_pair(object_id, nd));
LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(object_id);
+
+ toggleScriptFloater(object_id);
}
void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index dc22a243eb..4915720036 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -42,6 +42,7 @@
#include "llfloaterbuycurrency.h"
#include "llfloaterchat.h"
#include "llfloaterlagmeter.h"
+#include "llfloatervolumepulldown.h"
#include "llfloaterregioninfo.h"
#include "llfloaterscriptdebug.h"
#include "llhudicon.h"
@@ -159,6 +160,7 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
mBtnVolume = getChild<LLButton>( "volume_btn" );
mBtnVolume->setClickedCallback( onClickVolume, this );
+ mBtnVolume->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterVolume, this));
gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&LLStatusBar::onVolumeChanged, this, _2));
@@ -203,7 +205,6 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
addChild(mSGPacketLoss);
childSetActionTextbox("stat_btn", onClickStatGraph);
-
}
LLStatusBar::~LLStatusBar()
@@ -244,7 +245,6 @@ BOOL LLStatusBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
BOOL LLStatusBar::postBuild()
{
-
gMenuBarView->setRightMouseDownCallback(boost::bind(&show_navbar_context_menu, _1, _2, _3));
return TRUE;
@@ -506,6 +506,13 @@ static void onClickScriptDebug(void*)
LLFloaterScriptDebug::show(LLUUID::null);
}
+//static
+void LLStatusBar::onMouseEnterVolume(LLUICtrl* ctrl)
+{
+ // show the master volume pull-down
+ LLFloaterReg::showInstance("volume_pulldown");
+}
+
static void onClickVolume(void* data)
{
// toggle the master mute setting
diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h
index bdaacce981..f77cc1acb8 100644
--- a/indra/newview/llstatusbar.h
+++ b/indra/newview/llstatusbar.h
@@ -47,6 +47,7 @@ class LLUICtrl;
class LLUUID;
class LLFrameTimer;
class LLStatGraph;
+class LLPanelVolumePulldown;
class LLStatusBar
: public LLPanel
@@ -92,8 +93,8 @@ private:
void onVolumeChanged(const LLSD& newvalue);
+ static void onMouseEnterVolume(LLUICtrl* ctrl);
static void onClickStatGraph(void* data);
-
private:
LLTextBox *mTextHealth;
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 227f6c4971..1a8edb1f6a 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -106,6 +106,7 @@
#include "llfloateruipreview.h"
#include "llfloaterurldisplay.h"
#include "llfloatervoicedevicesettings.h"
+#include "llfloatervolumepulldown.h"
#include "llfloaterwater.h"
#include "llfloaterwhitelistentry.h"
#include "llfloaterwindlight.h"
@@ -248,6 +249,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("upload_image", "floater_image_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterImagePreview>, "upload");
LLFloaterReg::add("upload_sound", "floater_sound_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundPreview>, "upload");
+ LLFloaterReg::add("volume_pulldown", "floater_volume_pulldown.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterVolumePulldown>);
LLFloaterReg::add("voice_call", "floater_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCall>);
LLFloaterReg::add("voice_controls", "floater_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallFloater>);
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index d0ae5d1e38..f9e1a94def 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -509,7 +509,10 @@ bool LLViewerInventoryCategory::fetchDescendents()
// This comes from LLInventoryFilter from llfolderview.h
U32 sort_order = gSavedSettings.getU32("InventorySortOrder") & 0x1;
- std::string url = gAgent.getRegion()->getCapability("WebFetchInventoryDescendents");
+ // *NOTE
+ // Temporary workaround for bug EXT-2879, see ticket for details.
+ // Commented gAgent.getRegion()->getCapability in order to use the old system.
+ std::string url;//= gAgent.getRegion()->getCapability("WebFetchInventoryDescendents");
if (!url.empty()) //Capability found. Build up LLSD and use it.
{
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index fd74c9c2fc..f639c841e7 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -138,15 +138,6 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
}
else
{
- if(mFocusedImplID.notNull())
- {
- if(mMediaControls.get())
- {
- // Don't reset camera zoom by default, just tell the controls they're no longer controlling zoom.
- mMediaControls.get()->resetZoomLevel(false);
- }
- }
-
if(hasFocus())
{
gFocusMgr.setKeyboardFocus(NULL);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 9fc818e1ff..a5e06e7cff 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -4347,7 +4347,28 @@ void process_money_balance_reply( LLMessageSystem* msg, void** )
// *TODO: Translate
LLSD args;
args["MESSAGE"] = desc;
- LLNotificationsUtil::add("SystemMessage", args);
+
+ // this is a marker to retrieve avatar name from server message:
+ // "<avatar name> paid you L$"
+ const std::string marker = "paid you L$";
+
+ // extract avatar name from system message
+ std::string name = desc.substr(0, desc.find(marker, 0));
+ LLStringUtil::trim(name);
+
+ // if name extracted and name cache contains avatar id send loggable notification
+ LLUUID from_id;
+ if(name.size() > 0 && gCacheName->getUUID(name, from_id))
+ {
+ args["NAME"] = name;
+ LLSD payload;
+ payload["from_id"] = from_id;
+ LLNotificationsUtil::add("PaymentRecived", args, payload);
+ }
+ else
+ {
+ LLNotificationsUtil::add("SystemMessage", args);
+ }
// Once the 'recent' container gets large enough, chop some
// off the beginning.
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index 3554528d19..a0396bc790 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -750,6 +750,8 @@ LLVoiceChannelP2P::LLVoiceChannelP2P(const LLUUID& session_id, const std::string
mReceivedCall(FALSE)
{
// make sure URI reflects encoded version of other user's agent id
+ // *NOTE: in case of Avaline call generated SIP URL will be incorrect.
+ // But it will be overridden in LLVoiceChannelP2P::setSessionHandle() called when agent accepts call
setURI(LLVoiceClient::getInstance()->sipURIFromID(other_user_id));
}
@@ -867,6 +869,10 @@ void LLVoiceChannelP2P::setSessionHandle(const std::string& handle, const std::s
}
else
{
+ LL_WARNS("Voice") << "incoming SIP URL is not provided. Channel may not work properly." << LL_ENDL;
+ // In case of incoming AvaLine call generated URI will be differ from original one.
+ // This is because Avatar-2-Avatar URI is based on avatar UUID but Avaline is not.
+ // See LLVoiceClient::sessionAddedEvent() -> setUUIDFromStringHash()
setURI(LLVoiceClient::getInstance()->sipURIFromID(mOtherUserID));
}
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index d677634be6..7e1e7c940f 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -63,6 +63,7 @@
#include "llparcel.h"
#include "llviewerparcelmgr.h"
#include "llfirstuse.h"
+#include "lltrans.h"
#include "llviewerwindow.h"
#include "llviewercamera.h"
#include "llvoavatarself.h"
@@ -1161,11 +1162,12 @@ LLVoiceClient::LLVoiceClient() :
mVoiceEnabled(false),
mWriteInProgress(false),
- mLipSyncEnabled(false),
- mAPIVersion("Unknown")
+ mLipSyncEnabled(false)
{
gVoiceClient = this;
+ mAPIVersion = LLTrans::getString("NotConnected");
+
#if LL_DARWIN || LL_LINUX || LL_SOLARIS
// HACK: THIS DOES NOT BELONG HERE
// When the vivox daemon dies, the next write attempt on our socket generates a SIGPIPE, which kills us.
diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
index d8534bfe0b..0856049374 100644
--- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
@@ -22,13 +22,15 @@
bg_readonly_color="ChatHistoryBgColor"
bg_writeable_color="ChatHistoryBgColor"
follows="all"
- left="1"
+ left="5"
top="20"
layout="topleft"
- height="280"
+ height="275"
name="chat_history"
parse_highlights="true"
text_color="ChatHistoryTextColor"
text_readonly_color="ChatHistoryTextColor"
- width="320" />
+ right_widget_pad="5"
+ left_widget_pad="0"
+ width="315" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
index 4434fe7403..c59d97457e 100644
--- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
@@ -8,32 +8,49 @@
save_visibility="true"
single_instance="true"
width="282">
+ <string
+ name="title_nearby">
+ NEARBY VOICE
+ </string>
+ <string
+ name="title_group">
+ Group Call with [GROUP]
+ </string>
+ <string
+ name="title_adhoc">
+ Conference Call
+ </string>
+ <string
+ name="no_one_near">
+ No one near
+ </string>
<panel
bevel_style="in"
follows="left|right|top"
- height="73"
+ height="62"
layout="topleft"
left="0"
name="control_panel"
- width="285">
+ width="282">
<panel
- height="20"
+ height="18"
+ follows="top|left|right"
layout="topleft"
left="10"
name="my_panel"
- width="262">
+ width="263">
<avatar_icon
enabled="false"
follows="left|top"
height="18"
- image_name="Generic_Person"
+ default_icon_name="Generic_Person"
layout="topleft"
left="0"
name="user_icon"
top="0"
width="18" />
<text
- follows="top|left"
+ follows="top|left|right"
font="SansSerifSmallBold"
height="16"
layout="topleft"
@@ -41,10 +58,23 @@
name="user_text"
text_color="white"
top="4"
+ use_ellipses="true"
value="Mya Avatar:"
- width="80" />
+ width="210" />
+ <output_monitor
+ auto_update="true"
+ draw_border="false"
+ follows="right"
+ height="16"
+ layout="topleft"
+ name="speaking_indicator"
+ right="-1"
+ top="2"
+ visible="true"
+ width="20" />
</panel>
<layout_stack
+ animate="false"
bottom="10"
clip="false"
follows="left|right|top"
@@ -53,9 +83,11 @@
orientation="horizontal"
width="262">
<layout_panel
+ auto_resize="false"
follows="left"
layout="topleft"
min_width="24"
+ name="microphone_icon_panel"
top="0"
user_resize="false"
width="24">
@@ -69,9 +101,11 @@
</layout_panel>
<layout_panel
layout="topleft"
+ min_width="138"
+ name="volume_slider_panel"
top="0"
user_resize="false"
- width="258">
+ width="138">
<slider_bar
control_name="AudioLevelMic"
follows="left|right|top"
@@ -84,7 +118,25 @@
tool_tip="Master Volume"
top="0"
value="0.75"
- width="258" />
+ width="138" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ layout="topleft"
+ min_width="100"
+ name="leave_btn_panel"
+ top="0"
+ user_resize="false"
+ visible="false"
+ width="100">
+ <button
+ follows="left|right|top"
+ height="24"
+ label="Leave Call"
+ left="0"
+ name="leave_call_btn"
+ top="0"
+ width="100" />
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/en/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..eb5e31b57d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_imchiclet_adhoc.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu
+ height="101"
+ layout="topleft"
+ left="100"
+ mouse_opaque="false"
+ name="IMChiclet AdHoc Menu"
+ top="724"
+ visible="false"
+ width="128">
+ <menu_item_call
+ label="End Session"
+ layout="topleft"
+ name="End Session">
+ <menu_item_call.on_click
+ function="IMChicletMenu.Action"
+ parameter="end" />
+ </menu_item_call>
+</menu>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 79ef1d104b..254c8a0f21 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -2382,15 +2382,15 @@ Please choose the male or female avatar. You can change your mind later.
<notification
icon="alertmodal.tga"
name="GrantedModifyRights"
- type="alertmodal">
-[FIRST_NAME] [LAST_NAME] has given you permission to edit their objects.
+ type="notify">
+[NAME] has given you permission to edit their objects.
</notification>
<notification
icon="alertmodal.tga"
name="RevokedModifyRights"
- type="alertmodal">
-Your privilege to modify [FIRST_NAME] [LAST_NAME]&apos;s objects has been revoked
+ type="notify">
+Your privilege to modify [NAME]&apos;s objects has been revoked
</notification>
<notification
@@ -4611,6 +4611,13 @@ Please select at least one type of content to search (PG, Mature, or Adult).
<notification
icon="notify.tga"
+ name="PaymentRecived"
+ type="notify">
+[MESSAGE]
+ </notification>
+
+ <notification
+ icon="notify.tga"
name="EventNotification"
type="notify">
Event Notification:
@@ -5783,6 +5790,26 @@ Server Error: Media update or get failed.
yestext="OK"/>
</notification>
+ <notification
+ icon="alertmodal.tga"
+ name="TextChatIsMutedByModerator"
+ type="alertmodal">
+Your text chat has been muted by moderator.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="VoiceIsMutedByModerator"
+ type="alertmodal">
+Your voice has been muted by moderator.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
<notification
icon="alertmodal.tga"
name="ConfirmClearTeleportHistory"
diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml
index c1090a1686..9cb765ae93 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml
@@ -8,7 +8,7 @@
label="im_header"
layout="topleft"
name="im_header"
- width="300">
+ width="310">
<avatar_icon
follows="left"
height="18"
diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
index 0a5812882d..0a3fd1699f 100644
--- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
@@ -76,7 +76,6 @@
visible="false"
width="100" />
<button
- enabled="false"
bottom="10"
height="20"
label="Voice Controls"
diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml
index 4b91dc6294..c52b0c83d0 100644
--- a/indra/newview/skins/default/xui/en/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml
@@ -6,6 +6,7 @@
layout="topleft"
left="0"
width="380"
+ help_topic="panel_landmarks"
border="true"
background_visible="true"
bg_alpha_color="DkGray2"
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
index e00f654750..89f1fe35ca 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
@@ -221,12 +221,23 @@
width="50" />
<text bottom_delta="0" follows="top|left" height="15" left_delta="60" name="X_label">
- X
+ X
</text>
- <spinner bottom_delta="0"
- decimal_digits="0" enabled="true" follows="left|top" height="16"
- increment="1" initial_val="256" label="" label_width="0"
- left_delta="20" max_val="2048" min_val="0" mouse_opaque="true"
- name="height_pixels" width="50" />
+ <spinner
+ bottom_delta="0"
+ decimal_digits="0"
+ enabled="true"
+ follows="left|top"
+ height="16"
+ increment="1"
+ initial_val="256"
+ label=""
+ label_width="0"
+ left_delta="20"
+ max_val="2048"
+ min_val="0"
+ mouse_opaque="true"
+ name="height_pixels"
+ width="50" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
index af4c01185a..8b86067b03 100644
--- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
@@ -9,6 +9,11 @@
width="800">
<string name="control_background_image_name">Inspector_Background</string>
<string name="skip_step">0.2</string>
+ <string name="min_width">400</string>
+ <string name="min_height">120</string>
+ <string name="zoom_near_padding">1.0</string>
+ <string name="zoom_medium_padding">1.25</string>
+ <string name="zoom_far_padding">1.5</string>
<panel
name="media_region"
bottom="125"
@@ -20,7 +25,7 @@
name="media_controls"
follows="left|right"
animate="false"
- height="32"
+ height="26"
layout="topleft"
left="0"
orientation="horizontal"
@@ -235,18 +240,17 @@
width="190"
min_width="90">
<!--
- RE-ENABLE THIS WHEN WE HAVE A HISTORY DROP-DOWN AGAIN
-
-<combo_box
-name="media_address_url"
-allow_text_entry="true"
-height="22"
-layout="topleft"
-max_chars="1024"
-tool_tip = "Media URL"
-<combo_box.commit_callback
-function="MediaCtrl.CommitURL" />
-</combo_box>
+ RE-ENABLE THIS WHEN WE HAVE A HISTORY DROP-DOWN AGAIN
+ <combo_box
+ name="media_address_url"
+ allow_text_entry="true"
+ height="22"
+ layout="topleft"
+ max_chars="1024"
+ tool_tip = "Media URL">
+ <combo_box.commit_callback
+ function="MediaCtrl.CommitURL" />
+ </combo_box>
-->
<line_editor
name="media_address_url"
@@ -304,17 +308,17 @@ function="MediaCtrl.CommitURL" />
user_resize="false"
follows="left|right|top|bottom"
layout="topleft"
+ height="16"
min_width="100"
width="200">
<slider_bar
name="media_play_slider"
follows="left|right|top"
- height="22"
+ height="16"
increment="0.05"
initial_value="0.5"
layout="topleft"
tool_tip="Movie play progress"
- top="8"
min_width="100"
width="200">
<slider_bar.commit_callback
@@ -619,7 +623,7 @@ function="MediaCtrl.CommitURL" />
</layout_stack>
<layout_stack
follows="left|right|bottom"
- height="32"
+ height="20"
layout="topleft"
animate="false"
left="0"
@@ -632,7 +636,7 @@ function="MediaCtrl.CommitURL" />
user_resize="false" />
<panel
name="media_progress_indicator"
- height="22"
+ height="20"
layout="topleft"
left="0"
top="0"
@@ -644,6 +648,7 @@ function="MediaCtrl.CommitURL" />
name="media_progress_bar"
color_bar="1 1 1 0.96"
follows="left|right|top"
+ top="5"
height="8"
layout="topleft"
left="0"
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 65bc48265d..9c66653e3c 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -81,6 +81,17 @@
name="volume_btn"
tool_tip="Global Volume Control"
width="16" />
+ <panel
+ class="panel_volume_pulldown"
+ follows="all"
+ height="533"
+ layout="topleft"
+ left="0"
+ name="volume_pulldown"
+ top="5"
+ visible="false"
+ width="313" />
+
<text
enabled="true"
follows="right|bottom"
diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
index 01204ba779..32fc9fce01 100644
--- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="Teleport History" bottom="0" height="326" left="0" width="380"
+ help_topic="panel_teleport_history"
border="true" follows="left|top|right|bottom">
<accordion
follows="left|top|right|bottom"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 4b727e36ab..e47ec1ebda 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -267,6 +267,7 @@
<string name="ChangePermissions">Change its permissions</string>
<string name="TrackYourCamera">Track your camera</string>
<string name="ControlYourCamera">Control your camera</string>
+ <string name="NotConnected">Not Connected</string>
<!-- Sim Access labels -->
<string name="SIM_ACCESS_PG">PG</string>