summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/cmake/ExamplePlugin.cmake16
-rw-r--r--indra/llui/llfloaterreg.cpp1
-rw-r--r--indra/media_plugins/CMakeLists.txt2
-rw-r--r--indra/media_plugins/example/CMakeLists.txt74
-rw-r--r--indra/media_plugins/example/media_plugin_example.cpp488
-rw-r--r--indra/newview/llavatarlist.cpp7
-rw-r--r--indra/newview/llavatarlist.h4
-rw-r--r--indra/newview/llavatarlistitem.cpp48
-rw-r--r--indra/newview/llavatarlistitem.h11
-rw-r--r--indra/newview/llimfloater.cpp159
-rw-r--r--indra/newview/llimfloater.h15
-rw-r--r--indra/newview/lllandmarkactions.cpp37
-rw-r--r--indra/newview/lllandmarkactions.h7
-rw-r--r--indra/newview/lllocationinputctrl.cpp14
-rw-r--r--indra/newview/lllocationinputctrl.h1
-rw-r--r--indra/newview/llnearbychathandler.cpp3
-rw-r--r--indra/newview/llpanellandmarks.cpp5
-rw-r--r--indra/newview/llpanelplaceinfo.cpp11
-rw-r--r--indra/newview/skins/default/textures/containers/Accordion_Selected.pngbin0 -> 228 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml5
-rw-r--r--indra/newview/skins/default/xui/en/floater_moveview.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_nearby_chat.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_control_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/accordion_tab.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/panel.xml1
-rw-r--r--indra/test_apps/llplugintest/CMakeLists.txt7
-rw-r--r--indra/test_apps/llplugintest/bookmarks.txt1
-rw-r--r--indra/test_apps/llplugintest/llmediaplugintest.cpp22
29 files changed, 912 insertions, 39 deletions
diff --git a/indra/cmake/ExamplePlugin.cmake b/indra/cmake/ExamplePlugin.cmake
new file mode 100644
index 0000000000..599787ad21
--- /dev/null
+++ b/indra/cmake/ExamplePlugin.cmake
@@ -0,0 +1,16 @@
+# -*- cmake -*-
+include(Linking)
+include(Prebuilt)
+
+if (STANDALONE)
+ set(EXAMPLEPLUGIN OFF CACHE BOOL
+ "EXAMPLEPLUGIN support for the llplugin/llmedia test apps.")
+else (STANDALONE)
+ set(EXAMPLEPLUGIN ON CACHE BOOL
+ "EXAMPLEPLUGIN support for the llplugin/llmedia test apps.")
+endif (STANDALONE)
+
+if (WINDOWS)
+elseif (DARWIN)
+elseif (LINUX)
+endif (WINDOWS)
diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp
index d60a879410..d98d8a0e90 100644
--- a/indra/llui/llfloaterreg.cpp
+++ b/indra/llui/llfloaterreg.cpp
@@ -135,6 +135,7 @@ LLFloater* LLFloaterReg::getInstance(const std::string& name, const LLSD& key)
res->mKey = key;
res->setInstanceName(name);
res->applyRectControl(); // Can't apply rect control until setting instance name
+ res->applyDockState();//same...
if (res->mAutoTile && !res->getHost() && index > 0)
{
const LLRect& cur_rect = res->getRect();
diff --git a/indra/media_plugins/CMakeLists.txt b/indra/media_plugins/CMakeLists.txt
index d35afd8cbd..cc03d9cb72 100644
--- a/indra/media_plugins/CMakeLists.txt
+++ b/indra/media_plugins/CMakeLists.txt
@@ -9,3 +9,5 @@ add_subdirectory(gstreamer010)
if (WINDOWS OR DARWIN)
add_subdirectory(quicktime)
endif (WINDOWS OR DARWIN)
+
+add_subdirectory(example)
diff --git a/indra/media_plugins/example/CMakeLists.txt b/indra/media_plugins/example/CMakeLists.txt
new file mode 100644
index 0000000000..4d82f2747c
--- /dev/null
+++ b/indra/media_plugins/example/CMakeLists.txt
@@ -0,0 +1,74 @@
+# -*- cmake -*-
+
+project(media_plugin_example)
+
+include(00-Common)
+include(LLCommon)
+include(LLImage)
+include(LLPlugin)
+include(LLMath)
+include(LLRender)
+include(LLWindow)
+include(Linking)
+include(PluginAPI)
+include(MediaPluginBase)
+include(FindOpenGL)
+
+include(ExamplePlugin)
+
+include_directories(
+ ${LLPLUGIN_INCLUDE_DIRS}
+ ${MEDIA_PLUGIN_BASE_INCLUDE_DIRS}
+ ${LLCOMMON_INCLUDE_DIRS}
+ ${LLMATH_INCLUDE_DIRS}
+ ${LLIMAGE_INCLUDE_DIRS}
+ ${LLRENDER_INCLUDE_DIRS}
+ ${LLWINDOW_INCLUDE_DIRS}
+)
+
+
+### media_plugin_example
+
+set(media_plugin_example_SOURCE_FILES
+ media_plugin_example.cpp
+ )
+
+add_library(media_plugin_example
+ SHARED
+ ${media_plugin_example_SOURCE_FILES}
+)
+
+target_link_libraries(media_plugin_example
+ ${LLPLUGIN_LIBRARIES}
+ ${MEDIA_PLUGIN_BASE_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
+ ${EXAMPLE_PLUGIN_LIBRARIES}
+ ${PLUGIN_API_WINDOWS_LIBRARIES}
+)
+
+add_dependencies(media_plugin_example
+ ${LLPLUGIN_LIBRARIES}
+ ${MEDIA_PLUGIN_BASE_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
+)
+
+if (WINDOWS)
+ set_target_properties(
+ media_plugin_example
+ PROPERTIES
+ LINK_FLAGS "/MANIFEST:NO"
+ )
+endif (WINDOWS)
+
+if (DARWIN)
+ # Don't prepend 'lib' to the executable name, and don't embed a full path in the library's install name
+ set_target_properties(
+ media_plugin_example
+ PROPERTIES
+ PREFIX ""
+ BUILD_WITH_INSTALL_RPATH 1
+ INSTALL_NAME_DIR "@executable_path"
+ LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp"
+ )
+
+endif (DARWIN) \ No newline at end of file
diff --git a/indra/media_plugins/example/media_plugin_example.cpp b/indra/media_plugins/example/media_plugin_example.cpp
new file mode 100644
index 0000000000..e873a0d034
--- /dev/null
+++ b/indra/media_plugins/example/media_plugin_example.cpp
@@ -0,0 +1,488 @@
+/**
+ * @file media_plugin_example.cpp
+ * @brief Example plugin for LLMedia API plugin system
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 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://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$
+ */
+
+#include "linden_common.h"
+
+#include "llgl.h"
+#include "llplugininstance.h"
+#include "llpluginmessage.h"
+#include "llpluginmessageclasses.h"
+#include "media_plugin_base.h"
+
+#include <time.h>
+
+////////////////////////////////////////////////////////////////////////////////
+//
+class MediaPluginExample :
+ public MediaPluginBase
+{
+ public:
+ MediaPluginExample( LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data );
+ ~MediaPluginExample();
+
+ /*virtual*/ void receiveMessage( const char* message_string );
+
+ private:
+ bool init();
+ void update( int milliseconds );
+ void write_pixel( int x, int y, unsigned char r, unsigned char g, unsigned char b );
+ bool mFirstTime;
+
+ time_t mLastUpdateTime;
+ enum Constants { ENumObjects = 10 };
+ unsigned char* mBackgroundPixels;
+ int mColorR[ ENumObjects ];
+ int mColorG[ ENumObjects ];
+ int mColorB[ ENumObjects ];
+ int mXpos[ ENumObjects ];
+ int mYpos[ ENumObjects ];
+ int mXInc[ ENumObjects ];
+ int mYInc[ ENumObjects ];
+ int mBlockSize[ ENumObjects ];
+ bool mMouseButtonDown;
+ bool mStopAction;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//
+MediaPluginExample::MediaPluginExample( LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data ) :
+ MediaPluginBase( host_send_func, host_user_data )
+{
+ mFirstTime = true;
+ mWidth = 0;
+ mHeight = 0;
+ mDepth = 4;
+ mPixels = 0;
+ mMouseButtonDown = false;
+ mStopAction = false;
+ mLastUpdateTime = 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+MediaPluginExample::~MediaPluginExample()
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginExample::receiveMessage( const char* message_string )
+{
+ LLPluginMessage message_in;
+
+ if ( message_in.parse( message_string ) >= 0 )
+ {
+ std::string message_class = message_in.getClass();
+ std::string message_name = message_in.getName();
+
+ if ( message_class == LLPLUGIN_MESSAGE_CLASS_BASE )
+ {
+ if ( message_name == "init" )
+ {
+ LLPluginMessage message( "base", "init_response" );
+ LLSD versions = LLSD::emptyMap();
+ versions[ LLPLUGIN_MESSAGE_CLASS_BASE ] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
+ versions[ LLPLUGIN_MESSAGE_CLASS_MEDIA ] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION;
+ versions[ LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER ] = LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER_VERSION;
+ message.setValueLLSD( "versions", versions );
+
+ std::string plugin_version = "Example media plugin, Example Version 1.0.0.0";
+ message.setValue( "plugin_version", plugin_version );
+ sendMessage( message );
+
+ // Plugin gets to decide the texture parameters to use.
+ message.setMessage( LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params" );
+ message.setValueS32( "default_width", mWidth );
+ message.setValueS32( "default_height", mHeight );
+ message.setValueS32( "depth", mDepth );
+ message.setValueU32( "internalformat", GL_RGBA );
+ message.setValueU32( "format", GL_RGBA );
+ message.setValueU32( "type", GL_UNSIGNED_BYTE );
+ message.setValueBoolean( "coords_opengl", false );
+ sendMessage( message );
+ }
+ else
+ if ( message_name == "idle" )
+ {
+ // no response is necessary here.
+ F64 time = message_in.getValueReal( "time" );
+
+ // Convert time to milliseconds for update()
+ update( time );
+ }
+ else
+ if ( message_name == "cleanup" )
+ {
+ // clean up here
+ }
+ else
+ if ( message_name == "shm_added" )
+ {
+ SharedSegmentInfo info;
+ info.mAddress = message_in.getValuePointer( "address" );
+ info.mSize = ( size_t )message_in.getValueS32( "size" );
+ std::string name = message_in.getValue( "name" );
+
+ mSharedSegments.insert( SharedSegmentMap::value_type( name, info ) );
+
+ }
+ else
+ if ( message_name == "shm_remove" )
+ {
+ std::string name = message_in.getValue( "name" );
+
+ SharedSegmentMap::iterator iter = mSharedSegments.find( name );
+ if( iter != mSharedSegments.end() )
+ {
+ if ( mPixels == iter->second.mAddress )
+ {
+ // This is the currently active pixel buffer.
+ // Make sure we stop drawing to it.
+ mPixels = NULL;
+ mTextureSegmentName.clear();
+ };
+ mSharedSegments.erase( iter );
+ }
+ else
+ {
+ //std::cerr << "MediaPluginExample::receiveMessage: unknown shared memory region!" << std::endl;
+ };
+
+ // Send the response so it can be cleaned up.
+ LLPluginMessage message( "base", "shm_remove_response" );
+ message.setValue( "name", name );
+ sendMessage( message );
+ }
+ else
+ {
+ //std::cerr << "MediaPluginExample::receiveMessage: unknown base message: " << message_name << std::endl;
+ };
+ }
+ else
+ if ( message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA )
+ {
+ if ( message_name == "size_change" )
+ {
+ std::string name = message_in.getValue( "name" );
+ S32 width = message_in.getValueS32( "width" );
+ S32 height = message_in.getValueS32( "height" );
+ S32 texture_width = message_in.getValueS32( "texture_width" );
+ S32 texture_height = message_in.getValueS32( "texture_height" );
+
+ if ( ! name.empty() )
+ {
+ // Find the shared memory region with this name
+ SharedSegmentMap::iterator iter = mSharedSegments.find( name );
+ if ( iter != mSharedSegments.end() )
+ {
+ mPixels = ( unsigned char* )iter->second.mAddress;
+ mWidth = width;
+ mHeight = height;
+
+ mTextureWidth = texture_width;
+ mTextureHeight = texture_height;
+
+ init();
+ };
+ };
+
+ LLPluginMessage message( LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response" );
+ message.setValue( "name", name );
+ message.setValueS32( "width", width );
+ message.setValueS32( "height", height );
+ message.setValueS32( "texture_width", texture_width );
+ message.setValueS32( "texture_height", texture_height );
+ sendMessage( message );
+ }
+ else
+ if ( message_name == "load_uri" )
+ {
+ std::string uri = message_in.getValue( "uri" );
+ if ( ! uri.empty() )
+ {
+ };
+ }
+ else
+ if ( message_name == "mouse_event" )
+ {
+ std::string event = message_in.getValue( "event" );
+ S32 button = message_in.getValueS32( "button" );
+
+ // left mouse button
+ if ( button == 0 )
+ {
+ int mouse_x = message_in.getValueS32( "x" );
+ int mouse_y = message_in.getValueS32( "y" );
+ std::string modifiers = message_in.getValue( "modifiers" );
+
+ if ( event == "move" )
+ {
+ if ( mMouseButtonDown )
+ write_pixel( mouse_x, mouse_y, rand() % 0x80 + 0x80, rand() % 0x80 + 0x80, rand() % 0x80 + 0x80 );
+ }
+ else
+ if ( event == "down" )
+ {
+ mMouseButtonDown = true;
+ }
+ else
+ if ( event == "up" )
+ {
+ mMouseButtonDown = false;
+ }
+ else
+ if ( event == "double_click" )
+ {
+ };
+ };
+ }
+ else
+ if ( message_name == "key_event" )
+ {
+ std::string event = message_in.getValue( "event" );
+ S32 key = message_in.getValueS32( "key" );
+ std::string modifiers = message_in.getValue( "modifiers" );
+
+ if ( event == "down" )
+ {
+ if ( key == ' ')
+ {
+ mLastUpdateTime = 0;
+ update( 0 );
+ };
+ };
+ }
+ else
+ {
+ //std::cerr << "MediaPluginExample::receiveMessage: unknown media message: " << message_string << std::endl;
+ };
+ }
+ else
+ if ( message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER )
+ {
+ if ( message_name == "browse_reload" )
+ {
+ mLastUpdateTime = 0;
+ mFirstTime = true;
+ mStopAction = false;
+ update( 0 );
+ }
+ else
+ if ( message_name == "browse_stop" )
+ {
+ for( int n = 0; n < ENumObjects; ++n )
+ mXInc[ n ] = mYInc[ n ] = 0;
+
+ mStopAction = true;
+ update( 0 );
+ }
+ else
+ {
+ //std::cerr << "MediaPluginExample::receiveMessage: unknown media_browser message: " << message_string << std::endl;
+ };
+ }
+ else
+ {
+ //std::cerr << "MediaPluginExample::receiveMessage: unknown message class: " << message_class << std::endl;
+ };
+ };
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginExample::write_pixel( int x, int y, unsigned char r, unsigned char g, unsigned char b )
+{
+ // make sure we don't write outside the buffer
+ if ( ( x < 0 ) || ( x >= mWidth ) || ( y < 0 ) || ( y >= mHeight ) )
+ return;
+
+ if ( mBackgroundPixels != NULL )
+ {
+ unsigned char *pixel = mBackgroundPixels;
+ pixel += y * mWidth * mDepth;
+ pixel += ( x * mDepth );
+ pixel[ 0 ] = b;
+ pixel[ 1 ] = g;
+ pixel[ 2 ] = r;
+
+ setDirty( x, y, x + 1, y + 1 );
+ };
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginExample::update( int milliseconds )
+{
+ if ( mWidth < 1 || mWidth > 2048 || mHeight < 1 || mHeight > 2048 )
+ return;
+
+ if ( mPixels == 0 )
+ return;
+
+ if ( mFirstTime )
+ {
+ for( int n = 0; n < ENumObjects; ++n )
+ {
+ mXpos[ n ] = ( mWidth / 2 ) + rand() % ( mWidth / 16 ) - ( mWidth / 32 );
+ mYpos[ n ] = ( mHeight / 2 ) + rand() % ( mHeight / 16 ) - ( mHeight / 32 );
+
+ mColorR[ n ] = rand() % 0x60 + 0x60;
+ mColorG[ n ] = rand() % 0x60 + 0x60;
+ mColorB[ n ] = rand() % 0x60 + 0x60;
+
+ mXInc[ n ] = 0;
+ while ( mXInc[ n ] == 0 )
+ mXInc[ n ] = rand() % 7 - 3;
+
+ mYInc[ n ] = 0;
+ while ( mYInc[ n ] == 0 )
+ mYInc[ n ] = rand() % 9 - 4;
+
+ mBlockSize[ n ] = rand() % 0x30 + 0x10;
+ };
+
+ delete [] mBackgroundPixels;
+
+ mBackgroundPixels = new unsigned char[ mWidth * mHeight * mDepth ];
+
+ mFirstTime = false;
+ };
+
+ if ( mStopAction )
+ return;
+
+ if ( time( NULL ) > mLastUpdateTime + 3 )
+ {
+ const int num_squares = rand() % 20 + 4;
+ int sqr1_r = rand() % 0x80 + 0x20;
+ int sqr1_g = rand() % 0x80 + 0x20;
+ int sqr1_b = rand() % 0x80 + 0x20;
+ int sqr2_r = rand() % 0x80 + 0x20;
+ int sqr2_g = rand() % 0x80 + 0x20;
+ int sqr2_b = rand() % 0x80 + 0x20;
+
+ for ( int y1 = 0; y1 < num_squares; ++y1 )
+ {
+ for ( int x1 = 0; x1 < num_squares; ++x1 )
+ {
+ int px_start = mWidth * x1 / num_squares;
+ int px_end = ( mWidth * ( x1 + 1 ) ) / num_squares;
+ int py_start = mHeight * y1 / num_squares;
+ int py_end = ( mHeight * ( y1 + 1 ) ) / num_squares;
+
+ for( int y2 = py_start; y2 < py_end; ++y2 )
+ {
+ for( int x2 = px_start; x2 < px_end; ++x2 )
+ {
+ int rowspan = mWidth * mDepth;
+
+ if ( ( y1 % 2 ) ^ ( x1 % 2 ) )
+ {
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 0 ] = sqr1_r;
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 1 ] = sqr1_g;
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 2 ] = sqr1_b;
+ }
+ else
+ {
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 0 ] = sqr2_r;
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 1 ] = sqr2_g;
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 2 ] = sqr2_b;
+ };
+ };
+ };
+ };
+ };
+
+ time( &mLastUpdateTime );
+ };
+
+ memcpy( mPixels, mBackgroundPixels, mWidth * mHeight * mDepth );
+
+ for( int n = 0; n < ENumObjects; ++n )
+ {
+ if ( rand() % 50 == 0 )
+ {
+ mXInc[ n ] = 0;
+ while ( mXInc[ n ] == 0 )
+ mXInc[ n ] = rand() % 7 - 3;
+
+ mYInc[ n ] = 0;
+ while ( mYInc[ n ] == 0 )
+ mYInc[ n ] = rand() % 9 - 4;
+ };
+
+ if ( mXpos[ n ] + mXInc[ n ] < 0 || mXpos[ n ] + mXInc[ n ] >= mWidth - mBlockSize[ n ] )
+ mXInc[ n ] =- mXInc[ n ];
+
+ if ( mYpos[ n ] + mYInc[ n ] < 0 || mYpos[ n ] + mYInc[ n ] >= mHeight - mBlockSize[ n ] )
+ mYInc[ n ] =- mYInc[ n ];
+
+ mXpos[ n ] += mXInc[ n ];
+ mYpos[ n ] += mYInc[ n ];
+
+ for( int y = 0; y < mBlockSize[ n ]; ++y )
+ {
+ for( int x = 0; x < mBlockSize[ n ]; ++x )
+ {
+ mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 0 ] = mColorR[ n ];
+ mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 1 ] = mColorG[ n ];
+ mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 2 ] = mColorB[ n ];
+ };
+ };
+ };
+
+ setDirty( 0, 0, mWidth, mHeight );
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//
+bool MediaPluginExample::init()
+{
+ LLPluginMessage message( LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text" );
+ message.setValue( "name", "Example Plugin" );
+ sendMessage( message );
+
+ return true;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//
+int init_media_plugin( LLPluginInstance::sendMessageFunction host_send_func,
+ void* host_user_data,
+ LLPluginInstance::sendMessageFunction *plugin_send_func,
+ void **plugin_user_data )
+{
+ MediaPluginExample* self = new MediaPluginExample( host_send_func, host_user_data );
+ *plugin_send_func = MediaPluginExample::staticReceiveMessage;
+ *plugin_user_data = ( void* )self;
+
+ return 0;
+}
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index 65a2b8b5e6..7b2dc02864 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -79,6 +79,8 @@ static const LLFlatListView::ItemReverseComparator REVERSE_NAME_COMPARATOR(NAME_
LLAvatarList::Params::Params()
: ignore_online_status("ignore_online_status", false)
, show_last_interaction_time("show_last_interaction_time", false)
+, show_info_btn("show_info_btn", true)
+, show_profile_btn("show_profile_btn", true)
{
}
@@ -89,6 +91,9 @@ LLAvatarList::LLAvatarList(const Params& p)
, mContextMenu(NULL)
, mDirty(true) // to force initial update
, mLITUpdateTimer(NULL)
+, mShowIcons(true)
+, mShowInfoBtn(p.show_info_btn)
+, mShowProfileBtn(p.show_profile_btn)
{
setCommitOnSelectionChange(true);
@@ -253,6 +258,8 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is
item->childSetVisible("info_btn", false);
item->setAvatarIconVisible(mShowIcons);
+ item->setShowInfoBtn(mShowInfoBtn);
+ item->setShowProfileBtn(mShowProfileBtn);
addItem(item, id, pos);
}
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index 8f2f0249a6..51d3760d39 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -59,6 +59,8 @@ public:
{
Optional<bool> ignore_online_status; // show all items as online
Optional<bool> show_last_interaction_time; // show most recent interaction time. *HACK: move this to a derived class
+ Optional<bool> show_info_btn;
+ Optional<bool> show_profile_btn;
Params();
};
@@ -96,6 +98,8 @@ private:
bool mShowLastInteractionTime;
bool mDirty;
bool mShowIcons;
+ bool mShowInfoBtn;
+ bool mShowProfileBtn;
LLTimer* mLITUpdateTimer; // last interaction time update timer
std::string mIconParamName;
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 8464430501..a7ac14c948 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -42,8 +42,6 @@
#include "llavatariconctrl.h"
#include "llbutton.h"
-S32 LLAvatarListItem::sIconWidth = 0;
-
LLAvatarListItem::LLAvatarListItem()
: LLPanel(),
mAvatarIcon(NULL),
@@ -53,15 +51,17 @@ LLAvatarListItem::LLAvatarListItem()
mInfoBtn(NULL),
mProfileBtn(NULL),
mContextMenu(NULL),
- mOnlineStatus(E_UNKNOWN)
+ mOnlineStatus(E_UNKNOWN),
+ mShowInfoBtn(true),
+ mShowProfileBtn(true)
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_avatar_list_item.xml");
// Remember avatar icon width including its padding from the name text box,
// so that we can hide and show the icon again later.
- if (!sIconWidth)
- {
- sIconWidth = mAvatarName->getRect().mLeft - mAvatarIcon->getRect().mLeft;
- }
+
+ mIconWidth = mAvatarName->getRect().mLeft - mAvatarIcon->getRect().mLeft;
+ mInfoBtnWidth = mInfoBtn->getRect().mRight - mSpeakingIndicator->getRect().mRight;
+ mProfileBtnWidth = mProfileBtn->getRect().mRight - mInfoBtn->getRect().mRight;
}
LLAvatarListItem::~LLAvatarListItem()
@@ -116,8 +116,8 @@ BOOL LLAvatarListItem::postBuild()
void LLAvatarListItem::onMouseEnter(S32 x, S32 y, MASK mask)
{
childSetVisible("hovered_icon", true);
- mInfoBtn->setVisible(true);
- mProfileBtn->setVisible(true);
+ mInfoBtn->setVisible(mShowInfoBtn);
+ mProfileBtn->setVisible(mShowProfileBtn);
LLPanel::onMouseEnter(x, y, mask);
}
@@ -202,6 +202,34 @@ void LLAvatarListItem::setLastInteractionTime(const std::string& val)
mLastInteractionTime->setValue(val);
}
+void LLAvatarListItem::setShowInfoBtn(bool show)
+{
+ // Already done? Then do nothing.
+ if(mShowInfoBtn == show)
+ return;
+ mShowInfoBtn = show;
+ S32 width_delta = show ? - mInfoBtnWidth : mInfoBtnWidth;
+
+ //Translating speaking indicator
+ mSpeakingIndicator->translate(width_delta, 0);
+ //Reshaping avatar name
+ mAvatarName->reshape(mAvatarName->getRect().getWidth() + width_delta, mAvatarName->getRect().getHeight());
+}
+
+void LLAvatarListItem::setShowProfileBtn(bool show)
+{
+ // Already done? Then do nothing.
+ if(mShowProfileBtn == show)
+ return;
+ mShowProfileBtn = show;
+ S32 width_delta = show ? - mProfileBtnWidth : mProfileBtnWidth;
+
+ //Translating speaking indicator
+ mSpeakingIndicator->translate(width_delta, 0);
+ //Reshaping avatar name
+ mAvatarName->reshape(mAvatarName->getRect().getWidth() + width_delta, mAvatarName->getRect().getHeight());
+}
+
void LLAvatarListItem::setAvatarIconVisible(bool visible)
{
// Already done? Then do nothing.
@@ -213,7 +241,7 @@ void LLAvatarListItem::setAvatarIconVisible(bool visible)
// Move the avatar name horizontally by icon size + its distance from the avatar name.
LLRect name_rect = mAvatarName->getRect();
- name_rect.mLeft += visible ? sIconWidth : -sIconWidth;
+ name_rect.mLeft += visible ? mIconWidth : -mIconWidth;
mAvatarName->setRect(name_rect);
}
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index 10c0b17005..cd7a85c3dc 100644
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -64,6 +64,9 @@ public:
void setName(const std::string& name);
void setAvatarId(const LLUUID& id, bool ignore_status_changes = false);
void setLastInteractionTime(const std::string& val);
+ //Show/hide profile/info btn, translating speaker indicator and avatar name coordinates accordingly
+ void setShowProfileBtn(bool hide);
+ void setShowInfoBtn(bool hide);
void setAvatarIconVisible(bool visible);
const LLUUID& getAvatarId() const;
@@ -99,7 +102,13 @@ private:
LLUUID mAvatarId;
EOnlineStatus mOnlineStatus;
- static S32 sIconWidth; // icon width + padding
+ //Flag indicating that info/profile button shouldn't be shown at all.
+ //Speaker indicator and avatar name coords are translated accordingly
+ bool mShowInfoBtn;
+ bool mShowProfileBtn;
+ S32 mIconWidth; // icon width + padding
+ S32 mInfoBtnWidth; //info btn width + padding
+ S32 mProfileBtnWidth; //profile btn width + padding
};
#endif //LL_LLAVATARLISTITEM_H
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index b21df87093..dee86f4a22 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -51,6 +51,7 @@
#include "llviewerwindow.h"
#include "llvoicechannel.h"
#include "lltransientfloatermgr.h"
+#include "llinventorymodel.h"
@@ -265,7 +266,7 @@ void LLIMFloater::draw()
}
}
- LLFloater::draw();
+ LLTransientDockableFloater::draw();
}
@@ -602,6 +603,162 @@ void LLIMFloater::processSessionUpdate(const LLSD& session_update)
}
}
+BOOL LLIMFloater::handleDragAndDrop(S32 x, S32 y, MASK mask,
+ BOOL drop, EDragAndDropType cargo_type,
+ void *cargo_data, EAcceptance *accept,
+ std::string& tooltip_msg)
+{
+
+ if (mDialog == IM_NOTHING_SPECIAL)
+ {
+ LLToolDragAndDrop::handleGiveDragAndDrop(mOtherParticipantUUID, mSessionID, drop,
+ cargo_type, cargo_data, accept);
+ }
+
+ // handle case for dropping calling cards (and folders of calling cards) onto invitation panel for invites
+ else if (isInviteAllowed())
+ {
+ *accept = ACCEPT_NO;
+
+ if (cargo_type == DAD_CALLINGCARD)
+ {
+ if (dropCallingCard((LLInventoryItem*)cargo_data, drop))
+ {
+ *accept = ACCEPT_YES_MULTI;
+ }
+ }
+ else if (cargo_type == DAD_CATEGORY)
+ {
+ if (dropCategory((LLInventoryCategory*)cargo_data, drop))
+ {
+ *accept = ACCEPT_YES_MULTI;
+ }
+ }
+ }
+ return TRUE;
+}
+
+BOOL LLIMFloater::dropCallingCard(LLInventoryItem* item, BOOL drop)
+{
+ BOOL rv = isInviteAllowed();
+ if(rv && item && item->getCreatorUUID().notNull())
+ {
+ if(drop)
+ {
+ std::vector<LLUUID> ids;
+ ids.push_back(item->getCreatorUUID());
+ inviteToSession(ids);
+ }
+ }
+ else
+ {
+ // set to false if creator uuid is null.
+ rv = FALSE;
+ }
+ return rv;
+}
+
+BOOL LLIMFloater::dropCategory(LLInventoryCategory* category, BOOL drop)
+{
+ BOOL rv = isInviteAllowed();
+ if(rv && category)
+ {
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ LLUniqueBuddyCollector buddies;
+ gInventory.collectDescendentsIf(category->getUUID(),
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ buddies);
+ S32 count = items.count();
+ if(count == 0)
+ {
+ rv = FALSE;
+ }
+ else if(drop)
+ {
+ std::vector<LLUUID> ids;
+ ids.reserve(count);
+ for(S32 i = 0; i < count; ++i)
+ {
+ ids.push_back(items.get(i)->getCreatorUUID());
+ }
+ inviteToSession(ids);
+ }
+ }
+ return rv;
+}
+
+BOOL LLIMFloater::isInviteAllowed() const
+{
+
+ return ( (IM_SESSION_CONFERENCE_START == mDialog)
+ || (IM_SESSION_INVITE == mDialog) );
+}
+
+class LLSessionInviteResponder : public LLHTTPClient::Responder
+{
+public:
+ LLSessionInviteResponder(const LLUUID& session_id)
+ {
+ mSessionID = session_id;
+ }
+
+ void error(U32 statusNum, const std::string& reason)
+ {
+ llinfos << "Error inviting all agents to session" << llendl;
+ //throw something back to the viewer here?
+ }
+
+private:
+ LLUUID mSessionID;
+};
+
+BOOL LLIMFloater::inviteToSession(const std::vector<LLUUID>& ids)
+{
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region)
+ {
+ return FALSE;
+ }
+
+ S32 count = ids.size();
+
+ if( isInviteAllowed() && (count > 0) )
+ {
+ llinfos << "LLIMFloater::inviteToSession() - inviting participants" << llendl;
+
+ std::string url = region->getCapability("ChatSessionRequest");
+
+ LLSD data;
+
+ data["params"] = LLSD::emptyArray();
+ for (int i = 0; i < count; i++)
+ {
+ data["params"].append(ids[i]);
+ }
+
+ data["method"] = "invite";
+ data["session-id"] = mSessionID;
+ LLHTTPClient::post(
+ url,
+ data,
+ new LLSessionInviteResponder(
+ mSessionID));
+ }
+ else
+ {
+ llinfos << "LLIMFloater::inviteToSession -"
+ << " no need to invite agents for "
+ << mDialog << llendl;
+ // successful add, because everyone that needed to get added
+ // was added.
+ }
+
+ return TRUE;
+}
+
void LLIMFloater::addTypingIndicator(const LLIMInfo* im_info)
{
// We may have lost a "stop-typing" packet, don't add it twice
diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h
index d2aac57ee2..f5edb3188a 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llimfloater.h
@@ -35,11 +35,13 @@
#include "lltransientdockablefloater.h"
#include "lllogchat.h"
+#include "lltooldraganddrop.h"
class LLLineEditor;
class LLPanelChatControlPanel;
class LLChatHistory;
-
+class LLInventoryItem;
+class LLInventoryCategory;
/**
* Individual IM window that appears at the bottom of the screen,
@@ -90,10 +92,21 @@ public:
void processIMTyping(const LLIMInfo* im_info, BOOL typing);
void processSessionUpdate(const LLSD& session_update);
+ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask,
+ BOOL drop, EDragAndDropType cargo_type,
+ void *cargo_data, EAcceptance *accept,
+ std::string& tooltip_msg);
+
private:
// process focus events to set a currently active session
/* virtual */ void onFocusLost();
/* virtual */ void onFocusReceived();
+
+ BOOL dropCallingCard(LLInventoryItem* item, BOOL drop);
+ BOOL dropCategory(LLInventoryCategory* category, BOOL drop);
+
+ BOOL isInviteAllowed() const;
+ BOOL inviteToSession(const std::vector<LLUUID>& agent_ids);
static void onInputEditorFocusReceived( LLFocusableElement* caller, void* userdata );
static void onInputEditorFocusLost(LLFocusableElement* caller, void* userdata);
diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp
index 091346d3b4..0b07dd4f21 100644
--- a/indra/newview/lllandmarkactions.cpp
+++ b/indra/newview/lllandmarkactions.cpp
@@ -133,6 +133,33 @@ public:
}
};
+// Returns true if the given inventory item is a landmark pointing to the current parcel.
+// Used to find out if there is at least one landmark from current parcel.
+class LLFistAgentParcelLandmark : public LLInventoryCollectFunctor
+{
+private:
+ bool mFounded;// to avoid unnecessary check
+
+public:
+ LLFistAgentParcelLandmark(): mFounded(false){}
+
+ /*virtual*/ bool operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+ {
+ if (mFounded || !item || item->getType() != LLAssetType::AT_LANDMARK)
+ return false;
+
+ LLLandmark* landmark = gLandmarkList.getAsset(item->getAssetUUID());
+ if (!landmark) // the landmark not been loaded yet
+ return false;
+
+ LLVector3d landmark_global_pos;
+ if (!landmark->getGlobalPos(landmark_global_pos))
+ return false;
+ mFounded = LLViewerParcelMgr::getInstance()->inAgentParcel(landmark_global_pos);
+ return mFounded;
+ }
+};
+
static void fetch_landmarks(LLInventoryModel::cat_array_t& cats,
LLInventoryModel::item_array_t& items,
LLInventoryCollectFunctor& add)
@@ -172,6 +199,16 @@ bool LLLandmarkActions::landmarkAlreadyExists()
return findLandmarkForAgentPos() != NULL;
}
+//static
+bool LLLandmarkActions::hasParcelLandmark()
+{
+ LLFistAgentParcelLandmark get_first_agent_landmark;
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ fetch_landmarks(cats, items, get_first_agent_landmark);
+ return !items.empty();
+
+}
// *TODO: This could be made more efficient by only fetching the FIRST
// landmark that meets the criteria
diff --git a/indra/newview/lllandmarkactions.h b/indra/newview/lllandmarkactions.h
index 32f05e702b..312426cab0 100644
--- a/indra/newview/lllandmarkactions.h
+++ b/indra/newview/lllandmarkactions.h
@@ -50,9 +50,14 @@ public:
*/
static LLInventoryModel::item_array_t fetchLandmarksByName(std::string& name, BOOL if_use_substring);
/**
- * @brief Checks whether landmark exists for current parcel.
+ * @brief Checks whether landmark exists for current agent position.
*/
static bool landmarkAlreadyExists();
+
+ /**
+ * @brief Checks whether landmark exists for current parcel.
+ */
+ static bool hasParcelLandmark();
/**
* @brief Searches landmark for global position.
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 00f12ae2eb..8fe317a292 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -294,6 +294,11 @@ void LLLocationInputCtrl::hideList()
BOOL LLLocationInputCtrl::handleToolTip(S32 x, S32 y, MASK mask)
{
+
+ if(mAddLandmarkBtn->parentPointInView(x,y))
+ {
+ updateAddLandmarkTooltip();
+ }
// Let the buttons show their tooltips.
if (LLUICtrl::handleToolTip(x, y, mask))
{
@@ -602,11 +607,12 @@ void LLLocationInputCtrl::enableAddLandmarkButton(bool val)
// depending on whether current parcel has been landmarked.
void LLLocationInputCtrl::updateAddLandmarkButton()
{
- bool landmark_exists = LLLandmarkActions::landmarkAlreadyExists();
- enableAddLandmarkButton(!landmark_exists);
-
+ enableAddLandmarkButton(LLLandmarkActions::hasParcelLandmark());
+}
+void LLLocationInputCtrl::updateAddLandmarkTooltip()
+{
std::string tooltip;
- if(landmark_exists)
+ if(LLLandmarkActions::landmarkAlreadyExists())
{
tooltip = mEditLandmarkTooltip;
}
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h
index c74a294ca3..44dc0cb251 100644
--- a/indra/newview/lllocationinputctrl.h
+++ b/indra/newview/lllocationinputctrl.h
@@ -107,6 +107,7 @@ private:
bool findTeleportItemsByTitle(const LLTeleportHistoryItem& item, const std::string& filter);
void setText(const LLStringExplicit& text);
void updateAddLandmarkButton();
+ void updateAddLandmarkTooltip();
void updateContextMenu();
void updateWidgetlayout();
void changeLocationPresentation();
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index 957513e154..8a8ad9d073 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -262,8 +262,9 @@ void LLNearbyChatScreenChannel::showToastsBottom()
toast_rect.setLeftTopAndSize(getRect().mLeft , toast_top, toast_rect.getWidth() ,toast_rect.getHeight());
toast->setRect(toast_rect);
-
+ toast->setIsHidden(false);
toast->setVisible(TRUE);
+
bottom = toast->getRect().mTop;
}
}
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 48a93f0d42..6bff01ee5e 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -184,9 +184,8 @@ void LLLandmarksPanel::updateVerbs()
if (!isTabVisible())
return;
- BOOL enabled = isLandmarkSelected();
- mTeleportBtn->setEnabled(enabled);
- mShowOnMapBtn->setEnabled(enabled);
+ mTeleportBtn->setEnabled(isActionEnabled("teleport"));
+ mShowOnMapBtn->setEnabled(isActionEnabled("show_on_map"));
// TODO: mantipov: Uncomment when mShareBtn is supported
// Share button should be enabled when neither a folder nor a landmark is selected
diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp
index 5af27a5ec1..34644cfe42 100644
--- a/indra/newview/llpanelplaceinfo.cpp
+++ b/indra/newview/llpanelplaceinfo.cpp
@@ -54,6 +54,7 @@
#include "llaccordionctrltab.h"
#include "llagent.h"
#include "llagentui.h"
+#include "llappviewer.h"
#include "llavatarpropertiesprocessor.h"
#include "llcallbacklist.h"
#include "llexpandabletextbox.h"
@@ -1003,13 +1004,15 @@ void LLPanelPlaceInfo::updateYouAreHereBanner(void* userdata)
LLPanelPlaceInfo* self = static_cast<LLPanelPlaceInfo*>(userdata);
if(!self->getVisible())
return;
+ if(!gDisconnected)
+ {
+ static F32 radius = gSavedSettings.getF32("YouAreHereDistance");
- static F32 radius = gSavedSettings.getF32("YouAreHereDistance");
-
- BOOL display_banner = self->mLastSelectedRegionID == gAgent.getRegion()->getRegionID() &&
+ BOOL display_banner = gAgent.getRegion()->getRegionID() == self->mLastSelectedRegionID &&
LLAgentUI::checkAgentDistance(self->mPosRegion, radius);
- self->mYouAreHerePanel->setVisible(display_banner);
+ self->mYouAreHerePanel->setVisible(display_banner);
+ }
}
void LLPanelPlaceInfo::onForSaleBannerClick()
diff --git a/indra/newview/skins/default/textures/containers/Accordion_Selected.png b/indra/newview/skins/default/textures/containers/Accordion_Selected.png
new file mode 100644
index 0000000000..0616dea6a3
--- /dev/null
+++ b/indra/newview/skins/default/textures/containers/Accordion_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 401f32c908..fdc7deab1c 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -6,6 +6,8 @@
<texture name="Accordion_ArrowOpened_Press" file_name="containers/Accordion_ArrowOpened_Press.png" preload="false" />
<texture name="Accordion_Off" file_name="containers/Accordion_Off.png" preload="false" />
<texture name="Accordion_Press" file_name="containers/Accordion_Press.png" preload="false" />
+ <texture name="Accordion_Over" file_name="containers/Accordion_Over.png" preload="false" />
+ <texture name="Accordion_Selected" file_name="containers/Accordion_Selected.png" preload="false" />
<texture name="Activate_Checkmark" file_name="taskpanel/Activate_Checkmark.png" preload="false" />
@@ -442,6 +444,9 @@
<!--WARNING OLD ART *do not use*-->
+ <texture name="Banner_ForSale" file_name="Banner_ForSale.png" preload="false" />
+ <texture name="Banner_YouAreHere" file_name="Banner_YouAreHere.png" preload="false" />
+
<texture name="btn_chatbar.tga" scale.left="20" scale.top="24" scale.right="44" scale.bottom="0" />
<texture name="btn_chatbar_selected.tga" scale.left="20" scale.top="24" scale.right="44" scale.bottom="0" />
diff --git a/indra/newview/skins/default/xui/en/floater_moveview.xml b/indra/newview/skins/default/xui/en/floater_moveview.xml
index 01a1b95a9a..02cbef5987 100644
--- a/indra/newview/skins/default/xui/en/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/en/floater_moveview.xml
@@ -3,7 +3,7 @@
legacy_header_height="18"
can_dock="true"
can_close="true"
- can_minimize="true"
+ can_minimize="false"
center_horiz="true"
follows="bottom"
height="110"
@@ -38,7 +38,7 @@
Fly Backwards (press Down Arrow or S)
</string>
<panel
- border="true"
+ border="false"
height="83"
follows="left|top"
layout="topleft"
@@ -136,7 +136,7 @@
</panel>
<!-- Width and height of this panel should be synchronized with panel_stand_stop_flying.xml -->
<panel
- border="true"
+ border="false"
height="27"
layout="topleft"
left="0"
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 65dd4e74ff..e7c5bf8585 100644
--- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
@@ -14,6 +14,7 @@
help_topic="nearby_chat"
save_rect="true"
title="Nearby Chat"
+ save_dock_state="true"
save_visibility="true"
single_instance="true"
width="320">
diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
index 8db745fab7..1003b4a3a8 100644
--- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
@@ -13,6 +13,8 @@
left="3"
name="speakers_list"
opaque="false"
+ show_info_btn="false"
+ show_profile_btn="false"
top="10"
width="140" />
<button
diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
index 15b6b2a00d..ce952628c6 100644
--- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
@@ -13,6 +13,8 @@
left="3"
name="speakers_list"
opaque="false"
+ show_info_btn="false"
+ show_profile_btn="false"
top="10"
width="140" />
<button
diff --git a/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml b/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml
index dabcb1038b..fcfe89c653 100644
--- a/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml
+++ b/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml
@@ -9,4 +9,5 @@
header_image="Accordion_Off"
header_image_over="Accordion_Over"
header_image_pressed="Accordion_Press"
+ header_image_selected="Accordion_Selected"
/>
diff --git a/indra/newview/skins/default/xui/en/widgets/panel.xml b/indra/newview/skins/default/xui/en/widgets/panel.xml
index 127f0f40e8..1bd5a5bda2 100644
--- a/indra/newview/skins/default/xui/en/widgets/panel.xml
+++ b/indra/newview/skins/default/xui/en/widgets/panel.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!-- Optional parameters:
+ border - show border around panel
bg_opaque_image - image name for "in-front" panel look
bg_alpha_image - image name for "in-back" or transparent panel look
-->
diff --git a/indra/test_apps/llplugintest/CMakeLists.txt b/indra/test_apps/llplugintest/CMakeLists.txt
index 88c4ba8ad9..53b981cccd 100644
--- a/indra/test_apps/llplugintest/CMakeLists.txt
+++ b/indra/test_apps/llplugintest/CMakeLists.txt
@@ -293,6 +293,7 @@ add_dependencies(llmediaplugintest
SLPlugin
media_plugin_quicktime
media_plugin_webkit
+ media_plugin_example
${LLPLUGIN_LIBRARIES}
${LLMESSAGE_LIBRARIES}
${LLCOMMON_LIBRARIES}
@@ -369,6 +370,12 @@ if (DARWIN OR WINDOWS)
DEPENDS ${BUILT_QUICKTIME_PLUGIN}
)
+ get_target_property(BUILT_EXAMPLE_PLUGIN media_plugin_example LOCATION)
+ add_custom_command(TARGET llmediaplugintest POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_EXAMPLE_PLUGIN} ${PLUGINS_DESTINATION_DIR}
+ DEPENDS ${BUILT_EXAMPLE_PLUGIN}
+ )
+
# copy over bookmarks file if llmediaplugintest gets built
get_target_property(BUILT_LLMEDIAPLUGINTEST llmediaplugintest LOCATION)
add_custom_command(TARGET llmediaplugintest POST_BUILD
diff --git a/indra/test_apps/llplugintest/bookmarks.txt b/indra/test_apps/llplugintest/bookmarks.txt
index ef34167b29..b8b83df386 100644
--- a/indra/test_apps/llplugintest/bookmarks.txt
+++ b/indra/test_apps/llplugintest/bookmarks.txt
@@ -34,3 +34,4 @@
(QT) Movie - The Informers,http://movies.apple.com/movies/independent/theinformers/theinformers_h.320.mov
(QT) Animated GIF,http://upload.wikimedia.org/wikipedia/commons/4/44/Optical.greysquares.arp-animated.gif
(QT) Apple Text Descriptors,http://ubrowser.com/tmp/apple_text.txt
+(EX) Example Plugin,example://blah
diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp
index 553d1ab131..d987915bb8 100644
--- a/indra/test_apps/llplugintest/llmediaplugintest.cpp
+++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp
@@ -138,8 +138,6 @@ LLMediaPluginTest::LLMediaPluginTest( int app_window, int window_width, int wind
mMediaBrowserControlBackButtonFlag( true ),
mMediaBrowserControlForwardButtonFlag( true ),
mHomeWebUrl( "http://www.google.com/" )
- //mHomeWebUrl( "file:///C|/Program Files/QuickTime/Sample.mov" )
- //mHomeWebUrl( "http://movies.apple.com/movies/wb/watchmen/watchmen-tlr2_480p.mov" )
{
// debugging spam
std::cout << std::endl << " GLUT version: " << "3.7.6" << std::endl; // no way to get real version from GLUT
@@ -277,8 +275,6 @@ void LLMediaPluginTest::bindTexture(GLuint texture, GLint row_length, GLint alig
{
glEnable( GL_TEXTURE_2D );
-// std::cerr << "binding texture " << texture << std::endl;
-
glBindTexture( GL_TEXTURE_2D, texture );
glPixelStorei( GL_UNPACK_ROW_LENGTH, row_length );
glPixelStorei( GL_UNPACK_ALIGNMENT, alignment );
@@ -410,7 +406,7 @@ void LLMediaPluginTest::draw( int draw_type )
// only bother with pick if we have something to render
// Actually, we need to pick even if we're not ready to render.
// Otherwise you can't select and remove a panel which has gone bad.
-// if ( mMediaPanels[ panel ]->mReadyToRender )
+ //if ( mMediaPanels[ panel ]->mReadyToRender )
{
glMatrixMode( GL_TEXTURE );
glPushMatrix();
@@ -621,10 +617,10 @@ void LLMediaPluginTest::idle()
if ( mSelectedPanel )
{
// set volume based on slider if we have time media
-// if ( mGluiMediaTimeControlWindowFlag )
-// {
-// mSelectedPanel->mMediaSource->setVolume( (float)mMediaTimeControlVolume / 100.0f );
-// };
+ //if ( mGluiMediaTimeControlWindowFlag )
+ //{
+ // mSelectedPanel->mMediaSource->setVolume( (float)mMediaTimeControlVolume / 100.0f );
+ //};
// NOTE: it is absurd that we need cache the state of GLUI controls
// but enabling/disabling controls drags framerate from 500+
@@ -1463,6 +1459,9 @@ std::string LLMediaPluginTest::mimeTypeFromUrl( std::string& url )
else
if ( url.find( ".txt" ) != std::string::npos ) // Apple Text descriptors
mime_type = "video/quicktime";
+ else
+ if ( url.find( "example://" ) != std::string::npos ) // Example plugin
+ mime_type = "example/example";
return mime_type;
}
@@ -1487,6 +1486,9 @@ std::string LLMediaPluginTest::pluginNameFromMimeType( std::string& mime_type )
else
if ( mime_type == "text/html" )
plugin_name = "media_plugin_webkit.dll";
+ else
+ if ( mime_type == "example/example" )
+ plugin_name = "media_plugin_example.dll";
#elif LL_LINUX
std::string plugin_name( "libmedia_plugin_null.so" );
@@ -1799,7 +1801,7 @@ void LLMediaPluginTest::getRandomMediaSize( int& width, int& height, std::string
// adjust this random size if it's a browser so we get
// a more useful size for testing..
- if ( mime_type == "text/html" )
+ if ( mime_type == "text/html" || mime_type == "example/example" )
{
width = ( ( rand() % 100 ) + 100 ) * 4;
height = ( width * ( ( rand() % 400 ) + 1000 ) ) / 1000;