summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xBuildParams9
-rwxr-xr-xautobuild.xml144
-rwxr-xr-xindra/CMakeLists.txt6
-rwxr-xr-xindra/cmake/00-Common.cmake2
-rw-r--r--indra/cmake/CEFPlugin.cmake40
-rwxr-xr-xindra/cmake/CMakeLists.txt8
-rwxr-xr-xindra/cmake/Linking.cmake2
-rwxr-xr-xindra/cmake/Variables.cmake8
-rwxr-xr-xindra/cmake/WebKitLibPlugin.cmake93
-rwxr-xr-xindra/lib/python/indra/util/llmanifest.py56
-rwxr-xr-xindra/llcommon/llprocess.cpp7
-rwxr-xr-xindra/llmessage/llcurl.cpp5
-rwxr-xr-xindra/llmessage/llcurl.h1
-rwxr-xr-xindra/llplugin/CMakeLists.txt3
-rwxr-xr-xindra/llplugin/llpluginclassmedia.cpp15
-rwxr-xr-xindra/llplugin/llpluginclassmedia.h2
-rwxr-xr-xindra/llplugin/slplugin/slplugin.cpp1
-rwxr-xr-xindra/llui/llfocusmgr.cpp6
-rwxr-xr-xindra/llui/llfocusmgr.h1
-rwxr-xr-xindra/llui/llview.cpp46
-rwxr-xr-xindra/llui/llview.h3
-rw-r--r--indra/llwindow/llopenglview-objc.mm6
-rwxr-xr-xindra/llwindow/llwindowwin32.cpp13
-rwxr-xr-xindra/llwindow/llwindowwin32.h3
-rwxr-xr-xindra/media_plugins/CMakeLists.txt9
-rw-r--r--[-rwxr-xr-x]indra/media_plugins/cef/CMakeLists.txt (renamed from indra/media_plugins/webkit/CMakeLists.txt)75
-rw-r--r--[-rwxr-xr-x]indra/media_plugins/cef/mac_volume_catcher.cpp (renamed from indra/media_plugins/webkit/mac_volume_catcher.cpp)2
-rw-r--r--indra/media_plugins/cef/media_plugin_cef.cpp817
-rw-r--r--[-rwxr-xr-x]indra/media_plugins/cef/volume_catcher.h (renamed from indra/media_plugins/webkit/volume_catcher.h)0
-rw-r--r--[-rwxr-xr-x]indra/media_plugins/cef/windows_volume_catcher.cpp (renamed from indra/media_plugins/webkit/windows_volume_catcher.cpp)0
-rwxr-xr-xindra/media_plugins/quicktime/CMakeLists.txt3
-rwxr-xr-xindra/media_plugins/webkit/dummy_volume_catcher.cpp58
-rwxr-xr-xindra/media_plugins/webkit/linux_volume_catcher.cpp468
-rwxr-xr-xindra/media_plugins/webkit/linux_volume_catcher_pa_syms.inc21
-rwxr-xr-xindra/media_plugins/webkit/linux_volume_catcher_paglib_syms.inc6
-rwxr-xr-xindra/media_plugins/webkit/media_plugin_webkit.cpp1481
-rwxr-xr-xindra/media_plugins/winmmshim/CMakeLists.txt3
-rwxr-xr-xindra/newview/CMakeLists.txt64
-rw-r--r--indra/newview/VIEWER_VERSION.txt2
-rwxr-xr-xindra/newview/llappviewer.cpp13
-rwxr-xr-xindra/newview/llmediactrl.cpp47
-rwxr-xr-xindra/newview/llmediactrl.h1
-rwxr-xr-xindra/newview/llviewerkeyboard.cpp5
-rwxr-xr-xindra/newview/llviewerkeyboard.h1
-rwxr-xr-xindra/newview/llviewermedia.cpp108
-rwxr-xr-xindra/newview/llviewermedia.h6
-rwxr-xr-xindra/newview/llviewermediafocus.cpp7
-rwxr-xr-xindra/newview/llviewermediafocus.h1
-rwxr-xr-xindra/newview/llviewerwindow.cpp38
-rwxr-xr-xindra/newview/llviewerwindow.h1
-rwxr-xr-xindra/newview/skins/default/xui/en/menu_login.xml2
-rwxr-xr-xindra/newview/skins/default/xui/en/menu_viewer.xml4
-rwxr-xr-xindra/newview/skins/default/xui/en/mime_types.xml40
-rwxr-xr-xindra/newview/skins/default/xui/en/mime_types_mac.xml38
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_preferences_setup.xml13
-rwxr-xr-xindra/newview/skins/default/xui/en/strings.xml2
-rwxr-xr-xindra/newview/viewer_manifest.py266
-rw-r--r--indra/test_apps/llfbconnecttest/CMakeLists.txt372
-rw-r--r--indra/test_apps/llfbconnecttest/README.Linden20
-rw-r--r--indra/test_apps/llfbconnecttest/bookmarks.txt4
-rw-r--r--indra/test_apps/llfbconnecttest/llfbconnecttest.cpp2394
-rw-r--r--indra/test_apps/llfbconnecttest/llfbconnecttest.h173
-rwxr-xr-xindra/test_apps/llplugintest/CMakeLists.txt277
-rwxr-xr-xindra/test_apps/llplugintest/llmediaplugintest.cpp2377
-rwxr-xr-xindra/test_apps/llplugintest/llmediaplugintest.h207
65 files changed, 1478 insertions, 8428 deletions
diff --git a/BuildParams b/BuildParams
index aeea3b1246..15fb56ec17 100755
--- a/BuildParams
+++ b/BuildParams
@@ -70,12 +70,15 @@ additional_packages = ""
# the viewer_channel_suffix is prefixed by a blank and then appended to the viewer_channel
# for the package in a setting that overrides the compiled-in value
################################################################
-additional_packages = "EDU"
+## Removed 2015-07-02 (MAINT-5360) until we fix packaging step in Team City
+## additional_packages = "EDU"
# The EDU package allows us to create a separate release channel whose expirations
# are synchronized as much as possible with the academic year
-EDU_sourceid = ""
-EDU_viewer_channel_suffix = "edu"
+## Removed 2015-07-02 (MAINT-5360) until we fix packaging step in Team City
+## EDU_sourceid = ""
+## Removed 2015-07-02 (MAINT-5360) until we fix packaging step in Team City
+## EDU_viewer_channel_suffix = "edu"
# Notifications - to configure email notices, add a setting like this:
# <username>_<reponame>.email = <email-address>
diff --git a/autobuild.xml b/autobuild.xml
index 52d750f64d..e6f1bb11aa 100755
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -1517,16 +1517,18 @@
<key>version</key>
<string>0.0.1</string>
</map>
- <key>llphysicsextensions_source</key>
+ <key>llceflib</key>
<map>
<key>copyright</key>
- <string>Copyright (c) 2010, Linden Research, Inc.</string>
+ <string>Copyright (c) 2014, Linden Research, Inc.</string>
+ <key>description</key>
+ <string>LLCefLib implements a headless web browser, rendering modern web content to a memory buffer and providing an API for injecting mouse and keyboard events. It uses the Chromium Embedded Framework (https://bitbucket.org/chromiumembedded/cef)</string>
<key>license</key>
- <string>internal</string>
+ <string>LGPL</string>
<key>license_file</key>
- <string>LICENSES/llphysicsextensions.txt</string>
+ <string>LICENSES/LICENSE-source.txt</string>
<key>name</key>
- <string>llphysicsextensions_source</string>
+ <string>llceflib</string>
<key>platforms</key>
<map>
<key>darwin</key>
@@ -1534,44 +1536,34 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>468e88a527e610804c3eecf07f4ed70b</string>
+ <string>e1c24780a5ee341fc38b860f27827df5</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
- <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llphysicsextensions-source_llphysicsextensions-update/rev/298369/arch/Darwin/installer/llphysicsextensions_source-1.0.298369-darwin-298369.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llceflib_3p-llceflib/rev/306266/arch/Darwin/installer/llceflib-1.2.0.306266-darwin-306266.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
</map>
- <key>linux</key>
- <map>
- <key>archive</key>
- <map>
- <key>hash</key>
- <string>793964e49c935b414c4bdbb8a0d14ad1</string>
- <key>url</key>
- <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llphysicsextensions-source_llphysicsextensions-update/rev/298369/arch/Linux/installer/llphysicsextensions_source-1.0.298369-linux-298369.tar.bz2</string>
- </map>
- <key>name</key>
- <string>linux</string>
- </map>
<key>windows</key>
<map>
<key>archive</key>
<map>
<key>hash</key>
- <string>922aad5261aac150e5ce3c094e57f373</string>
+ <string>ab90c7250d2b0859f2094c113101277b</string>
+ <key>hash_algorithm</key>
+ <string>md5</string>
<key>url</key>
- <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llphysicsextensions-source_llphysicsextensions-update/rev/298369/arch/CYGWIN/installer/llphysicsextensions_source-1.0.298369-windows-298369.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llceflib_3p-llceflib/rev/306266/arch/CYGWIN/installer/llceflib-1.2.0.306266-windows-306266.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
</map>
</map>
<key>version</key>
- <string>1.0.298369</string>
+ <string>1.2.0.306266</string>
</map>
- <key>llphysicsextensions_stub</key>
+ <key>llphysicsextensions_source</key>
<map>
<key>copyright</key>
<string>Copyright (c) 2010, Linden Research, Inc.</string>
@@ -1580,7 +1572,7 @@
<key>license_file</key>
<string>LICENSES/llphysicsextensions.txt</string>
<key>name</key>
- <string>llphysicsextensions_stub</string>
+ <string>llphysicsextensions_source</string>
<key>platforms</key>
<map>
<key>darwin</key>
@@ -1588,11 +1580,11 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>1175977a191ffc936fd0ccca433c8278</string>
+ <string>468e88a527e610804c3eecf07f4ed70b</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/llphysicsextensions-stub_llphysicsextensions-update/rev/298370/arch/Darwin/installer/llphysicsextensions_stub-1.0.298370-darwin-298370.tar.bz2</string>
+ <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llphysicsextensions-source_llphysicsextensions-update/rev/298369/arch/Darwin/installer/llphysicsextensions_source-1.0.298369-darwin-298369.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@@ -1602,9 +1594,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>d13d7927692eab2d6a63e36166b72a8a</string>
+ <string>793964e49c935b414c4bdbb8a0d14ad1</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/llphysicsextensions-stub_llphysicsextensions-update/rev/298370/arch/Linux/installer/llphysicsextensions_stub-1.0.298370-linux-298370.tar.bz2</string>
+ <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llphysicsextensions-source_llphysicsextensions-update/rev/298369/arch/Linux/installer/llphysicsextensions_source-1.0.298369-linux-298369.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -1614,29 +1606,27 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>9594f6fd79ee924fe675a4a23e30516e</string>
+ <string>922aad5261aac150e5ce3c094e57f373</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/llphysicsextensions-stub_llphysicsextensions-update/rev/298370/arch/CYGWIN/installer/llphysicsextensions_stub-1.0.298370-windows-298370.tar.bz2</string>
+ <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llphysicsextensions-source_llphysicsextensions-update/rev/298369/arch/CYGWIN/installer/llphysicsextensions_source-1.0.298369-windows-298369.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
</map>
</map>
<key>version</key>
- <string>1.0.298370</string>
+ <string>1.0.298369</string>
</map>
- <key>llqtwebkit</key>
+ <key>llphysicsextensions_stub</key>
<map>
<key>copyright</key>
- <string>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</string>
- <key>description</key>
- <string>QT cross-platform application and UI framework.</string>
+ <string>Copyright (c) 2010, Linden Research, Inc.</string>
<key>license</key>
- <string>LGPL</string>
+ <string>internal</string>
<key>license_file</key>
- <string>LICENSES/llqtwebkit.txt</string>
+ <string>LICENSES/llphysicsextensions.txt</string>
<key>name</key>
- <string>llqtwebkit</string>
+ <string>llphysicsextensions_stub</string>
<key>platforms</key>
<map>
<key>darwin</key>
@@ -1644,11 +1634,11 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>3c2b6be4c78b2479c3fae612e1053d37</string>
+ <string>1175977a191ffc936fd0ccca433c8278</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/canonical_3p-llqtwebkit2/rev/295522/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20141015.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/llphysicsextensions-stub_llphysicsextensions-update/rev/298370/arch/Darwin/installer/llphysicsextensions_stub-1.0.298370-darwin-298370.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@@ -1658,11 +1648,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>d31358176b9ba8c676458cc061767c0b</string>
- <key>hash_algorithm</key>
- <string>md5</string>
+ <string>d13d7927692eab2d6a63e36166b72a8a</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/canonical_3p-llqtwebkit2/rev/295522/arch/Linux/installer/llqtwebkit-4.7.1-linux-20141015.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/llphysicsextensions-stub_llphysicsextensions-update/rev/298370/arch/Linux/installer/llphysicsextensions_stub-1.0.298370-linux-298370.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -1672,18 +1660,16 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>bb4e8c8006c8a7aef6d3e3c36a8cebbf</string>
- <key>hash_algorithm</key>
- <string>md5</string>
+ <string>9594f6fd79ee924fe675a4a23e30516e</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/canonical_3p-llqtwebkit2/rev/295522/arch/CYGWIN/installer/llqtwebkit-4.7.1-windows-20141015.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/llphysicsextensions-stub_llphysicsextensions-update/rev/298370/arch/CYGWIN/installer/llphysicsextensions_stub-1.0.298370-windows-298370.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
</map>
</map>
<key>version</key>
- <string>4.7.1</string>
+ <string>1.0.298370</string>
</map>
<key>mesa</key>
<map>
@@ -2052,9 +2038,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>3f8b52280cb1eff2d1acd0214bce1b16</string>
+ <string>78650a79bda6435e623a940ad425a593</string>
<key>url</key>
- <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/quicktime_3p-update-quicktime/rev/296445/arch/CYGWIN/installer/quicktime-7.3-windows-296445.tar.bz2</string>
+ <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/quicktime_3p-update-quicktime/rev/300073/arch/CYGWIN/installer/quicktime-7.3-windows-300073.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@@ -2063,62 +2049,6 @@
<key>version</key>
<string>7.3</string>
</map>
- <key>slplugins</key>
- <map>
- <key>copyright</key>
- <string>Second Life Viewer Source Code - Copyright (C) 2010, Linden Research, Inc.</string>
- <key>description</key>
- <string>Second Life Viewer Plugins and launcher</string>
- <key>license</key>
- <string>LGPL</string>
- <key>license_file</key>
- <string>LICENSES/slplugins-license.txt</string>
- <key>name</key>
- <string>slplugins</string>
- <key>platforms</key>
- <map>
- <key>darwin</key>
- <map>
- <key>archive</key>
- <map>
- <key>hash</key>
- <string>f6bfb026572f03a4c8ac6b2b7d7eb0ae</string>
- <key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/slplugins_3p-update-slplugins/rev/298079/arch/Darwin/installer/slplugins-3.7.24.297623.298079-darwin-298079.tar.bz2</string>
- </map>
- <key>name</key>
- <string>darwin</string>
- </map>
- <key>linux</key>
- <map>
- <key>archive</key>
- <map>
- <key>hash</key>
- <string>64b8a3bac95b5888a7ede3d7661a18b8</string>
- <key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/slplugins_3p-update-slplugins/rev/298079/arch/Linux/installer/slplugins-3.7.24.297623.298079-linux-298079.tar.bz2</string>
- </map>
- <key>name</key>
- <string>linux</string>
- </map>
- <key>windows</key>
- <map>
- <key>archive</key>
- <map>
- <key>hash</key>
- <string>3a1ea3385303b78b0327c8cea929ef27</string>
- <key>hash_algorithm</key>
- <string>md5</string>
- <key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/slplugins_3p-update-slplugins/rev/298079/arch/CYGWIN/installer/slplugins-3.7.24.297623.298079-windows-298079.tar.bz2</string>
- </map>
- <key>name</key>
- <string>windows</string>
- </map>
- </map>
- <key>version</key>
- <string>3.7.24.297623.298079</string>
- </map>
<key>slvoice</key>
<map>
<key>copyright</key>
diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt
index 10692402a5..133c5ee265 100755
--- a/indra/CMakeLists.txt
+++ b/indra/CMakeLists.txt
@@ -57,12 +57,6 @@ add_subdirectory(${VIEWER_PREFIX}test)
if (ENABLE_MEDIA_PLUGINS)
# viewer media plugins
add_subdirectory(${LIBS_OPEN_PREFIX}media_plugins)
-
- # llplugin testbed code (is this the right way to include it?)
- if (LL_TESTS AND NOT LINUX)
- add_subdirectory(${VIEWER_PREFIX}test_apps/llplugintest)
- add_subdirectory(${VIEWER_PREFIX}test_apps/llfbconnecttest)
- endif (LL_TESTS AND NOT LINUX)
endif (ENABLE_MEDIA_PLUGINS)
if (LINUX)
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index 7a320ffc59..1a3b6c5117 100755
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -191,7 +191,7 @@ if (DARWIN)
add_definitions(-DLL_DARWIN=1)
set(CMAKE_CXX_LINK_FLAGS "-Wl,-no_compact_unwind -Wl,-headerpad_max_install_names,-search_paths_first")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
- set(DARWIN_extra_cstar_flags "-g")
+ set(DARWIN_extra_cstar_flags "-g -Wno-unused-local-typedef -Wno-deprecated-declarations")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${DARWIN_extra_cstar_flags}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${DARWIN_extra_cstar_flags}")
# NOTE: it's critical that the optimization flag is put in front.
diff --git a/indra/cmake/CEFPlugin.cmake b/indra/cmake/CEFPlugin.cmake
new file mode 100644
index 0000000000..9cfb7d14c7
--- /dev/null
+++ b/indra/cmake/CEFPlugin.cmake
@@ -0,0 +1,40 @@
+# -*- cmake -*-
+include(Linking)
+include(Prebuilt)
+
+if (USESYSTEMLIBS)
+ set(CEFPLUGIN OFF CACHE BOOL
+ "CEFPLUGIN support for the llplugin/llmedia test apps.")
+else (USESYSTEMLIBS)
+ use_prebuilt_binary(llceflib)
+ set(CEFPLUGIN ON CACHE BOOL
+ "CEFPLUGIN support for the llplugin/llmedia test apps.")
+ set(CEF_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/cef)
+endif (USESYSTEMLIBS)
+
+if (WINDOWS)
+ set(CEF_PLUGIN_LIBRARIES
+ libcef.lib
+ libcef_dll_wrapper.lib
+ llceflib.lib
+ )
+elseif (DARWIN)
+ FIND_LIBRARY(APPKIT_LIBRARY AppKit)
+ if (NOT APPKIT_LIBRARY)
+ message(FATAL_ERROR "AppKit not found")
+ endif()
+
+ FIND_LIBRARY(CEF_LIBRARY "Chromium Embedded Framework" ${ARCH_PREBUILT_DIRS_RELEASE})
+ if (NOT CEF_LIBRARY)
+ message(FATAL_ERROR "CEF not found")
+ endif()
+
+ set(CEF_PLUGIN_LIBRARIES
+ ${ARCH_PREBUILT_DIRS_RELEASE}/libcef_dll_wrapper.a
+ ${ARCH_PREBUILT_DIRS_RELEASE}/libLLCefLib.a
+ ${APPKIT_LIBRARY}
+ ${CEF_LIBRARY}
+ )
+
+elseif (LINUX)
+endif (WINDOWS)
diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt
index cd7da5d6c1..4dd69649d0 100755
--- a/indra/cmake/CMakeLists.txt
+++ b/indra/cmake/CMakeLists.txt
@@ -14,6 +14,7 @@ set(cmake_SOURCE_FILES
Boost.cmake
BuildVersion.cmake
CARes.cmake
+ CEFPlugin.cmake
CMakeCopyIfDifferent.cmake
ConfigurePkgConfig.cmake
CURL.cmake
@@ -82,18 +83,18 @@ set(cmake_SOURCE_FILES
LLXML.cmake
LScript.cmake
Linking.cmake
-## MediaPluginBase.cmake
+ MediaPluginBase.cmake
NDOF.cmake
OPENAL.cmake
OpenGL.cmake
OpenJPEG.cmake
OpenSSL.cmake
PNG.cmake
-## PluginAPI.cmake
+ PluginAPI.cmake
Prebuilt.cmake
PulseAudio.cmake
Python.cmake
-## QuickTimePlugin.cmake
+ QuickTimePlugin.cmake
TemplateCheck.cmake
Tut.cmake
UI.cmake
@@ -102,7 +103,6 @@ set(cmake_SOURCE_FILES
Variables.cmake
ViewerMiscLibs.cmake
VisualLeakDetector.cmake
-## WebKitLibPlugin.cmake
XmlRpcEpi.cmake
ZLIB.cmake
)
diff --git a/indra/cmake/Linking.cmake b/indra/cmake/Linking.cmake
index c95f0c3702..74fe3f1137 100755
--- a/indra/cmake/Linking.cmake
+++ b/indra/cmake/Linking.cmake
@@ -6,7 +6,7 @@ set(${CMAKE_CURRENT_LIST_FILE}_INCLUDED "YES")
include(Variables)
set(ARCH_PREBUILT_DIRS ${AUTOBUILD_INSTALL_DIR}/lib)
-##set(ARCH_PREBUILT_DIRS_PLUGINS ${AUTOBUILD_INSTALL_DIR}/plugins)
+set(ARCH_PREBUILT_DIRS_PLUGINS ${AUTOBUILD_INSTALL_DIR}/plugins)
set(ARCH_PREBUILT_DIRS_RELEASE ${AUTOBUILD_INSTALL_DIR}/lib/release)
set(ARCH_PREBUILT_DIRS_DEBUG ${AUTOBUILD_INSTALL_DIR}/lib/debug)
if (WINDOWS)
diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake
index 76d92d7a48..63e296b556 100755
--- a/indra/cmake/Variables.cmake
+++ b/indra/cmake/Variables.cmake
@@ -26,7 +26,7 @@ set(VIEWER_PREFIX)
set(INTEGRATION_TESTS_PREFIX)
set(LL_TESTS ON CACHE BOOL "Build and run unit and integration tests (disable for build timing runs to reduce variation")
set(INCREMENTAL_LINK OFF CACHE BOOL "Use incremental linking on win32 builds (enable for faster links on some machines)")
-set(ENABLE_MEDIA_PLUGINS OFF CACHE BOOL "Turn off building media plugins if they are imported by third-party library mechanism")
+set(ENABLE_MEDIA_PLUGINS ON CACHE BOOL "Turn off building media plugins if they are imported by third-party library mechanism")
if(LIBS_CLOSED_DIR)
file(TO_CMAKE_PATH "${LIBS_CLOSED_DIR}" LIBS_CLOSED_DIR)
@@ -130,10 +130,10 @@ endif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(DARWIN 1)
- # now we only support Xcode 6.0 using 10.9 (Mavericks), minimum OS 10.7 (Lion)
- set(XCODE_VERSION 6.0)
+ # now we only support Xcode 7.0 using 10.11 (El Capitan), minimum OS 10.7 (Lion)
+ set(XCODE_VERSION 7.0)
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.7)
- set(CMAKE_OSX_SYSROOT macosx10.9)
+ set(CMAKE_OSX_SYSROOT macosx10.11)
set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "com.apple.compilers.llvm.clang.1_0")
set(CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL 3)
diff --git a/indra/cmake/WebKitLibPlugin.cmake b/indra/cmake/WebKitLibPlugin.cmake
deleted file mode 100755
index f7c548a2fd..0000000000
--- a/indra/cmake/WebKitLibPlugin.cmake
+++ /dev/null
@@ -1,93 +0,0 @@
-# -*- cmake -*-
-include(Linking)
-include(Prebuilt)
-include(OpenSSL)
-
-if (USESYSTEMLIBS)
- # The minimal version, 4.4.3, is rather arbitrary: it's the version in Debian/Lenny.
- find_package(Qt4 4.4.3 COMPONENTS QtCore QtGui QtNetwork QtOpenGL QtWebKit REQUIRED)
- include(${QT_USE_FILE})
- set(QTDIR $ENV{QTDIR})
- if (QTDIR AND NOT "${QT_BINARY_DIR}" STREQUAL "${QTDIR}/bin")
- message(FATAL_ERROR "\"${QT_BINARY_DIR}\" is unequal \"${QTDIR}/bin\"; "
- "Qt is found by looking for qmake in your PATH. "
- "Please set your PATH such that 'qmake' is found in \$QTDIR/bin, "
- "or unset QTDIR if the found Qt is correct.")
- endif (QTDIR AND NOT "${QT_BINARY_DIR}" STREQUAL "${QTDIR}/bin")
- find_package(LLQtWebkit REQUIRED QUIET)
- # Add the plugins.
- set(QT_PLUGIN_LIBRARIES)
- foreach(qlibname qgif qjpeg)
- find_library(QT_PLUGIN_${qlibname} ${qlibname} PATHS ${QT_PLUGINS_DIR}/imageformats NO_DEFAULT_PATH)
- if (QT_PLUGIN_${qlibname})
- list(APPEND QT_PLUGIN_LIBRARIES ${QT_PLUGIN_${qlibname}})
- else (QT_PLUGIN_${qtlibname})
- message(FATAL_ERROR "Could not find the Qt plugin ${qlibname} in \"${QT_PLUGINS_DIR}/imageformats\"!")
- endif (QT_PLUGIN_${qlibname})
- endforeach(qlibname)
- # qjpeg depends on libjpeg
- list(APPEND QT_PLUGIN_LIBRARIES jpeg)
- set(WEBKITLIBPLUGIN OFF CACHE BOOL
- "WEBKITLIBPLUGIN support for the llplugin/llmedia test apps.")
-else (USESYSTEMLIBS)
- use_prebuilt_binary(llqtwebkit)
- set(WEBKITLIBPLUGIN ON CACHE BOOL
- "WEBKITLIBPLUGIN support for the llplugin/llmedia test apps.")
-endif (USESYSTEMLIBS)
-
-if (WINDOWS)
- set(WEBKIT_PLUGIN_LIBRARIES
- debug llqtwebkitd
- debug QtWebKitd4
- debug QtOpenGLd4
- debug QtNetworkd4
- debug QtGuid4
- debug QtCored4
- debug qtmaind
- optimized llqtwebkit
- optimized QtWebKit4
- optimized QtOpenGL4
- optimized QtNetwork4
- optimized QtGui4
- optimized QtCore4
- optimized qtmain
- )
-elseif (DARWIN)
- set(WEBKIT_PLUGIN_LIBRARIES
- ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.a
- ${ARCH_PREBUILT_DIRS_RELEASE}/libQtWebKit.4.dylib
- ${ARCH_PREBUILT_DIRS_RELEASE}/libQtOpenGL.4.dylib
- ${ARCH_PREBUILT_DIRS_RELEASE}/libQtNetwork.4.dylib
- ${ARCH_PREBUILT_DIRS_RELEASE}/libQtGui.4.dylib
- ${ARCH_PREBUILT_DIRS_RELEASE}/libQtCore.4.dylib
- )
-elseif (LINUX)
- # *HUH: What does this do?
- set(WEBKIT_PLUGIN_LIBRARIES ${LLQTWEBKIT_LIBRARY} ${QT_LIBRARIES} ${QT_PLUGIN_LIBRARIES})
- set(WEBKIT_PLUGIN_LIBRARIES
- llqtwebkit
-# qico
-# qpng
-# qtiff
-# qsvg
-# QtSvg
- QtWebKit
- QtOpenGL
- QtNetwork
- ${OPENSSL_LIBRARIES}
- QtGui
- QtCore
-# jscore
-# qgif
-# qjpeg
-# jpeg
- fontconfig
- X11
- Xrender
- GL
-
-# sqlite3
-# Xi
-# SM
- )
-endif (WINDOWS)
diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py
index 1d85aa2978..62bd09471a 100755
--- a/indra/lib/python/indra/util/llmanifest.py
+++ b/indra/lib/python/indra/util/llmanifest.py
@@ -512,11 +512,7 @@ class LLManifest(object):
# ensure that destination path exists
self.cmakedirs(os.path.dirname(dst))
self.created_paths.append(dst)
- if not os.path.isdir(src):
- self.ccopy(src,dst)
- else:
- # src is a dir
- self.ccopytree(src,dst)
+ self.ccopymumble(src, dst)
else:
print "Doesn't exist:", src
@@ -595,28 +591,38 @@ class LLManifest(object):
else:
os.remove(path)
- def ccopy(self, src, dst):
- """ Copy a single file or symlink. Uses filecmp to skip copying for existing files."""
+ def ccopymumble(self, src, dst):
+ """Copy a single symlink, file or directory."""
if os.path.islink(src):
linkto = os.readlink(src)
- if os.path.islink(dst) or os.path.exists(dst):
+ if os.path.islink(dst) or os.path.isfile(dst):
os.remove(dst) # because symlinking over an existing link fails
+ elif os.path.isdir(dst):
+ shutil.rmtree(dst)
os.symlink(linkto, dst)
+ elif os.path.isdir(src):
+ self.ccopytree(src, dst)
else:
- # Don't recopy file if it's up-to-date.
- # If we seem to be not not overwriting files that have been
- # updated, set the last arg to False, but it will take longer.
- if os.path.exists(dst) and filecmp.cmp(src, dst, True):
- return
- # only copy if it's not excluded
- if self.includes(src, dst):
- try:
- os.unlink(dst)
- except OSError, err:
- if err.errno != errno.ENOENT:
- raise
-
- shutil.copy2(src, dst)
+ self.ccopyfile(src, dst)
+ # XXX What about devices, sockets etc.?
+ # YYY would we put such things into a viewer package?!
+
+ def ccopyfile(self, src, dst):
+ """ Copy a single file. Uses filecmp to skip copying for existing files."""
+ # Don't recopy file if it's up-to-date.
+ # If we seem to be not not overwriting files that have been
+ # updated, set the last arg to False, but it will take longer.
+ if os.path.exists(dst) and filecmp.cmp(src, dst, True):
+ return
+ # only copy if it's not excluded
+ if self.includes(src, dst):
+ try:
+ os.unlink(dst)
+ except OSError, err:
+ if err.errno != errno.ENOENT:
+ raise
+
+ shutil.copy2(src, dst)
def ccopytree(self, src, dst):
"""Direct copy of shutil.copytree with the additional
@@ -632,11 +638,7 @@ class LLManifest(object):
srcname = os.path.join(src, name)
dstname = os.path.join(dst, name)
try:
- if os.path.isdir(srcname):
- self.ccopytree(srcname, dstname)
- else:
- self.ccopy(srcname, dstname)
- # XXX What about devices, sockets etc.?
+ self.ccopymumble(srcname, dstname)
except (IOError, os.error), why:
errors.append((srcname, dstname, why))
if errors:
diff --git a/indra/llcommon/llprocess.cpp b/indra/llcommon/llprocess.cpp
index 715df36f39..e0aa30cc1a 100755
--- a/indra/llcommon/llprocess.cpp
+++ b/indra/llcommon/llprocess.cpp
@@ -738,8 +738,11 @@ LLProcess::LLProcess(const LLSDOrParams& params):
{
mPipes.replace(i, new ReadPipeImpl(desc, pipe, FILESLOT(i)));
}
- LL_DEBUGS("LLProcess") << "Instantiating " << typeid(mPipes[i]).name()
- << "('" << desc << "')" << LL_ENDL;
+ // Removed temporaily for Xcode 7 build tests: error was:
+ // "error: expression with side effects will be evaluated despite
+ // being used as an operand to 'typeid' [-Werror,-Wpotentially-evaluated-expression]""
+ //LL_DEBUGS("LLProcess") << "Instantiating " << typeid(mPipes[i]).name()
+ // << "('" << desc << "')" << LL_ENDL;
}
}
diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp
index 73df47b933..7e9ae8d108 100755
--- a/indra/llmessage/llcurl.cpp
+++ b/indra/llmessage/llcurl.cpp
@@ -178,6 +178,11 @@ void LLCurl::Responder::setURL(const std::string& url)
mURL = url;
}
+const std::string& LLCurl::Responder::getURL()
+{
+ return mURL;
+}
+
void LLCurl::Responder::successResult(const LLSD& content)
{
setResult(HTTP_OK, "", content);
diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h
index 385d9fffa8..14d4a14deb 100755
--- a/indra/llmessage/llcurl.h
+++ b/indra/llmessage/llcurl.h
@@ -147,6 +147,7 @@ public:
public:
void setHTTPMethod(EHTTPMethod method);
void setURL(const std::string& url);
+ const std::string& Responder::getURL();
void setResult(S32 status, const std::string& reason, const LLSD& content = LLSD());
void setResponseHeader(const std::string& header, const std::string& value);
diff --git a/indra/llplugin/CMakeLists.txt b/indra/llplugin/CMakeLists.txt
index 05fc12e338..8c4ddd524e 100755
--- a/indra/llplugin/CMakeLists.txt
+++ b/indra/llplugin/CMakeLists.txt
@@ -20,7 +20,6 @@ include_directories(
${LLRENDER_INCLUDE_DIRS}
${LLXML_INCLUDE_DIRS}
${LLWINDOW_INCLUDE_DIRS}
- ${LLQTWEBKIT_INCLUDE_DIR}
)
include_directories(SYSTEM
${LLCOMMON_SYSTEM_INCLUDE_DIRS}
@@ -68,7 +67,7 @@ list(APPEND llplugin_SOURCE_FILES ${llplugin_HEADER_FILES})
add_library (llplugin ${llplugin_SOURCE_FILES})
-##add_subdirectory(slplugin)
+add_subdirectory(slplugin)
# Add tests
if (LL_TESTS)
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index 4bfd0de81e..fd04fc4b62 100755
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -146,7 +146,7 @@ void LLPluginClassMedia::reset()
mClickTarget.clear();
mClickUUID.clear();
mStatusCode = 0;
-
+
mClickEnforceTarget = false;
// media_time class
@@ -670,6 +670,19 @@ bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers, LLSD
return true;
}
+void LLPluginClassMedia::setCookie(std::string uri, std::string name, std::string value, std::string domain, std::string path)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "set_cookie");
+
+ message.setValue("uri", uri);
+ message.setValue("name", name);
+ message.setValue("value", value);
+ message.setValue("domain", domain);
+ message.setValue("path", path);
+
+ sendMessage(message);
+}
+
void LLPluginClassMedia::loadURI(const std::string &uri)
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "load_uri");
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index 96d577f43c..255fb0e2f1 100755
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -133,6 +133,8 @@ public:
// Text may be unicode (utf8 encoded)
bool textInput(const std::string &text, MASK modifiers, LLSD native_key_data);
+ void setCookie(std::string uri, std::string name, std::string value, std::string domain, std::string path);
+
void loadURI(const std::string &uri);
// "Loading" means uninitialized or any state prior to fully running (processing commands)
diff --git a/indra/llplugin/slplugin/slplugin.cpp b/indra/llplugin/slplugin/slplugin.cpp
index 6c9ba0ae52..684bcf1207 100755
--- a/indra/llplugin/slplugin/slplugin.cpp
+++ b/indra/llplugin/slplugin/slplugin.cpp
@@ -310,4 +310,3 @@ int main(int argc, char **argv)
return 0;
}
-
diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp
index 547f0bd398..fb811452be 100755
--- a/indra/llui/llfocusmgr.cpp
+++ b/indra/llui/llfocusmgr.cpp
@@ -47,6 +47,12 @@ BOOL LLFocusableElement::handleKey(KEY key, MASK mask, BOOL called_from_parent)
}
// virtual
+BOOL LLFocusableElement::handleKeyUp(KEY key, MASK mask, BOOL called_from_parent)
+{
+ return FALSE;
+}
+
+// virtual
BOOL LLFocusableElement::handleUnicodeChar(llwchar uni_char, BOOL called_from_parent)
{
return FALSE;
diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h
index afd2a8ce06..950ac55325 100755
--- a/indra/llui/llfocusmgr.h
+++ b/indra/llui/llfocusmgr.h
@@ -57,6 +57,7 @@ public:
// These were brought up the hierarchy from LLView so that we don't have to use dynamic_cast when dealing with keyboard focus.
virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
+ virtual BOOL handleKeyUp(KEY key, MASK mask, BOOL called_from_parent);
virtual BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent);
virtual void onTopLost(); // called when registered as top ctrl and user clicks elsewhere
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index a8beb9cfc9..8f7cac1f61 100755
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -866,6 +866,7 @@ BOOL LLView::handleToolTip(S32 x, S32 y, MASK mask)
return handled;
}
+
BOOL LLView::handleKey(KEY key, MASK mask, BOOL called_from_parent)
{
BOOL handled = FALSE;
@@ -898,6 +899,38 @@ BOOL LLView::handleKey(KEY key, MASK mask, BOOL called_from_parent)
return handled;
}
+BOOL LLView::handleKeyUp(KEY key, MASK mask, BOOL called_from_parent)
+{
+ BOOL handled = FALSE;
+
+ if (getVisible() && getEnabled())
+ {
+ if (called_from_parent)
+ {
+ // Downward traversal
+ handled = childrenHandleKeyUp(key, mask) != NULL;
+ }
+
+ if (!handled)
+ {
+ // For event logging we don't care which widget handles it
+ // So we capture the key at the end of this function once we know if it was handled
+ handled = handleKeyUpHere(key, mask);
+ if (handled)
+ {
+ LL_DEBUGS() << "Key handled by " << getName() << LL_ENDL;
+ }
+ }
+ }
+
+ if (!handled && !called_from_parent && mParentView)
+ {
+ // Upward traversal
+ handled = mParentView->handleKeyUp(key, mask, FALSE);
+ }
+ return handled;
+}
+
// Called from handleKey()
// Handles key in this object. Checking parents and children happens in handleKey()
BOOL LLView::handleKeyHere(KEY key, MASK mask)
@@ -905,6 +938,13 @@ BOOL LLView::handleKeyHere(KEY key, MASK mask)
return FALSE;
}
+// Called from handleKey()
+// Handles key in this object. Checking parents and children happens in handleKey()
+BOOL LLView::handleKeyUpHere(KEY key, MASK mask)
+{
+ return FALSE;
+}
+
BOOL LLView::handleUnicodeChar(llwchar uni_char, BOOL called_from_parent)
{
BOOL handled = FALSE;
@@ -1021,6 +1061,12 @@ LLView* LLView::childrenHandleKey(KEY key, MASK mask)
}
// Called during downward traversal
+LLView* LLView::childrenHandleKeyUp(KEY key, MASK mask)
+{
+ return childrenHandleCharEvent("Key Up", &LLView::handleKeyUp, key, mask);
+}
+
+// Called during downward traversal
LLView* LLView::childrenHandleUnicodeChar(llwchar uni_char)
{
return childrenHandleCharEvent("Unicode character", &LLView::handleUnicodeCharWithDummyMask,
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index 7861c8f729..8494bb338a 100755
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -378,6 +378,7 @@ public:
// inherited from LLFocusableElement
/* virtual */ BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
+ /* virtual */ BOOL handleKeyUp(KEY key, MASK mask, BOOL called_from_parent);
/* virtual */ BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent);
virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
@@ -509,6 +510,7 @@ public:
//virtual BOOL addChildFromParam(const LLInitParam::BaseBlock& params) { return TRUE; }
virtual BOOL handleKeyHere(KEY key, MASK mask);
+ virtual BOOL handleKeyUpHere(KEY key, MASK mask);
virtual BOOL handleUnicodeCharHere(llwchar uni_char);
virtual void handleReshape(const LLRect& rect, bool by_user);
@@ -538,6 +540,7 @@ protected:
void logMouseEvent();
LLView* childrenHandleKey(KEY key, MASK mask);
+ LLView* childrenHandleKeyUp(KEY key, MASK mask);
LLView* childrenHandleUnicodeChar(llwchar uni_char);
LLView* childrenHandleDragAndDrop(S32 x, S32 y, MASK mask,
BOOL drop,
diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm
index 1c9160a42d..deb8cb90d8 100644
--- a/indra/llwindow/llopenglview-objc.mm
+++ b/indra/llwindow/llopenglview-objc.mm
@@ -239,7 +239,11 @@ attributedStringInfo getSegments(NSAttributedString *str)
{
[glContext setValues:(const GLint*)1 forParameter:NSOpenGLCPSwapInterval];
} else {
- [glContext setValues:(const GLint*)0 forParameter:NSOpenGLCPSwapInterval];
+ // supress this error after move to Xcode 7:
+ // error: null passed to a callee that requires a non-null argument [-Werror,-Wnonnull]
+ // Tried using ObjC 'nonnull' keyword as per SO article but didn't build
+ GLint swapInterval=0;
+ [glContext setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval];
}
mOldResize = false;
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 7e0eb9cf31..875ffe4cd4 100755
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -42,6 +42,7 @@
#include "llgl.h"
#include "llstring.h"
#include "lldir.h"
+#include "llsdutil.h"
#include "llglslshader.h"
// System includes
@@ -2068,6 +2069,9 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
window_imp->mKeyCharCode = 0; // don't know until wm_char comes in next
window_imp->mKeyScanCode = ( l_param >> 16 ) & 0xff;
window_imp->mKeyVirtualKey = w_param;
+ window_imp->mRawMsg = u_msg;
+ window_imp->mRawWParam = w_param;
+ window_imp->mRawLParam = l_param;
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_KEYDOWN");
{
@@ -2090,6 +2094,9 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
{
window_imp->mKeyScanCode = ( l_param >> 16 ) & 0xff;
window_imp->mKeyVirtualKey = w_param;
+ window_imp->mRawMsg = u_msg;
+ window_imp->mRawWParam = w_param;
+ window_imp->mRawLParam = l_param;
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_KEYUP");
LL_RECORD_BLOCK_TIME(FTM_KEYHANDLER);
@@ -2177,6 +2184,9 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
case WM_CHAR:
window_imp->mKeyCharCode = w_param;
+ window_imp->mRawMsg = u_msg;
+ window_imp->mRawWParam = w_param;
+ window_imp->mRawLParam = l_param;
// Should really use WM_UNICHAR eventually, but it requires a specific Windows version and I need
// to figure out how that works. - Doug
@@ -3239,6 +3249,9 @@ LLSD LLWindowWin32::getNativeKeyData()
result["scan_code"] = (S32)mKeyScanCode;
result["virtual_key"] = (S32)mKeyVirtualKey;
+ result["msg"] = ll_sd_from_U32(mRawMsg);
+ result["w_param"] = ll_sd_from_U32(mRawWParam);
+ result["l_param"] = ll_sd_from_U32(mRawLParam);
return result;
}
diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h
index 2ca8d48fc7..376bef3e50 100755
--- a/indra/llwindow/llwindowwin32.h
+++ b/indra/llwindow/llwindowwin32.h
@@ -208,6 +208,9 @@ protected:
U32 mKeyCharCode;
U32 mKeyScanCode;
U32 mKeyVirtualKey;
+ U32 mRawMsg;
+ U32 mRawWParam;
+ U32 mRawLParam;
friend class LLWindowManager;
};
diff --git a/indra/media_plugins/CMakeLists.txt b/indra/media_plugins/CMakeLists.txt
index 85318aea3b..24eb3947b4 100755
--- a/indra/media_plugins/CMakeLists.txt
+++ b/indra/media_plugins/CMakeLists.txt
@@ -2,16 +2,17 @@
add_subdirectory(base)
-add_subdirectory(webkit)
-
-add_subdirectory(gstreamer010)
+if (LINUX)
+ add_subdirectory(gstreamer010)
+endif (LINUX)
if (WINDOWS OR DARWIN)
add_subdirectory(quicktime)
+ add_subdirectory(cef)
endif (WINDOWS OR DARWIN)
if (WINDOWS)
add_subdirectory(winmmshim)
endif (WINDOWS)
-add_subdirectory(example)
+### add_subdirectory(example)
diff --git a/indra/media_plugins/webkit/CMakeLists.txt b/indra/media_plugins/cef/CMakeLists.txt
index 5a8fe90bdd..16015be672 100755..100644
--- a/indra/media_plugins/webkit/CMakeLists.txt
+++ b/indra/media_plugins/cef/CMakeLists.txt
@@ -1,6 +1,6 @@
# -*- cmake -*-
-project(media_plugin_webkit)
+project(media_plugin_cef)
include(00-Common)
include(LLCommon)
@@ -9,17 +9,14 @@ include(LLPlugin)
include(LLMath)
include(LLRender)
include(LLWindow)
-include(UI)
include(Linking)
include(PluginAPI)
include(MediaPluginBase)
include(OpenGL)
-include(PulseAudio)
-include(WebKitLibPlugin)
+include(CEFPlugin)
include_directories(
- ${PULSEAUDIO_INCLUDE_DIRS}
${LLPLUGIN_INCLUDE_DIRS}
${MEDIA_PLUGIN_BASE_INCLUDE_DIRS}
${LLCOMMON_INCLUDE_DIRS}
@@ -27,14 +24,14 @@ include_directories(
${LLIMAGE_INCLUDE_DIRS}
${LLRENDER_INCLUDE_DIRS}
${LLWINDOW_INCLUDE_DIRS}
- ${LLQTWEBKIT_INCLUDE_DIR}
+ ${CEF_INCLUDE_DIR}
)
include_directories(SYSTEM
${LLCOMMON_SYSTEM_INCLUDE_DIRS}
)
-### media_plugin_webkit
+### media_plugin_cef
if(NOT WORD_SIZE EQUAL 32)
if(WINDOWS)
@@ -44,75 +41,72 @@ if(NOT WORD_SIZE EQUAL 32)
endif(WINDOWS)
endif(NOT WORD_SIZE EQUAL 32)
-set(media_plugin_webkit_SOURCE_FILES
- media_plugin_webkit.cpp
+set(media_plugin_cef_SOURCE_FILES
+ media_plugin_cef.cpp
)
-set(media_plugin_webkit_HEADER_FILES
+set(media_plugin_cef_HEADER_FILES
volume_catcher.h
)
-set(media_plugin_webkit_LINK_LIBRARIES
+set (media_plugin_cef_LINK_LIBRARIES
${LLPLUGIN_LIBRARIES}
${MEDIA_PLUGIN_BASE_LIBRARIES}
${LLCOMMON_LIBRARIES}
- ${WEBKIT_PLUGIN_LIBRARIES}
- ${PLUGIN_API_WINDOWS_LIBRARIES}
- ${PULSEAUDIO_LIBRARIES}
-)
+ ${CEF_PLUGIN_LIBRARIES}
+ ${PLUGIN_API_WINDOWS_LIBRARIES})
+
# Select which VolumeCatcher implementation to use
if (LINUX)
- if (PULSEAUDIO_FOUND)
- list(APPEND media_plugin_webkit_SOURCE_FILES linux_volume_catcher.cpp)
- else (PULSEAUDIO_FOUND)
- list(APPEND media_plugin_webkit_SOURCE_FILES dummy_volume_catcher.cpp)
- endif (PULSEAUDIO_FOUND)
- list(APPEND media_plugin_webkit_LINK_LIBRARIES
- ${UI_LIBRARIES} # for glib/GTK
- )
+ message(FATAL_ERROR "CEF plugin has been enabled for a Linux compile.\n"
+ " Please create a volume_catcher implementation for this platform.")
+
elseif (DARWIN)
- list(APPEND media_plugin_webkit_SOURCE_FILES mac_volume_catcher.cpp)
+ list(APPEND media_plugin_cef_SOURCE_FILES mac_volume_catcher.cpp)
find_library(CORESERVICES_LIBRARY CoreServices)
find_library(AUDIOUNIT_LIBRARY AudioUnit)
- list(APPEND media_plugin_webkit_LINK_LIBRARIES
+ list(APPEND media_plugin_cef_LINK_LIBRARIES
${CORESERVICES_LIBRARY} # for Component Manager calls
${AUDIOUNIT_LIBRARY} # for AudioUnit calls
)
elseif (WINDOWS)
- list(APPEND media_plugin_webkit_SOURCE_FILES windows_volume_catcher.cpp)
+ list(APPEND media_plugin_cef_SOURCE_FILES windows_volume_catcher.cpp)
endif (LINUX)
-set_source_files_properties(${media_plugin_webkit_HEADER_FILES}
+set_source_files_properties(${media_plugin_cef_HEADER_FILES}
PROPERTIES HEADER_FILE_ONLY TRUE)
-list(APPEND media_plugin_webkit_SOURCE_FILES ${media_plugin_webkit_HEADER_FILES})
+list(APPEND media_plugin_cef_SOURCE_FILES ${media_plugin_cef_HEADER_FILES})
-add_library(media_plugin_webkit
+add_library(media_plugin_cef
SHARED
- ${media_plugin_webkit_SOURCE_FILES}
+ ${media_plugin_cef_SOURCE_FILES}
)
-target_link_libraries(media_plugin_webkit ${media_plugin_webkit_LINK_LIBRARIES})
-
-add_dependencies(media_plugin_webkit
+add_dependencies(media_plugin_cef
${LLPLUGIN_LIBRARIES}
${MEDIA_PLUGIN_BASE_LIBRARIES}
${LLCOMMON_LIBRARIES}
)
+target_link_libraries(media_plugin_cef
+ ${media_plugin_cef_LINK_LIBRARIES}
+)
+
if (WINDOWS)
set_target_properties(
- media_plugin_webkit
+ media_plugin_cef
PROPERTIES
- LINK_FLAGS "/MANIFEST:NO"
+ LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /NODEFAULTLIB:LIBCMT"
+ LINK_FLAGS_DEBUG "/MANIFEST:NO /SAFESEH:NO /NODEFAULTLIB:LIBCMTD"
)
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_webkit
+ media_plugin_cef
PROPERTIES
PREFIX ""
BUILD_WITH_INSTALL_RPATH 1
@@ -120,13 +114,4 @@ if (DARWIN)
LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp"
)
- # copy the webkit dylib to the build directory
-# add_custom_command(
-# TARGET media_plugin_webkit POST_BUILD
-# # OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/libllqtwebkit.dylib
-# COMMAND ${CMAKE_COMMAND} -E copy ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/
-# DEPENDS media_plugin_webkit ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib
-# )
-
endif (DARWIN)
-
diff --git a/indra/media_plugins/webkit/mac_volume_catcher.cpp b/indra/media_plugins/cef/mac_volume_catcher.cpp
index 73e5bf3da3..dddb9c2077 100755..100644
--- a/indra/media_plugins/webkit/mac_volume_catcher.cpp
+++ b/indra/media_plugins/cef/mac_volume_catcher.cpp
@@ -6,7 +6,7 @@
* $LicenseInfo:firstyear=2010&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp
new file mode 100644
index 0000000000..7f538e16d8
--- /dev/null
+++ b/indra/media_plugins/cef/media_plugin_cef.cpp
@@ -0,0 +1,817 @@
+/**
+* @file media_plugin_cef.cpp
+* @brief CEF (Chromium Embedding Framework) plugin for LLMedia API plugin system
+*
+* @cond
+* $LicenseInfo:firstyear=2008&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2010, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+* @endcond
+*/
+
+#include "linden_common.h"
+#include "indra_constants.h" // for indra keyboard codes
+
+#include "llgl.h"
+#include "llsdutil.h"
+#include "llplugininstance.h"
+#include "llpluginmessage.h"
+#include "llpluginmessageclasses.h"
+#include "media_plugin_base.h"
+
+#include "boost/function.hpp"
+#include "boost/bind.hpp"
+#include "llCEFLib.h"
+#include "volume_catcher.h"
+
+////////////////////////////////////////////////////////////////////////////////
+//
+class MediaPluginCEF :
+ public MediaPluginBase
+{
+public:
+ MediaPluginCEF(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
+ ~MediaPluginCEF();
+
+ /*virtual*/
+ void receiveMessage(const char* message_string);
+
+private:
+ bool init();
+
+ void onPageChangedCallback(unsigned char* pixels, int width, int height);
+ void onCustomSchemeURLCallback(std::string url);
+ void onConsoleMessageCallback(std::string message, std::string source, int line);
+ void onStatusMessageCallback(std::string value);
+ void onTitleChangeCallback(std::string title);
+ void onLoadStartCallback();
+ void onLoadEndCallback(int httpStatusCode);
+ void onAddressChangeCallback(std::string url);
+ void onNavigateURLCallback(std::string url, std::string target);
+ bool onHTTPAuthCallback(const std::string host, const std::string realm, std::string& username, std::string& password);
+ void onCursorChangedCallback(LLCEFLib::ECursorType type, unsigned int handle);
+
+ void postDebugMessage(const std::string& msg);
+ void authResponse(LLPluginMessage &message);
+
+ LLCEFLib::EKeyboardModifier decodeModifiers(std::string &modifiers);
+ void deserializeKeyboardData(LLSD native_key_data, uint32_t& native_scan_code, uint32_t& native_virtual_key, uint32_t& native_modifiers);
+ void keyEvent(LLCEFLib::EKeyEvent key_event, int key, LLCEFLib::EKeyboardModifier modifiers, LLSD native_key_data);
+ void unicodeInput(const std::string &utf8str, LLCEFLib::EKeyboardModifier modifiers, LLSD native_key_data);
+
+ void checkEditState();
+ void setVolume(F32 vol);
+
+ bool mEnableMediaPluginDebugging;
+ std::string mHostLanguage;
+ bool mCookiesEnabled;
+ bool mPluginsEnabled;
+ bool mJavascriptEnabled;
+ std::string mUserAgentSubtring;
+ std::string mAuthUsername;
+ std::string mAuthPassword;
+ bool mAuthOK;
+ bool mCanCut;
+ bool mCanCopy;
+ bool mCanPaste;
+ std::string mCachePath;
+ std::string mCookiePath;
+ LLCEFLib* mLLCEFLib;
+
+ VolumeCatcher mVolumeCatcher;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//
+MediaPluginCEF::MediaPluginCEF(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data) :
+MediaPluginBase(host_send_func, host_user_data)
+{
+ mWidth = 0;
+ mHeight = 0;
+ mDepth = 4;
+ mPixels = 0;
+ mEnableMediaPluginDebugging = true;
+ mHostLanguage = "en";
+ mCookiesEnabled = true;
+ mPluginsEnabled = false;
+ mJavascriptEnabled = true;
+ mUserAgentSubtring = "";
+ mAuthUsername = "";
+ mAuthPassword = "";
+ mAuthOK = false;
+ mCanCut = false;
+ mCanCopy = false;
+ mCanPaste = false;
+ mCachePath = "";
+ mCookiePath = "";
+ mLLCEFLib = new LLCEFLib();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+MediaPluginCEF::~MediaPluginCEF()
+{
+ mLLCEFLib->reset();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginCEF::postDebugMessage(const std::string& msg)
+{
+ if (mEnableMediaPluginDebugging)
+ {
+ std::stringstream str;
+ str << "@Media Msg> " << msg;
+
+ LLPluginMessage debug_message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "debug_message");
+ debug_message.setValue("message_text", str.str());
+ debug_message.setValue("message_level", "info");
+ sendMessage(debug_message);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginCEF::onPageChangedCallback(unsigned char* pixels, int width, int height)
+{
+ if (mPixels && pixels)
+ {
+ if (mWidth == width && mHeight == height)
+ {
+ memcpy(mPixels, pixels, mWidth * mHeight * mDepth);
+ }
+ setDirty(0, 0, mWidth, mHeight);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginCEF::onConsoleMessageCallback(std::string message, std::string source, int line)
+{
+ std::stringstream str;
+ str << "Console message: " << message << " in file(" << source << ") at line " << line;
+ postDebugMessage(str.str());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginCEF::onStatusMessageCallback(std::string value)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "status_text");
+ message.setValue("status", value);
+ sendMessage(message);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginCEF::onTitleChangeCallback(std::string title)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text");
+ message.setValue("name", title);
+ sendMessage(message);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginCEF::onLoadStartCallback()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");
+ //message.setValue("uri", event.getEventUri()); // not easily available here in CEF - needed?
+ message.setValueBoolean("history_back_available", mLLCEFLib->canGoBack());
+ message.setValueBoolean("history_forward_available", mLLCEFLib->canGoForward());
+ sendMessage(message);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginCEF::onLoadEndCallback(int httpStatusCode)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete");
+ //message.setValue("uri", event.getEventUri()); // not easily available here in CEF - needed?
+ message.setValueS32("result_code", httpStatusCode);
+ message.setValueBoolean("history_back_available", mLLCEFLib->canGoBack());
+ message.setValueBoolean("history_forward_available", mLLCEFLib->canGoForward());
+ sendMessage(message);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginCEF::onAddressChangeCallback(std::string url)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "location_changed");
+ message.setValue("uri", url);
+ sendMessage(message);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginCEF::onNavigateURLCallback(std::string url, std::string target)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_href");
+ message.setValue("uri", url);
+ message.setValue("target", target);
+ message.setValue("uuid", ""); // not used right now
+ sendMessage(message);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginCEF::onCustomSchemeURLCallback(std::string url)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_nofollow");
+ message.setValue("uri", url);
+ message.setValue("nav_type", "clicked"); // TODO: differentiate between click and navigate to
+ sendMessage(message);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+bool MediaPluginCEF::onHTTPAuthCallback(const std::string host, const std::string realm, std::string& username, std::string& password)
+{
+ mAuthOK = false;
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "auth_request");
+ message.setValue("url", host);
+ message.setValue("realm", realm);
+ message.setValueBoolean("blocking_request", true);
+
+ // The "blocking_request" key in the message means this sendMessage call will block until a response is received.
+ sendMessage(message);
+
+ if (mAuthOK)
+ {
+ username = mAuthUsername;
+ password = mAuthPassword;
+ }
+
+ return mAuthOK;
+}
+
+void MediaPluginCEF::onCursorChangedCallback(LLCEFLib::ECursorType type, unsigned int handle)
+{
+ std::string name = "";
+
+ switch (type)
+ {
+ case LLCEFLib::CT_POINTER:
+ name = "arrow";
+ break;
+ case LLCEFLib::CT_IBEAM:
+ name = "ibeam";
+ break;
+ case LLCEFLib::CT_NORTHSOUTHRESIZE:
+ name = "splitv";
+ break;
+ case LLCEFLib::CT_EASTWESTRESIZE:
+ name = "splith";
+ break;
+ case LLCEFLib::CT_HAND:
+ name = "hand";
+ break;
+
+ default:
+ LL_WARNS() << "Unknown cursor ID: " << (int)type << LL_ENDL;
+ break;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "cursor_changed");
+ message.setValue("name", name);
+ sendMessage(message);
+}
+
+void MediaPluginCEF::authResponse(LLPluginMessage &message)
+{
+ mAuthOK = message.getValueBoolean("ok");
+ if (mAuthOK)
+ {
+ mAuthUsername = message.getValue("username");
+ mAuthPassword = message.getValue("password");
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginCEF::receiveMessage(const char* message_string)
+{
+ // std::cerr << "MediaPluginWebKit::receiveMessage: received message: \"" << message_string << "\"" << std::endl;
+ 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 = "CEF plugin 1.0.0";
+ message.setValue("plugin_version", plugin_version);
+ sendMessage(message);
+ }
+ else if (message_name == "idle")
+ {
+ mLLCEFLib->update();
+
+ mVolumeCatcher.pump();
+ // this seems bad but unless the state changes (it won't until we figure out
+ // how to get CEF to tell us if copy/cut/paste is available) then this function
+ // will return immediately
+ checkEditState();
+ }
+ else if (message_name == "cleanup")
+ {
+ }
+ 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)
+ {
+ mPixels = NULL;
+ mTextureSegmentName.clear();
+ }
+ mSharedSegments.erase(iter);
+ }
+ else
+ {
+ //std::cerr << "MediaPluginWebKit::receiveMessage: unknown shared memory region!" << std::endl;
+ }
+
+ LLPluginMessage message("base", "shm_remove_response");
+ message.setValue("name", name);
+ sendMessage(message);
+ }
+ else
+ {
+ //std::cerr << "MediaPluginWebKit::receiveMessage: unknown base message: " << message_name << std::endl;
+ }
+ }
+ else if (message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
+ {
+ if (message_name == "init")
+ {
+ // event callbacks from LLCefLib
+ mLLCEFLib->setOnPageChangedCallback(boost::bind(&MediaPluginCEF::onPageChangedCallback, this, _1, _2, _3));
+ mLLCEFLib->setOnCustomSchemeURLCallback(boost::bind(&MediaPluginCEF::onCustomSchemeURLCallback, this, _1));
+ mLLCEFLib->setOnConsoleMessageCallback(boost::bind(&MediaPluginCEF::onConsoleMessageCallback, this, _1, _2, _3));
+ mLLCEFLib->setOnStatusMessageCallback(boost::bind(&MediaPluginCEF::onStatusMessageCallback, this, _1));
+ mLLCEFLib->setOnTitleChangeCallback(boost::bind(&MediaPluginCEF::onTitleChangeCallback, this, _1));
+ mLLCEFLib->setOnLoadStartCallback(boost::bind(&MediaPluginCEF::onLoadStartCallback, this));
+ mLLCEFLib->setOnLoadEndCallback(boost::bind(&MediaPluginCEF::onLoadEndCallback, this, _1));
+ mLLCEFLib->setOnAddressChangeCallback(boost::bind(&MediaPluginCEF::onAddressChangeCallback, this, _1));
+ mLLCEFLib->setOnNavigateURLCallback(boost::bind(&MediaPluginCEF::onNavigateURLCallback, this, _1, _2));
+ mLLCEFLib->setOnHTTPAuthCallback(boost::bind(&MediaPluginCEF::onHTTPAuthCallback, this, _1, _2, _3, _4));
+ mLLCEFLib->setOnCursorChangedCallback(boost::bind(&MediaPluginCEF::onCursorChangedCallback, this, _1, _2));
+
+ LLCEFLib::LLCEFLibSettings settings;
+ settings.initial_width = 1024;
+ settings.initial_height = 1024;
+ settings.plugins_enabled = mPluginsEnabled;
+ settings.javascript_enabled = mJavascriptEnabled;
+ settings.cookies_enabled = mCookiesEnabled;
+ settings.cookie_store_path = mCookiePath;
+ settings.cache_enabled = true;
+ settings.cache_path = mCachePath;
+ settings.accept_language_list = mHostLanguage;
+ settings.user_agent_substring = mUserAgentSubtring;
+
+ bool result = mLLCEFLib->init(settings);
+ if (!result)
+ {
+ // if this fails, the media system in viewer will put up a message
+ }
+
+ // Plugin gets to decide the texture parameters to use.
+ mDepth = 4;
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
+ message.setValueS32("default_width", 1024);
+ message.setValueS32("default_height", 1024);
+ message.setValueS32("depth", mDepth);
+ message.setValueU32("internalformat", GL_RGB);
+ message.setValueU32("format", GL_BGRA);
+ message.setValueU32("type", GL_UNSIGNED_BYTE);
+ message.setValueBoolean("coords_opengl", true);
+ sendMessage(message);
+ }
+ else if (message_name == "set_user_data_path")
+ {
+ std::string user_data_path = message_in.getValue("path"); // n.b. always has trailing platform-specific dir-delimiter
+ mCachePath = user_data_path + "cef_cache";
+ mCookiePath = user_data_path + "cef_cookies";
+ }
+ else 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;
+ };
+ };
+
+ mLLCEFLib->setSize(mWidth, mHeight);
+
+ 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 == "set_language_code")
+ {
+ mHostLanguage = message_in.getValue("language");
+ }
+ else if (message_name == "load_uri")
+ {
+ std::string uri = message_in.getValue("uri");
+ mLLCEFLib->navigate(uri);
+ }
+ else if (message_name == "set_cookie")
+ {
+ std::string uri = message_in.getValue("uri");
+ std::string name = message_in.getValue("name");
+ std::string value = message_in.getValue("value");
+ std::string domain = message_in.getValue("domain");
+ std::string path = message_in.getValue("path");
+ mLLCEFLib->setCookie(uri, name, value, domain, path);
+ }
+ else if (message_name == "mouse_event")
+ {
+ std::string event = message_in.getValue("event");
+
+ S32 x = message_in.getValueS32("x");
+ S32 y = message_in.getValueS32("y");
+
+ //std::string modifiers = message_in.getValue("modifiers");
+
+ S32 button = message_in.getValueS32("button");
+ LLCEFLib::EMouseButton btn = LLCEFLib::MB_MOUSE_BUTTON_LEFT;
+ if (button == 0) btn = LLCEFLib::MB_MOUSE_BUTTON_LEFT;
+ if (button == 1) btn = LLCEFLib::MB_MOUSE_BUTTON_RIGHT;
+ if (button == 2) btn = LLCEFLib::MB_MOUSE_BUTTON_MIDDLE;
+
+ if (event == "down")
+ {
+ mLLCEFLib->mouseButton(btn, LLCEFLib::ME_MOUSE_DOWN, x, y);
+ mLLCEFLib->setFocus(true);
+
+ std::stringstream str;
+ str << "Mouse down at = " << x << ", " << y;
+ postDebugMessage(str.str());
+ }
+ else if (event == "up")
+ {
+ mLLCEFLib->mouseButton(btn, LLCEFLib::ME_MOUSE_UP, x, y);
+
+ std::stringstream str;
+ str << "Mouse up at = " << x << ", " << y;
+ postDebugMessage(str.str());
+ }
+ else if (event == "double_click")
+ {
+ // TODO: do we need this ?
+ }
+ else
+ {
+ mLLCEFLib->mouseMove(x, y);
+ }
+ }
+ else if (message_name == "scroll_event")
+ {
+ S32 y = message_in.getValueS32("y");
+ const int scaling_factor = 40;
+ y *= -scaling_factor;
+
+ mLLCEFLib->mouseWheel(y);
+ }
+ else if (message_name == "text_event")
+ {
+ std::string text = message_in.getValue("text");
+ std::string modifiers = message_in.getValue("modifiers");
+ LLSD native_key_data = message_in.getValueLLSD("native_key_data");
+
+ unicodeInput(text, decodeModifiers(modifiers), native_key_data);
+ }
+ else if (message_name == "key_event")
+ {
+#if LL_DARWIN
+ std::string event = message_in.getValue("event");
+ S32 key = message_in.getValueS32("key");
+ if (event == "down")
+ {
+ //mLLCEFLib->keyPress(key, true);
+ mLLCEFLib->keyboardEvent(LLCEFLib::KE_KEY_DOWN, (uint32_t)key, 0, LLCEFLib::KM_MODIFIER_NONE, 0, 0, 0);
+
+ }
+ else if (event == "up")
+ {
+ //mLLCEFLib->keyPress(key, false);
+ mLLCEFLib->keyboardEvent(LLCEFLib::KE_KEY_UP, (uint32_t)key, 0, LLCEFLib::KM_MODIFIER_NONE, 0, 0, 0);
+ }
+
+#elif LL_WINDOWS
+ std::string event = message_in.getValue("event");
+ S32 key = message_in.getValueS32("key");
+ std::string modifiers = message_in.getValue("modifiers");
+ LLSD native_key_data = message_in.getValueLLSD("native_key_data");
+
+ // Treat unknown events as key-up for safety.
+ LLCEFLib::EKeyEvent key_event = LLCEFLib::KE_KEY_UP;
+ if (event == "down")
+ {
+ key_event = LLCEFLib::KE_KEY_DOWN;
+ }
+ else if (event == "repeat")
+ {
+ key_event = LLCEFLib::KE_KEY_REPEAT;
+ }
+
+ keyEvent(key_event, key, decodeModifiers(modifiers), native_key_data);
+#endif
+ }
+ else if (message_name == "enable_media_plugin_debugging")
+ {
+ mEnableMediaPluginDebugging = message_in.getValueBoolean("enable");
+ }
+ if (message_name == "auth_response")
+ {
+ authResponse(message_in);
+ }
+ if (message_name == "edit_cut")
+ {
+ mLLCEFLib->editCut();
+ }
+ if (message_name == "edit_copy")
+ {
+ mLLCEFLib->editCopy();
+ }
+ if (message_name == "edit_paste")
+ {
+ mLLCEFLib->editPaste();
+ }
+ }
+ else if (message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER)
+ {
+ if (message_name == "set_page_zoom_factor")
+ {
+ F32 factor = (F32)message_in.getValueReal("factor");
+ mLLCEFLib->setPageZoom(factor);
+ }
+ if (message_name == "browse_stop")
+ {
+ mLLCEFLib->stop();
+ }
+ else if (message_name == "browse_reload")
+ {
+ bool ignore_cache = true;
+ mLLCEFLib->reload(ignore_cache);
+ }
+ else if (message_name == "browse_forward")
+ {
+ mLLCEFLib->goForward();
+ }
+ else if (message_name == "browse_back")
+ {
+ mLLCEFLib->goBack();
+ }
+ else if (message_name == "cookies_enabled")
+ {
+ mCookiesEnabled = message_in.getValueBoolean("enable");
+ }
+ else if (message_name == "set_user_agent")
+ {
+ mUserAgentSubtring = message_in.getValue("user_agent");
+ }
+ else if (message_name == "plugins_enabled")
+ {
+ mPluginsEnabled = message_in.getValueBoolean("enable");
+ }
+ else if (message_name == "javascript_enabled")
+ {
+ mJavascriptEnabled = message_in.getValueBoolean("enable");
+ }
+ }
+ else if (message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)
+ {
+ if (message_name == "set_volume")
+ {
+ F32 volume = (F32)message_in.getValueReal("volume");
+ setVolume(volume);
+ }
+ }
+ else
+ {
+ //std::cerr << "MediaPluginWebKit::receiveMessage: unknown message class: " << message_class << std::endl;
+ };
+ }
+}
+
+LLCEFLib::EKeyboardModifier MediaPluginCEF::decodeModifiers(std::string &modifiers)
+{
+ int result = 0;
+
+ if (modifiers.find("shift") != std::string::npos)
+ result |= LLCEFLib::KM_MODIFIER_SHIFT;
+
+ if (modifiers.find("alt") != std::string::npos)
+ result |= LLCEFLib::KM_MODIFIER_ALT;
+
+ if (modifiers.find("control") != std::string::npos)
+ result |= LLCEFLib::KM_MODIFIER_CONTROL;
+
+ if (modifiers.find("meta") != std::string::npos)
+ result |= LLCEFLib::KM_MODIFIER_META;
+
+ return (LLCEFLib::EKeyboardModifier)result;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginCEF::deserializeKeyboardData(LLSD native_key_data, uint32_t& native_scan_code, uint32_t& native_virtual_key, uint32_t& native_modifiers)
+{
+ native_scan_code = 0;
+ native_virtual_key = 0;
+ native_modifiers = 0;
+
+ if (native_key_data.isMap())
+ {
+#if LL_DARWIN
+ native_scan_code = (uint32_t)(native_key_data["char_code"].asInteger());
+ native_virtual_key = (uint32_t)(native_key_data["key_code"].asInteger());
+ native_modifiers = (uint32_t)(native_key_data["modifiers"].asInteger());
+#elif LL_WINDOWS
+ native_scan_code = (uint32_t)(native_key_data["scan_code"].asInteger());
+ native_virtual_key = (uint32_t)(native_key_data["virtual_key"].asInteger());
+ // TODO: I don't think we need to do anything with native modifiers here -- please verify
+#endif
+ };
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginCEF::keyEvent(LLCEFLib::EKeyEvent key_event, int key, LLCEFLib::EKeyboardModifier modifiers, LLSD native_key_data = LLSD::emptyMap())
+{
+#if LL_DARWIN
+ std::string utf8_text;
+
+ if (key < 128)
+ {
+ utf8_text = (char)key;
+ }
+
+ switch ((KEY)key)
+ {
+ case KEY_BACKSPACE: utf8_text = (char)8; break;
+ case KEY_TAB: utf8_text = (char)9; break;
+ case KEY_RETURN: utf8_text = (char)13; break;
+ case KEY_PAD_RETURN: utf8_text = (char)13; break;
+ case KEY_ESCAPE: utf8_text = (char)27; break;
+
+ default:
+ break;
+ }
+
+ uint32_t native_scan_code = 0;
+ uint32_t native_virtual_key = 0;
+ uint32_t native_modifiers = 0;
+ deserializeKeyboardData(native_key_data, native_scan_code, native_virtual_key, native_modifiers);
+
+ mLLCEFLib->keyboardEvent(key_event, (uint32_t)key, utf8_text.c_str(), modifiers, native_scan_code, native_virtual_key, native_modifiers);
+#elif LL_WINDOWS
+ U32 msg = ll_U32_from_sd(native_key_data["msg"]);
+ U32 wparam = ll_U32_from_sd(native_key_data["w_param"]);
+ U64 lparam = ll_U32_from_sd(native_key_data["l_param"]);
+ mLLCEFLib->nativeKeyboardEvent(msg, wparam, lparam);
+#endif
+};
+
+void MediaPluginCEF::unicodeInput(const std::string &utf8str, LLCEFLib::EKeyboardModifier modifiers, LLSD native_key_data = LLSD::emptyMap())
+{
+#if LL_DARWIN
+ //mLLCEFLib->keyPress(utf8str[0], true);
+ mLLCEFLib->keyboardEvent(LLCEFLib::KE_KEY_DOWN, (uint32_t)(utf8str[0]), 0, LLCEFLib::KM_MODIFIER_NONE, 0, 0, 0);
+#elif LL_WINDOWS
+ U32 msg = ll_U32_from_sd(native_key_data["msg"]);
+ U32 wparam = ll_U32_from_sd(native_key_data["w_param"]);
+ U64 lparam = ll_U32_from_sd(native_key_data["l_param"]);
+ mLLCEFLib->nativeKeyboardEvent(msg, wparam, lparam);
+#endif
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginCEF::checkEditState()
+{
+ bool can_cut = mLLCEFLib->editCanCut();
+ bool can_copy = mLLCEFLib->editCanCopy();
+ bool can_paste = mLLCEFLib->editCanPaste();
+
+ if ((can_cut != mCanCut) || (can_copy != mCanCopy) || (can_paste != mCanPaste))
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_state");
+
+ if (can_cut != mCanCut)
+ {
+ mCanCut = can_cut;
+ message.setValueBoolean("cut", can_cut);
+ }
+
+ if (can_copy != mCanCopy)
+ {
+ mCanCopy = can_copy;
+ message.setValueBoolean("copy", can_copy);
+ }
+
+ if (can_paste != mCanPaste)
+ {
+ mCanPaste = can_paste;
+ message.setValueBoolean("paste", can_paste);
+ }
+
+ sendMessage(message);
+ }
+}
+
+void MediaPluginCEF::setVolume(F32 vol)
+{
+ mVolumeCatcher.setVolume(vol);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+bool MediaPluginCEF::init()
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text");
+ message.setValue("name", "CEF 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)
+{
+ MediaPluginCEF* self = new MediaPluginCEF(host_send_func, host_user_data);
+ *plugin_send_func = MediaPluginCEF::staticReceiveMessage;
+ *plugin_user_data = (void*)self;
+
+ return 0;
+}
+
diff --git a/indra/media_plugins/webkit/volume_catcher.h b/indra/media_plugins/cef/volume_catcher.h
index 337f2913d3..337f2913d3 100755..100644
--- a/indra/media_plugins/webkit/volume_catcher.h
+++ b/indra/media_plugins/cef/volume_catcher.h
diff --git a/indra/media_plugins/webkit/windows_volume_catcher.cpp b/indra/media_plugins/cef/windows_volume_catcher.cpp
index 0cfb810906..0cfb810906 100755..100644
--- a/indra/media_plugins/webkit/windows_volume_catcher.cpp
+++ b/indra/media_plugins/cef/windows_volume_catcher.cpp
diff --git a/indra/media_plugins/quicktime/CMakeLists.txt b/indra/media_plugins/quicktime/CMakeLists.txt
index 58391007ff..d7a1874bf3 100755
--- a/indra/media_plugins/quicktime/CMakeLists.txt
+++ b/indra/media_plugins/quicktime/CMakeLists.txt
@@ -63,7 +63,8 @@ if (WINDOWS)
set_target_properties(
media_plugin_quicktime
PROPERTIES
- LINK_FLAGS "/MANIFEST:NO"
+ LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /NODEFAULTLIB:LIBCMT"
+ LINK_FLAGS_DEBUG "/MANIFEST:NO /SAFESEH:NO /NODEFAULTLIB:LIBCMTD"
)
endif (WINDOWS)
diff --git a/indra/media_plugins/webkit/dummy_volume_catcher.cpp b/indra/media_plugins/webkit/dummy_volume_catcher.cpp
deleted file mode 100755
index d54b31b2ae..0000000000
--- a/indra/media_plugins/webkit/dummy_volume_catcher.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * @file dummy_volume_catcher.cpp
- * @brief A null implementation of the "VolumeCatcher" class for platforms where it's not implemented yet.
- *
- * @cond
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- * @endcond
- */
-
-#include "volume_catcher.h"
-
-
-class VolumeCatcherImpl
-{
-};
-
-/////////////////////////////////////////////////////
-
-VolumeCatcher::VolumeCatcher()
-{
- pimpl = NULL;
-}
-
-VolumeCatcher::~VolumeCatcher()
-{
-}
-
-void VolumeCatcher::setVolume(F32 volume)
-{
-}
-
-void VolumeCatcher::setPan(F32 pan)
-{
-}
-
-void VolumeCatcher::pump()
-{
-}
-
diff --git a/indra/media_plugins/webkit/linux_volume_catcher.cpp b/indra/media_plugins/webkit/linux_volume_catcher.cpp
deleted file mode 100755
index 91be3a89e9..0000000000
--- a/indra/media_plugins/webkit/linux_volume_catcher.cpp
+++ /dev/null
@@ -1,468 +0,0 @@
-/**
- * @file linux_volume_catcher.cpp
- * @brief A Linux-specific, PulseAudio-specific hack to detect and volume-adjust new audio sources
- *
- * @cond
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- * @endcond
- */
-
-/*
- The high-level design is as follows:
- 1) Connect to the PulseAudio daemon
- 2) Watch for the creation of new audio players connecting to the daemon (this includes ALSA clients running on the PulseAudio emulation layer, such as Flash plugins)
- 3) Examine any new audio player's PID to see if it belongs to our own process
- 4) If so, tell PA to adjust the volume of that audio player ('sink input' in PA parlance)
- 5) Keep a list of all living audio players that we care about, adjust the volumes of all of them when we get a new setVolume() call
- */
-
-#include "linden_common.h"
-
-#include "volume_catcher.h"
-
-
-extern "C" {
-#include <glib.h>
-#include <glib-object.h>
-
-#include <pulse/introspect.h>
-#include <pulse/context.h>
-#include <pulse/subscribe.h>
-#include <pulse/glib-mainloop.h> // There's no special reason why we want the *glib* PA mainloop, but the generic polling implementation seems broken.
-
-#include "apr_pools.h"
-#include "apr_dso.h"
-}
-
-////////////////////////////////////////////////////
-
-#define DEBUGMSG(...) do {} while(0)
-#define INFOMSG(...) do {} while(0)
-#define WARNMSG(...) do {} while(0)
-
-#define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) RTN (*ll##PASYM)(__VA_ARGS__) = NULL
-#include "linux_volume_catcher_pa_syms.inc"
-#include "linux_volume_catcher_paglib_syms.inc"
-#undef LL_PA_SYM
-
-static bool sSymsGrabbed = false;
-static apr_pool_t *sSymPADSOMemoryPool = NULL;
-static apr_dso_handle_t *sSymPADSOHandleG = NULL;
-
-bool grab_pa_syms(std::string pulse_dso_name)
-{
- if (sSymsGrabbed)
- {
- // already have grabbed good syms
- return true;
- }
-
- bool sym_error = false;
- bool rtn = false;
- apr_status_t rv;
- apr_dso_handle_t *sSymPADSOHandle = NULL;
-
-#define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) do{rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll##PASYM, sSymPADSOHandle, #PASYM); if (rv != APR_SUCCESS) {INFOMSG("Failed to grab symbol: %s", #PASYM); if (REQUIRED) sym_error = true;} else DEBUGMSG("grabbed symbol: %s from %p", #PASYM, (void*)ll##PASYM);}while(0)
-
- //attempt to load the shared library
- apr_pool_create(&sSymPADSOMemoryPool, NULL);
-
- if ( APR_SUCCESS == (rv = apr_dso_load(&sSymPADSOHandle,
- pulse_dso_name.c_str(),
- sSymPADSOMemoryPool) ))
- {
- INFOMSG("Found DSO: %s", pulse_dso_name.c_str());
-
-#include "linux_volume_catcher_pa_syms.inc"
-#include "linux_volume_catcher_paglib_syms.inc"
-
- if ( sSymPADSOHandle )
- {
- sSymPADSOHandleG = sSymPADSOHandle;
- sSymPADSOHandle = NULL;
- }
-
- rtn = !sym_error;
- }
- else
- {
- INFOMSG("Couldn't load DSO: %s", pulse_dso_name.c_str());
- rtn = false; // failure
- }
-
- if (sym_error)
- {
- WARNMSG("Failed to find necessary symbols in PulseAudio libraries.");
- }
-#undef LL_PA_SYM
-
- sSymsGrabbed = rtn;
- return rtn;
-}
-
-
-void ungrab_pa_syms()
-{
- // should be safe to call regardless of whether we've
- // actually grabbed syms.
-
- if ( sSymPADSOHandleG )
- {
- apr_dso_unload(sSymPADSOHandleG);
- sSymPADSOHandleG = NULL;
- }
-
- if ( sSymPADSOMemoryPool )
- {
- apr_pool_destroy(sSymPADSOMemoryPool);
- sSymPADSOMemoryPool = NULL;
- }
-
- // NULL-out all of the symbols we'd grabbed
-#define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) do{ll##PASYM = NULL;}while(0)
-#include "linux_volume_catcher_pa_syms.inc"
-#include "linux_volume_catcher_paglib_syms.inc"
-#undef LL_PA_SYM
-
- sSymsGrabbed = false;
-}
-////////////////////////////////////////////////////
-
-// PulseAudio requires a chain of callbacks with C linkage
-extern "C" {
- void callback_discovered_sinkinput(pa_context *context, const pa_sink_input_info *i, int eol, void *userdata);
- void callback_subscription_alert(pa_context *context, pa_subscription_event_type_t t, uint32_t index, void *userdata);
- void callback_context_state(pa_context *context, void *userdata);
-}
-
-
-class VolumeCatcherImpl
-{
-public:
- VolumeCatcherImpl();
- ~VolumeCatcherImpl();
-
- void setVolume(F32 volume);
- void pump(void);
-
- // for internal use - can't be private because used from our C callbacks
-
- bool loadsyms(std::string pulse_dso_name);
- void init();
- void cleanup();
-
- void update_all_volumes(F32 volume);
- void update_index_volume(U32 index, F32 volume);
- void connected_okay();
-
- std::set<U32> mSinkInputIndices;
- std::map<U32,U32> mSinkInputNumChannels;
- F32 mDesiredVolume;
- pa_glib_mainloop *mMainloop;
- pa_context *mPAContext;
- bool mConnected;
- bool mGotSyms;
-};
-
-VolumeCatcherImpl::VolumeCatcherImpl()
- : mDesiredVolume(0.0f),
- mMainloop(NULL),
- mPAContext(NULL),
- mConnected(false),
- mGotSyms(false)
-{
- init();
-}
-
-VolumeCatcherImpl::~VolumeCatcherImpl()
-{
- cleanup();
-}
-
-bool VolumeCatcherImpl::loadsyms(std::string pulse_dso_name)
-{
- return grab_pa_syms(pulse_dso_name);
-}
-
-void VolumeCatcherImpl::init()
-{
- // try to be as defensive as possible because PA's interface is a
- // bit fragile and (for our purposes) we'd rather simply not function
- // than crash
-
- // we cheat and rely upon libpulse-mainloop-glib.so.0 to pull-in
- // libpulse.so.0 - this isn't a great assumption, and the two DSOs should
- // probably be loaded separately. Our Linux DSO framework needs refactoring,
- // we do this sort of thing a lot with practically identical logic...
- mGotSyms = loadsyms("libpulse-mainloop-glib.so.0");
- if (!mGotSyms) return;
-
- // better make double-sure glib itself is initialized properly.
- if (!g_thread_supported ()) g_thread_init (NULL);
- g_type_init();
-
- mMainloop = llpa_glib_mainloop_new(g_main_context_default());
- if (mMainloop)
- {
- pa_mainloop_api *api = llpa_glib_mainloop_get_api(mMainloop);
- if (api)
- {
- pa_proplist *proplist = llpa_proplist_new();
- if (proplist)
- {
- llpa_proplist_sets(proplist, PA_PROP_APPLICATION_ICON_NAME, "multimedia-player");
- llpa_proplist_sets(proplist, PA_PROP_APPLICATION_ID, "com.secondlife.viewer.mediaplugvoladjust");
- llpa_proplist_sets(proplist, PA_PROP_APPLICATION_NAME, "SL Plugin Volume Adjuster");
- llpa_proplist_sets(proplist, PA_PROP_APPLICATION_VERSION, "1");
-
- // plain old pa_context_new() is broken!
- mPAContext = llpa_context_new_with_proplist(api, NULL, proplist);
- llpa_proplist_free(proplist);
- }
- }
- }
-
- // Now we've set up a PA context and mainloop, try connecting the
- // PA context to a PA daemon.
- if (mPAContext)
- {
- llpa_context_set_state_callback(mPAContext, callback_context_state, this);
- pa_context_flags_t cflags = (pa_context_flags)0; // maybe add PA_CONTEXT_NOAUTOSPAWN?
- if (llpa_context_connect(mPAContext, NULL, cflags, NULL) >= 0)
- {
- // Okay! We haven't definitely connected, but we
- // haven't definitely failed yet.
- }
- else
- {
- // Failed to connect to PA manager... we'll leave
- // things like that. Perhaps we should try again later.
- }
- }
-}
-
-void VolumeCatcherImpl::cleanup()
-{
- mConnected = false;
-
- if (mGotSyms && mPAContext)
- {
- llpa_context_disconnect(mPAContext);
- llpa_context_unref(mPAContext);
- }
- mPAContext = NULL;
-
- if (mGotSyms && mMainloop)
- {
- llpa_glib_mainloop_free(mMainloop);
- }
- mMainloop = NULL;
-}
-
-void VolumeCatcherImpl::setVolume(F32 volume)
-{
- mDesiredVolume = volume;
-
- if (!mGotSyms) return;
-
- if (mConnected && mPAContext)
- {
- update_all_volumes(mDesiredVolume);
- }
-
- pump();
-}
-
-void VolumeCatcherImpl::pump()
-{
- gboolean may_block = FALSE;
- g_main_context_iteration(g_main_context_default(), may_block);
-}
-
-void VolumeCatcherImpl::connected_okay()
-{
- pa_operation *op;
-
- // fetch global list of existing sinkinputs
- if ((op = llpa_context_get_sink_input_info_list(mPAContext,
- callback_discovered_sinkinput,
- this)))
- {
- llpa_operation_unref(op);
- }
-
- // subscribe to future global sinkinput changes
- llpa_context_set_subscribe_callback(mPAContext,
- callback_subscription_alert,
- this);
- if ((op = llpa_context_subscribe(mPAContext, (pa_subscription_mask_t)
- (PA_SUBSCRIPTION_MASK_SINK_INPUT),
- NULL, NULL)))
- {
- llpa_operation_unref(op);
- }
-}
-
-void VolumeCatcherImpl::update_all_volumes(F32 volume)
-{
- for (std::set<U32>::iterator it = mSinkInputIndices.begin();
- it != mSinkInputIndices.end(); ++it)
- {
- update_index_volume(*it, volume);
- }
-}
-
-void VolumeCatcherImpl::update_index_volume(U32 index, F32 volume)
-{
- static pa_cvolume cvol;
- llpa_cvolume_set(&cvol, mSinkInputNumChannels[index],
- llpa_sw_volume_from_linear(volume));
-
- pa_context *c = mPAContext;
- uint32_t idx = index;
- const pa_cvolume *cvolumep = &cvol;
- pa_context_success_cb_t cb = NULL; // okay as null
- void *userdata = NULL; // okay as null
-
- pa_operation *op;
- if ((op = llpa_context_set_sink_input_volume(c, idx, cvolumep, cb, userdata)))
- {
- llpa_operation_unref(op);
- }
-}
-
-
-void callback_discovered_sinkinput(pa_context *context, const pa_sink_input_info *sii, int eol, void *userdata)
-{
- VolumeCatcherImpl *impl = dynamic_cast<VolumeCatcherImpl*>((VolumeCatcherImpl*)userdata);
- llassert(impl);
-
- if (0 == eol)
- {
- pa_proplist *proplist = sii->proplist;
- pid_t sinkpid = atoll(llpa_proplist_gets(proplist, PA_PROP_APPLICATION_PROCESS_ID));
-
- if (sinkpid == getpid()) // does the discovered sinkinput belong to this process?
- {
- bool is_new = (impl->mSinkInputIndices.find(sii->index) ==
- impl->mSinkInputIndices.end());
-
- impl->mSinkInputIndices.insert(sii->index);
- impl->mSinkInputNumChannels[sii->index] = sii->channel_map.channels;
-
- if (is_new)
- {
- // new!
- impl->update_index_volume(sii->index, impl->mDesiredVolume);
- }
- else
- {
- // seen it already, do nothing.
- }
- }
- }
-}
-
-void callback_subscription_alert(pa_context *context, pa_subscription_event_type_t t, uint32_t index, void *userdata)
-{
- VolumeCatcherImpl *impl = dynamic_cast<VolumeCatcherImpl*>((VolumeCatcherImpl*)userdata);
- llassert(impl);
-
- switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) {
- case PA_SUBSCRIPTION_EVENT_SINK_INPUT:
- if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) ==
- PA_SUBSCRIPTION_EVENT_REMOVE)
- {
- // forget this sinkinput, if we were caring about it
- impl->mSinkInputIndices.erase(index);
- impl->mSinkInputNumChannels.erase(index);
- }
- else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) ==
- PA_SUBSCRIPTION_EVENT_NEW)
- {
- // ask for more info about this new sinkinput
- pa_operation *op;
- if ((op = llpa_context_get_sink_input_info(impl->mPAContext, index, callback_discovered_sinkinput, impl)))
- {
- llpa_operation_unref(op);
- }
- }
- else
- {
- // property change on this sinkinput - we don't care.
- }
- break;
-
- default:;
- }
-}
-
-void callback_context_state(pa_context *context, void *userdata)
-{
- VolumeCatcherImpl *impl = dynamic_cast<VolumeCatcherImpl*>((VolumeCatcherImpl*)userdata);
- llassert(impl);
-
- switch (llpa_context_get_state(context))
- {
- case PA_CONTEXT_READY:
- impl->mConnected = true;
- impl->connected_okay();
- break;
- case PA_CONTEXT_TERMINATED:
- impl->mConnected = false;
- break;
- case PA_CONTEXT_FAILED:
- impl->mConnected = false;
- break;
- default:;
- }
-}
-
-/////////////////////////////////////////////////////
-
-VolumeCatcher::VolumeCatcher()
-{
- pimpl = new VolumeCatcherImpl();
-}
-
-VolumeCatcher::~VolumeCatcher()
-{
- delete pimpl;
- pimpl = NULL;
-}
-
-void VolumeCatcher::setVolume(F32 volume)
-{
- llassert(pimpl);
- pimpl->setVolume(volume);
-}
-
-void VolumeCatcher::setPan(F32 pan)
-{
- // TODO: implement this (if possible)
-}
-
-void VolumeCatcher::pump()
-{
- llassert(pimpl);
- pimpl->pump();
-}
diff --git a/indra/media_plugins/webkit/linux_volume_catcher_pa_syms.inc b/indra/media_plugins/webkit/linux_volume_catcher_pa_syms.inc
deleted file mode 100755
index d806b48428..0000000000
--- a/indra/media_plugins/webkit/linux_volume_catcher_pa_syms.inc
+++ /dev/null
@@ -1,21 +0,0 @@
-// required symbols to grab
-LL_PA_SYM(true, pa_context_connect, int, pa_context *c, const char *server, pa_context_flags_t flags, const pa_spawn_api *api);
-LL_PA_SYM(true, pa_context_disconnect, void, pa_context *c);
-LL_PA_SYM(true, pa_context_get_sink_input_info, pa_operation*, pa_context *c, uint32_t idx, pa_sink_input_info_cb_t cb, void *userdata);
-LL_PA_SYM(true, pa_context_get_sink_input_info_list, pa_operation*, pa_context *c, pa_sink_input_info_cb_t cb, void *userdata);
-LL_PA_SYM(true, pa_context_get_state, pa_context_state_t, pa_context *c);
-LL_PA_SYM(true, pa_context_new_with_proplist, pa_context*, pa_mainloop_api *mainloop, const char *name, pa_proplist *proplist);
-LL_PA_SYM(true, pa_context_set_sink_input_volume, pa_operation*, pa_context *c, uint32_t idx, const pa_cvolume *volume, pa_context_success_cb_t cb, void *userdata);
-LL_PA_SYM(true, pa_context_set_state_callback, void, pa_context *c, pa_context_notify_cb_t cb, void *userdata);
-LL_PA_SYM(true, pa_context_set_subscribe_callback, void, pa_context *c, pa_context_subscribe_cb_t cb, void *userdata);
-LL_PA_SYM(true, pa_context_subscribe, pa_operation*, pa_context *c, pa_subscription_mask_t m, pa_context_success_cb_t cb, void *userdata);
-LL_PA_SYM(true, pa_context_unref, void, pa_context *c);
-LL_PA_SYM(true, pa_cvolume_set, pa_cvolume*, pa_cvolume *a, unsigned channels, pa_volume_t v);
-LL_PA_SYM(true, pa_operation_unref, void, pa_operation *o);
-LL_PA_SYM(true, pa_proplist_free, void, pa_proplist* p);
-LL_PA_SYM(true, pa_proplist_gets, const char*, pa_proplist *p, const char *key);
-LL_PA_SYM(true, pa_proplist_new, pa_proplist*, void);
-LL_PA_SYM(true, pa_proplist_sets, int, pa_proplist *p, const char *key, const char *value);
-LL_PA_SYM(true, pa_sw_volume_from_linear, pa_volume_t, double v);
-
-// optional symbols to grab
diff --git a/indra/media_plugins/webkit/linux_volume_catcher_paglib_syms.inc b/indra/media_plugins/webkit/linux_volume_catcher_paglib_syms.inc
deleted file mode 100755
index abf628c96c..0000000000
--- a/indra/media_plugins/webkit/linux_volume_catcher_paglib_syms.inc
+++ /dev/null
@@ -1,6 +0,0 @@
-// required symbols to grab
-LL_PA_SYM(true, pa_glib_mainloop_free, void, pa_glib_mainloop* g);
-LL_PA_SYM(true, pa_glib_mainloop_get_api, pa_mainloop_api*, pa_glib_mainloop* g);
-LL_PA_SYM(true, pa_glib_mainloop_new, pa_glib_mainloop *, GMainContext *c);
-
-// optional symbols to grab
diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
deleted file mode 100755
index 3edeef51e3..0000000000
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ /dev/null
@@ -1,1481 +0,0 @@
-/**
- * @file media_plugin_webkit.cpp
- * @brief Webkit plugin for LLMedia API plugin system
- *
- * @cond
- * $LicenseInfo:firstyear=2008&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- * @endcond
- */
-#include "llqtwebkit.h"
-#include "linden_common.h"
-#include "indra_constants.h" // for indra keyboard codes
-
-#include "lltimer.h"
-#include "llgl.h"
-
-#include "llplugininstance.h"
-#include "llpluginmessage.h"
-#include "llpluginmessageclasses.h"
-#include "media_plugin_base.h"
-
-// set to 1 if you're using the version of llqtwebkit that's QPixmap-ified
-#if LL_LINUX
-# define LL_QTWEBKIT_USES_PIXMAPS 0
-extern "C" {
-# include <glib.h>
-# include <glib-object.h>
-}
-#else
-# define LL_QTWEBKIT_USES_PIXMAPS 0
-#endif // LL_LINUX
-
-# include "volume_catcher.h"
-
-#if LL_WINDOWS
-# include <direct.h>
-#else
-# include <unistd.h>
-# include <stdlib.h>
-#endif
-
-#if LL_WINDOWS
- // *NOTE:Mani - This captures the module handle for the dll. This is used below
- // to get the path to this dll for webkit initialization.
- // I don't know how/if this can be done with apr...
- namespace { HMODULE gModuleHandle;};
- BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
- {
- gModuleHandle = (HMODULE) hinstDLL;
- return TRUE;
- }
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-//
-class MediaPluginWebKit :
- public MediaPluginBase,
- public LLEmbeddedBrowserWindowObserver
-{
-public:
- MediaPluginWebKit(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
- ~MediaPluginWebKit();
-
- /*virtual*/ void receiveMessage(const char *message_string);
-
-private:
-
- std::string mProfileDir;
- std::string mHostLanguage;
- std::string mUserAgent;
- bool mCookiesEnabled;
- bool mJavascriptEnabled;
- bool mPluginsEnabled;
- bool mEnableMediaPluginDebugging;
-
- enum
- {
- INIT_STATE_UNINITIALIZED, // LLQtWebkit hasn't been set up yet
- INIT_STATE_INITIALIZED, // LLQtWebkit has been set up, but no browser window has been created yet.
- INIT_STATE_NAVIGATING, // Browser instance has been set up and initial navigate to about:blank has been issued
- INIT_STATE_NAVIGATE_COMPLETE, // initial navigate to about:blank has completed
- INIT_STATE_WAIT_REDRAW, // First real navigate begin has been received, waiting for page changed event to start handling redraws
- INIT_STATE_WAIT_COMPLETE, // Waiting for first real navigate complete event
- INIT_STATE_RUNNING // All initialization gymnastics are complete.
- };
- int mBrowserWindowId;
- int mInitState;
- std::string mInitialNavigateURL;
- bool mNeedsUpdate;
-
- bool mCanCut;
- bool mCanCopy;
- bool mCanPaste;
- int mLastMouseX;
- int mLastMouseY;
- bool mFirstFocus;
- F32 mBackgroundR;
- F32 mBackgroundG;
- F32 mBackgroundB;
- std::string mTarget;
- LLTimer mElapsedTime;
-
- VolumeCatcher mVolumeCatcher;
-
- void postDebugMessage( const std::string& msg )
- {
- if ( mEnableMediaPluginDebugging )
- {
- std::stringstream str;
- str << "@Media Msg> " << "[" << (double)mElapsedTime.getElapsedTimeF32() << "] -- " << msg;
-
- LLPluginMessage debug_message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "debug_message");
- debug_message.setValue("message_text", str.str());
- debug_message.setValue("message_level", "info");
- sendMessage(debug_message);
- }
- }
-
- void setInitState(int state)
- {
-// std::cerr << "changing init state to " << state << std::endl;
- mInitState = state;
- }
-
- ////////////////////////////////////////////////////////////////////////////////
- //
- void update(int milliseconds)
- {
-#if LL_QTLINUX_DOESNT_HAVE_GLIB
- // pump glib generously, as Linux browser plugins are on the
- // glib main loop, even if the browser itself isn't - ugh
- // This is NOT NEEDED if Qt itself was built with glib
- // mainloop integration.
- GMainContext *mainc = g_main_context_default();
- while(g_main_context_iteration(mainc, FALSE));
-#endif // LL_QTLINUX_DOESNT_HAVE_GLIB
-
- // pump qt
- LLQtWebKit::getInstance()->pump( milliseconds );
-
- mVolumeCatcher.pump();
-
- checkEditState();
-
- if(mInitState == INIT_STATE_NAVIGATE_COMPLETE)
- {
- if(!mInitialNavigateURL.empty())
- {
- // We already have the initial navigate URL -- kick off the navigate.
- LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, mInitialNavigateURL );
- mInitialNavigateURL.clear();
- }
- }
-
- if ( (mInitState > INIT_STATE_WAIT_REDRAW) && mNeedsUpdate )
- {
- const unsigned char* browser_pixels = LLQtWebKit::getInstance()->grabBrowserWindow( mBrowserWindowId );
-
- unsigned int rowspan = LLQtWebKit::getInstance()->getBrowserRowSpan( mBrowserWindowId );
- unsigned int height = LLQtWebKit::getInstance()->getBrowserHeight( mBrowserWindowId );
-#if !LL_QTWEBKIT_USES_PIXMAPS
- unsigned int buffer_size = rowspan * height;
-#endif // !LL_QTWEBKIT_USES_PIXMAPS
-
-// std::cerr << "webkit plugin: updating" << std::endl;
-
- // TODO: should get rid of this memcpy if possible
- if ( mPixels && browser_pixels )
- {
-// std::cerr << " memcopy of " << buffer_size << " bytes" << std::endl;
-
-#if LL_QTWEBKIT_USES_PIXMAPS
- // copy the pixel data upside-down because of the co-ord system
- for (int y=0; y<height; ++y)
- {
- memcpy( &mPixels[(height-y-1)*rowspan], &browser_pixels[y*rowspan], rowspan );
- }
-#else
- memcpy( mPixels, browser_pixels, buffer_size );
-#endif // LL_QTWEBKIT_USES_PIXMAPS
- }
-
- if ( mWidth > 0 && mHeight > 0 )
- {
-// std::cerr << "Setting dirty, " << mWidth << " x " << mHeight << std::endl;
- setDirty( 0, 0, mWidth, mHeight );
- }
-
- mNeedsUpdate = false;
- };
- };
-
- ////////////////////////////////////////////////////////////////////////////////
- //
- bool initBrowser()
- {
- // already initialized
- if ( mInitState > INIT_STATE_UNINITIALIZED )
- return true;
-
- // set up directories
- char cwd[ FILENAME_MAX ]; // I *think* this is defined on all platforms we use
- if (NULL == getcwd( cwd, FILENAME_MAX - 1 ))
- {
- LL_WARNS() << "Couldn't get cwd - probably too long - failing to init." << LL_ENDL;
- return false;
- }
- std::string application_dir = std::string( cwd );
-
-#if LL_LINUX
- // take care to initialize glib properly, because some
- // versions of Qt don't, and we indirectly need it for (some
- // versions of) Flash to not crash the browser.
- if (!g_thread_supported ()) g_thread_init (NULL);
- g_type_init();
-#endif
-
-#if LL_DARWIN
- // When running under the Xcode debugger, there's a setting called "Break on Debugger()/DebugStr()" which defaults to being turned on.
- // This causes the environment variable USERBREAK to be set to 1, which causes these legacy calls to break into the debugger.
- // This wouldn't cause any problems except for the fact that the current release version of the Flash plugin has a call to Debugger() in it
- // which gets hit when the plugin is probed by webkit.
- // Unsetting the environment variable here works around this issue.
- unsetenv("USERBREAK");
-#endif
-
-#if LL_WINDOWS
- //*NOTE:Mani - On windows, at least, the component path is the
- // location of this dll's image file.
- std::string component_dir;
- char dll_path[_MAX_PATH];
- DWORD len = GetModuleFileNameA(gModuleHandle, (LPCH)&dll_path, _MAX_PATH);
- while(len && dll_path[ len ] != ('\\') )
- {
- len--;
- }
- if(len >= 0)
- {
- dll_path[len] = 0;
- component_dir = dll_path;
- }
- else
- {
- // *NOTE:Mani - This case should be an rare exception.
- // GetModuleFileNameA should always give you a full path, no?
- component_dir = application_dir;
- }
-#else
- std::string component_dir = application_dir;
-#endif
-
- // debug spam sent to viewer and displayed in the log as usual
- postDebugMessage( "Component dir set to: " + component_dir );
-
- // window handle - needed on Windows and must be app window.
-#if LL_WINDOWS
- char window_title[ MAX_PATH ];
- GetConsoleTitleA( window_title, MAX_PATH );
- void* native_window_handle = (void*)FindWindowA( NULL, window_title );
-#else
- void* native_window_handle = 0;
-#endif
-
- // main browser initialization
- bool result = LLQtWebKit::getInstance()->init( application_dir, component_dir, mProfileDir, native_window_handle );
- if ( result )
- {
- mInitState = INIT_STATE_INITIALIZED;
-
- // debug spam sent to viewer and displayed in the log as usual
- postDebugMessage( "browser initialized okay" );
-
- return true;
- };
-
- // debug spam sent to viewer and displayed in the log as usual
- postDebugMessage( "browser nOT initialized." );
-
- return false;
- };
-
- ////////////////////////////////////////////////////////////////////////////////
- //
- bool initBrowserWindow()
- {
- // already initialized
- if ( mInitState > INIT_STATE_INITIALIZED )
- return true;
-
- // not enough information to initialize the browser yet.
- if ( mWidth < 0 || mHeight < 0 || mDepth < 0 ||
- mTextureWidth < 0 || mTextureHeight < 0 )
- {
- return false;
- };
-
- // Set up host language before creating browser window
- if(!mHostLanguage.empty())
- {
- LLQtWebKit::getInstance()->setHostLanguage(mHostLanguage);
- postDebugMessage( "Setting language to " + mHostLanguage );
- }
-
- // turn on/off cookies based on what host app tells us
- LLQtWebKit::getInstance()->enableCookies( mCookiesEnabled );
-
- // turn on/off plugins based on what host app tells us
- LLQtWebKit::getInstance()->enablePlugins( mPluginsEnabled );
-
- // turn on/off Javascript based on what host app tells us
-#if LLQTWEBKIT_API_VERSION >= 11
- LLQtWebKit::getInstance()->enableJavaScript( mJavascriptEnabled );
-#else
- LLQtWebKit::getInstance()->enableJavascript( mJavascriptEnabled );
-#endif
-
- std::stringstream str;
- str << "Cookies enabled = " << mCookiesEnabled << ", plugins enabled = " << mPluginsEnabled << ", Javascript enabled = " << mJavascriptEnabled;
- postDebugMessage( str.str() );
-
- // create single browser window
- mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow( mWidth, mHeight, mTarget);
-
- str.str("");
- str.clear();
- str << "Setting browser window size to " << mWidth << " x " << mHeight;
- postDebugMessage( str.str() );
-
- // tell LLQtWebKit about the size of the browser window
- LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight );
-
- // observer events that LLQtWebKit emits
- LLQtWebKit::getInstance()->addObserver( mBrowserWindowId, this );
-
- // append details to agent string
- LLQtWebKit::getInstance()->setBrowserAgentId( mUserAgent );
- postDebugMessage( "Updating user agent with " + mUserAgent );
-
-#if !LL_QTWEBKIT_USES_PIXMAPS
- // don't flip bitmap
- LLQtWebKit::getInstance()->flipWindow( mBrowserWindowId, true );
-#endif // !LL_QTWEBKIT_USES_PIXMAPS
-
- // set background color
- // convert background color channels from [0.0, 1.0] to [0, 255];
- LLQtWebKit::getInstance()->setBackgroundColor( mBrowserWindowId, int(mBackgroundR * 255.0f), int(mBackgroundG * 255.0f), int(mBackgroundB * 255.0f) );
-
- // Set state _before_ starting the navigate, since onNavigateBegin might get called before this call returns.
- setInitState(INIT_STATE_NAVIGATING);
-
- // Don't do this here -- it causes the dreaded "white flash" when loading a browser instance.
- // FIXME: Re-added this because navigating to a "page" initializes things correctly - especially
- // for the HTTP AUTH dialog issues (DEV-41731). Will fix at a later date.
- // Build a data URL like this: "data:text/html,%3Chtml%3E%3Cbody bgcolor=%22#RRGGBB%22%3E%3C/body%3E%3C/html%3E"
- // where RRGGBB is the background color in HTML style
- std::stringstream url;
-
- url << "data:text/html,%3Chtml%3E%3Cbody%20bgcolor=%22#";
- // convert background color channels from [0.0, 1.0] to [0, 255];
- url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundR * 255.0f);
- url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundG * 255.0f);
- url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundB * 255.0f);
- url << "%22%3E%3C/body%3E%3C/html%3E";
-
- //LL_DEBUGS() << "data url is: " << url.str() << LL_ENDL;
-
- // always display loading overlay now
-#if LLQTWEBKIT_API_VERSION >= 16
- LLQtWebKit::getInstance()->enableLoadingOverlay(mBrowserWindowId, true);
-#else
- LL_WARNS() << "Ignoring enableLoadingOverlay() call (llqtwebkit version is too old)." << LL_ENDL;
-#endif
- str.clear();
- str << "Loading overlay enabled = " << mEnableMediaPluginDebugging << " for mBrowserWindowId = " << mBrowserWindowId;
- postDebugMessage( str.str() );
-
- LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, url.str() );
-// LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, "about:blank" );
-
- return true;
- }
-
- void setVolume(F32 vol);
-
- ////////////////////////////////////////////////////////////////////////////////
- // virtual
- void onCursorChanged(const EventType& event)
- {
- LLQtWebKit::ECursor llqt_cursor = (LLQtWebKit::ECursor)event.getIntValue();
- std::string name;
-
- switch(llqt_cursor)
- {
- case LLQtWebKit::C_ARROW:
- name = "arrow";
- break;
- case LLQtWebKit::C_IBEAM:
- name = "ibeam";
- break;
- case LLQtWebKit::C_SPLITV:
- name = "splitv";
- break;
- case LLQtWebKit::C_SPLITH:
- name = "splith";
- break;
- case LLQtWebKit::C_POINTINGHAND:
- name = "hand";
- break;
-
- default:
- LL_WARNS() << "Unknown cursor ID: " << (int)llqt_cursor << LL_ENDL;
- break;
- }
-
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "cursor_changed");
- message.setValue("name", name);
- sendMessage(message);
- }
-
- ////////////////////////////////////////////////////////////////////////////////
- // virtual
- void onPageChanged( const EventType& event )
- {
- if(mInitState == INIT_STATE_WAIT_REDRAW)
- {
- setInitState(INIT_STATE_WAIT_COMPLETE);
- }
-
- // flag that an update is required
- mNeedsUpdate = true;
- };
-
- ////////////////////////////////////////////////////////////////////////////////
- // virtual
- void onNavigateBegin(const EventType& event)
- {
- if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
- {
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");
- message.setValue("uri", event.getEventUri());
- message.setValueBoolean("history_back_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK));
- message.setValueBoolean("history_forward_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_FORWARD));
- sendMessage(message);
-
- // debug spam sent to viewer and displayed in the log as usual
- postDebugMessage( "Navigate begin event at: " + event.getEventUri() );
-
- setStatus(STATUS_LOADING);
- }
-
- if(mInitState == INIT_STATE_NAVIGATE_COMPLETE)
- {
- // Skip the WAIT_REDRAW state now -- with the right background color set, it should no longer be necessary.
-// setInitState(INIT_STATE_WAIT_REDRAW);
- setInitState(INIT_STATE_WAIT_COMPLETE);
- }
-
- }
-
- ////////////////////////////////////////////////////////////////////////////////
- // virtual
- void onNavigateComplete(const EventType& event)
- {
- if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
- {
- if(mInitState < INIT_STATE_RUNNING)
- {
- setInitState(INIT_STATE_RUNNING);
-
- // Clear the history, so the "back" button doesn't take you back to "about:blank".
- LLQtWebKit::getInstance()->clearHistory(mBrowserWindowId);
- }
-
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete");
- message.setValue("uri", event.getEventUri());
- message.setValueS32("result_code", event.getIntValue());
- message.setValue("result_string", event.getStringValue());
- message.setValueBoolean("history_back_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK));
- message.setValueBoolean("history_forward_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_FORWARD));
- sendMessage(message);
-
- setStatus(STATUS_LOADED);
- }
- else if(mInitState == INIT_STATE_NAVIGATING)
- {
- setInitState(INIT_STATE_NAVIGATE_COMPLETE);
- }
-
- // debug spam sent to viewer and displayed in the log as usual
- postDebugMessage( "Navigate complete event at: " + event.getEventUri() );
- }
-
- ////////////////////////////////////////////////////////////////////////////////
- // virtual
- void onUpdateProgress(const EventType& event)
- {
- if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
- {
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "progress");
- message.setValueS32("percent", event.getIntValue());
- sendMessage(message);
- }
- }
-
- ////////////////////////////////////////////////////////////////////////////////
- // virtual
- void onStatusTextChange(const EventType& event)
- {
- if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
- {
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "status_text");
- message.setValue("status", event.getStringValue());
- sendMessage(message);
- }
- }
-
- ////////////////////////////////////////////////////////////////////////////////
- // virtual
- void onTitleChange(const EventType& event)
- {
- if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
- {
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text");
- message.setValue("name", event.getStringValue());
- sendMessage(message);
- }
- }
-
- ////////////////////////////////////////////////////////////////////////////////
- // virtual
- void onNavigateErrorPage(const EventType& event)
- {
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_error_page");
- message.setValueS32("status_code", event.getIntValue());
- sendMessage(message);
- }
-
- ////////////////////////////////////////////////////////////////////////////////
- // virtual
- void onLocationChange(const EventType& event)
- {
- if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
- {
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "location_changed");
- message.setValue("uri", event.getEventUri());
- sendMessage(message);
- }
- }
-
- ////////////////////////////////////////////////////////////////////////////////
- // virtual
- void onClickLinkHref(const EventType& event)
- {
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_href");
- message.setValue("uri", event.getEventUri());
- message.setValue("target", event.getStringValue());
- message.setValue("uuid", event.getStringValue2());
- sendMessage(message);
- }
-
- ////////////////////////////////////////////////////////////////////////////////
- // virtual
- void onClickLinkNoFollow(const EventType& event)
- {
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_nofollow");
- message.setValue("uri", event.getEventUri());
-#if LLQTWEBKIT_API_VERSION >= 7
- message.setValue("nav_type", event.getNavigationType());
-#else
- message.setValue("nav_type", "clicked");
-#endif
- sendMessage(message);
- }
-
-
- ////////////////////////////////////////////////////////////////////////////////
- // virtual
- void onCookieChanged(const EventType& event)
- {
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "cookie_set");
- message.setValue("cookie", event.getStringValue());
- // These could be passed through as well, but aren't really needed.
-// message.setValue("uri", event.getEventUri());
-// message.setValueBoolean("dead", (event.getIntValue() != 0))
-
- // debug spam
- postDebugMessage( "Sending cookie_set message from plugin: " + event.getStringValue() );
-
- sendMessage(message);
- }
-
- ////////////////////////////////////////////////////////////////////////////////
- // virtual
- void onWindowCloseRequested(const EventType& event)
- {
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "close_request");
- message.setValue("uuid", event.getStringValue());
- sendMessage(message);
- }
-
- ////////////////////////////////////////////////////////////////////////////////
- // virtual
- void onWindowGeometryChangeRequested(const EventType& event)
- {
- int x, y, width, height;
- event.getRectValue(x, y, width, height);
-
- // This sometimes gets called with a zero-size request. Don't pass these along.
- if(width > 0 && height > 0)
- {
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "geometry_change");
- message.setValue("uuid", event.getStringValue());
- message.setValueS32("x", x);
- message.setValueS32("y", y);
- message.setValueS32("width", width);
- message.setValueS32("height", height);
- sendMessage(message);
- }
- }
-
- ////////////////////////////////////////////////////////////////////////////////
- // virtual
- std::string onRequestFilePicker( const EventType& eventIn )
- {
- return blockingPickFile();
- }
-
- std::string mAuthUsername;
- std::string mAuthPassword;
- bool mAuthOK;
-
- ////////////////////////////////////////////////////////////////////////////////
- // virtual
- bool onAuthRequest(const std::string &in_url, const std::string &in_realm, std::string &out_username, std::string &out_password)
- {
- mAuthOK = false;
-
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "auth_request");
- message.setValue("url", in_url);
- message.setValue("realm", in_realm);
- message.setValueBoolean("blocking_request", true);
-
- // The "blocking_request" key in the message means this sendMessage call will block until a response is received.
- sendMessage(message);
-
- if(mAuthOK)
- {
- out_username = mAuthUsername;
- out_password = mAuthPassword;
- }
-
- return mAuthOK;
- }
-
- void authResponse(LLPluginMessage &message)
- {
- mAuthOK = message.getValueBoolean("ok");
- if(mAuthOK)
- {
- mAuthUsername = message.getValue("username");
- mAuthPassword = message.getValue("password");
- }
- }
-
- ////////////////////////////////////////////////////////////////////////////////
- // virtual
- void onLinkHovered(const EventType& event)
- {
- if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
- {
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "link_hovered");
- message.setValue("link", event.getEventUri());
- message.setValue("title", event.getStringValue());
- message.setValue("text", event.getStringValue2());
- sendMessage(message);
- }
- }
-
- LLQtWebKit::EKeyboardModifier decodeModifiers(std::string &modifiers)
- {
- int result = 0;
-
- if(modifiers.find("shift") != std::string::npos)
- result |= LLQtWebKit::KM_MODIFIER_SHIFT;
-
- if(modifiers.find("alt") != std::string::npos)
- result |= LLQtWebKit::KM_MODIFIER_ALT;
-
- if(modifiers.find("control") != std::string::npos)
- result |= LLQtWebKit::KM_MODIFIER_CONTROL;
-
- if(modifiers.find("meta") != std::string::npos)
- result |= LLQtWebKit::KM_MODIFIER_META;
-
- return (LLQtWebKit::EKeyboardModifier)result;
- }
-
- ////////////////////////////////////////////////////////////////////////////////
- //
- void deserializeKeyboardData( LLSD native_key_data, uint32_t& native_scan_code, uint32_t& native_virtual_key, uint32_t& native_modifiers )
- {
- native_scan_code = 0;
- native_virtual_key = 0;
- native_modifiers = 0;
-
- if( native_key_data.isMap() )
- {
-#if LL_DARWIN
- native_scan_code = (uint32_t)(native_key_data["char_code"].asInteger());
- native_virtual_key = (uint32_t)(native_key_data["key_code"].asInteger());
- native_modifiers = (uint32_t)(native_key_data["modifiers"].asInteger());
-#elif LL_WINDOWS
- native_scan_code = (uint32_t)(native_key_data["scan_code"].asInteger());
- native_virtual_key = (uint32_t)(native_key_data["virtual_key"].asInteger());
- // TODO: I don't think we need to do anything with native modifiers here -- please verify
-#elif LL_LINUX
- native_scan_code = (uint32_t)(native_key_data["scan_code"].asInteger());
- native_virtual_key = (uint32_t)(native_key_data["virtual_key"].asInteger());
- native_modifiers = (uint32_t)(native_key_data["modifiers"].asInteger());
-#else
- // Add other platforms here as needed
-#endif
- };
- };
-
- ////////////////////////////////////////////////////////////////////////////////
- //
- void keyEvent(LLQtWebKit::EKeyEvent key_event, int key, LLQtWebKit::EKeyboardModifier modifiers, LLSD native_key_data = LLSD::emptyMap())
- {
- // The incoming values for 'key' will be the ones from indra_constants.h
- std::string utf8_text;
-
- if(key < KEY_SPECIAL)
- {
- // Low-ascii characters need to get passed through.
- utf8_text = (char)key;
- }
-
- // Any special-case handling we want to do for particular keys...
- switch((KEY)key)
- {
- // ASCII codes for some standard keys
- case LLQtWebKit::KEY_BACKSPACE: utf8_text = (char)8; break;
- case LLQtWebKit::KEY_TAB: utf8_text = (char)9; break;
- case LLQtWebKit::KEY_RETURN: utf8_text = (char)13; break;
- case LLQtWebKit::KEY_PAD_RETURN: utf8_text = (char)13; break;
- case LLQtWebKit::KEY_ESCAPE: utf8_text = (char)27; break;
-
- default:
- break;
- }
-
-// std::cerr << "key event " << (int)key_event << ", native_key_data = " << native_key_data << std::endl;
-
- uint32_t native_scan_code = 0;
- uint32_t native_virtual_key = 0;
- uint32_t native_modifiers = 0;
- deserializeKeyboardData( native_key_data, native_scan_code, native_virtual_key, native_modifiers );
-
- LLQtWebKit::getInstance()->keyboardEvent( mBrowserWindowId, key_event, (uint32_t)key, utf8_text.c_str(), modifiers, native_scan_code, native_virtual_key, native_modifiers);
-
- checkEditState();
- };
-
- ////////////////////////////////////////////////////////////////////////////////
- //
- void unicodeInput( const std::string &utf8str, LLQtWebKit::EKeyboardModifier modifiers, LLSD native_key_data = LLSD::emptyMap())
- {
- uint32_t key = LLQtWebKit::KEY_NONE;
-
-// std::cerr << "unicode input, native_key_data = " << native_key_data << std::endl;
-
- if(utf8str.size() == 1)
- {
- // The only way a utf8 string can be one byte long is if it's actually a single 7-bit ascii character.
- // In this case, use it as the key value.
- key = utf8str[0];
- }
-
- uint32_t native_scan_code = 0;
- uint32_t native_virtual_key = 0;
- uint32_t native_modifiers = 0;
- deserializeKeyboardData( native_key_data, native_scan_code, native_virtual_key, native_modifiers );
-
- LLQtWebKit::getInstance()->keyboardEvent( mBrowserWindowId, LLQtWebKit::KE_KEY_DOWN, (uint32_t)key, utf8str.c_str(), modifiers, native_scan_code, native_virtual_key, native_modifiers);
- LLQtWebKit::getInstance()->keyboardEvent( mBrowserWindowId, LLQtWebKit::KE_KEY_UP, (uint32_t)key, utf8str.c_str(), modifiers, native_scan_code, native_virtual_key, native_modifiers);
-
- checkEditState();
- };
-
- void checkEditState(void)
- {
- bool can_cut = LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_EDIT_CUT);
- bool can_copy = LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_EDIT_COPY);
- bool can_paste = LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_EDIT_PASTE);
-
- if((can_cut != mCanCut) || (can_copy != mCanCopy) || (can_paste != mCanPaste))
- {
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_state");
-
- if(can_cut != mCanCut)
- {
- mCanCut = can_cut;
- message.setValueBoolean("cut", can_cut);
- }
-
- if(can_copy != mCanCopy)
- {
- mCanCopy = can_copy;
- message.setValueBoolean("copy", can_copy);
- }
-
- if(can_paste != mCanPaste)
- {
- mCanPaste = can_paste;
- message.setValueBoolean("paste", can_paste);
- }
-
- sendMessage(message);
-
- }
- }
-
- std::string mPickedFile;
-
- std::string blockingPickFile(void)
- {
- mPickedFile.clear();
-
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "pick_file");
- message.setValueBoolean("blocking_request", true);
-
- // The "blocking_request" key in the message means this sendMessage call will block until a response is received.
- sendMessage(message);
-
- return mPickedFile;
- }
-
- void onPickFileResponse(const std::string &file)
- {
- mPickedFile = file;
- }
-
-};
-
-MediaPluginWebKit::MediaPluginWebKit(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data) :
- MediaPluginBase(host_send_func, host_user_data)
-{
-// std::cerr << "MediaPluginWebKit constructor" << std::endl;
-
- mBrowserWindowId = 0;
- mInitState = INIT_STATE_UNINITIALIZED;
- mNeedsUpdate = true;
- mCanCut = false;
- mCanCopy = false;
- mCanPaste = false;
- mLastMouseX = 0;
- mLastMouseY = 0;
- mFirstFocus = true;
- mBackgroundR = 0.0f;
- mBackgroundG = 0.0f;
- mBackgroundB = 0.0f;
-
- mHostLanguage = "en"; // default to english
- mJavascriptEnabled = true; // default to on
- mPluginsEnabled = true; // default to on
- mEnableMediaPluginDebugging = false;
- mUserAgent = "LLPluginMedia Web Browser";
-
- mElapsedTime.reset();
-}
-
-MediaPluginWebKit::~MediaPluginWebKit()
-{
- // unhook observer
- LLQtWebKit::getInstance()->remObserver( mBrowserWindowId, this );
-
- // clean up
- LLQtWebKit::getInstance()->reset();
-
-// std::cerr << "MediaPluginWebKit destructor" << std::endl;
-}
-
-void MediaPluginWebKit::receiveMessage(const char *message_string)
-{
-// std::cerr << "MediaPluginWebKit::receiveMessage: received message: \"" << message_string << "\"" << std::endl;
- 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 = "Webkit media plugin, Webkit version ";
- plugin_version += LLQtWebKit::getInstance()->getVersion();
- message.setValue("plugin_version", plugin_version);
- 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((int)(time * 1000.0f));
- }
- else if(message_name == "cleanup")
- {
- // DTOR most likely won't be called but the recent change to the way this process
- // is (not) killed means we see this message and can do what we need to here.
- // Note: this cleanup is ultimately what writes cookies to the disk
- LLQtWebKit::getInstance()->remObserver( mBrowserWindowId, this );
- LLQtWebKit::getInstance()->reset();
- }
- else if(message_name == "shm_added")
- {
- SharedSegmentInfo info;
- info.mAddress = message_in.getValuePointer("address");
- info.mSize = (size_t)message_in.getValueS32("size");
- std::string name = message_in.getValue("name");
-
-// std::cerr << "MediaPluginWebKit::receiveMessage: shared memory added, name: " << name
-// << ", size: " << info.mSize
-// << ", address: " << info.mAddress
-// << std::endl;
-
- mSharedSegments.insert(SharedSegmentMap::value_type(name, info));
-
- }
- else if(message_name == "shm_remove")
- {
- std::string name = message_in.getValue("name");
-
-// std::cerr << "MediaPluginWebKit::receiveMessage: shared memory remove, name = " << name << std::endl;
-
- 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 << "MediaPluginWebKit::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 << "MediaPluginWebKit::receiveMessage: unknown base message: " << message_name << std::endl;
- }
- }
- else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)
- {
- if(message_name == "set_volume")
- {
- F32 volume = (F32)message_in.getValueReal("volume");
- setVolume(volume);
- }
- }
- else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
- {
- if(message_name == "init")
- {
- mTarget = message_in.getValue("target");
-
- // This is the media init message -- all necessary data for initialization should have been received.
- if(initBrowser())
- {
-
- // Plugin gets to decide the texture parameters to use.
- mDepth = 4;
-
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
- message.setValueS32("default_width", 1024);
- message.setValueS32("default_height", 1024);
- message.setValueS32("depth", mDepth);
- message.setValueU32("internalformat", GL_RGBA);
- #if LL_QTWEBKIT_USES_PIXMAPS
- message.setValueU32("format", GL_BGRA_EXT); // I hope this isn't system-dependant... is it? If so, we'll have to check the root window's pixel layout or something... yuck.
- #else
- message.setValueU32("format", GL_RGBA);
- #endif // LL_QTWEBKIT_USES_PIXMAPS
- message.setValueU32("type", GL_UNSIGNED_BYTE);
- message.setValueBoolean("coords_opengl", true);
- sendMessage(message);
- }
- else
- {
- // if initialization failed, we're done.
- mDeleteMe = true;
- }
-
- }
- else if(message_name == "set_user_data_path")
- {
- std::string user_data_path = message_in.getValue("path"); // n.b. always has trailing platform-specific dir-delimiter
- mProfileDir = user_data_path + "browser_profile";
-
- // FIXME: Should we do anything with this if it comes in after the browser has been initialized?
- }
- else if(message_name == "set_language_code")
- {
- mHostLanguage = message_in.getValue("language");
-
- // FIXME: Should we do anything with this if it comes in after the browser has been initialized?
- }
- else if(message_name == "plugins_enabled")
- {
- mPluginsEnabled = message_in.getValueBoolean("enable");
- }
- else if(message_name == "javascript_enabled")
- {
- mJavascriptEnabled = message_in.getValueBoolean("enable");
- }
- else 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");
- mBackgroundR = (F32)message_in.getValueReal("background_r");
- mBackgroundG = (F32)message_in.getValueReal("background_g");
- mBackgroundB = (F32)message_in.getValueReal("background_b");
-// mBackgroundA = message_in.setValueReal("background_a"); // Ignore any alpha
-
- 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;
-
- if(initBrowserWindow())
- {
-
- // size changed so tell the browser
- LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight );
-
- // std::cerr << "webkit plugin: set size to " << mWidth << " x " << mHeight
- // << ", rowspan is " << LLQtWebKit::getInstance()->getBrowserRowSpan(mBrowserWindowId) << std::endl;
-
- S32 real_width = LLQtWebKit::getInstance()->getBrowserRowSpan(mBrowserWindowId) / LLQtWebKit::getInstance()->getBrowserDepth(mBrowserWindowId);
-
- // The actual width the browser will be drawing to is probably smaller... let the host know by modifying texture_width in the response.
- if(real_width <= texture_width)
- {
- texture_width = real_width;
- }
- else
- {
- // This won't work -- it'll be bigger than the allocated memory. This is a fatal error.
- // std::cerr << "Fatal error: browser rowbytes greater than texture width" << std::endl;
- mDeleteMe = true;
- return;
- }
- }
- else
- {
- // Setting up the browser window failed. This is a fatal error.
- mDeleteMe = true;
- }
-
-
- mTextureWidth = texture_width;
- mTextureHeight = texture_height;
-
- };
- };
-
- 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");
-
-// std::cout << "loading URI: " << uri << std::endl;
-
- if(!uri.empty())
- {
- if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
- {
- LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, uri );
- }
- else
- {
- mInitialNavigateURL = uri;
- }
- }
- }
- else if(message_name == "mouse_event")
- {
- std::string event = message_in.getValue("event");
- S32 button = message_in.getValueS32("button");
- mLastMouseX = message_in.getValueS32("x");
- mLastMouseY = message_in.getValueS32("y");
- std::string modifiers = message_in.getValue("modifiers");
-
- // Treat unknown mouse events as mouse-moves.
- LLQtWebKit::EMouseEvent mouse_event = LLQtWebKit::ME_MOUSE_MOVE;
- if(event == "down")
- {
- mouse_event = LLQtWebKit::ME_MOUSE_DOWN;
- }
- else if(event == "up")
- {
- mouse_event = LLQtWebKit::ME_MOUSE_UP;
- }
- else if(event == "double_click")
- {
- mouse_event = LLQtWebKit::ME_MOUSE_DOUBLE_CLICK;
- }
-
- LLQtWebKit::getInstance()->mouseEvent( mBrowserWindowId, mouse_event, button, mLastMouseX, mLastMouseY, decodeModifiers(modifiers));
- checkEditState();
- }
- else if(message_name == "scroll_event")
- {
- S32 x = message_in.getValueS32("x");
- S32 y = message_in.getValueS32("y");
- std::string modifiers = message_in.getValue("modifiers");
-
- // Incoming scroll events are adjusted so that 1 detent is approximately 1 unit.
- // Qt expects 1 detent to be 120 units.
- // It also seems that our y scroll direction is inverted vs. what Qt expects.
-
- x *= 120;
- y *= -120;
-
- LLQtWebKit::getInstance()->scrollWheelEvent(mBrowserWindowId, mLastMouseX, mLastMouseY, x, y, decodeModifiers(modifiers));
- }
- 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");
- LLSD native_key_data = message_in.getValueLLSD("native_key_data");
-
- // Treat unknown events as key-up for safety.
- LLQtWebKit::EKeyEvent key_event = LLQtWebKit::KE_KEY_UP;
- if(event == "down")
- {
- key_event = LLQtWebKit::KE_KEY_DOWN;
- }
- else if(event == "repeat")
- {
- key_event = LLQtWebKit::KE_KEY_REPEAT;
- }
-
- keyEvent(key_event, key, decodeModifiers(modifiers), native_key_data);
- }
- else if(message_name == "text_event")
- {
- std::string text = message_in.getValue("text");
- std::string modifiers = message_in.getValue("modifiers");
- LLSD native_key_data = message_in.getValueLLSD("native_key_data");
-
- unicodeInput(text, decodeModifiers(modifiers), native_key_data);
- }
- if(message_name == "edit_cut")
- {
- LLQtWebKit::getInstance()->userAction( mBrowserWindowId, LLQtWebKit::UA_EDIT_CUT );
- checkEditState();
- }
- if(message_name == "edit_copy")
- {
- LLQtWebKit::getInstance()->userAction( mBrowserWindowId, LLQtWebKit::UA_EDIT_COPY );
- checkEditState();
- }
- if(message_name == "edit_paste")
- {
- LLQtWebKit::getInstance()->userAction( mBrowserWindowId, LLQtWebKit::UA_EDIT_PASTE );
- checkEditState();
- }
- if(message_name == "pick_file_response")
- {
- onPickFileResponse(message_in.getValue("file"));
- }
- if(message_name == "auth_response")
- {
- authResponse(message_in);
- }
- else
- if(message_name == "enable_media_plugin_debugging")
- {
- mEnableMediaPluginDebugging = message_in.getValueBoolean( "enable" );
- }
- else
- if(message_name == "js_enable_object")
- {
-#if LLQTWEBKIT_API_VERSION >= 9
- bool enable = message_in.getValueBoolean( "enable" );
- LLQtWebKit::getInstance()->setSLObjectEnabled( enable );
-#endif
- }
- else
- if(message_name == "js_agent_location")
- {
-#if LLQTWEBKIT_API_VERSION >= 9
- F32 x = (F32)message_in.getValueReal("x");
- F32 y = (F32)message_in.getValueReal("y");
- F32 z = (F32)message_in.getValueReal("z");
- LLQtWebKit::getInstance()->setAgentLocation( x, y, z );
- LLQtWebKit::getInstance()->emitLocation();
-#endif
- }
- else
- if(message_name == "js_agent_global_location")
- {
-#if LLQTWEBKIT_API_VERSION >= 9
- F32 x = (F32)message_in.getValueReal("x");
- F32 y = (F32)message_in.getValueReal("y");
- F32 z = (F32)message_in.getValueReal("z");
- LLQtWebKit::getInstance()->setAgentGlobalLocation( x, y, z );
- LLQtWebKit::getInstance()->emitLocation();
-#endif
- }
- else
- if(message_name == "js_agent_orientation")
- {
-#if LLQTWEBKIT_API_VERSION >= 9
- F32 angle = (F32)message_in.getValueReal("angle");
- LLQtWebKit::getInstance()->setAgentOrientation( angle );
- LLQtWebKit::getInstance()->emitLocation();
-#endif
- }
- else
- if(message_name == "js_agent_region")
- {
-#if LLQTWEBKIT_API_VERSION >= 9
- const std::string& region = message_in.getValue("region");
- LLQtWebKit::getInstance()->setAgentRegion( region );
- LLQtWebKit::getInstance()->emitLocation();
-#endif
- }
- else
- if(message_name == "js_agent_maturity")
- {
-#if LLQTWEBKIT_API_VERSION >= 9
- const std::string& maturity = message_in.getValue("maturity");
- LLQtWebKit::getInstance()->setAgentMaturity( maturity );
- LLQtWebKit::getInstance()->emitMaturity();
-#endif
- }
- else
- if(message_name == "js_agent_language")
- {
-#if LLQTWEBKIT_API_VERSION >= 9
- const std::string& language = message_in.getValue("language");
- LLQtWebKit::getInstance()->setAgentLanguage( language );
- LLQtWebKit::getInstance()->emitLanguage();
-#endif
- }
- else
- {
-// std::cerr << "MediaPluginWebKit::receiveMessage: unknown media message: " << message_string << std::endl;
- }
- }
- else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER)
- {
- if(message_name == "focus")
- {
- bool val = message_in.getValueBoolean("focused");
- LLQtWebKit::getInstance()->focusBrowser( mBrowserWindowId, val );
-
- if(mFirstFocus && val)
- {
- // On the first focus, post a tab key event. This fixes a problem with initial focus.
- std::string empty;
- keyEvent(LLQtWebKit::KE_KEY_DOWN, KEY_TAB, decodeModifiers(empty));
- keyEvent(LLQtWebKit::KE_KEY_UP, KEY_TAB, decodeModifiers(empty));
- mFirstFocus = false;
- }
- }
- else if(message_name == "set_page_zoom_factor")
- {
-#if LLQTWEBKIT_API_VERSION >= 15
- F32 factor = (F32)message_in.getValueReal("factor");
- LLQtWebKit::getInstance()->setPageZoomFactor(factor);
-#else
- LL_WARNS() << "Ignoring setPageZoomFactor message (llqtwebkit version is too old)." << LL_ENDL;
-#endif
- }
- else if(message_name == "clear_cache")
- {
- LLQtWebKit::getInstance()->clearCache();
- }
- else if(message_name == "clear_cookies")
- {
- LLQtWebKit::getInstance()->clearAllCookies();
- }
- else if(message_name == "enable_cookies")
- {
- mCookiesEnabled = message_in.getValueBoolean("enable");
- LLQtWebKit::getInstance()->enableCookies( mCookiesEnabled );
- }
- else if(message_name == "enable_plugins")
- {
- mPluginsEnabled = message_in.getValueBoolean("enable");
- LLQtWebKit::getInstance()->enablePlugins( mPluginsEnabled );
- }
- else if(message_name == "enable_javascript")
- {
- mJavascriptEnabled = message_in.getValueBoolean("enable");
- //LLQtWebKit::getInstance()->enableJavascript( mJavascriptEnabled );
- }
- else if(message_name == "set_cookies")
- {
- LLQtWebKit::getInstance()->setCookies(message_in.getValue("cookies"));
-
- // debug spam
- postDebugMessage( "Plugin setting cookie: " + message_in.getValue("cookies") );
- }
- else if(message_name == "proxy_setup")
- {
- bool val = message_in.getValueBoolean("enable");
- std::string host = message_in.getValue("host");
- int port = message_in.getValueS32("port");
- LLQtWebKit::getInstance()->enableProxy( val, host, port );
- }
- else if(message_name == "browse_stop")
- {
- LLQtWebKit::getInstance()->userAction( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_STOP );
- }
- else if(message_name == "browse_reload")
- {
- // foo = message_in.getValueBoolean("ignore_cache");
- LLQtWebKit::getInstance()->userAction( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_RELOAD );
- }
- else if(message_name == "browse_forward")
- {
- LLQtWebKit::getInstance()->userAction( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_FORWARD );
- }
- else if(message_name == "browse_back")
- {
- LLQtWebKit::getInstance()->userAction( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK );
- }
- else if(message_name == "set_status_redirect")
- {
- int code = message_in.getValueS32("code");
- std::string url = message_in.getValue("url");
- if ( 404 == code ) // browser lib only supports 404 right now
- {
-#if LLQTWEBKIT_API_VERSION < 8
- LLQtWebKit::getInstance()->set404RedirectUrl( mBrowserWindowId, url );
-#endif
- };
- }
- else if(message_name == "set_user_agent")
- {
- mUserAgent = message_in.getValue("user_agent");
- LLQtWebKit::getInstance()->setBrowserAgentId( mUserAgent );
- }
- else if(message_name == "show_web_inspector")
- {
-#if LLQTWEBKIT_API_VERSION >= 10
- bool val = message_in.getValueBoolean("show");
- LLQtWebKit::getInstance()->showWebInspector( val );
-#else
- LL_WARNS() << "Ignoring showWebInspector message (llqtwebkit version is too old)." << LL_ENDL;
-#endif
- }
- else if(message_name == "ignore_ssl_cert_errors")
- {
-#if LLQTWEBKIT_API_VERSION >= 3
- LLQtWebKit::getInstance()->setIgnoreSSLCertErrors( message_in.getValueBoolean("ignore") );
-#else
- LL_WARNS() << "Ignoring ignore_ssl_cert_errors message (llqtwebkit version is too old)." << LL_ENDL;
-#endif
- }
- else if(message_name == "add_certificate_file_path")
- {
-#if LLQTWEBKIT_API_VERSION >= 6
- LLQtWebKit::getInstance()->setCAFile( message_in.getValue("path") );
-#else
- LL_WARNS() << "Ignoring add_certificate_file_path message (llqtwebkit version is too old)." << LL_ENDL;
-#endif
- }
- else if(message_name == "init_history")
- {
- // Initialize browser history
- LLSD history = message_in.getValueLLSD("history");
- // First, clear the URL history
- LLQtWebKit::getInstance()->clearHistory(mBrowserWindowId);
- // Then, add the history items in order
- LLSD::array_iterator iter_history = history.beginArray();
- LLSD::array_iterator end_history = history.endArray();
- for(; iter_history != end_history; ++iter_history)
- {
- std::string url = (*iter_history).asString();
- if(! url.empty()) {
- LLQtWebKit::getInstance()->prependHistoryUrl(mBrowserWindowId, url);
- }
- }
- }
- else if(message_name == "proxy_window_opened")
- {
- std::string target = message_in.getValue("target");
- std::string uuid = message_in.getValue("uuid");
- LLQtWebKit::getInstance()->proxyWindowOpened(mBrowserWindowId, target, uuid);
- }
- else if(message_name == "proxy_window_closed")
- {
- std::string uuid = message_in.getValue("uuid");
- LLQtWebKit::getInstance()->proxyWindowClosed(mBrowserWindowId, uuid);
- }
- else
- {
-// std::cerr << "MediaPluginWebKit::receiveMessage: unknown media_browser message: " << message_string << std::endl;
- };
- }
- else
- {
-// std::cerr << "MediaPluginWebKit::receiveMessage: unknown message class: " << message_class << std::endl;
- };
- }
-}
-
-void MediaPluginWebKit::setVolume(F32 volume)
-{
- mVolumeCatcher.setVolume(volume);
-}
-
-int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
-{
- MediaPluginWebKit *self = new MediaPluginWebKit(host_send_func, host_user_data);
- *plugin_send_func = MediaPluginWebKit::staticReceiveMessage;
- *plugin_user_data = (void*)self;
-
- return 0;
-}
-
-
diff --git a/indra/media_plugins/winmmshim/CMakeLists.txt b/indra/media_plugins/winmmshim/CMakeLists.txt
index bf74f81809..6890589892 100755
--- a/indra/media_plugins/winmmshim/CMakeLists.txt
+++ b/indra/media_plugins/winmmshim/CMakeLists.txt
@@ -22,9 +22,6 @@ set(winmm_shim_HEADER_FILES
list(APPEND winmm_shim_SOURCE_FILES ${winmm_shim_HEADER_FILES})
-set_source_files_properties(${media_plugin_webkit_HEADER_FILES}
- PROPERTIES HEADER_FILE_ONLY TRUE)
-
add_library(winmm_shim
SHARED
${winmm_shim_SOURCE_FILES}
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 16877c345e..73ed651e65 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -44,7 +44,6 @@ include(OPENAL)
include(OpenGL)
include(OpenSSL)
include(PNG)
-include(Prebuilt)
include(TemplateCheck)
include(UI)
include(UnixInstall)
@@ -62,9 +61,6 @@ if(FMODEX)
include_directories(${FMODEX_INCLUDE_DIR})
endif(FMODEX)
-# install SLPlugin host executable and its dynamic-library plugins
-use_prebuilt_binary(slplugins)
-
include_directories(
${DBUSGLIB_INCLUDE_DIRS}
${JSONCPP_INCLUDE_DIR}
@@ -1764,44 +1760,12 @@ if (WINDOWS)
${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt
${CMAKE_CURRENT_SOURCE_DIR}/featuretable_xp.txt
${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/qtcore4.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/qtgui4.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/qtnetwork4.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/qtopengl4.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/qtwebkit4.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/qtxmlpatterns4.dll
${ARCH_PREBUILT_DIRS_RELEASE}/ssleay32.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qgif4.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qico4.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qjpeg4.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qmng4.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qsvg4.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qtiff4.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qcncodecs4.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qjpcodecs4.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qkrcodecs4.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qtwcodecs4.dll
${ARCH_PREBUILT_DIRS_DEBUG}/libeay32.dll
- ${ARCH_PREBUILT_DIRS_DEBUG}/qtcored4.dll
- ${ARCH_PREBUILT_DIRS_DEBUG}/qtguid4.dll
- ${ARCH_PREBUILT_DIRS_DEBUG}/qtnetworkd4.dll
- ${ARCH_PREBUILT_DIRS_DEBUG}/qtopengld4.dll
- ${ARCH_PREBUILT_DIRS_DEBUG}/qtwebkitd4.dll
- ${ARCH_PREBUILT_DIRS_DEBUG}/qtxmlpatternsd4.dll
${ARCH_PREBUILT_DIRS_DEBUG}/ssleay32.dll
- ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qgifd4.dll
- ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qicod4.dll
- ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qjpegd4.dll
- ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qmngd4.dll
- ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qsvgd4.dll
- ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qtiffd4.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qcncodecsd4.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qjpcodecsd4.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qkrcodecsd4.dll
- ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qtwcodecsd4.dll
SLPlugin
media_plugin_quicktime
- media_plugin_webkit
+ media_plugin_cef
winmm_shim
windows-crash-logger
)
@@ -1846,10 +1810,10 @@ if (WINDOWS)
add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts)
endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
-## add_dependencies(${VIEWER_BINARY_NAME}
-## SLPlugin
-## windows-crash-logger
-## )
+ add_dependencies(${VIEWER_BINARY_NAME}
+ SLPlugin
+ windows-crash-logger
+ )
# sets the 'working directory' for debugging from visual studio.
if (NOT UNATTENDED)
@@ -2016,9 +1980,8 @@ if (LINUX)
set(COPY_INPUT_DEPENDENCIES
${VIEWER_BINARY_NAME}
linux-crash-logger
-## SLPlugin
-## media_plugin_webkit
-## media_plugin_gstreamer010
+ SLPlugin
+ media_plugin_gstreamer010
llcommon
)
@@ -2130,7 +2093,7 @@ if (DARWIN)
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
)
-##add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit mac-crash-logger)
+ add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_cef mac-crash-logger)
add_dependencies(${VIEWER_BINARY_NAME} mac-crash-logger)
if (ENABLE_SIGNING)
@@ -2185,20 +2148,19 @@ if (PACKAGE)
if (DARWIN)
list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}")
# *TODO: Generate these search dirs in the cmake files related to each binary.
-## list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/llplugin/slplugin/${CMAKE_CFG_INTDIR}")
+ list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/llplugin/slplugin/${CMAKE_CFG_INTDIR}")
list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/mac_crash_logger/${CMAKE_CFG_INTDIR}")
-## list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/gstreamer010/${CMAKE_CFG_INTDIR}")
-## list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}")
-## list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/webkit/${CMAKE_CFG_INTDIR}")
+ list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/gstreamer010/${CMAKE_CFG_INTDIR}")
+ list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}")
set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-darwin.tar.bz2")
-## set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin mac-crash-logger")
+ set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin mac-crash-logger")
set(VIEWER_EXE_GLOBS "'Second Life' mac-crash-logger")
set(VIEWER_LIB_GLOB "*.dylib")
endif (DARWIN)
if (LINUX)
list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/packaged")
set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-linux.tar.bz2")
-## set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin SLPlugin")
+ set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin SLPlugin")
set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin")
set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*")
set(VIEWER_COPY_MANIFEST copy_l_viewer_manifest)
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index 2e14a9557d..fcdb2e109f 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-3.8.6
+4.0.0
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index fbf2a04bcc..9e80e26e3f 100755
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -124,6 +124,9 @@
#include "llleap.h"
#include "stringize.h"
#include "llcoros.h"
+#if !LL_LINUX
+#include "cef/llceflib.h"
+#endif
// Third party library includes
#include <boost/bind.hpp>
@@ -131,7 +134,6 @@
#include <boost/algorithm/string.hpp>
#include <boost/regex.hpp>
-
#if LL_WINDOWS
# include <share.h> // For _SH_DENYWR in processMarkerFiles
#else
@@ -2788,7 +2790,7 @@ bool LLAppViewer::initConfiguration()
#endif
if (!gArgs.empty())
{
- gWindowTitle += std::string(" ") + gArgs;
+ gWindowTitle += std::string(" ") + gArgs;
}
LLStringUtil::truncate(gWindowTitle, 255);
@@ -3372,8 +3374,11 @@ LLSD LLAppViewer::getViewerInfo() const
info["VOICE_VERSION"] = LLTrans::getString("NotConnected");
}
- // TODO: Implement media plugin version query
- info["QT_WEBKIT_VERSION"] = "4.7.1 (version number hard-coded)";
+#if !LL_LINUX
+ info["LLCEFLIB_VERSION"] = LLCEFLIB_VERSION;
+#else
+ info["LLCEFLIB_VERSION"] = "Undefined";
+#endif
S32 packets_in = LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_IN);
if (packets_in > 0)
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index 73faed7ef5..d999c6f52b 100755
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -428,6 +428,23 @@ BOOL LLMediaCtrl::handleKeyHere( KEY key, MASK mask )
////////////////////////////////////////////////////////////////////////////////
//
+BOOL LLMediaCtrl::handleKeyUpHere(KEY key, MASK mask)
+{
+ BOOL result = FALSE;
+
+ if (mMediaSource)
+ {
+ result = mMediaSource->handleKeyUpHere(key, mask);
+ }
+
+ if (!result)
+ result = LLPanel::handleKeyUpHere(key, mask);
+
+ return result;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
void LLMediaCtrl::onVisibilityChange ( BOOL new_visibility )
{
LL_INFOS() << "visibility changed to " << (new_visibility?"true":"false") << LL_ENDL;
@@ -989,19 +1006,23 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
std::string uuid = self->getClickUUID();
LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << target << "\", uri is " << url << LL_ENDL;
- LLNotification::Params notify_params;
- notify_params.name = "PopupAttempt";
- notify_params.payload = LLSD().with("target", target).with("url", url).with("uuid", uuid).with("media_id", mMediaTextureID);
- notify_params.functor.function = boost::bind(&LLMediaCtrl::onPopup, this, _1, _2);
-
- if (mTrusted)
- {
- LLNotifications::instance().forceResponse(notify_params, 0);
- }
- else
- {
- LLNotifications::instance().add(notify_params);
- }
+ LLWeb::loadURL(url, target, std::string());
+
+ // CP: removing this code because we no longer support popups so this breaks the flow.
+ // replaced with a bare call to LLWeb::LoadURL(...)
+ //LLNotification::Params notify_params;
+ //notify_params.name = "PopupAttempt";
+ //notify_params.payload = LLSD().with("target", target).with("url", url).with("uuid", uuid).with("media_id", mMediaTextureID);
+ //notify_params.functor.function = boost::bind(&LLMediaCtrl::onPopup, this, _1, _2);
+
+ //if (mTrusted)
+ //{
+ // LLNotifications::instance().forceResponse(notify_params, 0);
+ //}
+ //else
+ //{
+ // LLNotifications::instance().add(notify_params);
+ //}
break;
};
diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h
index 988733b85a..cb3a864d63 100755
--- a/indra/newview/llmediactrl.h
+++ b/indra/newview/llmediactrl.h
@@ -151,6 +151,7 @@ public:
// over-rides
virtual BOOL handleKeyHere( KEY key, MASK mask);
+ virtual BOOL handleKeyUpHere(KEY key, MASK mask);
virtual void onVisibilityChange ( BOOL new_visibility );
virtual BOOL handleUnicodeCharHere(llwchar uni_char);
virtual void reshape( S32 width, S32 height, BOOL called_from_parent = TRUE);
diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp
index ada829eb4b..1ab672aafc 100755
--- a/indra/newview/llviewerkeyboard.cpp
+++ b/indra/newview/llviewerkeyboard.cpp
@@ -729,7 +729,10 @@ BOOL LLViewerKeyboard::handleKey(KEY translated_key, MASK translated_mask, BOOL
return mKeyHandledByUI[translated_key];
}
-
+BOOL LLViewerKeyboard::handleKeyUp(KEY translated_key, MASK translated_mask)
+{
+ return gViewerWindow->handleKeyUp(translated_key, translated_mask);
+}
BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name)
{
diff --git a/indra/newview/llviewerkeyboard.h b/indra/newview/llviewerkeyboard.h
index ca73212ed1..110dc89d28 100755
--- a/indra/newview/llviewerkeyboard.h
+++ b/indra/newview/llviewerkeyboard.h
@@ -89,6 +89,7 @@ public:
LLViewerKeyboard();
BOOL handleKey(KEY key, MASK mask, BOOL repeated);
+ BOOL handleKeyUp(KEY key, MASK mask);
S32 loadBindings(const std::string& filename); // returns number bound, 0 on error
S32 loadBindingsXML(const std::string& filename); // returns number bound, 0 on error
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 3eae0f8d86..1098b2a7e1 100755
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -66,6 +66,7 @@
#include "llvoavatar.h"
#include "llvoavatarself.h"
#include "llvovolume.h"
+#include "llfloaterreg.h"
#include "llwebprofile.h"
#include "llwindow.h"
#include "llvieweraudio.h"
@@ -284,13 +285,16 @@ public:
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer)
{
+ const std::string url = getURL();
+ llinfos << "@@@ URL to set cookie on" << url << llendl;
+
// We don't care about the content of the response, only the Set-Cookie header.
- LL_DEBUGS("MediaAuth") << dumpResponse()
- << " [headers:" << getResponseHeaders() << "]" << LL_ENDL;
+ llinfos << dumpResponse()
+ << " [headers:" << getResponseHeaders() << "]" << llendl;
const std::string& cookie = getResponseHeader(HTTP_IN_HEADER_SET_COOKIE);
// *TODO: What about bad status codes? Does this destroy previous cookies?
- LLViewerMedia::openIDCookieResponse(cookie);
+ LLViewerMedia::openIDCookieResponse(url, cookie);
}
};
@@ -1199,7 +1203,7 @@ void LLViewerMedia::clearAllCookies()
}
// If we have an OpenID cookie, re-add it to the cookie store.
- setOpenIDCookie();
+ setOpenIDCookie(std::string());
}
/////////////////////////////////////////////////////////////////////////////////////////
@@ -1302,7 +1306,7 @@ void LLViewerMedia::loadCookieFile()
}
// If we have an OpenID cookie, re-add it to the cookie store.
- setOpenIDCookie();
+ setOpenIDCookie(std::string());
}
@@ -1388,9 +1392,31 @@ LLSD LLViewerMedia::getHeaders()
return headers;
}
+ /////////////////////////////////////////////////////////////////////////////////////////
+ // static
+bool LLViewerMedia::parseRawCookie(const std::string raw_cookie, std::string& name, std::string& value, std::string& path)
+{
+ std::size_t name_pos = raw_cookie.find_first_of("=");
+ if (name_pos != std::string::npos)
+ {
+ name = raw_cookie.substr(0, name_pos);
+ std::size_t value_pos = raw_cookie.find_first_of(";", name_pos);
+ if (value_pos != std::string::npos)
+ {
+ value = raw_cookie.substr(name_pos + 1, value_pos - name_pos - 1);
+ path = "/"; // assume root path for now
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
/////////////////////////////////////////////////////////////////////////////////////////
// static
-void LLViewerMedia::setOpenIDCookie()
+void LLViewerMedia::setOpenIDCookie(const std::string& url)
{
if(!sOpenIDCookie.empty())
{
@@ -1419,6 +1445,26 @@ void LLViewerMedia::setOpenIDCookie()
getCookieStore()->setCookiesFromHost(sOpenIDCookie, authority.substr(host_start, host_end - host_start));
+ if (url.length())
+ {
+ LLMediaCtrl* media_instance = LLFloaterReg::getInstance("destinations")->getChild<LLMediaCtrl>("destination_guide_contents");
+ if (media_instance)
+ {
+ std::string cookie_host = authority.substr(host_start, host_end - host_start);
+ std::string cookie_name = "";
+ std::string cookie_value = "";
+ std::string cookie_path = "";
+ if (parseRawCookie(sOpenIDCookie, cookie_name, cookie_value, cookie_path))
+ {
+ media_instance->getMediaPlugin()->setCookie(url, cookie_name, cookie_value, cookie_host, cookie_path);
+ }
+ }
+ }
+
+ // NOTE: this is the original OpenID cookie code, so of which is no longer needed now that we
+ // are using CEF - it's very intertwined with other code so, for the moment, I'm going to
+ // leave it alone and make a task to come back to it once we're sure the CEF cookie code is robust.
+
// Do a web profile get so we can store the cookie
LLSD headers = LLSD::emptyMap();
headers[HTTP_OUT_HEADER_ACCEPT] = "*/*";
@@ -1473,13 +1519,13 @@ void LLViewerMedia::openIDSetup(const std::string &openid_url, const std::string
/////////////////////////////////////////////////////////////////////////////////////////
// static
-void LLViewerMedia::openIDCookieResponse(const std::string &cookie)
+void LLViewerMedia::openIDCookieResponse(const std::string& url, const std::string &cookie)
{
LL_DEBUGS("MediaAuth") << "Cookie received: \"" << cookie << "\"" << LL_ENDL;
sOpenIDCookie += cookie;
- setOpenIDCookie();
+ setOpenIDCookie(url);
}
/////////////////////////////////////////////////////////////////////////////////////////
@@ -1803,7 +1849,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
// HACK: we always try to keep a spare running webkit plugin around to improve launch times.
// If a spare was already created before PluginAttachDebuggerToPlugins was set, don't use it.
// Do not use a spare if launching with full viewer control (e.g. Facebook, Twitter and few others)
- if ((plugin_basename == "media_plugin_webkit") &&
+ if ((plugin_basename == "media_plugin_cef") &&
!gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins") && !clean_browser)
{
media_source = LLViewerMedia::getSpareBrowserMediaSource();
@@ -1872,6 +1918,9 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
bool media_plugin_debugging_enabled = gSavedSettings.getBOOL("MediaPluginDebugging");
media_source->enableMediaPluginDebugging( media_plugin_debugging_enabled || clean_browser);
+ // need to set agent string here before instance created
+ media_source->setBrowserUserAgent(LLViewerMedia::getCurrentUserAgent());
+
media_source->setTarget(target);
const std::string plugin_dir = gDirUtilp->getLLPluginDir();
@@ -2698,27 +2747,48 @@ void LLViewerMediaImpl::navigateStop()
bool LLViewerMediaImpl::handleKeyHere(KEY key, MASK mask)
{
bool result = false;
-
+
if (mMediaSource)
{
// FIXME: THIS IS SO WRONG.
// Menu keys should be handled by the menu system and not passed to UI elements, but this is how LLTextEditor and LLLineEditor do it...
- if( MASK_CONTROL & mask && key != KEY_LEFT && key != KEY_RIGHT && key != KEY_HOME && key != KEY_END)
+ if (MASK_CONTROL & mask && key != KEY_LEFT && key != KEY_RIGHT && key != KEY_HOME && key != KEY_END)
{
result = true;
}
-
- if(!result)
+
+ if (!result)
{
-
+
LLSD native_key_data = gViewerWindow->getWindow()->getNativeKeyData();
-
- result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_DOWN ,key, mask, native_key_data);
- // Since the viewer internal event dispatching doesn't give us key-up events, simulate one here.
- (void)mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_UP ,key, mask, native_key_data);
+ result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_DOWN, key, mask, native_key_data);
}
}
-
+
+ return result;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+bool LLViewerMediaImpl::handleKeyUpHere(KEY key, MASK mask)
+{
+ bool result = false;
+
+ if (mMediaSource)
+ {
+ // FIXME: THIS IS SO WRONG.
+ // Menu keys should be handled by the menu system and not passed to UI elements, but this is how LLTextEditor and LLLineEditor do it...
+ if (MASK_CONTROL & mask && key != KEY_LEFT && key != KEY_RIGHT && key != KEY_HOME && key != KEY_END)
+ {
+ result = true;
+ }
+
+ if (!result)
+ {
+ LLSD native_key_data = gViewerWindow->getWindow()->getNativeKeyData();
+ result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_UP, key, mask, native_key_data);
+ }
+ }
+
return result;
}
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 1ce42e97b8..4ee1b56a2a 100755
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -150,7 +150,7 @@ public:
static void removeCookie(const std::string &name, const std::string &domain, const std::string &path = std::string("/") );
static void openIDSetup(const std::string &openid_url, const std::string &openid_token);
- static void openIDCookieResponse(const std::string &cookie);
+ static void openIDCookieResponse(const std::string& url, const std::string &cookie);
static void proxyWindowOpened(const std::string &target, const std::string &uuid);
static void proxyWindowClosed(const std::string &uuid);
@@ -163,7 +163,8 @@ public:
static LLSD getHeaders();
private:
- static void setOpenIDCookie();
+ static bool parseRawCookie(const std::string raw_cookie, std::string& name, std::string& value, std::string& path);
+ static void setOpenIDCookie(const std::string& url);
static void onTeleportFinished();
static LLPluginCookieStore *sCookieStore;
@@ -238,6 +239,7 @@ public:
void navigateInternal();
void navigateStop();
bool handleKeyHere(KEY key, MASK mask);
+ bool handleKeyUpHere(KEY key, MASK mask);
bool handleUnicodeCharHere(llwchar uni_char);
bool canNavigateForward();
bool canNavigateBack();
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index aa019dfdd8..1265ca0a70 100755
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -352,6 +352,13 @@ BOOL LLViewerMediaFocus::handleKey(KEY key, MASK mask, BOOL called_from_parent)
return true;
}
+BOOL LLViewerMediaFocus::handleKeyUp(KEY key, MASK mask, BOOL called_from_parent)
+{
+ return true;
+}
+
+
+
BOOL LLViewerMediaFocus::handleUnicodeChar(llwchar uni_char, BOOL called_from_parent)
{
LLViewerMediaImpl* media_impl = getFocusedMediaImpl();
diff --git a/indra/newview/llviewermediafocus.h b/indra/newview/llviewermediafocus.h
index f03dd8751e..42c841df15 100755
--- a/indra/newview/llviewermediafocus.h
+++ b/indra/newview/llviewermediafocus.h
@@ -56,6 +56,7 @@ public:
/*virtual*/ bool getFocus();
/*virtual*/ BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
+ /*virtual*/ BOOL handleKeyUp(KEY key, MASK mask, BOOL called_from_parent);
/*virtual*/ BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent);
BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index ba84d7aa2c..b6212e0958 100755
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1399,10 +1399,9 @@ BOOL LLViewerWindow::handleTranslatedKeyUp(KEY key, MASK mask)
tool_inspectp->keyUp(key, mask);
}
- return FALSE;
+ return gViewerKeyboard.handleKeyUp(key, mask);
}
-
void LLViewerWindow::handleScanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level)
{
LLViewerJoystick::getInstance()->setCameraNeedsUpdate(true);
@@ -2545,6 +2544,41 @@ void LLViewerWindow::draw()
}
// Takes a single keydown event, usually when UI is visible
+BOOL LLViewerWindow::handleKeyUp(KEY key, MASK mask)
+{
+ if (gFocusMgr.getKeyboardFocus()
+ && !(mask & (MASK_CONTROL | MASK_ALT))
+ && !gFocusMgr.getKeystrokesOnly())
+ {
+ // We have keyboard focus, and it's not an accelerator
+ if (key < 0x80)
+ {
+ // Not a special key, so likely (we hope) to generate a character. Let it fall through to character handler first.
+ return (gFocusMgr.getKeyboardFocus() != NULL);
+ }
+ }
+
+ LLFocusableElement* keyboard_focus = gFocusMgr.getKeyboardFocus();
+ if (keyboard_focus)
+ {
+ if (keyboard_focus->handleKeyUp(key, mask, FALSE))
+ {
+ LL_DEBUGS() << "LLviewerWindow::handleKeyUp - in 'traverse up' - no loops seen... just called keyboard_focus->handleKeyUp an it returned true" << LL_ENDL;
+ LLViewerEventRecorder::instance().logKeyEvent(key, mask);
+ return TRUE;
+ }
+ else {
+ LL_DEBUGS() << "LLviewerWindow::handleKeyUp - in 'traverse up' - no loops seen... just called keyboard_focus->handleKeyUp an it returned FALSE" << LL_ENDL;
+ }
+ }
+
+ // don't pass keys on to world when something in ui has focus
+ return gFocusMgr.childHasKeyboardFocus(mRootView)
+ || LLMenuGL::getKeyboardMode()
+ || (gMenuBarView && gMenuBarView->getHighlightedItem() && gMenuBarView->getHighlightedItem()->isActive());
+}
+
+// Takes a single keydown event, usually when UI is visible
BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
{
// hide tooltips on keypress
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 7fde52d4e1..17e9ac2636 100755
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -314,6 +314,7 @@ public:
LLView* getHintHolder() { return mHintHolder.get(); }
LLView* getLoginPanelHolder() { return mLoginPanelHolder.get(); }
BOOL handleKey(KEY key, MASK mask);
+ BOOL handleKeyUp(KEY key, MASK mask);
void handleScrollWheel (S32 clicks);
// add and remove views from "popup" layer
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index 73ca7c529d..419ec359a6 100755
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -236,7 +236,7 @@
name="Web Content Floater Debug Test">
<menu_item_call.on_click
function="Advanced.WebContentTest"
- parameter="http://google.com"/>
+ parameter="https://callum-linden.s3.amazonaws.com/ceftests.html"/>
</menu_item_call>
<menu
create_jump_keys="true"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 3f557d0d0f..8de9a1a99a 100755
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -1438,7 +1438,7 @@
function="Floater.Show"
parameter="bumps" />
</menu_item_call>
- <menu_item_separator/>
+ <menu_item_separator/>
<menu_item_call
label="About [APP_NAME]"
name="About Second Life">
@@ -3191,7 +3191,7 @@
shortcut="control|shift|Z">
<menu_item_call.on_click
function="Advanced.WebContentTest"
- parameter="http://google.com"/>
+ parameter="https://callum-linden.s3.amazonaws.com/ceftests.html"/>
</menu_item_call>
<menu_item_call
label="FB Connect Test"
diff --git a/indra/newview/skins/default/xui/en/mime_types.xml b/indra/newview/skins/default/xui/en/mime_types.xml
index f5f2223330..7cb4a6e53b 100755
--- a/indra/newview/skins/default/xui/en/mime_types.xml
+++ b/indra/newview/skins/default/xui/en/mime_types.xml
@@ -7,7 +7,7 @@
none
</defaultwidget>
<defaultimpl>
- media_plugin_webkit
+ media_plugin_cef
</defaultimpl>
<widgetset name="web">
<label name="web_label">
@@ -141,7 +141,7 @@
none
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="none/none">
@@ -152,7 +152,7 @@
none
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="audio/*">
@@ -185,7 +185,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype menu="1" name="video/vnd.secondlife.qt.legacy">
@@ -207,7 +207,7 @@
web
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="application/ogg">
@@ -229,7 +229,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="application/postscript">
@@ -240,7 +240,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="application/rtf">
@@ -251,7 +251,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="application/smil">
@@ -262,7 +262,7 @@
movie
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="application/xhtml+xml">
@@ -273,7 +273,7 @@
web
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="application/x-director">
@@ -284,7 +284,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="audio/mid">
@@ -339,7 +339,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype menu="1" name="image/gif">
@@ -350,7 +350,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype menu="1" name="image/jpeg">
@@ -361,7 +361,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype menu="1" name="image/png">
@@ -372,7 +372,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="image/svg+xml">
@@ -383,7 +383,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype menu="1" name="image/tiff">
@@ -394,7 +394,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype menu="1" name="text/html">
@@ -405,7 +405,7 @@
web
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype menu="1" name="text/plain">
@@ -416,7 +416,7 @@
text
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="text/xml">
@@ -427,7 +427,7 @@
text
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype menu="1" name="video/mpeg">
diff --git a/indra/newview/skins/default/xui/en/mime_types_mac.xml b/indra/newview/skins/default/xui/en/mime_types_mac.xml
index 90230f12dd..f71c24b2e4 100755
--- a/indra/newview/skins/default/xui/en/mime_types_mac.xml
+++ b/indra/newview/skins/default/xui/en/mime_types_mac.xml
@@ -7,7 +7,7 @@
none
</defaultwidget>
<defaultimpl>
- media_plugin_webkit
+ media_plugin_cef
</defaultimpl>
<widgetset name="web">
<label name="web_label">
@@ -152,7 +152,7 @@
none
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="audio/*">
@@ -185,7 +185,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype menu="1" name="video/vnd.secondlife.qt.legacy">
@@ -207,7 +207,7 @@
web
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="application/ogg">
@@ -229,7 +229,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="application/postscript">
@@ -240,7 +240,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="application/rtf">
@@ -251,7 +251,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="application/smil">
@@ -262,7 +262,7 @@
movie
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="application/xhtml+xml">
@@ -273,7 +273,7 @@
web
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="application/x-director">
@@ -284,7 +284,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="audio/mid">
@@ -339,7 +339,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype menu="1" name="image/gif">
@@ -350,7 +350,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype menu="1" name="image/jpeg">
@@ -361,7 +361,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype menu="1" name="image/png">
@@ -372,7 +372,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="image/svg+xml">
@@ -383,7 +383,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype menu="1" name="image/tiff">
@@ -394,7 +394,7 @@
image
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype menu="1" name="text/html">
@@ -405,7 +405,7 @@
web
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype menu="1" name="text/plain">
@@ -416,7 +416,7 @@
text
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype name="text/xml">
@@ -427,7 +427,7 @@
text
</widgettype>
<impl>
- media_plugin_webkit
+ media_plugin_cef
</impl>
</mimetype>
<mimetype menu="1" name="video/mpeg">
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
index b201e071ef..45b2b6ec27 100755
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -224,19 +224,6 @@
radio_style="false"
width="400"
top_pad="5"/>
- <check_box
- top_delta="4"
- enabled="true"
- follows="left|top"
- height="14"
- initial_value="false"
- control_name="MediaEnablePopups"
- label="Enable media browser pop-ups"
- left_delta="0"
- mouse_opaque="true"
- name="media_popup_enabled"
- width="400"
- top_pad="5"/>
<text
type="string"
length="1"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 4eb6e2462d..f2eddbb38e 100755
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -50,7 +50,7 @@ OpenGL Version: [OPENGL_VERSION]
libcurl Version: [LIBCURL_VERSION]
J2C Decoder Version: [J2C_VERSION]
Audio Driver Version: [AUDIO_DRIVER_VERSION]
-Qt Webkit Version: [QT_WEBKIT_VERSION]
+LLCEFLib/CEF Version: [LLCEFLIB_VERSION]
Voice Server Version: [VOICE_VERSION]
</string>
<string name="AboutTraffic">Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)</string>
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index cae6bded9f..9a65171d44 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -340,9 +340,9 @@ class Windows_i686_Manifest(ViewerManifest):
self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe())
# Plugin host application
- # The current slplugin package places slplugin.exe right into the
- # packages base directory.
- self.path2basename(pkgdir, "slplugin.exe")
+ self.path2basename(os.path.join(os.pardir,
+ 'llplugin', 'slplugin', self.args['configuration']),
+ "slplugin.exe")
self.path2basename("../viewer_components/updater/scripts/windows", "update_install.bat")
# Get shared libs from the shared libs staging directory
@@ -428,54 +428,115 @@ class Windows_i686_Manifest(ViewerManifest):
self.path("featuretable_xp.txt")
# Media plugins - QuickTime
- # Media plugins - WebKit/Qt
- if self.prefix(src=os.path.join(pkgdir, "llplugin"), dst="llplugin"):
+ if self.prefix(src='../media_plugins/quicktime/%s' % self.args['configuration'], dst="llplugin"):
self.path("media_plugin_quicktime.dll")
- self.path("media_plugin_webkit.dll")
- self.path("qtcore4.dll")
- self.path("qtgui4.dll")
- self.path("qtnetwork4.dll")
- self.path("qtopengl4.dll")
- self.path("qtwebkit4.dll")
- self.path("qtxmlpatterns4.dll")
-
- # For WebKit/Qt plugin runtimes (image format plugins)
- if self.prefix(src="imageformats", dst="imageformats"):
- self.path("qgif4.dll")
- self.path("qico4.dll")
- self.path("qjpeg4.dll")
- self.path("qmng4.dll")
- self.path("qsvg4.dll")
- self.path("qtiff4.dll")
- self.end_prefix()
-
- # For WebKit/Qt plugin runtimes (codec/character encoding plugins)
- if self.prefix(src="codecs", dst="codecs"):
- self.path("qcncodecs4.dll")
- self.path("qjpcodecs4.dll")
- self.path("qkrcodecs4.dll")
- self.path("qtwcodecs4.dll")
- self.end_prefix()
+ self.end_prefix()
- self.end_prefix()
+ # Media plugins - CEF
+ if self.prefix(src='../media_plugins/cef/%s' % self.args['configuration'], dst="llplugin"):
+ self.path("media_plugin_cef.dll")
+ self.end_prefix()
# winmm.dll shim
if self.prefix(src='../media_plugins/winmmshim/%s' % self.args['configuration'], dst=""):
self.path("winmm.dll")
self.end_prefix()
+ # CEF runtime files - debug
if self.args['configuration'].lower() == 'debug':
- if self.prefix(src=debpkgdir, dst="llplugin"):
- self.path("libeay32.dll")
- self.path("ssleay32.dll")
+ if self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'debug'), dst="llplugin"):
+ self.path("d3dcompiler_43.dll")
+ self.path("d3dcompiler_47.dll")
+ self.path("libcef.dll")
+ self.path("libEGL.dll")
+ self.path("libGLESv2.dll")
+ self.path("llceflib_host.exe")
+ self.path("natives_blob.bin")
+ self.path("snapshot_blob.bin")
+ self.path("widevinecdmadapter.dll")
+ self.path("wow_helper.exe")
self.end_prefix()
-
else:
- if self.prefix(src=relpkgdir, dst="llplugin"):
- self.path("libeay32.dll")
- self.path("ssleay32.dll")
+ # CEF runtime files - not debug (release, relwithdebinfo etc.)
+ if self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'release'), dst="llplugin"):
+ self.path("d3dcompiler_43.dll")
+ self.path("d3dcompiler_47.dll")
+ self.path("libcef.dll")
+ self.path("libEGL.dll")
+ self.path("libGLESv2.dll")
+ self.path("llceflib_host.exe")
+ self.path("natives_blob.bin")
+ self.path("snapshot_blob.bin")
+ self.path("widevinecdmadapter.dll")
+ self.path("wow_helper.exe")
self.end_prefix()
+ # CEF files common to all configurations
+ if self.prefix(src=os.path.join(os.pardir, 'packages', 'resources'), dst="llplugin"):
+ self.path("cef.pak")
+ self.path("cef_100_percent.pak")
+ self.path("cef_200_percent.pak")
+ self.path("cef_extensions.pak")
+ self.path("devtools_resources.pak")
+ self.path("icudtl.dat")
+ self.end_prefix()
+
+ if self.prefix(src=os.path.join(os.pardir, 'packages', 'resources', 'locales'), dst=os.path.join('llplugin', 'locales')):
+ self.path("am.pak")
+ self.path("ar.pak")
+ self.path("bg.pak")
+ self.path("bn.pak")
+ self.path("ca.pak")
+ self.path("cs.pak")
+ self.path("da.pak")
+ self.path("de.pak")
+ self.path("el.pak")
+ self.path("en-GB.pak")
+ self.path("en-US.pak")
+ self.path("es-419.pak")
+ self.path("es.pak")
+ self.path("et.pak")
+ self.path("fa.pak")
+ self.path("fi.pak")
+ self.path("fil.pak")
+ self.path("fr.pak")
+ self.path("gu.pak")
+ self.path("he.pak")
+ self.path("hi.pak")
+ self.path("hr.pak")
+ self.path("hu.pak")
+ self.path("id.pak")
+ self.path("it.pak")
+ self.path("ja.pak")
+ self.path("kn.pak")
+ self.path("ko.pak")
+ self.path("lt.pak")
+ self.path("lv.pak")
+ self.path("ml.pak")
+ self.path("mr.pak")
+ self.path("ms.pak")
+ self.path("nb.pak")
+ self.path("nl.pak")
+ self.path("pl.pak")
+ self.path("pt-BR.pak")
+ self.path("pt-PT.pak")
+ self.path("ro.pak")
+ self.path("ru.pak")
+ self.path("sk.pak")
+ self.path("sl.pak")
+ self.path("sr.pak")
+ self.path("sv.pak")
+ self.path("sw.pak")
+ self.path("ta.pak")
+ self.path("te.pak")
+ self.path("th.pak")
+ self.path("tr.pak")
+ self.path("uk.pak")
+ self.path("vi.pak")
+ self.path("zh-CN.pak")
+ self.path("zh-TW.pak")
+ self.end_prefix()
+
# pull in the crash logger and updater from other projects
# tag:"crash-logger" here as a cue to the exporter
self.path(src='../win_crash_logger/%s/windows-crash-logger.exe' % self.args['configuration'],
@@ -739,14 +800,13 @@ class Darwin_i386_Manifest(ViewerManifest):
dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile)
# our apps
- for app_bld_dir, app in ((os.path.join(os.pardir,
- "mac_crash_logger",
- self.args['configuration']),
- "mac-crash-logger.app"),
+ for app_bld_dir, app in (("mac_crash_logger", "mac-crash-logger.app"),
# plugin launcher
- (pkgdir, "SLPlugin.app"),
+ (os.path.join("llplugin", "slplugin"), "SLPlugin.app"),
):
- self.path2basename(app_bld_dir, app)
+ self.path2basename(os.path.join(os.pardir,
+ app_bld_dir, self.args['configuration']),
+ app)
# our apps dependencies on shared libs
# for each app, for each dylib we collected in dylibs,
@@ -759,46 +819,57 @@ class Darwin_i386_Manifest(ViewerManifest):
symlinkf(src, dst)
except OSError as err:
print "Can't symlink %s -> %s: %s" % (src, dst, err)
- # SLPlugin.app/Contents/Resources gets those Qt4 libraries it needs.
- if self.prefix(src="", dst="SLPlugin.app/Contents/Resources"):
- for libfile in ('libQtCore.4.dylib',
- 'libQtCore.4.7.1.dylib',
- 'libQtGui.4.dylib',
- 'libQtGui.4.7.1.dylib',
- 'libQtNetwork.4.dylib',
- 'libQtNetwork.4.7.1.dylib',
- 'libQtOpenGL.4.dylib',
- 'libQtOpenGL.4.7.1.dylib',
- 'libQtSvg.4.dylib',
- 'libQtSvg.4.7.1.dylib',
- 'libQtWebKit.4.dylib',
- 'libQtWebKit.4.7.1.dylib',
- 'libQtXml.4.dylib',
- 'libQtXml.4.7.1.dylib'):
- self.path2basename(relpkgdir, libfile)
- self.end_prefix("SLPlugin.app/Contents/Resources")
-
- # Qt4 codecs go to llplugin. Not certain why but this is the first
- # location probed according to dtruss so we'll go with that.
- if self.prefix(src=os.path.join(pkgdir, "llplugin/codecs/"), dst="llplugin/codecs"):
- self.path("libq*.dylib")
- self.end_prefix("llplugin/codecs")
-
- # Similarly for imageformats.
- if self.prefix(src=os.path.join(pkgdir, "llplugin/imageformats/"), dst="llplugin/imageformats"):
- self.path("libq*.dylib")
- self.end_prefix("llplugin/imageformats")
-
- # SLPlugin plugins proper
- if self.prefix(src=os.path.join(pkgdir, "llplugin"), dst="llplugin"):
- self.path("media_plugin_quicktime.dylib")
- self.path("media_plugin_webkit.dylib")
+
+ # LLCefLib helper apps go inside SLPlugin.app
+ if self.prefix(src="", dst="SLPlugin.app/Contents/Frameworks"):
+ for helperappfile in ('LLCefLib Helper.app',
+ 'LLCefLib Helper EH.app'):
+ self.path2basename(relpkgdir, helperappfile)
+
+ pluginframeworkpath = self.dst_path_of('Chromium Embedded Framework.framework');
+
+ self.end_prefix()
+
+ # SLPlugin plugins
+ if self.prefix(src="", dst="llplugin"):
+ self.path2basename("../media_plugins/quicktime/" + self.args['configuration'],
+ "media_plugin_quicktime.dylib")
+ self.path2basename("../media_plugins/cef/" + self.args['configuration'],
+ "media_plugin_cef.dylib")
self.end_prefix("llplugin")
self.end_prefix("Resources")
+ # CEF framework goes inside Second Life.app/Contents/Frameworks
+ if self.prefix(src="", dst="Frameworks"):
+ frameworkfile="Chromium Embedded Framework.framework"
+ self.path2basename(relpkgdir, frameworkfile)
+ self.end_prefix("Frameworks")
+
+ # This code constructs a relative path from the
+ # target framework folder back to the location of the symlink.
+ # It needs to be relative so that the symlink still works when
+ # (as is normal) the user moves the app bunlde out of the DMG
+ # and into the /Applications folder. Note we also call 'raise'
+ # to terminate the process if we get an error since without
+ # this symlink, Second Life web media can't possibly work.
+ # Real Framework folder:
+ # Second Life.app/Contents/Frameworks/Chromium Embedded Framework.framework/
+ # Location of symlink and why it'ds relavie
+ # Second Life.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework/
+ frameworkpath = os.path.join(os.pardir, os.pardir, os.pardir, os.pardir, "Frameworks", "Chromium Embedded Framework.framework")
+ try:
+ symlinkf(frameworkpath, pluginframeworkpath)
+ except OSError as err:
+ print "Can't symlink %s -> %s: %s" % (frameworkpath, pluginframeworkpath, err)
+ raise
+
self.end_prefix("Contents")
+ # fix up media_plugin.dylib so it knows where to look for CEF files it needs
+ self.run_command('install_name_tool -change "@executable_path/Chromium Embedded Framework" "@executable_path/../Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%(config)s/Second Life.app/Contents/Resources/llplugin/media_plugin_cef.dylib"' %
+ { 'config' : self.args['configuration'] })
+
# NOTE: the -S argument to strip causes it to keep enough info for
# annotated backtraces (i.e. function names in the crash log). 'strip' with no
# arguments yields a slightly smaller binary but makes crash logs mostly useless.
@@ -808,7 +879,6 @@ class Darwin_i386_Manifest(ViewerManifest):
self.run_command('strip -S %(viewer_binary)r' %
{ 'viewer_binary' : self.dst_path_of('Contents/MacOS/Second Life')})
-
def copy_finish(self):
# Force executable permissions to be set for scripts
# see CHOP-223 and http://mercurial.selenic.com/bts/issue1802
@@ -985,7 +1055,7 @@ class LinuxManifest(ViewerManifest):
if self.prefix(src="", dst="bin"):
self.path("secondlife-bin","do-not-directly-run-secondlife-bin")
self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin")
- self.path2basename(pkgdir, "SLPlugin")
+ self.path2basename("../llplugin/slplugin", "SLPlugin")
self.path2basename("../viewer_components/updater/scripts/linux", "update_install")
self.end_prefix("bin")
@@ -1005,9 +1075,8 @@ class LinuxManifest(ViewerManifest):
self.end_prefix(icon_path)
# plugins
- if self.prefix(src=os.path.join(pkgdir, "llplugin"), dst="bin/llplugin"):
- self.path("libmedia_plugin_webkit.so")
- self.path("libmedia_plugin_gstreamer.so")
+ if self.prefix(src="", dst="bin/llplugin"):
+ self.path("../media_plugins/gstreamer010/libmedia_plugin_gstreamer010.so", "libmedia_plugin_gstreamer.so")
self.end_prefix("bin/llplugin")
# llcommon
@@ -1147,37 +1216,6 @@ class Linux_i686_Manifest(LinuxManifest):
self.path("libvivoxplatform.so")
self.end_prefix("lib")
- # plugin runtime
- if self.prefix(src=os.path.join(pkgdir, "lib"), dst="lib"):
- self.path("libQtCore.so*")
- self.path("libQtGui.so*")
- self.path("libQtNetwork.so*")
- self.path("libQtOpenGL.so*")
- self.path("libQtSvg.so*")
- self.path("libQtWebKit.so*")
- self.path("libQtXml.so*")
- self.end_prefix("lib")
-
- # For WebKit/Qt plugin runtimes (image format plugins)
- if self.prefix(src=os.path.join(pkgdir, "llplugin", "imageformats"),
- dst="bin/llplugin/imageformats"):
- self.path("libqgif.so")
- self.path("libqico.so")
- self.path("libqjpeg.so")
- self.path("libqmng.so")
- self.path("libqsvg.so")
- self.path("libqtiff.so")
- self.end_prefix("bin/llplugin/imageformats")
-
- # For WebKit/Qt plugin runtimes (codec/character encoding plugins)
- if self.prefix(src=os.path.join(pkgdir, "llplugin", "codecs"),
- dst="bin/llplugin/codecs"):
- self.path("libqcncodecs.so")
- self.path("libqjpcodecs.so")
- self.path("libqkrcodecs.so")
- self.path("libqtwcodecs.so")
- self.end_prefix("bin/llplugin/codecs")
-
self.strip_binaries()
diff --git a/indra/test_apps/llfbconnecttest/CMakeLists.txt b/indra/test_apps/llfbconnecttest/CMakeLists.txt
deleted file mode 100644
index 25aaebb783..0000000000
--- a/indra/test_apps/llfbconnecttest/CMakeLists.txt
+++ /dev/null
@@ -1,372 +0,0 @@
-# -*- cmake -*-
-project(llfbconnecttest)
-
-include(00-Common)
-include(FindOpenGL)
-include(LLCommon)
-include(LLPlugin)
-include(Linking)
-include(LLSharedLibs)
-include(PluginAPI)
-include(LLImage)
-include(LLMath)
-include(LLMessage)
-include(LLRender)
-include(LLWindow)
-include(Glut)
-include(Glui)
-
-include_directories(
- ${LLPLUGIN_INCLUDE_DIRS}
- ${LLCOMMON_INCLUDE_DIRS}
- ${LLIMAGE_INCLUDE_DIRS}
- ${LLMATH_INCLUDE_DIRS}
- ${LLMESSAGE_INCLUDE_DIRS}
- ${LLRENDER_INCLUDE_DIRS}
- ${LLWINDOW_INCLUDE_DIRS}
-)
-
-if (DARWIN)
- include(CMakeFindFrameworks)
- find_library(COREFOUNDATION_LIBRARY CoreFoundation)
-endif (DARWIN)
-
-### llfbconnecttest
-
-set(llfbconnecttest_SOURCE_FILES
- llfbconnecttest.cpp
- llfbconnecttest.h
- bookmarks.txt
- )
-
-add_executable(llfbconnecttest
- WIN32
- MACOSX_BUNDLE
- ${llfbconnecttest_SOURCE_FILES}
-)
-
-set_target_properties(llfbconnecttest
- PROPERTIES
- WIN32_EXECUTABLE
- FALSE
-)
-
-target_link_libraries(llfbconnecttest
- ${GLUT_LIBRARY}
- ${GLUI_LIBRARY}
- ${OPENGL_LIBRARIES}
- ${LLPLUGIN_LIBRARIES}
- ${LLMESSAGE_LIBRARIES}
- ${LLCOMMON_LIBRARIES}
- ${PLUGIN_API_WINDOWS_LIBRARIES}
-)
-
-if (DARWIN)
- # The testbed needs to use a couple of CoreFoundation calls now, to deal with being a bundled app.
- target_link_libraries(llfbconnecttest
- ${COREFOUNDATION_LIBRARY}
- )
-endif (DARWIN)
-
-add_dependencies(llfbconnecttest
- stage_third_party_libs
- SLPlugin
- media_plugin_webkit
- ${LLPLUGIN_LIBRARIES}
- ${LLMESSAGE_LIBRARIES}
- ${LLCOMMON_LIBRARIES}
-)
-
-# turn off weird GLUI pragma
-add_definitions(-DGLUI_NO_LIB_PRAGMA)
-
-if (DARWIN OR LINUX)
- # glui.h contains code that triggers the "overloaded-virtual" warning in gcc.
- set_source_files_properties(llfbconnecttest.cpp PROPERTIES COMPILE_FLAGS "-Wno-overloaded-virtual")
-endif (DARWIN OR LINUX)
-
-# Gather build products of the various dependencies into the build directory for the testbed.
-
-if (DARWIN)
- # path inside the app bundle where we'll need to copy plugins and other related files
- set(PLUGINS_DESTINATION_DIR
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llfbconnecttest.app/Contents/Resources
- )
-
- # create the Contents/Resources directory
- add_custom_command(
- TARGET llfbconnecttest POST_BUILD
- COMMAND ${CMAKE_COMMAND}
- ARGS
- -E
- make_directory
- ${PLUGINS_DESTINATION_DIR}
- COMMENT "Creating Resources directory in app bundle."
- )
-else (DARWIN)
- set(PLUGINS_DESTINATION_DIR
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/
- )
-endif (DARWIN)
-
-set(BUILT_SLPLUGIN $<TARGET_FILE:SLPlugin>)
-add_custom_command(TARGET llfbconnecttest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_SLPLUGIN} ${PLUGINS_DESTINATION_DIR}
- DEPENDS ${BUILT_SLPLUGIN}
-)
-
-set(BUILT_LLCOMMON $<TARGET_FILE:llcommon>)
-add_custom_command(TARGET llfbconnecttest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_LLCOMMON} ${PLUGINS_DESTINATION_DIR}
- DEPENDS ${BUILT_LLCOMMON}
-)
-
-
-set(BUILT_WEBKIT_PLUGIN $<TARGET_FILE:media_plugin_webkit>)
-add_custom_command(TARGET llfbconnecttest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_WEBKIT_PLUGIN} ${PLUGINS_DESTINATION_DIR}
- DEPENDS ${BUILT_WEBKIT_PLUGIN}
-)
-
-# copy over bookmarks file if llfbconnecttest gets built
-set(BUILT_LLFBCONNECTTEST $<TARGET_FILE:llfbconnecttest>)
-add_custom_command(TARGET llfbconnecttest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/bookmarks.txt ${CMAKE_CURRENT_BINARY_DIR}/
- DEPENDS ${BUILT_LLFBCONNECTTEST}
-)
-
-# also copy it to the same place as SLPlugin, which is what the mac wants...
-add_custom_command(TARGET llfbconnecttest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/bookmarks.txt ${PLUGINS_DESTINATION_DIR}
- DEPENDS ${BUILT_LLFBCONNECTTEST}
-)
-
-if(WINDOWS)
- #********************
- # Plugin test library deploy
- #
- # Debug config runtime files required for the FB connect test
- set(fbconnecttest_debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}")
- set(fbconnecttest_debug_files
- libeay32.dll
- libglib-2.0-0.dll
- libgmodule-2.0-0.dll
- libgobject-2.0-0.dll
- libgthread-2.0-0.dll
- qtcored4.dll
- qtguid4.dll
- qtnetworkd4.dll
- qtopengld4.dll
- qtwebkitd4.dll
- ssleay32.dll
- )
- copy_if_different(
- ${fbconnecttest_debug_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/Debug"
- out_targets
- ${fbconnecttest_debug_files}
- )
- set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets})
-
- # Debug config runtime files required for the FB connect test (Qt image format plugins)
- set(fbconecttest_debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}/imageformats")
- set(fbconecttest_debug_files
- qgifd4.dll
- qicod4.dll
- qjpegd4.dll
- qmngd4.dll
- qsvgd4.dll
- qtiffd4.dll
- )
- copy_if_different(
- ${fbconecttest_debug_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/Debug/imageformats"
- out_targets
- ${fbconecttest_debug_files}
- )
- set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets})
-
- # Debug config runtime files required for the FB connect test (Qt codec plugins)
- set(fbconnecttest_debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}/codecs")
- set(fbconnecttest_debug_files
- qcncodecsd4.dll
- qjpcodecsd4.dll
- qkrcodecsd4.dll
- qtwcodecsd4.dll
- )
- copy_if_different(
- ${fbconnecttest_debug_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/Debug/codecs"
- out_targets
- ${fbconnecttest_debug_files}
- )
- set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets})
-
- # Release & ReleaseDebInfo config runtime files required for the FB connect test
- set(fbconnecttest_release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
- set(fbconnecttest_release_files
- libeay32.dll
- libglib-2.0-0.dll
- libgmodule-2.0-0.dll
- libgobject-2.0-0.dll
- libgthread-2.0-0.dll
- qtcore4.dll
- qtgui4.dll
- qtnetwork4.dll
- qtopengl4.dll
- qtwebkit4.dll
- qtxmlpatterns4.dll
- ssleay32.dll
- )
- copy_if_different(
- ${fbconnecttest_release_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/Release"
- out_targets
- ${fbconnecttest_release_files}
- )
- set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets})
-
- copy_if_different(
- ${fbconnecttest_release_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo"
- out_targets
- ${fbconnecttest_release_files}
- )
- set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets})
-
- # Release & ReleaseDebInfo config runtime files required for the FB connect test (Qt image format plugins)
- set(fbconnecttest_release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}/imageformats")
- set(fbconnecttest_release_files
- qgif4.dll
- qico4.dll
- qjpeg4.dll
- qmng4.dll
- qsvg4.dll
- qtiff4.dll
- )
- copy_if_different(
- ${fbconnecttest_release_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/Release/imageformats"
- out_targets
- ${fbconnecttest_release_files}
- )
- set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets})
-
- copy_if_different(
- ${fbconnecttest_release_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/imageformats"
- out_targets
- ${fbconnecttest_release_files}
- )
- set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets})
-
- # Release & ReleaseDebInfo config runtime files required for the FB connect test (Qt codec plugins)
- set(fbconnecttest_release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}/codecs")
- set(fbconnecttest_release_files
- qcncodecs4.dll
- qjpcodecs4.dll
- qkrcodecs4.dll
- qtwcodecs4.dll
- )
- copy_if_different(
- ${fbconnecttest_release_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/Release/codecs"
- out_targets
- ${fbconnecttest_release_files}
- )
- set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets})
-
- copy_if_different(
- ${fbconnecttest_release_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/codecs"
- out_targets
- ${fbconnecttest_release_files}
- )
- set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets})
-
- add_custom_target(copy_fbconnecttest_libs ALL
- DEPENDS
- ${fbconnect_test_targets}
- )
-
- add_dependencies(llfbconnecttest copy_fbconnecttest_libs)
-
-endif(WINDOWS)
-
-if (DARWIN)
- set(fbconnecttest_release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
- set(fbconnecttest_release_files
- libexception_handler.dylib
- libaprutil-1.0.dylib
- libapr-1.0.dylib
- libexpat.1.5.2.dylib
- libQtCore.4.7.1.dylib
- libQtCore.4.dylib
- libQtGui.4.7.1.dylib
- libQtGui.4.dylib
- libQtNetwork.4.7.1.dylib
- libQtNetwork.4.dylib
- libQtOpenGL.4.7.1.dylib
- libQtOpenGL.4.dylib
- libQtWebKit.4.7.1.dylib
- libQtWebKit.4.dylib
- libQtSvg.4.7.1.dylib
- libQtSvg.4.dylib
- libQtXml.4.7.1.dylib
- libQtXml.4.dylib
- )
- copy_if_different(
- ${fbconnecttest_release_src_dir}
- "${PLUGINS_DESTINATION_DIR}"
- out_targets
- ${fbconnecttest_release_files}
- )
- set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets})
-
- # Release & ReleaseDebInfo config runtime files required for the FB connect test (Qt image format plugins)
- set(fbconnecttest_release_src_dir "${ARCH_PREBUILT_DIRS_PLUGINS}/imageformats")
- set(fbconnecttest_release_files
- libqgif.dylib
- libqico.dylib
- libqjpeg.dylib
- libqmng.dylib
- libqsvg.dylib
- libqtiff.dylib
- )
- copy_if_different(
- ${fbconnecttest_release_src_dir}
- "${PLUGINS_DESTINATION_DIR}/imageformats"
- out_targets
- ${fbconnecttest_release_files}
- )
- set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets})
-
- # Release & ReleaseDebInfo config runtime files required for the FB connect test (Qt codec plugins)
- set(fbconnecttest_release_src_dir "${ARCH_PREBUILT_DIRS_PLUGINS}/codecs")
- set(fbconnecttest_release_files
- libqcncodecs.dylib
- libqjpcodecs.dylib
- libqkrcodecs.dylib
- libqtwcodecs.dylib
- )
- copy_if_different(
- ${fbconnecttest_release_src_dir}
- "${PLUGINS_DESTINATION_DIR}/codecs"
- out_targets
- ${fbconnecttest_release_files}
- )
- set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets})
-
- add_custom_target(copy_fbconnecttest_libs ALL
- DEPENDS
- ${fbconnect_test_targets}
- )
-
- add_dependencies(llfbconnecttest copy_fbconnecttest_libs)
-endif (DARWIN)
-
-if (LINUX)
-
-endif (LINUX)
-
-ll_deploy_sharedlibs_command(llfbconnecttest)
diff --git a/indra/test_apps/llfbconnecttest/README.Linden b/indra/test_apps/llfbconnecttest/README.Linden
deleted file mode 100644
index 7488ce680a..0000000000
--- a/indra/test_apps/llfbconnecttest/README.Linden
+++ /dev/null
@@ -1,20 +0,0 @@
-
-1. Description
-
- Exercises SLPlugin. Specific functions and goals aren't clear
- from the source.
-
-2. Running
-
- 2.1 Mac
-
- Make certain '.' is included in PATH. E.g.:
-
- PATH=.:"$PATH" open build-darwin-i386/test_apps/llfbconnecttest/RelWithDebInfo/llfbconnecttest.app
-
- Otherwise the program won't find SLPlugin and will timeout and
- fail after 30 seconds and give you little information as to why.
-
- Running 'dtruss' on plugin test applications will give you a great
- deal of insight into why they aren't activating.
-
diff --git a/indra/test_apps/llfbconnecttest/bookmarks.txt b/indra/test_apps/llfbconnecttest/bookmarks.txt
deleted file mode 100644
index 3995627ea9..0000000000
--- a/indra/test_apps/llfbconnecttest/bookmarks.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-# format is description, url (don't put ',' chars in description :)
-# if no ',' found, whole line is used for both description and url
-Google Home Page,http://www.google.com
-Facebook Home Page,http://www.facebook.com
diff --git a/indra/test_apps/llfbconnecttest/llfbconnecttest.cpp b/indra/test_apps/llfbconnecttest/llfbconnecttest.cpp
deleted file mode 100644
index 483a15c468..0000000000
--- a/indra/test_apps/llfbconnecttest/llfbconnecttest.cpp
+++ /dev/null
@@ -1,2394 +0,0 @@
-/**
- * @file LLFBConnectTest.cpp
- * @brief Facebook Connect Test App
- *
- * $LicenseInfo:firstyear=2008&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-#include "indra_constants.h"
-
-#include "llapr.h"
-#include "llerrorcontrol.h"
-
-#include <math.h>
-#include <iomanip>
-#include <sstream>
-#include <ctime>
-
-#include "llfbconnecttest.h"
-
-#if __APPLE__
- #include <GLUT/glut.h>
- #include <CoreFoundation/CoreFoundation.h>
-#else
- #define FREEGLUT_STATIC
- #include "GL/freeglut.h"
- #define GLUI_FREEGLUT
-#endif
-
-#if LL_WINDOWS
-#pragma warning(disable: 4263)
-#pragma warning(disable: 4264)
-#endif
-#include "glui.h"
-
-
-LLFBConnectTest* gApplication = 0;
-static void gluiCallbackWrapper( int control_id );
-
-////////////////////////////////////////////////////////////////////////////////
-//
-static bool isTexture( GLuint texture )
-{
- bool result = false;
-
- // glIsTexture will sometimes return false for real textures... do this instead.
- if(texture != 0)
- result = true;
-
- return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-mediaPanel::mediaPanel()
-{
- mMediaTextureHandle = 0;
- mPickTextureHandle = 0;
- mMediaSource = NULL;
- mPickTexturePixels = NULL;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-mediaPanel::~mediaPanel()
-{
- // delete OpenGL texture handles
- if ( isTexture( mPickTextureHandle ) )
- {
- std::cerr << "remMediaPanel: deleting pick texture " << mPickTextureHandle << std::endl;
- glDeleteTextures( 1, &mPickTextureHandle );
- mPickTextureHandle = 0;
- }
-
- if ( isTexture( mMediaTextureHandle ) )
- {
- std::cerr << "remMediaPanel: deleting media texture " << mMediaTextureHandle << std::endl;
- glDeleteTextures( 1, &mMediaTextureHandle );
- mMediaTextureHandle = 0;
- }
-
- if(mPickTexturePixels)
- {
- delete mPickTexturePixels;
- }
-
- if(mMediaSource)
- {
- delete mMediaSource;
- }
-
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-LLFBConnectTest::LLFBConnectTest( int app_window, int window_width, int window_height ) :
- mVersionMajor( 2 ),
- mVersionMinor( 0 ),
- mVersionPatch( 0 ),
- mMaxPanels( 25 ),
- mViewportAspect( 0 ),
- mAppWindow( app_window ),
- mCurMouseX( 0 ),
- mCurMouseY( 0 ),
- mFuzzyMedia( true ),
- mSelectedPanel( 0 ),
- mDistanceCameraToSelectedGeometry( 0.0f ),
- //mMediaBrowserControlEnableCookies( 0 ),
- mMediaBrowserControlBackButton( 0 ),
- mMediaBrowserControlForwardButton( 0 ),
- //mMediaTimeControlVolume( 100 ),
- //mMediaTimeControlSeekSeconds( 0 ),
- //mGluiMediaTimeControlWindowFlag( true ),
- mGluiMediaBrowserControlWindowFlag( true ),
- mMediaBrowserControlBackButtonFlag( true ),
- mMediaBrowserControlForwardButtonFlag( true ),
- mHomeWebUrl( "https://cryptic-ridge-1632.herokuapp.com/" )
-{
- // debugging spam
- std::cout << std::endl << " GLUT version: " << "3.7.6" << std::endl; // no way to get real version from GLUT
- std::cout << std::endl << " GLUI version: " << GLUI_Master.get_version() << std::endl;
- std::cout << std::endl << "Media Plugin Test version: " << mVersionMajor << "." << mVersionMinor << "." << mVersionPatch << std::endl;
-
- // bookmark title
- mBookmarks.push_back( std::pair< std::string, std::string >( "--- Bookmarks ---", "" ) );
-
- // insert hardcoded URLs here as required for testing
- //mBookmarks.push_back( std::pair< std::string, std::string >( "description", "url" ) );
-
- // read bookmarks from file.
- // note: uses command in ./CmakeLists.txt which copies bookmmarks file from source directory
- // to app directory (WITHOUT build configuration dir) (this is cwd in Windows within MSVC)
- // For example, test_apps\llplugintest and not test_apps\llplugintest\Release
- // This may need to be changed for Mac/Linux builds.
- // See https://jira.lindenlab.com/browse/DEV-31350 for large list of media URLs from AGNI
- const std::string bookmarks_filename( "bookmarks.txt" );
- std::ifstream file_handle( bookmarks_filename.c_str() );
- if ( file_handle.is_open() )
- {
- std::cout << "Reading bookmarks for test" << std::endl;
- while( ! file_handle.eof() )
- {
- std::string line;
- std::getline( file_handle, line );
- if ( file_handle.eof() )
- break;
-
- if ( line.substr( 0, 1 ) != "#" )
- {
- size_t comma_pos = line.find_first_of( ',' );
- if ( comma_pos != std::string::npos )
- {
- std::string description = line.substr( 0, comma_pos );
- std::string url = line.substr( comma_pos + 1 );
- mBookmarks.push_back( std::pair< std::string, std::string >( description, url ) );
- }
- else
- {
- mBookmarks.push_back( std::pair< std::string, std::string >( line, line ) );
- };
- };
- };
- std::cout << "Read " << mBookmarks.size() << " bookmarks" << std::endl;
- }
- else
- {
- std::cout << "Unable to read bookmarks from file: " << bookmarks_filename << std::endl;
- };
-
- // initialize linden lab APR module
- ll_init_apr();
-
- // Set up llerror logging
- {
- LLError::initForApplication(".");
- LLError::setDefaultLevel(LLError::LEVEL_INFO);
- //LLError::setTagLevel("Plugin", LLError::LEVEL_DEBUG);
- }
-
- // lots of randomness in this app
- srand( ( unsigned int )time( 0 ) );
-
- // build GUI
- makeChrome();
-
- // OpenGL initialilzation
- glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
- glClearDepth( 1.0f );
- glEnable( GL_DEPTH_TEST );
- glEnable( GL_COLOR_MATERIAL );
- glColorMaterial( GL_FRONT, GL_AMBIENT_AND_DIFFUSE );
- glDepthFunc( GL_LEQUAL );
- glEnable( GL_TEXTURE_2D );
- glDisable( GL_BLEND );
- glColor3f( 1.0f, 1.0f, 1.0f );
- glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
- glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
-
- // start with a sane view
- resetView();
-
- // initial media panel
- const int num_initial_panels = 1;
- for( int i = 0; i < num_initial_panels; ++i )
- {
- //addMediaPanel( mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second );
- addMediaPanel( mHomeWebUrl );
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-LLFBConnectTest::~LLFBConnectTest()
-{
- // delete all media panels
- for( int i = 0; i < (int)mMediaPanels.size(); ++i )
- {
- remMediaPanel( mMediaPanels[ i ] );
- };
-
- // Stop the plugin read thread if it's running.
- LLPluginProcessParent::setUseReadThread(false);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::reshape( int width, int height )
-{
- // update viewport (the active window inside the chrome)
- int viewport_x, viewport_y;
- int viewport_height, viewport_width;
- GLUI_Master.get_viewport_area( &viewport_x, &viewport_y, &viewport_width, &viewport_height );
- mViewportAspect = (float)( viewport_width ) / (float)( viewport_height );
- glViewport( viewport_x, viewport_y, viewport_width, viewport_height );
-
- // save these as we'll need them later
- mWindowWidth = width;
- mWindowHeight = height;
-
- // adjust size of URL bar so it doesn't get clipped
- mUrlEdit->set_w( mWindowWidth - 360 );
-
- // GLUI requires this
- if ( glutGetWindow() != mAppWindow )
- glutSetWindow( mAppWindow );
-
- // trigger re-display
- glutPostRedisplay();
-};
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::bindTexture(GLuint texture, GLint row_length, GLint alignment)
-{
- glEnable( GL_TEXTURE_2D );
-
- glBindTexture( GL_TEXTURE_2D, texture );
- glPixelStorei( GL_UNPACK_ROW_LENGTH, row_length );
- glPixelStorei( GL_UNPACK_ALIGNMENT, alignment );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-bool LLFBConnectTest::checkGLError(const char *name)
-{
- bool result = false;
- GLenum error = glGetError();
-
- if(error != GL_NO_ERROR)
- {
- // For some reason, glGenTextures is returning GL_INVALID_VALUE...
- std::cout << name << " ERROR 0x" << std::hex << error << std::dec << std::endl;
- result = true;
- }
-
- return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-GLfloat LLFBConnectTest::distanceToCamera( GLfloat point_x, GLfloat point_y, GLfloat point_z )
-{
- GLdouble camera_pos_x = 0.0f;
- GLdouble camera_pos_y = 0.0f;
- GLdouble camera_pos_z = 0.0f;
-
- GLdouble modelMatrix[16];
- GLdouble projMatrix[16];
- GLint viewport[4];
-
- glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix);
- glGetDoublev(GL_PROJECTION_MATRIX, projMatrix);
- glGetIntegerv(GL_VIEWPORT, viewport);
-
- gluUnProject(
- (viewport[2]-viewport[0])/2 , (viewport[3]-viewport[1])/2,
- 0.0,
- modelMatrix, projMatrix, viewport,
- &camera_pos_x, &camera_pos_y, &camera_pos_z );
-
- GLfloat distance =
- sqrt( ( camera_pos_x - point_x ) * ( camera_pos_x - point_x ) +
- ( camera_pos_y - point_y ) * ( camera_pos_y - point_y ) +
- ( camera_pos_z - point_z ) * ( camera_pos_z - point_z ) );
-
- return distance;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::drawGeometry( int panel, bool selected )
-{
- // texture coordinates for each panel
- GLfloat non_opengl_texture_coords[ 8 ] = { 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f };
- GLfloat opengl_texture_coords[ 8 ] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f };
-
- GLfloat *texture_coords = mMediaPanels[ panel ]->mAppTextureCoordsOpenGL?opengl_texture_coords:non_opengl_texture_coords;
-
- // base coordinates for each panel
- GLfloat base_vertex_pos[ 8 ] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f };
-
- // calculate posiitons
- const int num_panels = (int)mMediaPanels.size();
- const int num_rows = (int)sqrt( (float)num_panels );
- const int num_cols = num_panels / num_rows;
- const int panel_x = ( panel / num_rows );
- const int panel_y = ( panel % num_rows );
-
- // default spacing is small - make it larger if checkbox set - for testing positional audio
- float spacing = 0.1f;
- //if ( mLargePanelSpacing )
- // spacing = 2.0f;
-
- const GLfloat offset_x = num_cols * ( 1.0 + spacing ) / 2;
- const GLfloat offset_y = num_rows * ( 1.0 + spacing ) / 2;
-
- // Adjust for media aspect ratios
- {
- float aspect = 1.0f;
-
- if(mMediaPanels[ panel ]->mMediaHeight != 0)
- {
- aspect = (float)mMediaPanels[ panel ]->mMediaWidth / (float)mMediaPanels[ panel ]->mMediaHeight;
- }
-
- if(aspect > 1.0f)
- {
- // media is wider than it is high -- adjust the top and bottom in
- for( int corner = 0; corner < 4; ++corner )
- {
- float temp = base_vertex_pos[corner * 2 + 1];
-
- if(temp < 0.5f)
- temp += 0.5 - (0.5f / aspect);
- else
- temp -= 0.5 - (0.5f / aspect);
-
- base_vertex_pos[corner * 2 + 1] = temp;
- }
- }
- else if(aspect < 1.0f)
- {
- // media is higher than it is wide -- adjust the left and right sides in
- for( int corner = 0; corner < 4; ++corner )
- {
- float temp = base_vertex_pos[corner * 2];
-
- if(temp < 0.5f)
- temp += 0.5f - (0.5f * aspect);
- else
- temp -= 0.5f - (0.5f * aspect);
-
- base_vertex_pos[corner * 2] = temp;
- }
- }
- }
-
- glBegin( GL_QUADS );
- for( int corner = 0; corner < 4; ++corner )
- {
- glTexCoord2f( texture_coords[ corner * 2 ], texture_coords[ corner * 2 + 1 ] );
- GLfloat x = base_vertex_pos[ corner * 2 ] + panel_x * ( 1.0 + spacing ) - offset_x + spacing / 2.0f;
- GLfloat y = base_vertex_pos[ corner * 2 + 1 ] + panel_y * ( 1.0 + spacing ) - offset_y + spacing / 2.0f;
-
- glVertex3f( x, y, 0.0f );
- };
- glEnd();
-
- // calculate distance to this panel if it's selected
- if ( selected )
- {
- GLfloat point_x = base_vertex_pos[ 0 ] + panel_x * ( 1.0 + spacing ) - offset_x + spacing / 2.0f;
- GLfloat point_y = base_vertex_pos[ 0 + 1 ] + panel_y * ( 1.0 + spacing ) - offset_y + spacing / 2.0f;
- GLfloat point_z = 0.0f;
- mDistanceCameraToSelectedGeometry = distanceToCamera( point_x, point_y, point_z );
- };
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::startPanelHighlight( float red, float green, float blue, float line_width )
-{
- glPushAttrib( GL_ALL_ATTRIB_BITS );
- glEnable( GL_POLYGON_OFFSET_FILL );
- glPolygonOffset( -2.5f, -2.5f );
- glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
- glLineWidth( line_width );
- glColor3f( red, green, blue );
- glDisable( GL_TEXTURE_2D );
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::endPanelHighlight()
-{
- glPopAttrib();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::draw( int draw_type )
-{
- for( int panel = 0; panel < (int)mMediaPanels.size(); ++panel )
- {
- // drawing pick texture
- if ( draw_type == DrawTypePickTexture )
- {
- // 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 )
- {
- glMatrixMode( GL_TEXTURE );
- glPushMatrix();
-
- // pick texture is a power of 2 so no need to scale
- glLoadIdentity();
-
- // bind to media texture
- glLoadIdentity();
- bindTexture( mMediaPanels[ panel ]->mPickTextureHandle );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
-
- // draw geometry using pick texture
- drawGeometry( panel, false );
-
- glMatrixMode( GL_TEXTURE );
- glPopMatrix();
- };
- }
- else
- if ( draw_type == DrawTypeMediaTexture )
- {
- bool texture_valid = false;
- bool plugin_exited = false;
-
- if(mMediaPanels[ panel ]->mMediaSource)
- {
- texture_valid = mMediaPanels[ panel ]->mMediaSource->textureValid();
- plugin_exited = mMediaPanels[ panel ]->mMediaSource->isPluginExited();
- }
-
- // save texture matrix (changes for each panel)
- glMatrixMode( GL_TEXTURE );
- glPushMatrix();
-
- // only process texture if the media is ready to draw
- // (we still want to draw the geometry)
- if ( mMediaPanels[ panel ]->mReadyToRender && texture_valid )
- {
- // bind to media texture
- bindTexture( mMediaPanels[ panel ]->mMediaTextureHandle );
-
- if ( mFuzzyMedia )
- {
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
- }
- else
- {
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
- }
-
- // scale to fit panel
- glScalef( mMediaPanels[ panel ]->mTextureScaleX,
- mMediaPanels[ panel ]->mTextureScaleY,
- 1.0f );
- };
-
- float intensity = plugin_exited?0.25f:1.0f;
-
- // highlight the selected panel
- if ( mSelectedPanel && ( mMediaPanels[ panel ]->mId == mSelectedPanel->mId ) )
- {
- startPanelHighlight( intensity, intensity, 0.0f, 5.0f );
- drawGeometry( panel, true );
- endPanelHighlight();
- }
- else
- // this panel not able to render yet since it
- // doesn't have enough information
- if ( !mMediaPanels[ panel ]->mReadyToRender )
- {
- startPanelHighlight( intensity, 0.0f, 0.0f, 2.0f );
- drawGeometry( panel, false );
- endPanelHighlight();
- }
- else
- // just display a border around the media
- {
- startPanelHighlight( 0.0f, intensity, 0.0f, 2.0f );
- drawGeometry( panel, false );
- endPanelHighlight();
- };
-
- if ( mMediaPanels[ panel ]->mReadyToRender && texture_valid )
- {
- // draw visual geometry
- drawGeometry( panel, false );
- }
-
- // restore texture matrix (changes for each panel)
- glMatrixMode( GL_TEXTURE );
- glPopMatrix();
- };
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::display()
-{
- // GLUI requires this
- if ( glutGetWindow() != mAppWindow )
- glutSetWindow( mAppWindow );
-
- // start with a clean slate
- glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
- glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
-
- // set up OpenGL view
- glMatrixMode( GL_PROJECTION );
- glLoadIdentity();
- glFrustum( -mViewportAspect * 0.04f, mViewportAspect * 0.04f, -0.04f, 0.04f, 0.1f, 50.0f );
- glMatrixMode( GL_MODELVIEW );
- glLoadIdentity();
- glTranslatef( 0.0, 0.0, 0.0f );
- glTranslatef( mViewPos[ 0 ], mViewPos[ 1 ], -mViewPos[ 2 ] );
- glMultMatrixf( mViewRotation );
-
- // draw pick texture
- draw( DrawTypePickTexture );
-
- // read colors and get coordinate values
- glReadPixels( mCurMouseX, mCurMouseY, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, mPixelReadColor );
-
- // clear the pick render (otherwise it may depth-fight with the textures rendered later)
- glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
-
- // draw visible geometry
- draw( DrawTypeMediaTexture );
-
- glutSwapBuffers();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::idle()
-{
-// checkGLError("LLFBConnectTest::idle");
-
- // GLUI requires this
- if ( glutGetWindow() != mAppWindow )
- glutSetWindow( mAppWindow );
-
- // random creation/destruction of panels enabled?
-/*
- const time_t panel_timeout_time = 5;
- if ( mRandomPanelCount )
- {
- // time for a change
- static time_t last_panel_time = 0;
- if ( time( NULL ) - last_panel_time > panel_timeout_time )
- {
- if ( rand() % 2 == 0 )
- {
- if ( mMediaPanels.size() < 16 )
- {
- std::cout << "Randomly adding new panel" << std::endl;
- addMediaPanel( mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second );
- };
- }
- else
- {
- if ( mMediaPanels.size() > 0 )
- {
- std::cout << "Deleting selected panel" << std::endl;
- remMediaPanel( mSelectedPanel );
- };
- };
- time( &last_panel_time );
- };
- };
-
- // random selection of bookmarks enabled?
- const time_t bookmark_timeout_time = 5;
- if ( mRandomBookmarks )
- {
- // time for a change
- static time_t last_bookmark_time = 0;
- if ( time( NULL ) - last_bookmark_time > bookmark_timeout_time )
- {
- // go to a different random bookmark on each panel
- for( int panel = 0; panel < (int)mMediaPanels.size(); ++panel )
- {
- std::string uri = mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second;
-
- std::cout << "Random: navigating to : " << uri << std::endl;
-
- std::string mime_type = mimeTypeFromUrl( uri );
-
- if ( mime_type != mMediaPanels[ panel ]->mMimeType )
- {
- replaceMediaPanel( mMediaPanels[ panel ], uri );
- }
- else
- {
- mMediaPanels[ panel ]->mMediaSource->loadURI( uri );
- mMediaPanels[ panel ]->mMediaSource->start();
- };
- };
-
- time( &last_bookmark_time );
- };
- };
-*/
- // update UI
- if ( mSelectedPanel )
- {
- // set volume based on slider if we have time media
- //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+
- // down to 15. Not a problem for plugin system - only this test
- // enable/disable time based UI controls based on type of plugin
- if ( mSelectedPanel->mMediaSource->pluginSupportsMediaTime() )
- {
- /*
- if ( ! mGluiMediaTimeControlWindowFlag )
- {
- mGluiMediaTimeControlWindow->enable();
- mGluiMediaTimeControlWindowFlag = true;
- };
- */
- }
- else
- {
- /*
- if ( mGluiMediaTimeControlWindowFlag )
- {
- mGluiMediaTimeControlWindow->disable();
- mGluiMediaTimeControlWindowFlag = false;
- };
- */
- };
-
- // enable/disable browser based UI controls based on type of plugin
- if ( mSelectedPanel->mMediaSource->pluginSupportsMediaBrowser() )
- {
- if ( ! mGluiMediaBrowserControlWindowFlag )
- {
- mGluiMediaBrowserControlWindow->enable();
- mGluiMediaBrowserControlWindowFlag = true;
- };
- }
- else
- {
- if ( mGluiMediaBrowserControlWindowFlag )
- {
- mGluiMediaBrowserControlWindow->disable();
- mGluiMediaBrowserControlWindowFlag = false;
- };
- };
-
- // enable/disable browser back button depending on browser history
- if ( mSelectedPanel->mMediaSource->getHistoryBackAvailable() )
- {
- if ( ! mMediaBrowserControlBackButtonFlag )
- {
- mMediaBrowserControlBackButton->enable();
- mMediaBrowserControlBackButtonFlag = true;
- };
- }
- else
- {
- if ( mMediaBrowserControlBackButtonFlag )
- {
- mMediaBrowserControlBackButton->disable();
- mMediaBrowserControlBackButtonFlag = false;
- };
- };
-
- // enable/disable browser forward button depending on browser history
- if ( mSelectedPanel->mMediaSource->getHistoryForwardAvailable() )
- {
- if ( ! mMediaBrowserControlForwardButtonFlag )
- {
- mMediaBrowserControlForwardButton->enable();
- mMediaBrowserControlForwardButtonFlag = true;
- };
- }
- else
- {
- if ( mMediaBrowserControlForwardButtonFlag )
- {
- mMediaBrowserControlForwardButton->disable();
- mMediaBrowserControlForwardButtonFlag = false;
- };
- };
-
- // NOTE: This is *very* slow and not worth optimising
- updateStatusBar();
- };
-
- // update all the panels
- for( int panel_index = 0; panel_index < (int)mMediaPanels.size(); ++panel_index )
- {
- mediaPanel *panel = mMediaPanels[ panel_index ];
-
- // call plugins idle function so it can potentially update itself
- panel->mMediaSource->idle();
-
- // update each media panel
- updateMediaPanel( panel );
-
- LLRect dirty_rect;
- if ( ! panel->mMediaSource->textureValid() )
- {
- //std::cout << "texture invalid, skipping update..." << std::endl;
- }
- else
- if ( panel &&
- ( panel->mMediaWidth != panel->mMediaSource->getWidth() ||
- panel->mMediaHeight != panel->mMediaSource->getHeight() ) )
- {
- //std::cout << "Resize in progress, skipping update..." << std::endl;
- }
- else
- if ( panel->mMediaSource->getDirty( &dirty_rect ) )
- {
- const unsigned char* pixels = panel->mMediaSource->getBitsData();
- if ( pixels && isTexture(panel->mMediaTextureHandle))
- {
- int x_offset = dirty_rect.mLeft;
- int y_offset = dirty_rect.mBottom;
- int width = dirty_rect.mRight - dirty_rect.mLeft;
- int height = dirty_rect.mTop - dirty_rect.mBottom;
-
- if((dirty_rect.mRight <= panel->mTextureWidth) && (dirty_rect.mTop <= panel->mTextureHeight))
- {
- // Offset the pixels pointer properly
- pixels += ( y_offset * panel->mMediaSource->getTextureDepth() * panel->mMediaSource->getBitsWidth() );
- pixels += ( x_offset * panel->mMediaSource->getTextureDepth() );
-
- // set up texture
- bindTexture( panel->mMediaTextureHandle, panel->mMediaSource->getBitsWidth() );
- if ( mFuzzyMedia )
- {
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
- }
- else
- {
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
- };
-
- checkGLError("glTexParameteri");
-
- if(panel->mMediaSource->getTextureFormatSwapBytes())
- {
- glPixelStorei(GL_UNPACK_SWAP_BYTES, 1);
- checkGLError("glPixelStorei");
- }
-
- // draw portion that changes into texture
- glTexSubImage2D( GL_TEXTURE_2D, 0,
- x_offset,
- y_offset,
- width,
- height,
- panel->mMediaSource->getTextureFormatPrimary(),
- panel->mMediaSource->getTextureFormatType(),
- pixels );
-
- if(checkGLError("glTexSubImage2D"))
- {
- std::cerr << " panel ID=" << panel->mId << std::endl;
- std::cerr << " texture size = " << panel->mTextureWidth << " x " << panel->mTextureHeight << std::endl;
- std::cerr << " media size = " << panel->mMediaWidth << " x " << panel->mMediaHeight << std::endl;
- std::cerr << " dirty rect = " << dirty_rect.mLeft << ", " << dirty_rect.mBottom << ", " << dirty_rect.mRight << ", " << dirty_rect.mTop << std::endl;
- std::cerr << " texture width = " << panel->mMediaSource->getBitsWidth() << std::endl;
- std::cerr << " format primary = 0x" << std::hex << panel->mMediaSource->getTextureFormatPrimary() << std::dec << std::endl;
- std::cerr << " format type = 0x" << std::hex << panel->mMediaSource->getTextureFormatType() << std::dec << std::endl;
- std::cerr << " pixels = " << (void*)pixels << std::endl;
- }
-
- if(panel->mMediaSource->getTextureFormatSwapBytes())
- {
- glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);
- checkGLError("glPixelStorei");
- }
-
- panel->mMediaSource->resetDirty();
-
- panel->mReadyToRender = true;
- }
- else
- {
- std::cerr << "dirty rect is outside current media size, skipping update" << std::endl;
- }
- };
- };
- };
-
- // GLUI requires this
- if ( glutGetWindow() != mAppWindow )
- glutSetWindow( mAppWindow );
-
- // trigger re-display
- glutPostRedisplay();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::windowPosToTexturePos( int window_x, int window_y,
- int& media_x, int& media_y,
- int& id )
-{
- if ( ! mSelectedPanel )
- {
- media_x = 0;
- media_y = 0;
- id = 0;
- return;
- };
-
- // record cursor poisiton for a readback next frame
- mCurMouseX = window_x;
- // OpenGL app == coordinate system this way
- // NOTE: unrelated to settings in plugin - this
- // is just for this app
- mCurMouseY = mWindowHeight - window_y;
-
- // extract x (0..1023, y (0..1023) and id (0..15) from RGB components
- unsigned long pixel_read_color_bits = ( mPixelReadColor[ 0 ] << 16 ) | ( mPixelReadColor[ 1 ] << 8 ) | mPixelReadColor[ 2 ];
- int texture_x = pixel_read_color_bits & 0x3ff;
- int texture_y = ( pixel_read_color_bits >> 10 ) & 0x3ff;
- id = ( pixel_read_color_bits >> 20 ) & 0x0f;
-
- // scale to size of media (1024 because we use 10 bits for X and Y from 24)
- media_x = (int)( ( (float)mSelectedPanel->mMediaWidth * (float)texture_x ) / 1024.0f );
- media_y = (int)( ( (float)mSelectedPanel->mMediaHeight * (float)texture_y ) / 1024.0f );
-
- // we assume the plugin uses an inverted coordinate scheme like OpenGL
- // if not, the plugin code inverts the Y coordinate for us - we don't need to
- media_y = mSelectedPanel->mMediaHeight - media_y;
-
- if ( media_x > 0 && media_y > 0 )
- {
- //std::cout << " mouse coords: " << mCurMouseX << " x " << mCurMouseY << " and id = " << id << std::endl;
- //std::cout << "raw texture coords: " << texture_x << " x " << texture_y << " and id = " << id << std::endl;
- //std::cout << " media coords: " << media_x << " x " << media_y << " and id = " << id << std::endl;
- //std::cout << std::endl;
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::selectPanelById( int id )
-{
- for( int panel = 0; panel < (int)mMediaPanels.size(); ++panel )
- {
- if ( mMediaPanels[ panel ]->mId == id )
- {
- selectPanel(mMediaPanels[ panel ]);
- return;
- };
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::selectPanel( mediaPanel* panel )
-{
- if( mSelectedPanel == panel )
- return;
-
- // turn off volume before we delete it
- if( mSelectedPanel && mSelectedPanel->mMediaSource )
- {
- mSelectedPanel->mMediaSource->setVolume( 0.0f );
- mSelectedPanel->mMediaSource->setPriority( LLPluginClassMedia::PRIORITY_LOW );
- };
-
- mSelectedPanel = panel;
-
- if( mSelectedPanel && mSelectedPanel->mMediaSource )
- {
- //mSelectedPanel->mMediaSource->setVolume( (float)mMediaTimeControlVolume / 100.0f );
- mSelectedPanel->mMediaSource->setPriority( LLPluginClassMedia::PRIORITY_NORMAL );
-
- if(!mSelectedPanel->mStartUrl.empty())
- {
- mUrlEdit->set_text(const_cast<char*>(mSelectedPanel->mStartUrl.c_str()) );
- }
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-mediaPanel* LLFBConnectTest::findMediaPanel( LLPluginClassMedia* source )
-{
- mediaPanel *result = NULL;
-
- for( int panel = 0; panel < (int)mMediaPanels.size(); ++panel )
- {
- if ( mMediaPanels[ panel ]->mMediaSource == source )
- {
- result = mMediaPanels[ panel ];
- }
- }
-
- return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-mediaPanel* LLFBConnectTest::findMediaPanel( const std::string &target_name )
-{
- mediaPanel *result = NULL;
-
- for( int panel = 0; panel < (int)mMediaPanels.size(); ++panel )
- {
- if ( mMediaPanels[ panel ]->mTarget == target_name )
- {
- result = mMediaPanels[ panel ];
- }
- }
-
- return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::navigateToNewURI( std::string uri )
-{
- if ( uri.length() )
- {
- std::string mime_type = mimeTypeFromUrl( uri );
-
- if ( !mSelectedPanel->mMediaSource->isPluginExited() && (mime_type == mSelectedPanel->mMimeType) )
- {
- std::cout << "MIME type is the same" << std::endl;
- mSelectedPanel->mMediaSource->loadURI( uri );
- mSelectedPanel->mMediaSource->start();
- mBookmarkList->do_selection( 0 );
- }
- else
- {
- std::cout << "MIME type changed or plugin had exited" << std::endl;
- replaceMediaPanel( mSelectedPanel, uri );
- mBookmarkList->do_selection( 0 );
- }
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::initUrlHistory( std::string uris )
-{
- if ( uris.length() > 0 )
- {
- std::cout << "init URL : " << uris << std::endl;
- LLSD historySD;
-
- char *cstr, *p;
- cstr = new char[uris.size()+1];
- strcpy(cstr, uris.c_str());
- const char *DELIMS = " ,;";
- p = strtok(cstr, DELIMS);
- while (p != NULL) {
- historySD.insert(0, p);
- p = strtok(NULL, DELIMS);
- }
- mSelectedPanel->mMediaSource->initializeUrlHistory(historySD);
- delete[] cstr;
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::gluiCallback( int control_id )
-{
- if ( control_id == mIdBookmarks )
- {
- std::string uri = mBookmarks[ mSelBookmark ].second;
-
- navigateToNewURI( uri );
- }
- else
- if ( control_id == mIdUrlEdit)
- {
- std::string uri = mUrlEdit->get_text();
-
- navigateToNewURI( uri );
- }
-/*
- else
- if ( control_id == mIdUrlInitHistoryEdit )
- {
- std::string uri = mUrlInitHistoryEdit->get_text();
-
- initUrlHistory( uri );
- }
- else
- if ( control_id == mIdControlAddPanel )
- {
- addMediaPanel( mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second );
- }
- else
- if ( control_id == mIdControlRemPanel )
- {
- remMediaPanel( mSelectedPanel );
- }
- else
- if ( control_id == mIdDisableTimeout )
- {
- // Set the "disable timeout" flag for all active plugins.
- for( int i = 0; i < (int)mMediaPanels.size(); ++i )
- {
- mMediaPanels[ i ]->mMediaSource->setDisableTimeout(mDisableTimeout);
- }
- }
- else
- if ( control_id == mIdUsePluginReadThread )
- {
- LLPluginProcessParent::setUseReadThread(mUsePluginReadThread);
- }
- else
- if ( control_id == mIdControlCrashPlugin )
- {
- // send message to plugin and ask it to crash
- // (switch out for ReleaseCandidate version :) )
- if(mSelectedPanel && mSelectedPanel->mMediaSource)
- {
- mSelectedPanel->mMediaSource->crashPlugin();
- }
- }
- else
- if ( control_id == mIdControlHangPlugin )
- {
- // send message to plugin and ask it to hang
- // (switch out for ReleaseCandidate version :) )
- if(mSelectedPanel && mSelectedPanel->mMediaSource)
- {
- mSelectedPanel->mMediaSource->hangPlugin();
- }
- }
- else
-*/
- if ( control_id == mIdControlExitApp )
- {
- // text for exiting plugin system cleanly
- delete this; // clean up
- exit( 0 );
- }
-/*
- else
- if ( control_id == mIdMediaTimeControlPlay )
- {
- if ( mSelectedPanel )
- {
- mSelectedPanel->mMediaSource->setLoop( false );
- mSelectedPanel->mMediaSource->start();
- };
- }
- else
- if ( control_id == mIdMediaTimeControlLoop )
- {
- if ( mSelectedPanel )
- {
- mSelectedPanel->mMediaSource->setLoop( true );
- mSelectedPanel->mMediaSource->start();
- };
- }
- else
- if ( control_id == mIdMediaTimeControlPause )
- {
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->pause();
- }
- else
- if ( control_id == mIdMediaTimeControlStop )
- {
- if ( mSelectedPanel )
- {
- mSelectedPanel->mMediaSource->stop();
- };
- }
- else
- if ( control_id == mIdMediaTimeControlSeek )
- {
- if ( mSelectedPanel )
- {
- // get value from spinner
- float seconds_to_seek = mMediaTimeControlSeekSeconds;
- mSelectedPanel->mMediaSource->seek( seconds_to_seek );
- mSelectedPanel->mMediaSource->start();
- };
- }
- else
- if ( control_id == mIdMediaTimeControlRewind )
- {
- if ( mSelectedPanel )
- {
- mSelectedPanel->mMediaSource->setLoop( false );
- mSelectedPanel->mMediaSource->start(-2.0f);
- };
- }
- else
- if ( control_id == mIdMediaTimeControlFastForward )
- {
- if ( mSelectedPanel )
- {
- mSelectedPanel->mMediaSource->setLoop( false );
- mSelectedPanel->mMediaSource->start(2.0f);
- };
- }
- else
-*/
- if ( control_id == mIdMediaBrowserControlBack )
- {
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->browse_back();
- }
- else
- if ( control_id == mIdMediaBrowserControlStop )
- {
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->browse_stop();
- }
- else
- if ( control_id == mIdMediaBrowserControlForward )
- {
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->browse_forward();
- }
- else
- if ( control_id == mIdMediaBrowserControlHome )
- {
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->loadURI( mHomeWebUrl );
- }
- else
- if ( control_id == mIdMediaBrowserControlReload )
- {
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->browse_reload( true );
- }
-/*
- else
- if ( control_id == mIdMediaBrowserControlClearCache )
- {
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->clear_cache();
- }
- else
- if ( control_id == mIdMediaBrowserControlClearCookies )
- {
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->clear_cookies();
- }
- else
- if ( control_id == mIdMediaBrowserControlEnableCookies )
- {
- if ( mSelectedPanel )
- {
- if ( mMediaBrowserControlEnableCookies )
- {
- mSelectedPanel->mMediaSource->enable_cookies( true );
- }
- else
- {
- mSelectedPanel->mMediaSource->enable_cookies( false );
- }
- };
- };
-*/
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::keyboard( int key )
-{
- //if ( key == 'a' || key == 'A' )
- // addMediaPanel( mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second );
- //else
- //if ( key == 'r' || key == 'R' )
- // remMediaPanel( mSelectedPanel );
- //else
- //if ( key == 'd' || key == 'D' )
- // dumpPanelInfo();
- //else
- if ( key == 27 )
- {
- std::cout << "Application finished - exiting..." << std::endl;
- delete this;
- exit( 0 );
- };
-
- mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_DOWN, key, 0 , LLSD());
- mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_UP, key, 0, LLSD());
-};
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::mouseButton( int button, int state, int x, int y )
-{
- if ( button == GLUT_LEFT_BUTTON )
- {
- if ( state == GLUT_DOWN )
- {
- int media_x, media_y, id;
- windowPosToTexturePos( x, y, media_x, media_y, id );
-
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_DOWN, 0, media_x, media_y, 0 );
- }
- else
- if ( state == GLUT_UP )
- {
- int media_x, media_y, id;
- windowPosToTexturePos( x, y, media_x, media_y, id );
-
- // only select a panel if we're on a panel
- // (HACK: strictly speaking this rules out clicking on
- // the origin of a panel but that's very unlikely)
- if ( media_x > 0 && media_y > 0 )
- {
- selectPanelById( id );
-
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_UP, 0, media_x, media_y, 0 );
- };
- };
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::mousePassive( int x, int y )
-{
- int media_x, media_y, id;
- windowPosToTexturePos( x, y, media_x, media_y, id );
-
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_MOVE, 0, media_x, media_y, 0 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::mouseMove( int x, int y )
-{
- int media_x, media_y, id;
- windowPosToTexturePos( x, y, media_x, media_y, id );
-
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_MOVE, 0, media_x, media_y, 0 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::makeChrome()
-{
- // IDs used by GLUI
- int start_id = 0x1000;
-
- // right side window - geometry manipulators
-#if __APPLE__
- // the Apple GLUT implementation doesn't seem to set the graphic offset of subwindows correctly when they overlap in certain ways.
- // Use a separate controls window in this case.
- // GLUI window at right containing manipulation controls and other buttons
- int x = glutGet(GLUT_WINDOW_X) + glutGet(GLUT_WINDOW_WIDTH) + 4;
- int y = glutGet(GLUT_WINDOW_Y);
- GLUI* right_glui_window = GLUI_Master.create_glui( "", 0, x, y );
-#else
- GLUI* right_glui_window = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_RIGHT );
-#endif
- mViewRotationCtrl = right_glui_window->add_rotation( "Rotation", mViewRotation );
- mViewTranslationCtrl = right_glui_window->add_translation( "Translate", GLUI_TRANSLATION_XY, mViewPos );
- mViewTranslationCtrl->set_speed( 0.01f );
- mViewScaleCtrl = right_glui_window->add_translation( "Scale", GLUI_TRANSLATION_Z, &mViewPos[ 2 ] );
- mViewScaleCtrl->set_speed( 0.05f );
- right_glui_window->set_main_gfx_window( mAppWindow );
-
- // right side window - app controls
- /*
- mIdControlAddPanel = start_id++;
- right_glui_window->add_statictext( "" );
- right_glui_window->add_separator();
- right_glui_window->add_statictext( "" );
- right_glui_window->add_button( "Add panel", mIdControlAddPanel, gluiCallbackWrapper );
- right_glui_window->add_statictext( "" );
- mIdControlRemPanel = start_id++;
- right_glui_window->add_button( "Rem panel", mIdControlRemPanel, gluiCallbackWrapper );
- right_glui_window->add_statictext( "" );
- right_glui_window->add_separator();
- right_glui_window->add_statictext( "" );
- mIdControlCrashPlugin = start_id++;
- right_glui_window->add_button( "Crash plugin", mIdControlCrashPlugin, gluiCallbackWrapper );
- mIdControlHangPlugin = start_id++;
- right_glui_window->add_button( "Hang plugin", mIdControlHangPlugin, gluiCallbackWrapper );
- */
- right_glui_window->add_statictext( "" );
- right_glui_window->add_separator();
- right_glui_window->add_statictext( "" );
- mIdControlExitApp = start_id++;
- right_glui_window->add_button( "Exit app", mIdControlExitApp, gluiCallbackWrapper );
-
- //// top window - holds bookmark UI
- mIdBookmarks = start_id++;
- mSelBookmark = 0;
- GLUI* glui_window_top = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_TOP );
- mBookmarkList = glui_window_top->add_listbox( "", &mSelBookmark, mIdBookmarks, gluiCallbackWrapper );
- // only add the first 50 bookmarks - list can be very long sometimes (30,000+)
- // when testing list of media URLs from AGNI for example
- for( unsigned int each = 0; each < mBookmarks.size() && each < 50; ++each )
- mBookmarkList->add_item( each, const_cast< char* >( mBookmarks[ each ].first.c_str() ) );
- glui_window_top->set_main_gfx_window( mAppWindow );
-
- glui_window_top->add_column( false );
- mIdUrlEdit = start_id++;
- mUrlEdit = glui_window_top->add_edittext( "Url:", GLUI_EDITTEXT_TEXT, 0, mIdUrlEdit, gluiCallbackWrapper );
- mUrlEdit->set_w( 600 );
- //GLUI* glui_window_top2 = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_TOP );
- //mIdUrlInitHistoryEdit = start_id++;
- //mUrlInitHistoryEdit = glui_window_top2->add_edittext( "Init History (separate by commas or semicolons):",
- // GLUI_EDITTEXT_TEXT, 0, mIdUrlInitHistoryEdit, gluiCallbackWrapper );
- //mUrlInitHistoryEdit->set_w( 800 );
-
- // top window - media controls for "time" media types (e.g. movies)
-/*
- mGluiMediaTimeControlWindow = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_TOP );
- mGluiMediaTimeControlWindow->set_main_gfx_window( mAppWindow );
- mIdMediaTimeControlPlay = start_id++;
- mGluiMediaTimeControlWindow->add_button( "PLAY", mIdMediaTimeControlPlay, gluiCallbackWrapper );
- mGluiMediaTimeControlWindow->add_column( false );
- mIdMediaTimeControlLoop = start_id++;
- mGluiMediaTimeControlWindow->add_button( "LOOP", mIdMediaTimeControlLoop, gluiCallbackWrapper );
- mGluiMediaTimeControlWindow->add_column( false );
- mIdMediaTimeControlPause = start_id++;
- mGluiMediaTimeControlWindow->add_button( "PAUSE", mIdMediaTimeControlPause, gluiCallbackWrapper );
- mGluiMediaTimeControlWindow->add_column( false );
-
- GLUI_Button *button;
- mIdMediaTimeControlRewind = start_id++;
- button = mGluiMediaTimeControlWindow->add_button( "<<", mIdMediaTimeControlRewind, gluiCallbackWrapper );
- button->set_w(30);
- mGluiMediaTimeControlWindow->add_column( false );
- mIdMediaTimeControlFastForward = start_id++;
- button = mGluiMediaTimeControlWindow->add_button( ">>", mIdMediaTimeControlFastForward, gluiCallbackWrapper );
- button->set_w(30);
-
- mGluiMediaTimeControlWindow->add_column( true );
-
- mIdMediaTimeControlStop = start_id++;
- mGluiMediaTimeControlWindow->add_button( "STOP", mIdMediaTimeControlStop, gluiCallbackWrapper );
- mGluiMediaTimeControlWindow->add_column( false );
- mIdMediaTimeControlVolume = start_id++;
- GLUI_Spinner* spinner = mGluiMediaTimeControlWindow->add_spinner( "Volume", 2, &mMediaTimeControlVolume, mIdMediaTimeControlVolume, gluiCallbackWrapper);
- spinner->set_float_limits( 0, 100 );
- mGluiMediaTimeControlWindow->add_column( true );
- mIdMediaTimeControlSeekSeconds = start_id++;
- spinner = mGluiMediaTimeControlWindow->add_spinner( "", 2, &mMediaTimeControlSeekSeconds, mIdMediaTimeControlSeekSeconds, gluiCallbackWrapper);
- spinner->set_float_limits( 0, 200 );
- spinner->set_w( 32 );
- spinner->set_speed( 0.025f );
- mGluiMediaTimeControlWindow->add_column( false );
- mIdMediaTimeControlSeek = start_id++;
- mGluiMediaTimeControlWindow->add_button( "SEEK", mIdMediaTimeControlSeek, gluiCallbackWrapper );
- mGluiMediaTimeControlWindow->add_column( false );
-*/
-
- // top window - media controls for "browser" media types (e.g. web browser)
- mGluiMediaBrowserControlWindow = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_TOP );
- mGluiMediaBrowserControlWindow->set_main_gfx_window( mAppWindow );
- mIdMediaBrowserControlBack = start_id++;
- mMediaBrowserControlBackButton = mGluiMediaBrowserControlWindow->add_button( "BACK", mIdMediaBrowserControlBack, gluiCallbackWrapper );
- mGluiMediaBrowserControlWindow->add_column( false );
- mIdMediaBrowserControlStop = start_id++;
- mGluiMediaBrowserControlWindow->add_button( "STOP", mIdMediaBrowserControlStop, gluiCallbackWrapper );
- mGluiMediaBrowserControlWindow->add_column( false );
- mIdMediaBrowserControlForward = start_id++;
- mMediaBrowserControlForwardButton = mGluiMediaBrowserControlWindow->add_button( "FORWARD", mIdMediaBrowserControlForward, gluiCallbackWrapper );
- mGluiMediaBrowserControlWindow->add_column( false );
- mIdMediaBrowserControlHome = start_id++;
- mGluiMediaBrowserControlWindow->add_button( "HOME", mIdMediaBrowserControlHome, gluiCallbackWrapper );
- mGluiMediaBrowserControlWindow->add_column( false );
- mIdMediaBrowserControlReload = start_id++;
- mGluiMediaBrowserControlWindow->add_button( "RELOAD", mIdMediaBrowserControlReload, gluiCallbackWrapper );
- mGluiMediaBrowserControlWindow->add_column( false );
- /*
- mIdMediaBrowserControlClearCache = start_id++;
- mGluiMediaBrowserControlWindow->add_button( "CLEAR CACHE", mIdMediaBrowserControlClearCache, gluiCallbackWrapper );
- mGluiMediaBrowserControlWindow->add_column( false );
- mIdMediaBrowserControlClearCookies = start_id++;
- mGluiMediaBrowserControlWindow->add_button( "CLEAR COOKIES", mIdMediaBrowserControlClearCookies, gluiCallbackWrapper );
- mGluiMediaBrowserControlWindow->add_column( false );
- mIdMediaBrowserControlEnableCookies = start_id++;
- mMediaBrowserControlEnableCookies = 0;
- mGluiMediaBrowserControlWindow->add_checkbox( "Enable Cookies", &mMediaBrowserControlEnableCookies, mIdMediaBrowserControlEnableCookies, gluiCallbackWrapper );
-
- // top window - misc controls
- GLUI* glui_window_misc_control = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_TOP );
- mIdRandomPanelCount = start_id++;
- mRandomPanelCount = 0;
- glui_window_misc_control->add_checkbox( "Randomize panel count", &mRandomPanelCount, mIdRandomPanelCount, gluiCallbackWrapper );
- glui_window_misc_control->set_main_gfx_window( mAppWindow );
- glui_window_misc_control->add_column( true );
- mIdRandomBookmarks = start_id++;
- mRandomBookmarks = 0;
- glui_window_misc_control->add_checkbox( "Randomize bookmarks", &mRandomBookmarks, mIdRandomBookmarks, gluiCallbackWrapper );
- glui_window_misc_control->set_main_gfx_window( mAppWindow );
- glui_window_misc_control->add_column( true );
-
- mIdDisableTimeout = start_id++;
- mDisableTimeout = 0;
- glui_window_misc_control->add_checkbox( "Disable plugin timeout", &mDisableTimeout, mIdDisableTimeout, gluiCallbackWrapper );
- glui_window_misc_control->set_main_gfx_window( mAppWindow );
- glui_window_misc_control->add_column( true );
-
- mIdUsePluginReadThread = start_id++;
- mUsePluginReadThread = 0;
- glui_window_misc_control->add_checkbox( "Use plugin read thread", &mUsePluginReadThread, mIdUsePluginReadThread, gluiCallbackWrapper );
- glui_window_misc_control->set_main_gfx_window( mAppWindow );
- glui_window_misc_control->add_column( true );
-
- mIdLargePanelSpacing = start_id++;
- mLargePanelSpacing = 0;
- glui_window_misc_control->add_checkbox( "Large Panel Spacing", &mLargePanelSpacing, mIdLargePanelSpacing, gluiCallbackWrapper );
- glui_window_misc_control->set_main_gfx_window( mAppWindow );
- glui_window_misc_control->add_column( true );
-*/
- // bottom window - status
- mBottomGLUIWindow = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_BOTTOM );
- mStatusText = mBottomGLUIWindow->add_statictext( "" );
- mBottomGLUIWindow->set_main_gfx_window( mAppWindow );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::resetView()
-{
- mViewRotationCtrl->reset();
-
- mViewScaleCtrl->set_x( 0.0f );
- mViewScaleCtrl->set_y( 0.0f );
- mViewScaleCtrl->set_z( 1.3f );
-
- mViewTranslationCtrl->set_x( 0.0f );
- mViewTranslationCtrl->set_y( 0.0f );
- mViewTranslationCtrl->set_z( 0.0f );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::makePickTexture( int id, GLuint* texture_handle, unsigned char** texture_pixels )
-{
- int pick_texture_width = 1024;
- int pick_texture_height = 1024;
- int pick_texture_depth = 3;
- unsigned char* ptr = new unsigned char[ pick_texture_width * pick_texture_height * pick_texture_depth ];
- for( int y = 0; y < pick_texture_height; ++y )
- {
- for( int x = 0; x < pick_texture_width * pick_texture_depth ; x += pick_texture_depth )
- {
- unsigned long bits = 0L;
- bits |= ( id << 20 ) | ( y << 10 ) | ( x / 3 );
- unsigned char r_component = ( bits >> 16 ) & 0xff;
- unsigned char g_component = ( bits >> 8 ) & 0xff;
- unsigned char b_component = bits & 0xff;
-
- ptr[ y * pick_texture_width * pick_texture_depth + x + 0 ] = r_component;
- ptr[ y * pick_texture_width * pick_texture_depth + x + 1 ] = g_component;
- ptr[ y * pick_texture_width * pick_texture_depth + x + 2 ] = b_component;
- };
- };
-
- glGenTextures( 1, texture_handle );
-
- checkGLError("glGenTextures");
- std::cout << "glGenTextures returned " << *texture_handle << std::endl;
-
- bindTexture( *texture_handle );
- glTexImage2D( GL_TEXTURE_2D, 0,
- GL_RGB,
- pick_texture_width, pick_texture_height,
- 0, GL_RGB, GL_UNSIGNED_BYTE, ptr );
-
- *texture_pixels = ptr;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-std::string LLFBConnectTest::mimeTypeFromUrl( std::string& url )
-{
- // default to web
- std::string mime_type = "text/html";
-
- // we may need a more advanced MIME type accessor later :-)
- if ( url.find( ".mov" ) != std::string::npos ) // Movies
- mime_type = "video/quicktime";
- else
- if ( url.find( ".txt" ) != std::string::npos ) // Apple Text descriptors
- mime_type = "video/quicktime";
- else
- if ( url.find( ".mp3" ) != 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;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-std::string LLFBConnectTest::pluginNameFromMimeType( std::string& mime_type )
-{
-#if LL_DARWIN
- std::string plugin_name( "media_plugin_null.dylib" );
- if ( mime_type == "video/quicktime" )
- plugin_name = "media_plugin_quicktime.dylib";
- else
- if ( mime_type == "text/html" )
- plugin_name = "media_plugin_webkit.dylib";
-
-#elif LL_WINDOWS
- std::string plugin_name( "media_plugin_null.dll" );
-
- if ( mime_type == "video/quicktime" )
- plugin_name = "media_plugin_quicktime.dll";
- 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" );
-
- if ( mime_type == "video/quicktime" )
- plugin_name = "libmedia_plugin_quicktime.so";
- else
- if ( mime_type == "text/html" )
- plugin_name = "libmedia_plugin_webkit.so";
-#endif
- return plugin_name;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-mediaPanel* LLFBConnectTest::addMediaPanel( std::string url )
-{
- // Get the plugin filename using the URL
- std::string mime_type = mimeTypeFromUrl( url );
- std::string plugin_name = pluginNameFromMimeType( mime_type );
-
- // create a random size for the new media
- int media_width;
- int media_height;
- getRandomMediaSize( media_width, media_height, mime_type );
- media_width = 1024;
- media_height = 1536;
-
- // make a new plugin
- LLPluginClassMedia* media_source = new LLPluginClassMedia(this);
-
- // enable cookies so the FB login works
- media_source->enable_cookies(true);
-
- // tell the plugin what size we asked for
- media_source->setSize( media_width, media_height );
-
- // Use the launcher start and initialize the plugin
-#if LL_DARWIN || LL_LINUX
- std::string launcher_name( "SLPlugin" );
-#elif LL_WINDOWS
- std::string launcher_name( "SLPlugin.exe" );
-#endif
-
- // for this test app, use the cwd as the user data path (ugh).
-#if LL_WINDOWS
- std::string user_data_path = ".\\";
-#else
- char cwd[ FILENAME_MAX ];
- if (NULL == getcwd( cwd, FILENAME_MAX - 1 ))
- {
- std::cerr << "Couldn't get cwd - probably too long - failing to init." << std::endl;
- return NULL;
- }
- std::string user_data_path = std::string( cwd ) + "/";
-#endif
- media_source->setUserDataPath(user_data_path);
- media_source->init( launcher_name, user_data_path, plugin_name, false );
- //media_source->setDisableTimeout(mDisableTimeout);
-
- // make a new panel and save parameters
- mediaPanel* panel = new mediaPanel;
- panel->mMediaSource = media_source;
- panel->mStartUrl = url;
- panel->mMimeType = mime_type;
- panel->mMediaWidth = media_width;
- panel->mMediaHeight = media_height;
- panel->mTextureWidth = 0;
- panel->mTextureHeight = 0;
- panel->mTextureScaleX = 0;
- panel->mTextureScaleY = 0;
- panel->mMediaTextureHandle = 0;
- panel->mPickTextureHandle = 0;
- panel->mAppTextureCoordsOpenGL = false; // really need an 'undefined' state here too
- panel->mReadyToRender = false;
-
- // look through current media panels to find an unused index number
- bool id_exists = true;
- for( int nid = 0; nid < mMaxPanels; ++nid )
- {
- // does this id exist already?
- id_exists = false;
- for( int pid = 0; pid < (int)mMediaPanels.size(); ++pid )
- {
- if ( nid == mMediaPanels[ pid ]->mId )
- {
- id_exists = true;
- break;
- };
- };
-
- // id wasn't found so we can use it
- if ( ! id_exists )
- {
- panel->mId = nid;
- break;
- };
- };
-
- // if we get here and this flag is set, there is no room for any more panels
- if ( id_exists )
- {
- std::cout << "No room for any more panels" << std::endl;
- }
- else
- {
- // now we have the ID we can use it to make the
- // pick texture (id is baked into texture pixels)
- makePickTexture( panel->mId, &panel->mPickTextureHandle, &panel->mPickTexturePixels );
-
- // save this in the list of panels
- mMediaPanels.push_back( panel );
-
- // select the panel that was just created
- selectPanel( panel );
-
- // load and start the URL
- panel->mMediaSource->loadURI( url );
- panel->mMediaSource->start();
-
- std::cout << "Adding new media panel for " << url << "(" << media_width << "x" << media_height << ") with index " << panel->mId << " - total panels = " << mMediaPanels.size() << std::endl;
- }
-
- return panel;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::updateMediaPanel( mediaPanel* panel )
-{
-// checkGLError("LLFBConnectTest::updateMediaPanel");
-
- if ( ! panel )
- return;
-
- if(!panel->mMediaSource || !panel->mMediaSource->textureValid())
- {
- panel->mReadyToRender = false;
- return;
- }
-
- // take a reference copy of the plugin values since they
- // might change during this lifetime of this function
- int plugin_media_width = panel->mMediaSource->getWidth();
- int plugin_media_height = panel->mMediaSource->getHeight();
- int plugin_texture_width = panel->mMediaSource->getBitsWidth();
- int plugin_texture_height = panel->mMediaSource->getBitsHeight();
-
- // If the texture isn't created or the media or texture dimensions changed AND
- // the sizes are valid then we need to delete the old media texture (if necessary)
- // then make a new one.
- if ((panel->mMediaTextureHandle == 0 ||
- panel->mMediaWidth != plugin_media_width ||
- panel->mMediaHeight != plugin_media_height ||
- panel->mTextureWidth != plugin_texture_width ||
- panel->mTextureHeight != plugin_texture_height) &&
- ( plugin_media_width > 0 && plugin_media_height > 0 &&
- plugin_texture_width > 0 && plugin_texture_height > 0 ) )
- {
- std::cout << "Valid media size (" << plugin_media_width << " x " << plugin_media_height
- << ") and texture size (" << plugin_texture_width << " x " << plugin_texture_height
- << ") for panel with ID=" << panel->mId << " - making texture" << std::endl;
-
- // delete old GL texture
- if ( isTexture( panel->mMediaTextureHandle ) )
- {
- std::cerr << "updateMediaPanel: deleting texture " << panel->mMediaTextureHandle << std::endl;
- glDeleteTextures( 1, &panel->mMediaTextureHandle );
- panel->mMediaTextureHandle = 0;
- }
-
- std::cerr << "before: pick texture is " << panel->mPickTextureHandle << ", media texture is " << panel->mMediaTextureHandle << std::endl;
-
- // make a GL texture based on the dimensions the plugin told us
- GLuint new_texture = 0;
- glGenTextures( 1, &new_texture );
-
- checkGLError("glGenTextures");
-
- std::cout << "glGenTextures returned " << new_texture << std::endl;
-
- panel->mMediaTextureHandle = new_texture;
-
- bindTexture( panel->mMediaTextureHandle );
-
- std::cout << "Setting texture size to " << plugin_texture_width << " x " << plugin_texture_height << std::endl;
- glTexImage2D( GL_TEXTURE_2D, 0,
- GL_RGB,
- plugin_texture_width, plugin_texture_height,
- 0, GL_RGB, GL_UNSIGNED_BYTE,
- 0 );
-
-
- std::cerr << "after: pick texture is " << panel->mPickTextureHandle << ", media texture is " << panel->mMediaTextureHandle << std::endl;
- };
-
- // update our record of the media and texture dimensions
- // NOTE: do this after we we check for sizes changes
- panel->mMediaWidth = plugin_media_width;
- panel->mMediaHeight = plugin_media_height;
- panel->mTextureWidth = plugin_texture_width;
- panel->mTextureHeight = plugin_texture_height;
- if ( plugin_texture_width > 0 )
- {
- panel->mTextureScaleX = (double)panel->mMediaWidth / (double)panel->mTextureWidth;
- };
- if ( plugin_texture_height > 0 )
- {
- panel->mTextureScaleY = (double)panel->mMediaHeight / (double)panel->mTextureHeight;
- };
-
- // update the flag which tells us if the media source uses OprnGL coords or not.
- panel->mAppTextureCoordsOpenGL = panel->mMediaSource->getTextureCoordsOpenGL();
-
- // Check to see if we have enough to render this panel.
- // If we do, set a flag that the display functions use so
- // they only render a panel with media if it's ready.
- if ( panel->mMediaWidth < 0 ||
- panel->mMediaHeight < 0 ||
- panel->mTextureWidth < 1 ||
- panel->mTextureHeight < 1 ||
- panel->mMediaTextureHandle == 0 )
- {
- panel->mReadyToRender = false;
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-mediaPanel* LLFBConnectTest::replaceMediaPanel( mediaPanel* panel, std::string url )
-{
- // no media panels so we can't change anything - have to add
- if ( mMediaPanels.size() == 0 )
- return NULL;
-
- // sanity check
- if ( ! panel )
- return NULL;
-
- int index;
- for(index = 0; index < (int)mMediaPanels.size(); index++)
- {
- if(mMediaPanels[index] == panel)
- break;
- }
-
- if(index >= (int)mMediaPanels.size())
- {
- // panel isn't in mMediaPanels
- return NULL;
- }
-
- std::cout << "Replacing media panel with index " << panel->mId << std::endl;
-
- int panel_id = panel->mId;
-
- if(mSelectedPanel == panel)
- mSelectedPanel = NULL;
-
- delete panel;
-
- // Get the plugin filename using the URL
- std::string mime_type = mimeTypeFromUrl( url );
- std::string plugin_name = pluginNameFromMimeType( mime_type );
-
- // create a random size for the new media
- int media_width;
- int media_height;
- getRandomMediaSize( media_width, media_height, mime_type );
-
- // make a new plugin
- LLPluginClassMedia* media_source = new LLPluginClassMedia(this);
-
- // tell the plugin what size we asked for
- media_source->setSize( media_width, media_height );
-
- // Use the launcher start and initialize the plugin
-#if LL_DARWIN || LL_LINUX
- std::string launcher_name( "SLPlugin" );
-#elif LL_WINDOWS
- std::string launcher_name( "SLPlugin.exe" );
-#endif
-
- // for this test app, use the cwd as the user data path (ugh).
-#if LL_WINDOWS
- std::string user_data_path = ".\\";
-#else
- char cwd[ FILENAME_MAX ];
- if (NULL == getcwd( cwd, FILENAME_MAX - 1 ))
- {
- std::cerr << "Couldn't get cwd - probably too long - failing to init." << std::endl;
- return NULL;
- }
- std::string user_data_path = std::string( cwd ) + "/";
-#endif
-
- media_source->setUserDataPath(user_data_path);
- media_source->init( launcher_name, user_data_path, plugin_name, false );
- //media_source->setDisableTimeout(mDisableTimeout);
-
- // make a new panel and save parameters
- panel = new mediaPanel;
- panel->mMediaSource = media_source;
- panel->mStartUrl = url;
- panel->mMimeType = mime_type;
- panel->mMediaWidth = media_width;
- panel->mMediaHeight = media_height;
- panel->mTextureWidth = 0;
- panel->mTextureHeight = 0;
- panel->mTextureScaleX = 0;
- panel->mTextureScaleY = 0;
- panel->mMediaTextureHandle = 0;
- panel->mPickTextureHandle = 0;
- panel->mAppTextureCoordsOpenGL = false; // really need an 'undefined' state here too
- panel->mReadyToRender = false;
-
- panel->mId = panel_id;
-
- // Replace the entry in the panels array
- mMediaPanels[index] = panel;
-
- // now we have the ID we can use it to make the
- // pick texture (id is baked into texture pixels)
- makePickTexture( panel->mId, &panel->mPickTextureHandle, &panel->mPickTexturePixels );
-
- // select the panel that was just created
- selectPanel( panel );
-
- // load and start the URL
- panel->mMediaSource->loadURI( url );
- panel->mMediaSource->start();
-
- return panel;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::getRandomMediaSize( int& width, int& height, std::string mime_type )
-{
- // Make a new media source with a random size which we'll either
- // directly or the media plugin will tell us what it wants later.
- // Use a random size so we can test support for weird media sizes.
- // (Almost everything else will get filled in later once the
- // plugin responds)
- // NB. Do we need to enforce that width is on 4 pixel boundary?
- width = ( ( rand() % 170 ) + 30 ) * 4;
- height = ( ( rand() % 170 ) + 30 ) * 4;
-
- // adjust this random size if it's a browser so we get
- // a more useful size for testing..
- if ( mime_type == "text/html" || mime_type == "example/example" )
- {
- width = ( ( rand() % 100 ) + 100 ) * 4;
- height = ( width * ( ( rand() % 400 ) + 1000 ) ) / 1000;
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::remMediaPanel( mediaPanel* panel )
-{
- // always leave one panel
- if ( mMediaPanels.size() == 1 )
- return;
-
- // sanity check - don't think this can happen but see above for a case where it might...
- if ( ! panel )
- return;
-
- std::cout << "Removing media panel with index " << panel->mId << " - total panels = " << mMediaPanels.size() - 1 << std::endl;
-
- if(mSelectedPanel == panel)
- mSelectedPanel = NULL;
-
- delete panel;
-
- // remove from storage list
- for( int i = 0; i < (int)mMediaPanels.size(); ++i )
- {
- if ( mMediaPanels[ i ] == panel )
- {
- mMediaPanels.erase( mMediaPanels.begin() + i );
- break;
- };
- };
-
- // select the first panel
- selectPanel( mMediaPanels[ 0 ] );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::updateStatusBar()
-{
- if ( ! mSelectedPanel )
- return;
-
- // cache results - this is a very slow function
- static int cached_id = -1;
- static int cached_media_width = -1;
- static int cached_media_height = -1;
- static int cached_texture_width = -1;
- static int cached_texture_height = -1;
- static bool cached_supports_browser_media = true;
- static bool cached_supports_time_media = false;
- static int cached_movie_time = -1;
- static GLfloat cached_distance = -1.0f;
-
- static std::string cached_plugin_version = "";
- if (
- cached_id == mSelectedPanel->mId &&
- cached_media_width == mSelectedPanel->mMediaWidth &&
- cached_media_height == mSelectedPanel->mMediaHeight &&
- cached_texture_width == mSelectedPanel->mTextureWidth &&
- cached_texture_height == mSelectedPanel->mTextureHeight &&
- cached_supports_browser_media == mSelectedPanel->mMediaSource->pluginSupportsMediaBrowser() &&
- cached_supports_time_media == mSelectedPanel->mMediaSource->pluginSupportsMediaTime() &&
- cached_plugin_version == mSelectedPanel->mMediaSource->getPluginVersion() &&
- cached_movie_time == (int)mSelectedPanel->mMediaSource->getCurrentTime() &&
- cached_distance == mDistanceCameraToSelectedGeometry
- )
- {
- // nothing changed so don't spend time here
- return;
- };
-
- std::ostringstream stream( "" );
-
- stream.str( "" );
- stream.clear();
-
- stream << "Id: ";
- stream << std::setw( 2 ) << std::setfill( '0' );
- stream << mSelectedPanel->mId;
- stream << " | ";
- stream << "Media: ";
- stream << std::setw( 3 ) << std::setfill( '0' );
- stream << mSelectedPanel->mMediaWidth;
- stream << " x ";
- stream << std::setw( 3 ) << std::setfill( '0' );
- stream << mSelectedPanel->mMediaHeight;
- stream << " | ";
- stream << "Texture: ";
- stream << std::setw( 4 ) << std::setfill( '0' );
- stream << mSelectedPanel->mTextureWidth;
- stream << " x ";
- stream << std::setw( 4 ) << std::setfill( '0' );
- stream << mSelectedPanel->mTextureHeight;
-
- stream << " | ";
- stream << "Distance: ";
- stream << std::setw( 6 );
- stream << std::setprecision( 3 );
- stream << std::setprecision( 3 );
- stream << mDistanceCameraToSelectedGeometry;
- stream << " | ";
-
- if ( mSelectedPanel->mMediaSource->pluginSupportsMediaBrowser() )
- stream << "BROWSER";
- else
- if ( mSelectedPanel->mMediaSource->pluginSupportsMediaTime() )
- stream << "TIME ";
- stream << " | ";
- stream << mSelectedPanel->mMediaSource->getPluginVersion();
- stream << " | ";
- if ( mSelectedPanel->mMediaSource->pluginSupportsMediaTime() )
- {
- stream << std::setw( 3 ) << std::setfill( '0' );
- stream << (int)mSelectedPanel->mMediaSource->getCurrentTime();
- stream << " / ";
- stream << std::setw( 3 ) << std::setfill( '0' );
- stream << (int)mSelectedPanel->mMediaSource->getDuration();
- stream << " @ ";
- stream << (int)mSelectedPanel->mMediaSource->getCurrentPlayRate();
- stream << " | ";
- };
-
- glutSetWindow( mBottomGLUIWindow->get_glut_window_id() );
- mStatusText->set_text( const_cast< char*>( stream.str().c_str() ) );
- glutSetWindow( mAppWindow );
-
- // caching
- cached_id = mSelectedPanel->mId;
- cached_media_width = mSelectedPanel->mMediaWidth;
- cached_media_height = mSelectedPanel->mMediaHeight;
- cached_texture_width = mSelectedPanel->mTextureWidth;
- cached_texture_height = mSelectedPanel->mTextureHeight;
- cached_supports_browser_media = mSelectedPanel->mMediaSource->pluginSupportsMediaBrowser();
- cached_supports_time_media = mSelectedPanel->mMediaSource->pluginSupportsMediaTime();
- cached_plugin_version = mSelectedPanel->mMediaSource->getPluginVersion();
- cached_movie_time = (int)mSelectedPanel->mMediaSource->getCurrentTime();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::dumpPanelInfo()
-{
- std::cout << std::endl << "===== Media Panels =====" << std::endl;
- for( int i = 0; i < (int)mMediaPanels.size(); ++i )
- {
- std::cout << std::setw( 2 ) << std::setfill( '0' );
- std::cout << i + 1 << "> ";
- std::cout << "Id: ";
- std::cout << std::setw( 2 ) << std::setfill( '0' );
- std::cout << mMediaPanels[ i ]->mId;
- std::cout << " | ";
- std::cout << "Media: ";
- std::cout << std::setw( 3 ) << std::setfill( '0' );
- std::cout << mMediaPanels[ i ]->mMediaWidth;
- std::cout << " x ";
- std::cout << std::setw( 3 ) << std::setfill( '0' );
- std::cout << mMediaPanels[ i ]->mMediaHeight;
- std::cout << " | ";
- std::cout << "Texture: ";
- std::cout << std::setw( 4 ) << std::setfill( '0' );
- std::cout << mMediaPanels[ i ]->mTextureWidth;
- std::cout << " x ";
- std::cout << std::setw( 4 ) << std::setfill( '0' );
- std::cout << mMediaPanels[ i ]->mTextureHeight;
- std::cout << " | ";
- if ( mMediaPanels[ i ] == mSelectedPanel )
- std::cout << "(selected)";
-
- std::cout << std::endl;
- };
- std::cout << "========================" << std::endl;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFBConnectTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
-{
- // Uncomment this to make things much, much quieter.
-// return;
-
- switch(event)
- {
- case MEDIA_EVENT_CONTENT_UPDATED:
- // too spammy -- don't log these
-// std::cerr << "Media event: MEDIA_EVENT_CONTENT_UPDATED " << std::endl;
- break;
-
- case MEDIA_EVENT_TIME_DURATION_UPDATED:
- // too spammy -- don't log these
-// std::cerr << "Media event: MEDIA_EVENT_TIME_DURATION_UPDATED, time is " << self->getCurrentTime() << " of " << self->getDuration() << std::endl;
- break;
-
- case MEDIA_EVENT_SIZE_CHANGED:
- std::cerr << "Media event: MEDIA_EVENT_SIZE_CHANGED " << std::endl;
- break;
-
- case MEDIA_EVENT_CURSOR_CHANGED:
- std::cerr << "Media event: MEDIA_EVENT_CURSOR_CHANGED, new cursor is " << self->getCursorName() << std::endl;
- break;
-
- case MEDIA_EVENT_NAVIGATE_BEGIN:
- std::cerr << "Media event: MEDIA_EVENT_NAVIGATE_BEGIN " << std::endl;
- break;
-
- case MEDIA_EVENT_NAVIGATE_COMPLETE:
- std::cerr << "Media event: MEDIA_EVENT_NAVIGATE_COMPLETE, result string is: " << self->getNavigateResultString() << std::endl;
- break;
-
- case MEDIA_EVENT_PROGRESS_UPDATED:
- std::cerr << "Media event: MEDIA_EVENT_PROGRESS_UPDATED, loading at " << self->getProgressPercent() << "%" << std::endl;
- break;
-
- case MEDIA_EVENT_STATUS_TEXT_CHANGED:
- std::cerr << "Media event: MEDIA_EVENT_STATUS_TEXT_CHANGED, new status text is: " << self->getStatusText() << std::endl;
- break;
-
- case MEDIA_EVENT_NAME_CHANGED:
- std::cerr << "Media event: MEDIA_EVENT_NAME_CHANGED, new name is: " << self->getMediaName() << std::endl;
- glutSetWindowTitle( self->getMediaName().c_str() );
- break;
-
- case MEDIA_EVENT_LOCATION_CHANGED:
- {
- std::cerr << "Media event: MEDIA_EVENT_LOCATION_CHANGED, new uri is: " << self->getLocation() << std::endl;
- mediaPanel* panel = findMediaPanel(self);
- if(panel != NULL)
- {
- panel->mStartUrl = self->getLocation();
- if(panel == mSelectedPanel)
- {
- mUrlEdit->set_text(const_cast<char*>(panel->mStartUrl.c_str()) );
- }
- }
- }
- break;
-
- case MEDIA_EVENT_NAVIGATE_ERROR_PAGE:
- std::cerr << "Media event: MEDIA_EVENT_NAVIGATE_ERROR_PAGE, uri is: " << self->getClickURL() << std::endl;
- break;
-
- case MEDIA_EVENT_CLICK_LINK_HREF:
- {
- std::cerr << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, uri is " << self->getClickURL() << ", target is " << self->getClickTarget() << std::endl;
- // retrieve the event parameters
- std::string url = self->getClickURL();
- std::string target = self->getClickTarget();
-
- if(target == "_external")
- {
- // this should open in an external browser, but since this is a test app we don't care.
- }
- else if(target == "_blank")
- {
- // Create a new panel with the specified URL.
- addMediaPanel(url);
- }
- else // other named target
- {
- mediaPanel *target_panel = findMediaPanel(target);
- if(target_panel)
- {
- target_panel = replaceMediaPanel(target_panel, url);
- }
- else
- {
- target_panel = addMediaPanel(url);
- }
-
- if(target_panel)
- {
- target_panel->mTarget = target;
- }
- }
- }
- break;
-
- case MEDIA_EVENT_CLICK_LINK_NOFOLLOW:
- std::cerr << "Media event: MEDIA_EVENT_CLICK_LINK_NOFOLLOW, uri is " << self->getClickURL() << std::endl;
- break;
-
- case MEDIA_EVENT_PLUGIN_FAILED:
- std::cerr << "Media event: MEDIA_EVENT_PLUGIN_FAILED" << std::endl;
- break;
-
- case MEDIA_EVENT_PLUGIN_FAILED_LAUNCH:
- std::cerr << "Media event: MEDIA_EVENT_PLUGIN_FAILED_LAUNCH" << std::endl;
- break;
-
- case MEDIA_EVENT_CLOSE_REQUEST:
- std::cerr << "Media event: MEDIA_EVENT_CLOSE_REQUEST" << std::endl;
- break;
-
- case MEDIA_EVENT_PICK_FILE_REQUEST:
- std::cerr << "Media event: MEDIA_EVENT_PICK_FILE_REQUEST" << std::endl;
- // TODO: display an actual file picker
- self->sendPickFileResponse("cake");
- break;
-
- case MEDIA_EVENT_GEOMETRY_CHANGE:
- std::cerr << "Media event: MEDIA_EVENT_GEOMETRY_CHANGE, uuid is " << self->getClickUUID()
- << ", x = " << self->getGeometryX()
- << ", y = " << self->getGeometryY()
- << ", width = " << self->getGeometryWidth()
- << ", height = " << self->getGeometryHeight()
- << std::endl;
- break;
-
- case MEDIA_EVENT_AUTH_REQUEST:
- {
- //std::cerr << "Media event: MEDIA_EVENT_AUTH_REQUEST, url " << self->getAuthURL() ", realm " << self->getAuthRealm() << std::endl;
-
- // TODO: display an auth dialog
- self->sendAuthResponse(false, "", "");
- }
- break;
-
- case MEDIA_EVENT_LINK_HOVERED:
- {
- std::cerr << "Media event: MEDIA_EVENT_LINK_HOVERED, hover text is: " << self->getHoverText() << std::endl;
- }
- break;
-
- default:
- {
- std::cerr << "Media event: <unknown>, code is: " << int(event) << std::endl;
- }
- break;
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-static void gluiCallbackWrapper( int control_id )
-{
- if ( gApplication )
- gApplication->gluiCallback( control_id );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void glutReshape( int width, int height )
-{
- if ( gApplication )
- gApplication->reshape( width, height );
-};
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void glutDisplay()
-{
- if ( gApplication )
- gApplication->display();
-};
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void glutIdle(int update_ms)
-{
- GLUI_Master.set_glutTimerFunc( update_ms, glutIdle, update_ms);
-
- if ( gApplication )
- gApplication->idle();
-
-};
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void glutKeyboard( unsigned char key, int x, int y )
-{
- if ( gApplication )
- gApplication->keyboard( key );
-};
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void glutMousePassive( int x, int y )
-{
- if ( gApplication )
- gApplication->mousePassive( x, y );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void glutMouseMove( int x , int y )
-{
- if ( gApplication )
- gApplication->mouseMove( x, y );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void glutMouseButton( int button, int state, int x, int y )
-{
- if ( gApplication )
- gApplication->mouseButton( button, state, x, y );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-int main( int argc, char* argv[] )
-{
-#if LL_DARWIN
- // Set the current working directory to <application bundle>/Contents/Resources/
- CFURLRef resources_url = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle());
- if(resources_url != NULL)
- {
- CFStringRef resources_string = CFURLCopyFileSystemPath(resources_url, kCFURLPOSIXPathStyle);
- CFRelease(resources_url);
- if(resources_string != NULL)
- {
- char buffer[PATH_MAX] = "";
- if(CFStringGetCString(resources_string, buffer, sizeof(buffer), kCFStringEncodingUTF8))
- {
- chdir(buffer);
- }
- CFRelease(resources_string);
- }
- }
-#endif
-
- glutInit( &argc, argv );
- glutInitDisplayMode( GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB );
-
- const int app_window_x = 80;
- const int app_window_y = 0;
- const int app_window_width = 960;
- const int app_window_height = 960;
-
- glutInitWindowPosition( app_window_x, app_window_y );
- glutInitWindowSize( app_window_width, app_window_height );
-
- int app_window_handle = glutCreateWindow( "LLFBConnectTest" );
-
- glutDisplayFunc( glutDisplay );
-
- GLUI_Master.set_glutReshapeFunc( glutReshape );
- GLUI_Master.set_glutKeyboardFunc( glutKeyboard );
- GLUI_Master.set_glutMouseFunc( glutMouseButton );
-
- glutPassiveMotionFunc( glutMousePassive );
- glutMotionFunc( glutMouseMove );
-
- glutSetWindow( app_window_handle );
-
- gApplication = new LLFBConnectTest( app_window_handle, app_window_width, app_window_height );
-
- // update at approximately 60hz
- int update_ms = 1000 / 60;
-
- GLUI_Master.set_glutTimerFunc( update_ms, glutIdle, update_ms);
-
- glutMainLoop();
-
- delete gApplication;
-}
diff --git a/indra/test_apps/llfbconnecttest/llfbconnecttest.h b/indra/test_apps/llfbconnecttest/llfbconnecttest.h
deleted file mode 100644
index 77e4d096d0..0000000000
--- a/indra/test_apps/llfbconnecttest/llfbconnecttest.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/**
- * @file LLFBConnectTest.cpp
- * @brief Facebook Connect Test App
- *
- * $LicenseInfo:firstyear=2008&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_FB_CONNECT_H
-#define LL_FB_CONNECT_H
-
-#include <vector>
-#include <string>
-#include "llpluginclassmedia.h"
-#include "llgl.h"
-
-// Forward declarations
-class GLUI_Rotation;
-class GLUI_Translation;
-class GLUI_Listbox;
-class GLUI_EditText;
-class GLUI_StaticText;
-class GLUI;
-class GLUI_Button;
-
-////////////////////////////////////////////////////////////////////////////////
-//
-struct mediaPanel
-{
- public:
- mediaPanel();
- ~mediaPanel();
- int mId;
- std::string mStartUrl;
- std::string mMimeType;
- std::string mTarget;
- LLPluginClassMedia *mMediaSource;
- int mMediaWidth;
- int mMediaHeight;
- int mTextureWidth;
- int mTextureHeight;
- double mTextureScaleX;
- double mTextureScaleY;
- GLuint mMediaTextureHandle;
- GLuint mPickTextureHandle;
- unsigned char* mPickTexturePixels;
- bool mAppTextureCoordsOpenGL;
- bool mReadyToRender;
-};
-
-////////////////////////////////////////////////////////////////////////////////
-//
-class LLFBConnectTest : public LLPluginClassMediaOwner
-{
- public:
- LLFBConnectTest( int app_window, int window_width, int window_height );
- ~LLFBConnectTest();
-
- void reshape( int width, int height );
- void display();
- void idle();
- void gluiCallback( int control_id );
- void keyboard( int key );
- void mousePassive( int x, int y );
- void mouseButton( int button, int state, int x, int y );
- void mouseMove( int x, int y );
-
- void bindTexture(GLuint texture, GLint row_length = 0, GLint alignment = 1);
- bool checkGLError(const char *name = "OpenGL");
- void drawGeometry( int panel, bool selected );
- void startPanelHighlight( float red, float green, float blue, float line_width );
- void endPanelHighlight();
- enum { DrawTypePickTexture, DrawTypeMediaTexture };
- void draw( int draw_type );
- void windowPosToTexturePos( int window_x, int window_y, int& media_x, int& media_y, int& id );
-
- mediaPanel* addMediaPanel( std::string url );
- void updateMediaPanel( mediaPanel* panel );
- void remMediaPanel( mediaPanel* panel );
- mediaPanel* replaceMediaPanel( mediaPanel* panel, std::string url );
- void getRandomMediaSize( int& width, int& height, std::string mime_type );
- void navigateToNewURI( std::string uri );
- void initUrlHistory( std::string uri );
- void selectPanelById( int id );
- void selectPanel( mediaPanel* panel );
- mediaPanel* findMediaPanel( LLPluginClassMedia* panel );
- mediaPanel* findMediaPanel( const std::string &target_name );
- void makePickTexture( int id, GLuint* texture_handle, unsigned char** texture_pixels );
- void makeChrome();
- void resetView();
-
- void dumpPanelInfo();
- void updateStatusBar();
-
- GLfloat distanceToCamera( GLfloat point_x, GLfloat point_y, GLfloat point_z );
-
-
- // Inherited from LLPluginClassMediaOwner
- /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, LLPluginClassMediaOwner::EMediaEvent);
-
- private:
- const int mVersionMajor;
- const int mVersionMinor;
- const int mVersionPatch;
- const int mMaxPanels;
- int mAppWindow;
- int mWindowWidth;
- int mWindowHeight;
- int mCurMouseX;
- int mCurMouseY;
- unsigned char mPixelReadColor[ 3 ];
- bool mFuzzyMedia;
- const std::string mHomeWebUrl;
-
- std::vector< mediaPanel* > mMediaPanels;
- mediaPanel* mSelectedPanel;
- std::string mimeTypeFromUrl( std::string& url );
- std::string pluginNameFromMimeType( std::string& mime_type );
-
- GLUI_Rotation* mViewRotationCtrl;
- GLUI_Translation* mViewScaleCtrl;
- GLUI_Translation* mViewTranslationCtrl;
- float mViewportAspect;
- float mViewPos[ 3 ];
- float mViewRotation[ 16 ];
-
- float mDistanceCameraToSelectedGeometry;
-
- std::vector< std::pair< std::string, std::string > > mBookmarks;
- GLUI_Listbox* mBookmarkList;
- int mIdBookmarks;
- int mIdUrlEdit;
- GLUI_EditText* mUrlEdit;
- int mSelBookmark;
-
- int mIdControlExitApp;
-
- GLUI* mGluiMediaBrowserControlWindow;
- int mIdMediaBrowserControlBack;
- GLUI_Button* mMediaBrowserControlBackButton;
- int mIdMediaBrowserControlStop;
- int mIdMediaBrowserControlForward;
- GLUI_Button* mMediaBrowserControlForwardButton;
- bool mGluiMediaBrowserControlWindowFlag;
- bool mMediaBrowserControlBackButtonFlag;
- bool mMediaBrowserControlForwardButtonFlag;
- int mIdMediaBrowserControlHome;
- int mIdMediaBrowserControlReload;
-
- GLUI* mBottomGLUIWindow;
- GLUI_StaticText* mStatusText;
-};
-
-#endif // LL_FB_CONNECT_H
-
diff --git a/indra/test_apps/llplugintest/CMakeLists.txt b/indra/test_apps/llplugintest/CMakeLists.txt
index 0c8bdc464d..e682eaccca 100755
--- a/indra/test_apps/llplugintest/CMakeLists.txt
+++ b/indra/test_apps/llplugintest/CMakeLists.txt
@@ -254,138 +254,8 @@ endif (DARWIN)
# )
#endif (DARWIN)
-### llmediaplugintest
-
-set(llmediaplugintest_SOURCE_FILES
- llmediaplugintest.cpp
- llmediaplugintest.h
- bookmarks.txt
- )
-
-add_executable(llmediaplugintest
- WIN32
- MACOSX_BUNDLE
- ${llmediaplugintest_SOURCE_FILES}
-)
-
-set_target_properties(llmediaplugintest
- PROPERTIES
- WIN32_EXECUTABLE
- FALSE
-)
-
-target_link_libraries(llmediaplugintest
- ${GLUT_LIBRARY}
- ${GLUI_LIBRARY}
- ${OPENGL_LIBRARIES}
- ${LLPLUGIN_LIBRARIES}
- ${LLMESSAGE_LIBRARIES}
- ${LLCOMMON_LIBRARIES}
- ${PLUGIN_API_WINDOWS_LIBRARIES}
-)
-
-if (DARWIN)
- # The testbed needs to use a couple of CoreFoundation calls now, to deal with being a bundled app.
- target_link_libraries(llmediaplugintest
- ${COREFOUNDATION_LIBRARY}
- )
-endif (DARWIN)
-
-add_dependencies(llmediaplugintest
- stage_third_party_libs
- SLPlugin
- media_plugin_quicktime
- media_plugin_webkit
- media_plugin_example
- ${LLPLUGIN_LIBRARIES}
- ${LLMESSAGE_LIBRARIES}
- ${LLCOMMON_LIBRARIES}
-)
-
-# turn off weird GLUI pragma
-add_definitions(-DGLUI_NO_LIB_PRAGMA)
-
-if (DARWIN OR LINUX)
- # glui.h contains code that triggers the "overloaded-virtual" warning in gcc.
- set_source_files_properties(llmediaplugintest.cpp PROPERTIES COMPILE_FLAGS "-Wno-overloaded-virtual")
-endif (DARWIN OR LINUX)
-
# Gather build products of the various dependencies into the build directory for the testbed.
-if (DARWIN)
- # path inside the app bundle where we'll need to copy plugins and other related files
- set(PLUGINS_DESTINATION_DIR
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llmediaplugintest.app/Contents/Resources
- )
-
- # create the Contents/Resources directory
- add_custom_command(
- TARGET llmediaplugintest POST_BUILD
- COMMAND ${CMAKE_COMMAND}
- ARGS
- -E
- make_directory
- ${PLUGINS_DESTINATION_DIR}
- COMMENT "Creating Resources directory in app bundle."
- )
-else (DARWIN)
- set(PLUGINS_DESTINATION_DIR
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/
- )
-endif (DARWIN)
-
-set(BUILT_SLPLUGIN $<TARGET_FILE:SLPlugin>)
-add_custom_command(TARGET llmediaplugintest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_SLPLUGIN} ${PLUGINS_DESTINATION_DIR}
- DEPENDS ${BUILT_SLPLUGIN}
-)
-
-set(BUILT_LLCOMMON $<TARGET_FILE:llcommon>)
-add_custom_command(TARGET llmediaplugintest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_LLCOMMON} ${PLUGINS_DESTINATION_DIR}
- DEPENDS ${BUILT_LLCOMMON}
-)
-
-set(BUILT_WEBKIT_PLUGIN $<TARGET_FILE:media_plugin_webkit>)
-add_custom_command(TARGET llmediaplugintest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_WEBKIT_PLUGIN} ${PLUGINS_DESTINATION_DIR}
- DEPENDS ${BUILT_WEBKIT_PLUGIN}
-)
-
-if (DARWIN OR WINDOWS)
- set(BUILT_QUICKTIME_PLUGIN $<TARGET_FILE:media_plugin_quicktime>)
- add_custom_command(TARGET llmediaplugintest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_QUICKTIME_PLUGIN} ${PLUGINS_DESTINATION_DIR}
- DEPENDS ${BUILT_QUICKTIME_PLUGIN}
- )
-endif (DARWIN OR WINDOWS)
-
-set(BUILT_EXAMPLE_PLUGIN $<TARGET_FILE:media_plugin_example>)
-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
-set(BUILT_LLMEDIAPLUGINTEST $<TARGET_FILE:llmediaplugintest>)
-add_custom_command(TARGET llmediaplugintest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/bookmarks.txt ${CMAKE_CURRENT_BINARY_DIR}/
- DEPENDS ${BUILT_LLMEDIAPLUGINTEST}
-)
-
-# also copy it to the same place as SLPlugin, which is what the mac wants...
-add_custom_command(TARGET llmediaplugintest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/bookmarks.txt ${PLUGINS_DESTINATION_DIR}
- DEPENDS ${BUILT_LLMEDIAPLUGINTEST}
-)
-
-if (DARWIN)
-# add_custom_command(TARGET llmediaplugintest POST_BUILD
-# COMMAND ${CMAKE_COMMAND} -E copy ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib ${PLUGINS_DESTINATION_DIR}
-# DEPENDS ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib
-# )
-endif (DARWIN)
-
if(WINDOWS)
#********************
# Plugin test library deploy
@@ -398,11 +268,6 @@ if(WINDOWS)
libgmodule-2.0-0.dll
libgobject-2.0-0.dll
libgthread-2.0-0.dll
- qtcored4.dll
- qtguid4.dll
- qtnetworkd4.dll
- qtopengld4.dll
- qtwebkitd4.dll
ssleay32.dll
)
copy_if_different(
@@ -413,40 +278,6 @@ if(WINDOWS)
)
set(plugin_test_targets ${plugin_test_targets} ${out_targets})
- # Debug config runtime files required for the plugin test mule (Qt image format plugins)
- set(plugintest_debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}/imageformats")
- set(plugintest_debug_files
- qgifd4.dll
- qicod4.dll
- qjpegd4.dll
- qmngd4.dll
- qsvgd4.dll
- qtiffd4.dll
- )
- copy_if_different(
- ${plugintest_debug_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/Debug/imageformats"
- out_targets
- ${plugintest_debug_files}
- )
- set(plugin_test_targets ${plugin_test_targets} ${out_targets})
-
- # Debug config runtime files required for the plugin test mule (Qt codec plugins)
- set(plugintest_debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}/codecs")
- set(plugintest_debug_files
- qcncodecsd4.dll
- qjpcodecsd4.dll
- qkrcodecsd4.dll
- qtwcodecsd4.dll
- )
- copy_if_different(
- ${plugintest_debug_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/Debug/codecs"
- out_targets
- ${plugintest_debug_files}
- )
- set(plugin_test_targets ${plugin_test_targets} ${out_targets})
-
# Release & ReleaseDebInfo config runtime files required for the plugin test mule
set(plugintest_release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
set(plugintest_release_files
@@ -455,12 +286,6 @@ if(WINDOWS)
libgmodule-2.0-0.dll
libgobject-2.0-0.dll
libgthread-2.0-0.dll
- qtcore4.dll
- qtgui4.dll
- qtnetwork4.dll
- qtopengl4.dll
- qtwebkit4.dll
- qtxmlpatterns4.dll
ssleay32.dll
)
copy_if_different(
@@ -479,63 +304,11 @@ if(WINDOWS)
)
set(plugin_test_targets ${plugin_test_targets} ${out_targets})
- # Release & ReleaseDebInfo config runtime files required for the plugin test mule (Qt image format plugins)
- set(plugintest_release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}/imageformats")
- set(plugintest_release_files
- qgif4.dll
- qico4.dll
- qjpeg4.dll
- qmng4.dll
- qsvg4.dll
- qtiff4.dll
- )
- copy_if_different(
- ${plugintest_release_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/Release/imageformats"
- out_targets
- ${plugintest_release_files}
- )
- set(plugin_test_targets ${plugin_test_targets} ${out_targets})
-
- copy_if_different(
- ${plugintest_release_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/imageformats"
- out_targets
- ${plugintest_release_files}
- )
- set(plugin_test_targets ${plugin_test_targets} ${out_targets})
-
- # Release & ReleaseDebInfo config runtime files required for the plugin test mule (Qt codec plugins)
- set(plugintest_release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}/codecs")
- set(plugintest_release_files
- qcncodecs4.dll
- qjpcodecs4.dll
- qkrcodecs4.dll
- qtwcodecs4.dll
- )
- copy_if_different(
- ${plugintest_release_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/Release/codecs"
- out_targets
- ${plugintest_release_files}
- )
- set(plugin_test_targets ${plugin_test_targets} ${out_targets})
-
- copy_if_different(
- ${plugintest_release_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/codecs"
- out_targets
- ${plugintest_release_files}
- )
- set(plugin_test_targets ${plugin_test_targets} ${out_targets})
-
add_custom_target(copy_plugintest_libs ALL
DEPENDS
${plugin_test_targets}
)
- add_dependencies(llmediaplugintest copy_plugintest_libs)
-
endif(WINDOWS)
if (DARWIN)
@@ -545,20 +318,6 @@ if (DARWIN)
libaprutil-1.0.dylib
libapr-1.0.dylib
libexpat.1.5.2.dylib
- libQtCore.4.7.1.dylib
- libQtCore.4.dylib
- libQtGui.4.7.1.dylib
- libQtGui.4.dylib
- libQtNetwork.4.7.1.dylib
- libQtNetwork.4.dylib
- libQtOpenGL.4.7.1.dylib
- libQtOpenGL.4.dylib
- libQtWebKit.4.7.1.dylib
- libQtWebKit.4.dylib
- libQtSvg.4.7.1.dylib
- libQtSvg.4.dylib
- libQtXml.4.7.1.dylib
- libQtXml.4.dylib
)
copy_if_different(
${plugintest_release_src_dir}
@@ -568,46 +327,10 @@ if (DARWIN)
)
set(plugin_test_targets ${plugin_test_targets} ${out_targets})
- # Release & ReleaseDebInfo config runtime files required for the FB connect test (Qt image format plugins)
- set(plugintest_release_src_dir "${ARCH_PREBUILT_DIRS_PLUGINS}/imageformats")
- set(plugintest_release_files
- libqgif.dylib
- libqico.dylib
- libqjpeg.dylib
- libqmng.dylib
- libqsvg.dylib
- libqtiff.dylib
- )
- copy_if_different(
- ${plugintest_release_src_dir}
- "${PLUGINS_DESTINATION_DIR}/imageformats"
- out_targets
- ${plugintest_release_files}
- )
- set(plugin_test_targets ${plugin_test_targets} ${out_targets})
-
- # Release & ReleaseDebInfo config runtime files required for the FB connect test (Qt codec plugins)
- set(plugintest_release_src_dir "${ARCH_PREBUILT_DIRS_PLUGINS}/codecs")
- set(plugintest_release_files
- libqcncodecs.dylib
- libqjpcodecs.dylib
- libqkrcodecs.dylib
- libqtwcodecs.dylib
- )
- copy_if_different(
- ${plugintest_release_src_dir}
- "${PLUGINS_DESTINATION_DIR}/codecs"
- out_targets
- ${plugintest_release_files}
- )
- set(plugin_test_targets ${plugin_test_targets} ${out_targets})
-
add_custom_target(copy_plugintest_libs ALL
DEPENDS
${plugin_test_targets}
)
- add_dependencies(llmediaplugintest copy_plugintest_libs)
endif (DARWIN)
-ll_deploy_sharedlibs_command(llmediaplugintest)
diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp
deleted file mode 100755
index fa4f5abd28..0000000000
--- a/indra/test_apps/llplugintest/llmediaplugintest.cpp
+++ /dev/null
@@ -1,2377 +0,0 @@
-/**
- * @file LLMediaPluginTest.cpp
- * @brief Primary test application for LLMedia (Separate Process) Plugin system
- *
- * $LicenseInfo:firstyear=2008&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-#include "indra_constants.h"
-
-#include "llapr.h"
-#include "llerrorcontrol.h"
-
-#include <math.h>
-#include <iomanip>
-#include <sstream>
-#include <ctime>
-
-#include "llmediaplugintest.h"
-
-
-#if LL_WINDOWS
-#pragma warning(disable: 4263)
-#pragma warning(disable: 4264)
-#endif
-
-#if __APPLE__
- #include <GLUT/glut.h>
- #include <CoreFoundation/CoreFoundation.h>
-#else
- #define FREEGLUT_STATIC
- #include "GL/freeglut.h"
- #define GLUI_FREEGLUT
-#endif
-
-#include "glui.h"
-
-
-LLMediaPluginTest* gApplication = 0;
-static void gluiCallbackWrapper( int control_id );
-
-////////////////////////////////////////////////////////////////////////////////
-//
-static bool isTexture( GLuint texture )
-{
- bool result = false;
-
- // glIsTexture will sometimes return false for real textures... do this instead.
- if(texture != 0)
- result = true;
-
- return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-mediaPanel::mediaPanel()
-{
- mMediaTextureHandle = 0;
- mPickTextureHandle = 0;
- mMediaSource = NULL;
- mPickTexturePixels = NULL;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-mediaPanel::~mediaPanel()
-{
- // delete OpenGL texture handles
- if ( isTexture( mPickTextureHandle ) )
- {
- std::cerr << "remMediaPanel: deleting pick texture " << mPickTextureHandle << std::endl;
- glDeleteTextures( 1, &mPickTextureHandle );
- mPickTextureHandle = 0;
- }
-
- if ( isTexture( mMediaTextureHandle ) )
- {
- std::cerr << "remMediaPanel: deleting media texture " << mMediaTextureHandle << std::endl;
- glDeleteTextures( 1, &mMediaTextureHandle );
- mMediaTextureHandle = 0;
- }
-
- if(mPickTexturePixels)
- {
- delete mPickTexturePixels;
- }
-
- if(mMediaSource)
- {
- delete mMediaSource;
- }
-
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-LLMediaPluginTest::LLMediaPluginTest( int app_window, int window_width, int window_height ) :
- mVersionMajor( 2 ),
- mVersionMinor( 0 ),
- mVersionPatch( 0 ),
- mMaxPanels( 25 ),
- mViewportAspect( 0 ),
- mAppWindow( app_window ),
- mCurMouseX( 0 ),
- mCurMouseY( 0 ),
- mFuzzyMedia( true ),
- mSelectedPanel( 0 ),
- mDistanceCameraToSelectedGeometry( 0.0f ),
- mMediaBrowserControlEnableCookies( 0 ),
- mMediaBrowserControlBackButton( 0 ),
- mMediaBrowserControlForwardButton( 0 ),
- mMediaTimeControlVolume( 100 ),
- mMediaTimeControlSeekSeconds( 0 ),
- mGluiMediaTimeControlWindowFlag( true ),
- mGluiMediaBrowserControlWindowFlag( true ),
- mMediaBrowserControlBackButtonFlag( true ),
- mMediaBrowserControlForwardButtonFlag( true ),
- mHomeWebUrl( "http://www.google.com/" )
-{
- // debugging spam
- std::cout << std::endl << " GLUT version: " << "3.7.6" << std::endl; // no way to get real version from GLUT
- std::cout << std::endl << " GLUI version: " << GLUI_Master.get_version() << std::endl;
- std::cout << std::endl << "Media Plugin Test version: " << mVersionMajor << "." << mVersionMinor << "." << mVersionPatch << std::endl;
-
- // bookmark title
- mBookmarks.push_back( std::pair< std::string, std::string >( "--- Bookmarks ---", "" ) );
-
- // insert hardcoded URLs here as required for testing
- //mBookmarks.push_back( std::pair< std::string, std::string >( "description", "url" ) );
-
- // read bookmarks from file.
- // note: uses command in ./CmakeLists.txt which copies bookmmarks file from source directory
- // to app directory (WITHOUT build configuration dir) (this is cwd in Windows within MSVC)
- // For example, test_apps\llplugintest and not test_apps\llplugintest\Release
- // This may need to be changed for Mac/Linux builds.
- // See https://jira.lindenlab.com/browse/DEV-31350 for large list of media URLs from AGNI
- const std::string bookmarks_filename( "bookmarks.txt" );
- std::ifstream file_handle( bookmarks_filename.c_str() );
- if ( file_handle.is_open() )
- {
- std::cout << "Reading bookmarks for test" << std::endl;
- while( ! file_handle.eof() )
- {
- std::string line;
- std::getline( file_handle, line );
- if ( file_handle.eof() )
- break;
-
- if ( line.substr( 0, 1 ) != "#" )
- {
- size_t comma_pos = line.find_first_of( ',' );
- if ( comma_pos != std::string::npos )
- {
- std::string description = line.substr( 0, comma_pos );
- std::string url = line.substr( comma_pos + 1 );
- mBookmarks.push_back( std::pair< std::string, std::string >( description, url ) );
- }
- else
- {
- mBookmarks.push_back( std::pair< std::string, std::string >( line, line ) );
- };
- };
- };
- std::cout << "Read " << mBookmarks.size() << " bookmarks" << std::endl;
- }
- else
- {
- std::cout << "Unable to read bookmarks from file: " << bookmarks_filename << std::endl;
- };
-
- // initialize linden lab APR module
- ll_init_apr();
-
- // Set up llerror logging
- {
- LLError::initForApplication(".");
- LLError::setDefaultLevel(LLError::LEVEL_INFO);
- //LLError::setTagLevel("Plugin", LLError::LEVEL_DEBUG);
- }
-
- // lots of randomness in this app
- srand( ( unsigned int )time( 0 ) );
-
- // build GUI
- makeChrome();
-
- // OpenGL initialilzation
- glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
- glClearDepth( 1.0f );
- glEnable( GL_DEPTH_TEST );
- glEnable( GL_COLOR_MATERIAL );
- glColorMaterial( GL_FRONT, GL_AMBIENT_AND_DIFFUSE );
- glDepthFunc( GL_LEQUAL );
- glEnable( GL_TEXTURE_2D );
- glDisable( GL_BLEND );
- glColor3f( 1.0f, 1.0f, 1.0f );
- glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
- glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
-
- // start with a sane view
- resetView();
-
- // initial media panel
- const int num_initial_panels = 1;
- for( int i = 0; i < num_initial_panels; ++i )
- {
- //addMediaPanel( mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second );
- addMediaPanel( mHomeWebUrl );
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-LLMediaPluginTest::~LLMediaPluginTest()
-{
- // delete all media panels
- for( int i = 0; i < (int)mMediaPanels.size(); ++i )
- {
- remMediaPanel( mMediaPanels[ i ] );
- };
-
- // Stop the plugin read thread if it's running.
- LLPluginProcessParent::setUseReadThread(false);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::reshape( int width, int height )
-{
- // update viewport (the active window inside the chrome)
- int viewport_x, viewport_y;
- int viewport_height, viewport_width;
- GLUI_Master.get_viewport_area( &viewport_x, &viewport_y, &viewport_width, &viewport_height );
- mViewportAspect = (float)( viewport_width ) / (float)( viewport_height );
- glViewport( viewport_x, viewport_y, viewport_width, viewport_height );
-
- // save these as we'll need them later
- mWindowWidth = width;
- mWindowHeight = height;
-
- // adjust size of URL bar so it doesn't get clipped
- mUrlEdit->set_w( mWindowWidth - 360 );
-
- // GLUI requires this
- if ( glutGetWindow() != mAppWindow )
- glutSetWindow( mAppWindow );
-
- // trigger re-display
- glutPostRedisplay();
-};
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::bindTexture(GLuint texture, GLint row_length, GLint alignment)
-{
- glEnable( GL_TEXTURE_2D );
-
- glBindTexture( GL_TEXTURE_2D, texture );
- glPixelStorei( GL_UNPACK_ROW_LENGTH, row_length );
- glPixelStorei( GL_UNPACK_ALIGNMENT, alignment );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-bool LLMediaPluginTest::checkGLError(const char *name)
-{
- bool result = false;
- GLenum error = glGetError();
-
- if(error != GL_NO_ERROR)
- {
- // For some reason, glGenTextures is returning GL_INVALID_VALUE...
- std::cout << name << " ERROR 0x" << std::hex << error << std::dec << std::endl;
- result = true;
- }
-
- return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-GLfloat LLMediaPluginTest::distanceToCamera( GLfloat point_x, GLfloat point_y, GLfloat point_z )
-{
- GLdouble camera_pos_x = 0.0f;
- GLdouble camera_pos_y = 0.0f;
- GLdouble camera_pos_z = 0.0f;
-
- GLdouble modelMatrix[16];
- GLdouble projMatrix[16];
- GLint viewport[4];
-
- glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix);
- glGetDoublev(GL_PROJECTION_MATRIX, projMatrix);
- glGetIntegerv(GL_VIEWPORT, viewport);
-
- gluUnProject(
- (viewport[2]-viewport[0])/2 , (viewport[3]-viewport[1])/2,
- 0.0,
- modelMatrix, projMatrix, viewport,
- &camera_pos_x, &camera_pos_y, &camera_pos_z );
-
- GLfloat distance =
- sqrt( ( camera_pos_x - point_x ) * ( camera_pos_x - point_x ) +
- ( camera_pos_y - point_y ) * ( camera_pos_y - point_y ) +
- ( camera_pos_z - point_z ) * ( camera_pos_z - point_z ) );
-
- return distance;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::drawGeometry( int panel, bool selected )
-{
- // texture coordinates for each panel
- GLfloat non_opengl_texture_coords[ 8 ] = { 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f };
- GLfloat opengl_texture_coords[ 8 ] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f };
-
- GLfloat *texture_coords = mMediaPanels[ panel ]->mAppTextureCoordsOpenGL?opengl_texture_coords:non_opengl_texture_coords;
-
- // base coordinates for each panel
- GLfloat base_vertex_pos[ 8 ] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f };
-
- // calculate posiitons
- const int num_panels = (int)mMediaPanels.size();
- const int num_rows = (int)sqrt( (float)num_panels );
- const int num_cols = num_panels / num_rows;
- const int panel_x = ( panel / num_rows );
- const int panel_y = ( panel % num_rows );
-
- // default spacing is small - make it larger if checkbox set - for testing positional audio
- float spacing = 0.1f;
- if ( mLargePanelSpacing )
- spacing = 2.0f;
-
- const GLfloat offset_x = num_cols * ( 1.0 + spacing ) / 2;
- const GLfloat offset_y = num_rows * ( 1.0 + spacing ) / 2;
-
- // Adjust for media aspect ratios
- {
- float aspect = 1.0f;
-
- if(mMediaPanels[ panel ]->mMediaHeight != 0)
- {
- aspect = (float)mMediaPanels[ panel ]->mMediaWidth / (float)mMediaPanels[ panel ]->mMediaHeight;
- }
-
- if(aspect > 1.0f)
- {
- // media is wider than it is high -- adjust the top and bottom in
- for( int corner = 0; corner < 4; ++corner )
- {
- float temp = base_vertex_pos[corner * 2 + 1];
-
- if(temp < 0.5f)
- temp += 0.5 - (0.5f / aspect);
- else
- temp -= 0.5 - (0.5f / aspect);
-
- base_vertex_pos[corner * 2 + 1] = temp;
- }
- }
- else if(aspect < 1.0f)
- {
- // media is higher than it is wide -- adjust the left and right sides in
- for( int corner = 0; corner < 4; ++corner )
- {
- float temp = base_vertex_pos[corner * 2];
-
- if(temp < 0.5f)
- temp += 0.5f - (0.5f * aspect);
- else
- temp -= 0.5f - (0.5f * aspect);
-
- base_vertex_pos[corner * 2] = temp;
- }
- }
- }
-
- glBegin( GL_QUADS );
- for( int corner = 0; corner < 4; ++corner )
- {
- glTexCoord2f( texture_coords[ corner * 2 ], texture_coords[ corner * 2 + 1 ] );
- GLfloat x = base_vertex_pos[ corner * 2 ] + panel_x * ( 1.0 + spacing ) - offset_x + spacing / 2.0f;
- GLfloat y = base_vertex_pos[ corner * 2 + 1 ] + panel_y * ( 1.0 + spacing ) - offset_y + spacing / 2.0f;
-
- glVertex3f( x, y, 0.0f );
- };
- glEnd();
-
- // calculate distance to this panel if it's selected
- if ( selected )
- {
- GLfloat point_x = base_vertex_pos[ 0 ] + panel_x * ( 1.0 + spacing ) - offset_x + spacing / 2.0f;
- GLfloat point_y = base_vertex_pos[ 0 + 1 ] + panel_y * ( 1.0 + spacing ) - offset_y + spacing / 2.0f;
- GLfloat point_z = 0.0f;
- mDistanceCameraToSelectedGeometry = distanceToCamera( point_x, point_y, point_z );
- };
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::startPanelHighlight( float red, float green, float blue, float line_width )
-{
- glPushAttrib( GL_ALL_ATTRIB_BITS );
- glEnable( GL_POLYGON_OFFSET_FILL );
- glPolygonOffset( -2.5f, -2.5f );
- glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
- glLineWidth( line_width );
- glColor3f( red, green, blue );
- glDisable( GL_TEXTURE_2D );
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::endPanelHighlight()
-{
- glPopAttrib();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::draw( int draw_type )
-{
- for( int panel = 0; panel < (int)mMediaPanels.size(); ++panel )
- {
- // drawing pick texture
- if ( draw_type == DrawTypePickTexture )
- {
- // 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 )
- {
- glMatrixMode( GL_TEXTURE );
- glPushMatrix();
-
- // pick texture is a power of 2 so no need to scale
- glLoadIdentity();
-
- // bind to media texture
- glLoadIdentity();
- bindTexture( mMediaPanels[ panel ]->mPickTextureHandle );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
-
- // draw geometry using pick texture
- drawGeometry( panel, false );
-
- glMatrixMode( GL_TEXTURE );
- glPopMatrix();
- };
- }
- else
- if ( draw_type == DrawTypeMediaTexture )
- {
- bool texture_valid = false;
- bool plugin_exited = false;
-
- if(mMediaPanels[ panel ]->mMediaSource)
- {
- texture_valid = mMediaPanels[ panel ]->mMediaSource->textureValid();
- plugin_exited = mMediaPanels[ panel ]->mMediaSource->isPluginExited();
- }
-
- // save texture matrix (changes for each panel)
- glMatrixMode( GL_TEXTURE );
- glPushMatrix();
-
- // only process texture if the media is ready to draw
- // (we still want to draw the geometry)
- if ( mMediaPanels[ panel ]->mReadyToRender && texture_valid )
- {
- // bind to media texture
- bindTexture( mMediaPanels[ panel ]->mMediaTextureHandle );
-
- if ( mFuzzyMedia )
- {
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
- }
- else
- {
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
- }
-
- // scale to fit panel
- glScalef( mMediaPanels[ panel ]->mTextureScaleX,
- mMediaPanels[ panel ]->mTextureScaleY,
- 1.0f );
- };
-
- float intensity = plugin_exited?0.25f:1.0f;
-
- // highlight the selected panel
- if ( mSelectedPanel && ( mMediaPanels[ panel ]->mId == mSelectedPanel->mId ) )
- {
- startPanelHighlight( intensity, intensity, 0.0f, 5.0f );
- drawGeometry( panel, true );
- endPanelHighlight();
- }
- else
- // this panel not able to render yet since it
- // doesn't have enough information
- if ( !mMediaPanels[ panel ]->mReadyToRender )
- {
- startPanelHighlight( intensity, 0.0f, 0.0f, 2.0f );
- drawGeometry( panel, false );
- endPanelHighlight();
- }
- else
- // just display a border around the media
- {
- startPanelHighlight( 0.0f, intensity, 0.0f, 2.0f );
- drawGeometry( panel, false );
- endPanelHighlight();
- };
-
- if ( mMediaPanels[ panel ]->mReadyToRender && texture_valid )
- {
- // draw visual geometry
- drawGeometry( panel, false );
- }
-
- // restore texture matrix (changes for each panel)
- glMatrixMode( GL_TEXTURE );
- glPopMatrix();
- };
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::display()
-{
- // GLUI requires this
- if ( glutGetWindow() != mAppWindow )
- glutSetWindow( mAppWindow );
-
- // start with a clean slate
- glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
- glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
-
- // set up OpenGL view
- glMatrixMode( GL_PROJECTION );
- glLoadIdentity();
- glFrustum( -mViewportAspect * 0.04f, mViewportAspect * 0.04f, -0.04f, 0.04f, 0.1f, 50.0f );
- glMatrixMode( GL_MODELVIEW );
- glLoadIdentity();
- glTranslatef( 0.0, 0.0, 0.0f );
- glTranslatef( mViewPos[ 0 ], mViewPos[ 1 ], -mViewPos[ 2 ] );
- glMultMatrixf( mViewRotation );
-
- // draw pick texture
- draw( DrawTypePickTexture );
-
- // read colors and get coordinate values
- glReadPixels( mCurMouseX, mCurMouseY, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, mPixelReadColor );
-
- // clear the pick render (otherwise it may depth-fight with the textures rendered later)
- glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
-
- // draw visible geometry
- draw( DrawTypeMediaTexture );
-
- glutSwapBuffers();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::idle()
-{
-// checkGLError("LLMediaPluginTest::idle");
-
- // GLUI requires this
- if ( glutGetWindow() != mAppWindow )
- glutSetWindow( mAppWindow );
-
- // random creation/destruction of panels enabled?
- const time_t panel_timeout_time = 5;
- if ( mRandomPanelCount )
- {
- // time for a change
- static time_t last_panel_time = 0;
- if ( time( NULL ) - last_panel_time > panel_timeout_time )
- {
- if ( rand() % 2 == 0 )
- {
- if ( mMediaPanels.size() < 16 )
- {
- std::cout << "Randomly adding new panel" << std::endl;
- addMediaPanel( mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second );
- };
- }
- else
- {
- if ( mMediaPanels.size() > 0 )
- {
- std::cout << "Deleting selected panel" << std::endl;
- remMediaPanel( mSelectedPanel );
- };
- };
- time( &last_panel_time );
- };
- };
-
- // random selection of bookmarks enabled?
- const time_t bookmark_timeout_time = 5;
- if ( mRandomBookmarks )
- {
- // time for a change
- static time_t last_bookmark_time = 0;
- if ( time( NULL ) - last_bookmark_time > bookmark_timeout_time )
- {
- // go to a different random bookmark on each panel
- for( int panel = 0; panel < (int)mMediaPanels.size(); ++panel )
- {
- std::string uri = mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second;
-
- std::cout << "Random: navigating to : " << uri << std::endl;
-
- std::string mime_type = mimeTypeFromUrl( uri );
-
- if ( mime_type != mMediaPanels[ panel ]->mMimeType )
- {
- replaceMediaPanel( mMediaPanels[ panel ], uri );
- }
- else
- {
- mMediaPanels[ panel ]->mMediaSource->loadURI( uri );
- mMediaPanels[ panel ]->mMediaSource->start();
- };
- };
-
- time( &last_bookmark_time );
- };
- };
-
- // update UI
- if ( mSelectedPanel )
- {
- // set volume based on slider if we have time media
- //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+
- // down to 15. Not a problem for plugin system - only this test
- // enable/disable time based UI controls based on type of plugin
- if ( mSelectedPanel->mMediaSource->pluginSupportsMediaTime() )
- {
- if ( ! mGluiMediaTimeControlWindowFlag )
- {
- mGluiMediaTimeControlWindow->enable();
- mGluiMediaTimeControlWindowFlag = true;
- };
- }
- else
- {
- if ( mGluiMediaTimeControlWindowFlag )
- {
- mGluiMediaTimeControlWindow->disable();
- mGluiMediaTimeControlWindowFlag = false;
- };
- };
-
- // enable/disable browser based UI controls based on type of plugin
- if ( mSelectedPanel->mMediaSource->pluginSupportsMediaBrowser() )
- {
- if ( ! mGluiMediaBrowserControlWindowFlag )
- {
- mGluiMediaBrowserControlWindow->enable();
- mGluiMediaBrowserControlWindowFlag = true;
- };
- }
- else
- {
- if ( mGluiMediaBrowserControlWindowFlag )
- {
- mGluiMediaBrowserControlWindow->disable();
- mGluiMediaBrowserControlWindowFlag = false;
- };
- };
-
- // enable/disable browser back button depending on browser history
- if ( mSelectedPanel->mMediaSource->getHistoryBackAvailable() )
- {
- if ( ! mMediaBrowserControlBackButtonFlag )
- {
- mMediaBrowserControlBackButton->enable();
- mMediaBrowserControlBackButtonFlag = true;
- };
- }
- else
- {
- if ( mMediaBrowserControlBackButtonFlag )
- {
- mMediaBrowserControlBackButton->disable();
- mMediaBrowserControlBackButtonFlag = false;
- };
- };
-
- // enable/disable browser forward button depending on browser history
- if ( mSelectedPanel->mMediaSource->getHistoryForwardAvailable() )
- {
- if ( ! mMediaBrowserControlForwardButtonFlag )
- {
- mMediaBrowserControlForwardButton->enable();
- mMediaBrowserControlForwardButtonFlag = true;
- };
- }
- else
- {
- if ( mMediaBrowserControlForwardButtonFlag )
- {
- mMediaBrowserControlForwardButton->disable();
- mMediaBrowserControlForwardButtonFlag = false;
- };
- };
-
- // NOTE: This is *very* slow and not worth optimising
- updateStatusBar();
- };
-
- // update all the panels
- for( int panel_index = 0; panel_index < (int)mMediaPanels.size(); ++panel_index )
- {
- mediaPanel *panel = mMediaPanels[ panel_index ];
-
- // call plugins idle function so it can potentially update itself
- panel->mMediaSource->idle();
-
- // update each media panel
- updateMediaPanel( panel );
-
- LLRect dirty_rect;
- if ( ! panel->mMediaSource->textureValid() )
- {
- //std::cout << "texture invalid, skipping update..." << std::endl;
- }
- else
- if ( panel &&
- ( panel->mMediaWidth != panel->mMediaSource->getWidth() ||
- panel->mMediaHeight != panel->mMediaSource->getHeight() ) )
- {
- //std::cout << "Resize in progress, skipping update..." << std::endl;
- }
- else
- if ( panel->mMediaSource->getDirty( &dirty_rect ) )
- {
- const unsigned char* pixels = panel->mMediaSource->getBitsData();
- if ( pixels && isTexture(panel->mMediaTextureHandle))
- {
- int x_offset = dirty_rect.mLeft;
- int y_offset = dirty_rect.mBottom;
- int width = dirty_rect.mRight - dirty_rect.mLeft;
- int height = dirty_rect.mTop - dirty_rect.mBottom;
-
- if((dirty_rect.mRight <= panel->mTextureWidth) && (dirty_rect.mTop <= panel->mTextureHeight))
- {
- // Offset the pixels pointer properly
- pixels += ( y_offset * panel->mMediaSource->getTextureDepth() * panel->mMediaSource->getBitsWidth() );
- pixels += ( x_offset * panel->mMediaSource->getTextureDepth() );
-
- // set up texture
- bindTexture( panel->mMediaTextureHandle, panel->mMediaSource->getBitsWidth() );
- if ( mFuzzyMedia )
- {
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
- }
- else
- {
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
- };
-
- checkGLError("glTexParameteri");
-
- if(panel->mMediaSource->getTextureFormatSwapBytes())
- {
- glPixelStorei(GL_UNPACK_SWAP_BYTES, 1);
- checkGLError("glPixelStorei");
- }
-
- // draw portion that changes into texture
- glTexSubImage2D( GL_TEXTURE_2D, 0,
- x_offset,
- y_offset,
- width,
- height,
- panel->mMediaSource->getTextureFormatPrimary(),
- panel->mMediaSource->getTextureFormatType(),
- pixels );
-
- if(checkGLError("glTexSubImage2D"))
- {
- std::cerr << " panel ID=" << panel->mId << std::endl;
- std::cerr << " texture size = " << panel->mTextureWidth << " x " << panel->mTextureHeight << std::endl;
- std::cerr << " media size = " << panel->mMediaWidth << " x " << panel->mMediaHeight << std::endl;
- std::cerr << " dirty rect = " << dirty_rect.mLeft << ", " << dirty_rect.mBottom << ", " << dirty_rect.mRight << ", " << dirty_rect.mTop << std::endl;
- std::cerr << " texture width = " << panel->mMediaSource->getBitsWidth() << std::endl;
- std::cerr << " format primary = 0x" << std::hex << panel->mMediaSource->getTextureFormatPrimary() << std::dec << std::endl;
- std::cerr << " format type = 0x" << std::hex << panel->mMediaSource->getTextureFormatType() << std::dec << std::endl;
- std::cerr << " pixels = " << (void*)pixels << std::endl;
- }
-
- if(panel->mMediaSource->getTextureFormatSwapBytes())
- {
- glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);
- checkGLError("glPixelStorei");
- }
-
- panel->mMediaSource->resetDirty();
-
- panel->mReadyToRender = true;
- }
- else
- {
- std::cerr << "dirty rect is outside current media size, skipping update" << std::endl;
- }
- };
- };
- };
-
- // GLUI requires this
- if ( glutGetWindow() != mAppWindow )
- glutSetWindow( mAppWindow );
-
- // trigger re-display
- glutPostRedisplay();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::windowPosToTexturePos( int window_x, int window_y,
- int& media_x, int& media_y,
- int& id )
-{
- if ( ! mSelectedPanel )
- {
- media_x = 0;
- media_y = 0;
- id = 0;
- return;
- };
-
- // record cursor poisiton for a readback next frame
- mCurMouseX = window_x;
- // OpenGL app == coordinate system this way
- // NOTE: unrelated to settings in plugin - this
- // is just for this app
- mCurMouseY = mWindowHeight - window_y;
-
- // extract x (0..1023, y (0..1023) and id (0..15) from RGB components
- unsigned long pixel_read_color_bits = ( mPixelReadColor[ 0 ] << 16 ) | ( mPixelReadColor[ 1 ] << 8 ) | mPixelReadColor[ 2 ];
- int texture_x = pixel_read_color_bits & 0x3ff;
- int texture_y = ( pixel_read_color_bits >> 10 ) & 0x3ff;
- id = ( pixel_read_color_bits >> 20 ) & 0x0f;
-
- // scale to size of media (1024 because we use 10 bits for X and Y from 24)
- media_x = (int)( ( (float)mSelectedPanel->mMediaWidth * (float)texture_x ) / 1024.0f );
- media_y = (int)( ( (float)mSelectedPanel->mMediaHeight * (float)texture_y ) / 1024.0f );
-
- // we assume the plugin uses an inverted coordinate scheme like OpenGL
- // if not, the plugin code inverts the Y coordinate for us - we don't need to
- media_y = mSelectedPanel->mMediaHeight - media_y;
-
- if ( media_x > 0 && media_y > 0 )
- {
- //std::cout << " mouse coords: " << mCurMouseX << " x " << mCurMouseY << " and id = " << id << std::endl;
- //std::cout << "raw texture coords: " << texture_x << " x " << texture_y << " and id = " << id << std::endl;
- //std::cout << " media coords: " << media_x << " x " << media_y << " and id = " << id << std::endl;
- //std::cout << std::endl;
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::selectPanelById( int id )
-{
- for( int panel = 0; panel < (int)mMediaPanels.size(); ++panel )
- {
- if ( mMediaPanels[ panel ]->mId == id )
- {
- selectPanel(mMediaPanels[ panel ]);
- return;
- };
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::selectPanel( mediaPanel* panel )
-{
- if( mSelectedPanel == panel )
- return;
-
- // turn off volume before we delete it
- if( mSelectedPanel && mSelectedPanel->mMediaSource )
- {
- mSelectedPanel->mMediaSource->setVolume( 0.0f );
- mSelectedPanel->mMediaSource->setPriority( LLPluginClassMedia::PRIORITY_LOW );
- };
-
- mSelectedPanel = panel;
-
- if( mSelectedPanel && mSelectedPanel->mMediaSource )
- {
- mSelectedPanel->mMediaSource->setVolume( (float)mMediaTimeControlVolume / 100.0f );
- mSelectedPanel->mMediaSource->setPriority( LLPluginClassMedia::PRIORITY_NORMAL );
-
- if(!mSelectedPanel->mStartUrl.empty())
- {
- mUrlEdit->set_text(const_cast<char*>(mSelectedPanel->mStartUrl.c_str()) );
- }
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-mediaPanel* LLMediaPluginTest::findMediaPanel( LLPluginClassMedia* source )
-{
- mediaPanel *result = NULL;
-
- for( int panel = 0; panel < (int)mMediaPanels.size(); ++panel )
- {
- if ( mMediaPanels[ panel ]->mMediaSource == source )
- {
- result = mMediaPanels[ panel ];
- }
- }
-
- return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-mediaPanel* LLMediaPluginTest::findMediaPanel( const std::string &target_name )
-{
- mediaPanel *result = NULL;
-
- for( int panel = 0; panel < (int)mMediaPanels.size(); ++panel )
- {
- if ( mMediaPanels[ panel ]->mTarget == target_name )
- {
- result = mMediaPanels[ panel ];
- }
- }
-
- return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::navigateToNewURI( std::string uri )
-{
- if ( uri.length() )
- {
- std::string mime_type = mimeTypeFromUrl( uri );
-
- if ( !mSelectedPanel->mMediaSource->isPluginExited() && (mime_type == mSelectedPanel->mMimeType) )
- {
- std::cout << "MIME type is the same" << std::endl;
- mSelectedPanel->mMediaSource->loadURI( uri );
- mSelectedPanel->mMediaSource->start();
- mBookmarkList->do_selection( 0 );
- }
- else
- {
- std::cout << "MIME type changed or plugin had exited" << std::endl;
- replaceMediaPanel( mSelectedPanel, uri );
- mBookmarkList->do_selection( 0 );
- }
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::initUrlHistory( std::string uris )
-{
- if ( uris.length() > 0 )
- {
- std::cout << "init URL : " << uris << std::endl;
- LLSD historySD;
-
- char *cstr, *p;
- cstr = new char[uris.size()+1];
- strcpy(cstr, uris.c_str());
- const char *DELIMS = " ,;";
- p = strtok(cstr, DELIMS);
- while (p != NULL) {
- historySD.insert(0, p);
- p = strtok(NULL, DELIMS);
- }
- mSelectedPanel->mMediaSource->initializeUrlHistory(historySD);
- delete[] cstr;
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::gluiCallback( int control_id )
-{
- if ( control_id == mIdBookmarks )
- {
- std::string uri = mBookmarks[ mSelBookmark ].second;
-
- navigateToNewURI( uri );
- }
- else
- if ( control_id == mIdUrlEdit)
- {
- std::string uri = mUrlEdit->get_text();
-
- navigateToNewURI( uri );
- }
- else
- if ( control_id == mIdUrlInitHistoryEdit )
- {
- std::string uri = mUrlInitHistoryEdit->get_text();
-
- initUrlHistory( uri );
- }
- else
- if ( control_id == mIdControlAddPanel )
- {
- addMediaPanel( mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second );
- }
- else
- if ( control_id == mIdControlRemPanel )
- {
- remMediaPanel( mSelectedPanel );
- }
- else
- if ( control_id == mIdDisableTimeout )
- {
- // Set the "disable timeout" flag for all active plugins.
- for( int i = 0; i < (int)mMediaPanels.size(); ++i )
- {
- mMediaPanels[ i ]->mMediaSource->setDisableTimeout(mDisableTimeout);
- }
- }
- else
- if ( control_id == mIdUsePluginReadThread )
- {
- LLPluginProcessParent::setUseReadThread(mUsePluginReadThread);
- }
- else
- if ( control_id == mIdControlCrashPlugin )
- {
- // send message to plugin and ask it to crash
- // (switch out for ReleaseCandidate version :) )
- if(mSelectedPanel && mSelectedPanel->mMediaSource)
- {
- mSelectedPanel->mMediaSource->crashPlugin();
- }
- }
- else
- if ( control_id == mIdControlHangPlugin )
- {
- // send message to plugin and ask it to hang
- // (switch out for ReleaseCandidate version :) )
- if(mSelectedPanel && mSelectedPanel->mMediaSource)
- {
- mSelectedPanel->mMediaSource->hangPlugin();
- }
- }
- else
- if ( control_id == mIdControlExitApp )
- {
- // text for exiting plugin system cleanly
- delete this; // clean up
- exit( 0 );
- }
- else
- if ( control_id == mIdMediaTimeControlPlay )
- {
- if ( mSelectedPanel )
- {
- mSelectedPanel->mMediaSource->setLoop( false );
- mSelectedPanel->mMediaSource->start();
- };
- }
- else
- if ( control_id == mIdMediaTimeControlLoop )
- {
- if ( mSelectedPanel )
- {
- mSelectedPanel->mMediaSource->setLoop( true );
- mSelectedPanel->mMediaSource->start();
- };
- }
- else
- if ( control_id == mIdMediaTimeControlPause )
- {
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->pause();
- }
- else
- if ( control_id == mIdMediaTimeControlStop )
- {
- if ( mSelectedPanel )
- {
- mSelectedPanel->mMediaSource->stop();
- };
- }
- else
- if ( control_id == mIdMediaTimeControlSeek )
- {
- if ( mSelectedPanel )
- {
- // get value from spinner
- float seconds_to_seek = mMediaTimeControlSeekSeconds;
- mSelectedPanel->mMediaSource->seek( seconds_to_seek );
- mSelectedPanel->mMediaSource->start();
- };
- }
- else
- if ( control_id == mIdMediaTimeControlRewind )
- {
- if ( mSelectedPanel )
- {
- mSelectedPanel->mMediaSource->setLoop( false );
- mSelectedPanel->mMediaSource->start(-2.0f);
- };
- }
- else
- if ( control_id == mIdMediaTimeControlFastForward )
- {
- if ( mSelectedPanel )
- {
- mSelectedPanel->mMediaSource->setLoop( false );
- mSelectedPanel->mMediaSource->start(2.0f);
- };
- }
- else
- if ( control_id == mIdMediaBrowserControlBack )
- {
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->browse_back();
- }
- else
- if ( control_id == mIdMediaBrowserControlStop )
- {
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->browse_stop();
- }
- else
- if ( control_id == mIdMediaBrowserControlForward )
- {
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->browse_forward();
- }
- else
- if ( control_id == mIdMediaBrowserControlHome )
- {
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->loadURI( mHomeWebUrl );
- }
- else
- if ( control_id == mIdMediaBrowserControlReload )
- {
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->browse_reload( true );
- }
- else
- if ( control_id == mIdMediaBrowserControlClearCache )
- {
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->clear_cache();
- }
- else
- if ( control_id == mIdMediaBrowserControlClearCookies )
- {
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->clear_cookies();
- }
- else
- if ( control_id == mIdMediaBrowserControlEnableCookies )
- {
- if ( mSelectedPanel )
- {
- if ( mMediaBrowserControlEnableCookies )
- {
- mSelectedPanel->mMediaSource->enable_cookies( true );
- }
- else
- {
- mSelectedPanel->mMediaSource->enable_cookies( false );
- }
- };
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::keyboard( int key )
-{
- //if ( key == 'a' || key == 'A' )
- // addMediaPanel( mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second );
- //else
- //if ( key == 'r' || key == 'R' )
- // remMediaPanel( mSelectedPanel );
- //else
- //if ( key == 'd' || key == 'D' )
- // dumpPanelInfo();
- //else
- if ( key == 27 )
- {
- std::cout << "Application finished - exiting..." << std::endl;
- delete this;
- exit( 0 );
- };
-
- mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_DOWN, key, 0 , LLSD());
- mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_UP, key, 0, LLSD());
-};
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::mouseButton( int button, int state, int x, int y )
-{
- if ( button == GLUT_LEFT_BUTTON )
- {
- if ( state == GLUT_DOWN )
- {
- int media_x, media_y, id;
- windowPosToTexturePos( x, y, media_x, media_y, id );
-
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_DOWN, 0, media_x, media_y, 0 );
- }
- else
- if ( state == GLUT_UP )
- {
- int media_x, media_y, id;
- windowPosToTexturePos( x, y, media_x, media_y, id );
-
- // only select a panel if we're on a panel
- // (HACK: strictly speaking this rules out clicking on
- // the origin of a panel but that's very unlikely)
- if ( media_x > 0 && media_y > 0 )
- {
- selectPanelById( id );
-
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_UP, 0, media_x, media_y, 0 );
- };
- };
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::mousePassive( int x, int y )
-{
- int media_x, media_y, id;
- windowPosToTexturePos( x, y, media_x, media_y, id );
-
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_MOVE, 0, media_x, media_y, 0 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::mouseMove( int x, int y )
-{
- int media_x, media_y, id;
- windowPosToTexturePos( x, y, media_x, media_y, id );
-
- if ( mSelectedPanel )
- mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_MOVE, 0, media_x, media_y, 0 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::makeChrome()
-{
- // IDs used by GLUI
- int start_id = 0x1000;
-
- // right side window - geometry manipulators
-#if __APPLE__
- // the Apple GLUT implementation doesn't seem to set the graphic offset of subwindows correctly when they overlap in certain ways.
- // Use a separate controls window in this case.
- // GLUI window at right containing manipulation controls and other buttons
- int x = glutGet(GLUT_WINDOW_X) + glutGet(GLUT_WINDOW_WIDTH) + 4;
- int y = glutGet(GLUT_WINDOW_Y);
- GLUI* right_glui_window = GLUI_Master.create_glui( "", 0, x, y );
-#else
- GLUI* right_glui_window = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_RIGHT );
-#endif
- mViewRotationCtrl = right_glui_window->add_rotation( "Rotation", mViewRotation );
- mViewTranslationCtrl = right_glui_window->add_translation( "Translate", GLUI_TRANSLATION_XY, mViewPos );
- mViewTranslationCtrl->set_speed( 0.01f );
- mViewScaleCtrl = right_glui_window->add_translation( "Scale", GLUI_TRANSLATION_Z, &mViewPos[ 2 ] );
- mViewScaleCtrl->set_speed( 0.05f );
- right_glui_window->set_main_gfx_window( mAppWindow );
-
- // right side window - app controls
- mIdControlAddPanel = start_id++;
- right_glui_window->add_statictext( "" );
- right_glui_window->add_separator();
- right_glui_window->add_statictext( "" );
- right_glui_window->add_button( "Add panel", mIdControlAddPanel, gluiCallbackWrapper );
- right_glui_window->add_statictext( "" );
- mIdControlRemPanel = start_id++;
- right_glui_window->add_button( "Rem panel", mIdControlRemPanel, gluiCallbackWrapper );
- right_glui_window->add_statictext( "" );
- right_glui_window->add_separator();
- right_glui_window->add_statictext( "" );
- mIdControlCrashPlugin = start_id++;
- right_glui_window->add_button( "Crash plugin", mIdControlCrashPlugin, gluiCallbackWrapper );
- mIdControlHangPlugin = start_id++;
- right_glui_window->add_button( "Hang plugin", mIdControlHangPlugin, gluiCallbackWrapper );
-
- right_glui_window->add_statictext( "" );
- right_glui_window->add_separator();
- right_glui_window->add_statictext( "" );
- mIdControlExitApp = start_id++;
- right_glui_window->add_button( "Exit app", mIdControlExitApp, gluiCallbackWrapper );
-
- //// top window - holds bookmark UI
- mIdBookmarks = start_id++;
- mSelBookmark = 0;
- GLUI* glui_window_top = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_TOP );
- mBookmarkList = glui_window_top->add_listbox( "", &mSelBookmark, mIdBookmarks, gluiCallbackWrapper );
- // only add the first 50 bookmarks - list can be very long sometimes (30,000+)
- // when testing list of media URLs from AGNI for example
- for( unsigned int each = 0; each < mBookmarks.size() && each < 50; ++each )
- mBookmarkList->add_item( each, const_cast< char* >( mBookmarks[ each ].first.c_str() ) );
- glui_window_top->set_main_gfx_window( mAppWindow );
-
- glui_window_top->add_column( false );
- mIdUrlEdit = start_id++;
- mUrlEdit = glui_window_top->add_edittext( "Url:", GLUI_EDITTEXT_TEXT, 0, mIdUrlEdit, gluiCallbackWrapper );
- mUrlEdit->set_w( 600 );
- GLUI* glui_window_top2 = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_TOP );
- mIdUrlInitHistoryEdit = start_id++;
- mUrlInitHistoryEdit = glui_window_top2->add_edittext( "Init History (separate by commas or semicolons):",
- GLUI_EDITTEXT_TEXT, 0, mIdUrlInitHistoryEdit, gluiCallbackWrapper );
- mUrlInitHistoryEdit->set_w( 800 );
-
- // top window - media controls for "time" media types (e.g. movies)
- mGluiMediaTimeControlWindow = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_TOP );
- mGluiMediaTimeControlWindow->set_main_gfx_window( mAppWindow );
- mIdMediaTimeControlPlay = start_id++;
- mGluiMediaTimeControlWindow->add_button( "PLAY", mIdMediaTimeControlPlay, gluiCallbackWrapper );
- mGluiMediaTimeControlWindow->add_column( false );
- mIdMediaTimeControlLoop = start_id++;
- mGluiMediaTimeControlWindow->add_button( "LOOP", mIdMediaTimeControlLoop, gluiCallbackWrapper );
- mGluiMediaTimeControlWindow->add_column( false );
- mIdMediaTimeControlPause = start_id++;
- mGluiMediaTimeControlWindow->add_button( "PAUSE", mIdMediaTimeControlPause, gluiCallbackWrapper );
- mGluiMediaTimeControlWindow->add_column( false );
-
- GLUI_Button *button;
- mIdMediaTimeControlRewind = start_id++;
- button = mGluiMediaTimeControlWindow->add_button( "<<", mIdMediaTimeControlRewind, gluiCallbackWrapper );
- button->set_w(30);
- mGluiMediaTimeControlWindow->add_column( false );
- mIdMediaTimeControlFastForward = start_id++;
- button = mGluiMediaTimeControlWindow->add_button( ">>", mIdMediaTimeControlFastForward, gluiCallbackWrapper );
- button->set_w(30);
-
- mGluiMediaTimeControlWindow->add_column( true );
-
- mIdMediaTimeControlStop = start_id++;
- mGluiMediaTimeControlWindow->add_button( "STOP", mIdMediaTimeControlStop, gluiCallbackWrapper );
- mGluiMediaTimeControlWindow->add_column( false );
- mIdMediaTimeControlVolume = start_id++;
- GLUI_Spinner* spinner = mGluiMediaTimeControlWindow->add_spinner( "Volume", 2, &mMediaTimeControlVolume, mIdMediaTimeControlVolume, gluiCallbackWrapper);
- spinner->set_float_limits( 0, 100 );
- mGluiMediaTimeControlWindow->add_column( true );
- mIdMediaTimeControlSeekSeconds = start_id++;
- spinner = mGluiMediaTimeControlWindow->add_spinner( "", 2, &mMediaTimeControlSeekSeconds, mIdMediaTimeControlSeekSeconds, gluiCallbackWrapper);
- spinner->set_float_limits( 0, 200 );
- spinner->set_w( 32 );
- spinner->set_speed( 0.025f );
- mGluiMediaTimeControlWindow->add_column( false );
- mIdMediaTimeControlSeek = start_id++;
- mGluiMediaTimeControlWindow->add_button( "SEEK", mIdMediaTimeControlSeek, gluiCallbackWrapper );
- mGluiMediaTimeControlWindow->add_column( false );
-
-
- // top window - media controls for "browser" media types (e.g. web browser)
- mGluiMediaBrowserControlWindow = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_TOP );
- mGluiMediaBrowserControlWindow->set_main_gfx_window( mAppWindow );
- mIdMediaBrowserControlBack = start_id++;
- mMediaBrowserControlBackButton = mGluiMediaBrowserControlWindow->add_button( "BACK", mIdMediaBrowserControlBack, gluiCallbackWrapper );
- mGluiMediaBrowserControlWindow->add_column( false );
- mIdMediaBrowserControlStop = start_id++;
- mGluiMediaBrowserControlWindow->add_button( "STOP", mIdMediaBrowserControlStop, gluiCallbackWrapper );
- mGluiMediaBrowserControlWindow->add_column( false );
- mIdMediaBrowserControlForward = start_id++;
- mMediaBrowserControlForwardButton = mGluiMediaBrowserControlWindow->add_button( "FORWARD", mIdMediaBrowserControlForward, gluiCallbackWrapper );
- mGluiMediaBrowserControlWindow->add_column( false );
- mIdMediaBrowserControlHome = start_id++;
- mGluiMediaBrowserControlWindow->add_button( "HOME", mIdMediaBrowserControlHome, gluiCallbackWrapper );
- mGluiMediaBrowserControlWindow->add_column( false );
- mIdMediaBrowserControlReload = start_id++;
- mGluiMediaBrowserControlWindow->add_button( "RELOAD", mIdMediaBrowserControlReload, gluiCallbackWrapper );
- mGluiMediaBrowserControlWindow->add_column( false );
- mIdMediaBrowserControlClearCache = start_id++;
- mGluiMediaBrowserControlWindow->add_button( "CLEAR CACHE", mIdMediaBrowserControlClearCache, gluiCallbackWrapper );
- mGluiMediaBrowserControlWindow->add_column( false );
- mIdMediaBrowserControlClearCookies = start_id++;
- mGluiMediaBrowserControlWindow->add_button( "CLEAR COOKIES", mIdMediaBrowserControlClearCookies, gluiCallbackWrapper );
- mGluiMediaBrowserControlWindow->add_column( false );
- mIdMediaBrowserControlEnableCookies = start_id++;
- mMediaBrowserControlEnableCookies = 0;
- mGluiMediaBrowserControlWindow->add_checkbox( "Enable Cookies", &mMediaBrowserControlEnableCookies, mIdMediaBrowserControlEnableCookies, gluiCallbackWrapper );
-
- // top window - misc controls
- GLUI* glui_window_misc_control = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_TOP );
- mIdRandomPanelCount = start_id++;
- mRandomPanelCount = 0;
- glui_window_misc_control->add_checkbox( "Randomize panel count", &mRandomPanelCount, mIdRandomPanelCount, gluiCallbackWrapper );
- glui_window_misc_control->set_main_gfx_window( mAppWindow );
- glui_window_misc_control->add_column( true );
- mIdRandomBookmarks = start_id++;
- mRandomBookmarks = 0;
- glui_window_misc_control->add_checkbox( "Randomize bookmarks", &mRandomBookmarks, mIdRandomBookmarks, gluiCallbackWrapper );
- glui_window_misc_control->set_main_gfx_window( mAppWindow );
- glui_window_misc_control->add_column( true );
-
- mIdDisableTimeout = start_id++;
- mDisableTimeout = 0;
- glui_window_misc_control->add_checkbox( "Disable plugin timeout", &mDisableTimeout, mIdDisableTimeout, gluiCallbackWrapper );
- glui_window_misc_control->set_main_gfx_window( mAppWindow );
- glui_window_misc_control->add_column( true );
-
- mIdUsePluginReadThread = start_id++;
- mUsePluginReadThread = 0;
- glui_window_misc_control->add_checkbox( "Use plugin read thread", &mUsePluginReadThread, mIdUsePluginReadThread, gluiCallbackWrapper );
- glui_window_misc_control->set_main_gfx_window( mAppWindow );
- glui_window_misc_control->add_column( true );
-
- mIdLargePanelSpacing = start_id++;
- mLargePanelSpacing = 0;
- glui_window_misc_control->add_checkbox( "Large Panel Spacing", &mLargePanelSpacing, mIdLargePanelSpacing, gluiCallbackWrapper );
- glui_window_misc_control->set_main_gfx_window( mAppWindow );
- glui_window_misc_control->add_column( true );
-
- // bottom window - status
- mBottomGLUIWindow = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_BOTTOM );
- mStatusText = mBottomGLUIWindow->add_statictext( "" );
- mBottomGLUIWindow->set_main_gfx_window( mAppWindow );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::resetView()
-{
- mViewRotationCtrl->reset();
-
- mViewScaleCtrl->set_x( 0.0f );
- mViewScaleCtrl->set_y( 0.0f );
- mViewScaleCtrl->set_z( 3.0f );
-
- mViewTranslationCtrl->set_x( 0.0f );
- mViewTranslationCtrl->set_y( 0.0f );
- mViewTranslationCtrl->set_z( 0.0f );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::makePickTexture( int id, GLuint* texture_handle, unsigned char** texture_pixels )
-{
- int pick_texture_width = 1024;
- int pick_texture_height = 1024;
- int pick_texture_depth = 3;
- unsigned char* ptr = new unsigned char[ pick_texture_width * pick_texture_height * pick_texture_depth ];
- for( int y = 0; y < pick_texture_height; ++y )
- {
- for( int x = 0; x < pick_texture_width * pick_texture_depth ; x += pick_texture_depth )
- {
- unsigned long bits = 0L;
- bits |= ( id << 20 ) | ( y << 10 ) | ( x / 3 );
- unsigned char r_component = ( bits >> 16 ) & 0xff;
- unsigned char g_component = ( bits >> 8 ) & 0xff;
- unsigned char b_component = bits & 0xff;
-
- ptr[ y * pick_texture_width * pick_texture_depth + x + 0 ] = r_component;
- ptr[ y * pick_texture_width * pick_texture_depth + x + 1 ] = g_component;
- ptr[ y * pick_texture_width * pick_texture_depth + x + 2 ] = b_component;
- };
- };
-
- glGenTextures( 1, texture_handle );
-
- checkGLError("glGenTextures");
- std::cout << "glGenTextures returned " << *texture_handle << std::endl;
-
- bindTexture( *texture_handle );
- glTexImage2D( GL_TEXTURE_2D, 0,
- GL_RGB,
- pick_texture_width, pick_texture_height,
- 0, GL_RGB, GL_UNSIGNED_BYTE, ptr );
-
- *texture_pixels = ptr;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-std::string LLMediaPluginTest::mimeTypeFromUrl( std::string& url )
-{
- // default to web
- std::string mime_type = "text/html";
-
- // we may need a more advanced MIME type accessor later :-)
- if ( url.find( ".mov" ) != std::string::npos ) // Movies
- mime_type = "video/quicktime";
- else
- if ( url.find( ".txt" ) != std::string::npos ) // Apple Text descriptors
- mime_type = "video/quicktime";
- else
- if ( url.find( ".mp3" ) != 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;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-std::string LLMediaPluginTest::pluginNameFromMimeType( std::string& mime_type )
-{
-#if LL_DARWIN
- std::string plugin_name( "media_plugin_null.dylib" );
- if ( mime_type == "video/quicktime" )
- plugin_name = "media_plugin_quicktime.dylib";
- else
- if ( mime_type == "text/html" )
- plugin_name = "media_plugin_webkit.dylib";
-
-#elif LL_WINDOWS
- std::string plugin_name( "media_plugin_null.dll" );
-
- if ( mime_type == "video/quicktime" )
- plugin_name = "media_plugin_quicktime.dll";
- 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" );
-
- if ( mime_type == "video/quicktime" )
- plugin_name = "libmedia_plugin_quicktime.so";
- else
- if ( mime_type == "text/html" )
- plugin_name = "libmedia_plugin_webkit.so";
-#endif
- return plugin_name;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-mediaPanel* LLMediaPluginTest::addMediaPanel( std::string url )
-{
- // Get the plugin filename using the URL
- std::string mime_type = mimeTypeFromUrl( url );
- std::string plugin_name = pluginNameFromMimeType( mime_type );
-
- // create a random size for the new media
- int media_width;
- int media_height;
- getRandomMediaSize( media_width, media_height, mime_type );
-
- // make a new plugin
- LLPluginClassMedia* media_source = new LLPluginClassMedia(this);
-
- // tell the plugin what size we asked for
- media_source->setSize( media_width, media_height );
-
- // Use the launcher start and initialize the plugin
-#if LL_DARWIN || LL_LINUX
- std::string launcher_name( "SLPlugin" );
-#elif LL_WINDOWS
- std::string launcher_name( "SLPlugin.exe" );
-#endif
-
- // for this test app, use the cwd as the user data path (ugh).
-#if LL_WINDOWS
- std::string user_data_path = ".\\";
-#else
- char cwd[ FILENAME_MAX ];
- if (NULL == getcwd( cwd, FILENAME_MAX - 1 ))
- {
- std::cerr << "Couldn't get cwd - probably too long - failing to init." << std::endl;
- return NULL;
- }
- std::string user_data_path = std::string( cwd ) + "/";
-#endif
- media_source->setUserDataPath(user_data_path);
- media_source->init( launcher_name, user_data_path, plugin_name, false );
- media_source->setDisableTimeout(mDisableTimeout);
-
- // make a new panel and save parameters
- mediaPanel* panel = new mediaPanel;
- panel->mMediaSource = media_source;
- panel->mStartUrl = url;
- panel->mMimeType = mime_type;
- panel->mMediaWidth = media_width;
- panel->mMediaHeight = media_height;
- panel->mTextureWidth = 0;
- panel->mTextureHeight = 0;
- panel->mTextureScaleX = 0;
- panel->mTextureScaleY = 0;
- panel->mMediaTextureHandle = 0;
- panel->mPickTextureHandle = 0;
- panel->mAppTextureCoordsOpenGL = false; // really need an 'undefined' state here too
- panel->mReadyToRender = false;
-
- // look through current media panels to find an unused index number
- bool id_exists = true;
- for( int nid = 0; nid < mMaxPanels; ++nid )
- {
- // does this id exist already?
- id_exists = false;
- for( int pid = 0; pid < (int)mMediaPanels.size(); ++pid )
- {
- if ( nid == mMediaPanels[ pid ]->mId )
- {
- id_exists = true;
- break;
- };
- };
-
- // id wasn't found so we can use it
- if ( ! id_exists )
- {
- panel->mId = nid;
- break;
- };
- };
-
- // if we get here and this flag is set, there is no room for any more panels
- if ( id_exists )
- {
- std::cout << "No room for any more panels" << std::endl;
- }
- else
- {
- // now we have the ID we can use it to make the
- // pick texture (id is baked into texture pixels)
- makePickTexture( panel->mId, &panel->mPickTextureHandle, &panel->mPickTexturePixels );
-
- // save this in the list of panels
- mMediaPanels.push_back( panel );
-
- // select the panel that was just created
- selectPanel( panel );
-
- // load and start the URL
- panel->mMediaSource->loadURI( url );
- panel->mMediaSource->start();
-
- std::cout << "Adding new media panel for " << url << "(" << media_width << "x" << media_height << ") with index " << panel->mId << " - total panels = " << mMediaPanels.size() << std::endl;
- }
-
- return panel;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::updateMediaPanel( mediaPanel* panel )
-{
-// checkGLError("LLMediaPluginTest::updateMediaPanel");
-
- if ( ! panel )
- return;
-
- if(!panel->mMediaSource || !panel->mMediaSource->textureValid())
- {
- panel->mReadyToRender = false;
- return;
- }
-
- // take a reference copy of the plugin values since they
- // might change during this lifetime of this function
- int plugin_media_width = panel->mMediaSource->getWidth();
- int plugin_media_height = panel->mMediaSource->getHeight();
- int plugin_texture_width = panel->mMediaSource->getBitsWidth();
- int plugin_texture_height = panel->mMediaSource->getBitsHeight();
-
- // If the texture isn't created or the media or texture dimensions changed AND
- // the sizes are valid then we need to delete the old media texture (if necessary)
- // then make a new one.
- if ((panel->mMediaTextureHandle == 0 ||
- panel->mMediaWidth != plugin_media_width ||
- panel->mMediaHeight != plugin_media_height ||
- panel->mTextureWidth != plugin_texture_width ||
- panel->mTextureHeight != plugin_texture_height) &&
- ( plugin_media_width > 0 && plugin_media_height > 0 &&
- plugin_texture_width > 0 && plugin_texture_height > 0 ) )
- {
- std::cout << "Valid media size (" << plugin_media_width << " x " << plugin_media_height
- << ") and texture size (" << plugin_texture_width << " x " << plugin_texture_height
- << ") for panel with ID=" << panel->mId << " - making texture" << std::endl;
-
- // delete old GL texture
- if ( isTexture( panel->mMediaTextureHandle ) )
- {
- std::cerr << "updateMediaPanel: deleting texture " << panel->mMediaTextureHandle << std::endl;
- glDeleteTextures( 1, &panel->mMediaTextureHandle );
- panel->mMediaTextureHandle = 0;
- }
-
- std::cerr << "before: pick texture is " << panel->mPickTextureHandle << ", media texture is " << panel->mMediaTextureHandle << std::endl;
-
- // make a GL texture based on the dimensions the plugin told us
- GLuint new_texture = 0;
- glGenTextures( 1, &new_texture );
-
- checkGLError("glGenTextures");
-
- std::cout << "glGenTextures returned " << new_texture << std::endl;
-
- panel->mMediaTextureHandle = new_texture;
-
- bindTexture( panel->mMediaTextureHandle );
-
- std::cout << "Setting texture size to " << plugin_texture_width << " x " << plugin_texture_height << std::endl;
- glTexImage2D( GL_TEXTURE_2D, 0,
- GL_RGB,
- plugin_texture_width, plugin_texture_height,
- 0, GL_RGB, GL_UNSIGNED_BYTE,
- 0 );
-
-
- std::cerr << "after: pick texture is " << panel->mPickTextureHandle << ", media texture is " << panel->mMediaTextureHandle << std::endl;
- };
-
- // update our record of the media and texture dimensions
- // NOTE: do this after we we check for sizes changes
- panel->mMediaWidth = plugin_media_width;
- panel->mMediaHeight = plugin_media_height;
- panel->mTextureWidth = plugin_texture_width;
- panel->mTextureHeight = plugin_texture_height;
- if ( plugin_texture_width > 0 )
- {
- panel->mTextureScaleX = (double)panel->mMediaWidth / (double)panel->mTextureWidth;
- };
- if ( plugin_texture_height > 0 )
- {
- panel->mTextureScaleY = (double)panel->mMediaHeight / (double)panel->mTextureHeight;
- };
-
- // update the flag which tells us if the media source uses OprnGL coords or not.
- panel->mAppTextureCoordsOpenGL = panel->mMediaSource->getTextureCoordsOpenGL();
-
- // Check to see if we have enough to render this panel.
- // If we do, set a flag that the display functions use so
- // they only render a panel with media if it's ready.
- if ( panel->mMediaWidth < 0 ||
- panel->mMediaHeight < 0 ||
- panel->mTextureWidth < 1 ||
- panel->mTextureHeight < 1 ||
- panel->mMediaTextureHandle == 0 )
- {
- panel->mReadyToRender = false;
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-mediaPanel* LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url )
-{
- // no media panels so we can't change anything - have to add
- if ( mMediaPanels.size() == 0 )
- return NULL;
-
- // sanity check
- if ( ! panel )
- return NULL;
-
- int index;
- for(index = 0; index < (int)mMediaPanels.size(); index++)
- {
- if(mMediaPanels[index] == panel)
- break;
- }
-
- if(index >= (int)mMediaPanels.size())
- {
- // panel isn't in mMediaPanels
- return NULL;
- }
-
- std::cout << "Replacing media panel with index " << panel->mId << std::endl;
-
- int panel_id = panel->mId;
-
- if(mSelectedPanel == panel)
- mSelectedPanel = NULL;
-
- delete panel;
-
- // Get the plugin filename using the URL
- std::string mime_type = mimeTypeFromUrl( url );
- std::string plugin_name = pluginNameFromMimeType( mime_type );
-
- // create a random size for the new media
- int media_width;
- int media_height;
- getRandomMediaSize( media_width, media_height, mime_type );
-
- // make a new plugin
- LLPluginClassMedia* media_source = new LLPluginClassMedia(this);
-
- // tell the plugin what size we asked for
- media_source->setSize( media_width, media_height );
-
- // Use the launcher start and initialize the plugin
-#if LL_DARWIN || LL_LINUX
- std::string launcher_name( "SLPlugin" );
-#elif LL_WINDOWS
- std::string launcher_name( "SLPlugin.exe" );
-#endif
-
- // for this test app, use the cwd as the user data path (ugh).
-#if LL_WINDOWS
- std::string user_data_path = ".\\";
-#else
- char cwd[ FILENAME_MAX ];
- if (NULL == getcwd( cwd, FILENAME_MAX - 1 ))
- {
- std::cerr << "Couldn't get cwd - probably too long - failing to init." << std::endl;
- return NULL;
- }
- std::string user_data_path = std::string( cwd ) + "/";
-#endif
-
- media_source->setUserDataPath(user_data_path);
- media_source->init( launcher_name, user_data_path, plugin_name, false );
- media_source->setDisableTimeout(mDisableTimeout);
-
- // make a new panel and save parameters
- panel = new mediaPanel;
- panel->mMediaSource = media_source;
- panel->mStartUrl = url;
- panel->mMimeType = mime_type;
- panel->mMediaWidth = media_width;
- panel->mMediaHeight = media_height;
- panel->mTextureWidth = 0;
- panel->mTextureHeight = 0;
- panel->mTextureScaleX = 0;
- panel->mTextureScaleY = 0;
- panel->mMediaTextureHandle = 0;
- panel->mPickTextureHandle = 0;
- panel->mAppTextureCoordsOpenGL = false; // really need an 'undefined' state here too
- panel->mReadyToRender = false;
-
- panel->mId = panel_id;
-
- // Replace the entry in the panels array
- mMediaPanels[index] = panel;
-
- // now we have the ID we can use it to make the
- // pick texture (id is baked into texture pixels)
- makePickTexture( panel->mId, &panel->mPickTextureHandle, &panel->mPickTexturePixels );
-
- // select the panel that was just created
- selectPanel( panel );
-
- // load and start the URL
- panel->mMediaSource->loadURI( url );
- panel->mMediaSource->start();
-
- return panel;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::getRandomMediaSize( int& width, int& height, std::string mime_type )
-{
- // Make a new media source with a random size which we'll either
- // directly or the media plugin will tell us what it wants later.
- // Use a random size so we can test support for weird media sizes.
- // (Almost everything else will get filled in later once the
- // plugin responds)
- // NB. Do we need to enforce that width is on 4 pixel boundary?
- width = ( ( rand() % 170 ) + 30 ) * 4;
- height = ( ( rand() % 170 ) + 30 ) * 4;
-
- // adjust this random size if it's a browser so we get
- // a more useful size for testing..
- if ( mime_type == "text/html" || mime_type == "example/example" )
- {
- width = ( ( rand() % 100 ) + 100 ) * 4;
- height = ( width * ( ( rand() % 400 ) + 1000 ) ) / 1000;
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::remMediaPanel( mediaPanel* panel )
-{
- // always leave one panel
- if ( mMediaPanels.size() == 1 )
- return;
-
- // sanity check - don't think this can happen but see above for a case where it might...
- if ( ! panel )
- return;
-
- std::cout << "Removing media panel with index " << panel->mId << " - total panels = " << mMediaPanels.size() - 1 << std::endl;
-
- if(mSelectedPanel == panel)
- mSelectedPanel = NULL;
-
- delete panel;
-
- // remove from storage list
- for( int i = 0; i < (int)mMediaPanels.size(); ++i )
- {
- if ( mMediaPanels[ i ] == panel )
- {
- mMediaPanels.erase( mMediaPanels.begin() + i );
- break;
- };
- };
-
- // select the first panel
- selectPanel( mMediaPanels[ 0 ] );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::updateStatusBar()
-{
- if ( ! mSelectedPanel )
- return;
-
- // cache results - this is a very slow function
- static int cached_id = -1;
- static int cached_media_width = -1;
- static int cached_media_height = -1;
- static int cached_texture_width = -1;
- static int cached_texture_height = -1;
- static bool cached_supports_browser_media = true;
- static bool cached_supports_time_media = false;
- static int cached_movie_time = -1;
- static GLfloat cached_distance = -1.0f;
-
- static std::string cached_plugin_version = "";
- if (
- cached_id == mSelectedPanel->mId &&
- cached_media_width == mSelectedPanel->mMediaWidth &&
- cached_media_height == mSelectedPanel->mMediaHeight &&
- cached_texture_width == mSelectedPanel->mTextureWidth &&
- cached_texture_height == mSelectedPanel->mTextureHeight &&
- cached_supports_browser_media == mSelectedPanel->mMediaSource->pluginSupportsMediaBrowser() &&
- cached_supports_time_media == mSelectedPanel->mMediaSource->pluginSupportsMediaTime() &&
- cached_plugin_version == mSelectedPanel->mMediaSource->getPluginVersion() &&
- cached_movie_time == (int)mSelectedPanel->mMediaSource->getCurrentTime() &&
- cached_distance == mDistanceCameraToSelectedGeometry
- )
- {
- // nothing changed so don't spend time here
- return;
- };
-
- std::ostringstream stream( "" );
-
- stream.str( "" );
- stream.clear();
-
- stream << "Id: ";
- stream << std::setw( 2 ) << std::setfill( '0' );
- stream << mSelectedPanel->mId;
- stream << " | ";
- stream << "Media: ";
- stream << std::setw( 3 ) << std::setfill( '0' );
- stream << mSelectedPanel->mMediaWidth;
- stream << " x ";
- stream << std::setw( 3 ) << std::setfill( '0' );
- stream << mSelectedPanel->mMediaHeight;
- stream << " | ";
- stream << "Texture: ";
- stream << std::setw( 4 ) << std::setfill( '0' );
- stream << mSelectedPanel->mTextureWidth;
- stream << " x ";
- stream << std::setw( 4 ) << std::setfill( '0' );
- stream << mSelectedPanel->mTextureHeight;
-
- stream << " | ";
- stream << "Distance: ";
- stream << std::setw( 6 );
- stream << std::setprecision( 3 );
- stream << std::setprecision( 3 );
- stream << mDistanceCameraToSelectedGeometry;
- stream << " | ";
-
- if ( mSelectedPanel->mMediaSource->pluginSupportsMediaBrowser() )
- stream << "BROWSER";
- else
- if ( mSelectedPanel->mMediaSource->pluginSupportsMediaTime() )
- stream << "TIME ";
- stream << " | ";
- stream << mSelectedPanel->mMediaSource->getPluginVersion();
- stream << " | ";
- if ( mSelectedPanel->mMediaSource->pluginSupportsMediaTime() )
- {
- stream << std::setw( 3 ) << std::setfill( '0' );
- stream << (int)mSelectedPanel->mMediaSource->getCurrentTime();
- stream << " / ";
- stream << std::setw( 3 ) << std::setfill( '0' );
- stream << (int)mSelectedPanel->mMediaSource->getDuration();
- stream << " @ ";
- stream << (int)mSelectedPanel->mMediaSource->getCurrentPlayRate();
- stream << " | ";
- };
-
- glutSetWindow( mBottomGLUIWindow->get_glut_window_id() );
- mStatusText->set_text( const_cast< char*>( stream.str().c_str() ) );
- glutSetWindow( mAppWindow );
-
- // caching
- cached_id = mSelectedPanel->mId;
- cached_media_width = mSelectedPanel->mMediaWidth;
- cached_media_height = mSelectedPanel->mMediaHeight;
- cached_texture_width = mSelectedPanel->mTextureWidth;
- cached_texture_height = mSelectedPanel->mTextureHeight;
- cached_supports_browser_media = mSelectedPanel->mMediaSource->pluginSupportsMediaBrowser();
- cached_supports_time_media = mSelectedPanel->mMediaSource->pluginSupportsMediaTime();
- cached_plugin_version = mSelectedPanel->mMediaSource->getPluginVersion();
- cached_movie_time = (int)mSelectedPanel->mMediaSource->getCurrentTime();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::dumpPanelInfo()
-{
- std::cout << std::endl << "===== Media Panels =====" << std::endl;
- for( int i = 0; i < (int)mMediaPanels.size(); ++i )
- {
- std::cout << std::setw( 2 ) << std::setfill( '0' );
- std::cout << i + 1 << "> ";
- std::cout << "Id: ";
- std::cout << std::setw( 2 ) << std::setfill( '0' );
- std::cout << mMediaPanels[ i ]->mId;
- std::cout << " | ";
- std::cout << "Media: ";
- std::cout << std::setw( 3 ) << std::setfill( '0' );
- std::cout << mMediaPanels[ i ]->mMediaWidth;
- std::cout << " x ";
- std::cout << std::setw( 3 ) << std::setfill( '0' );
- std::cout << mMediaPanels[ i ]->mMediaHeight;
- std::cout << " | ";
- std::cout << "Texture: ";
- std::cout << std::setw( 4 ) << std::setfill( '0' );
- std::cout << mMediaPanels[ i ]->mTextureWidth;
- std::cout << " x ";
- std::cout << std::setw( 4 ) << std::setfill( '0' );
- std::cout << mMediaPanels[ i ]->mTextureHeight;
- std::cout << " | ";
- if ( mMediaPanels[ i ] == mSelectedPanel )
- std::cout << "(selected)";
-
- std::cout << std::endl;
- };
- std::cout << "========================" << std::endl;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaPluginTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
-{
- // Uncomment this to make things much, much quieter.
-// return;
-
- switch(event)
- {
- case MEDIA_EVENT_CONTENT_UPDATED:
- // too spammy -- don't log these
-// std::cerr << "Media event: MEDIA_EVENT_CONTENT_UPDATED " << std::endl;
- break;
-
- case MEDIA_EVENT_TIME_DURATION_UPDATED:
- // too spammy -- don't log these
-// std::cerr << "Media event: MEDIA_EVENT_TIME_DURATION_UPDATED, time is " << self->getCurrentTime() << " of " << self->getDuration() << std::endl;
- break;
-
- case MEDIA_EVENT_SIZE_CHANGED:
- std::cerr << "Media event: MEDIA_EVENT_SIZE_CHANGED " << std::endl;
- break;
-
- case MEDIA_EVENT_CURSOR_CHANGED:
- std::cerr << "Media event: MEDIA_EVENT_CURSOR_CHANGED, new cursor is " << self->getCursorName() << std::endl;
- break;
-
- case MEDIA_EVENT_NAVIGATE_BEGIN:
- std::cerr << "Media event: MEDIA_EVENT_NAVIGATE_BEGIN " << std::endl;
- break;
-
- case MEDIA_EVENT_NAVIGATE_COMPLETE:
- std::cerr << "Media event: MEDIA_EVENT_NAVIGATE_COMPLETE, result string is: " << self->getNavigateResultString() << std::endl;
- break;
-
- case MEDIA_EVENT_PROGRESS_UPDATED:
- std::cerr << "Media event: MEDIA_EVENT_PROGRESS_UPDATED, loading at " << self->getProgressPercent() << "%" << std::endl;
- break;
-
- case MEDIA_EVENT_STATUS_TEXT_CHANGED:
- std::cerr << "Media event: MEDIA_EVENT_STATUS_TEXT_CHANGED, new status text is: " << self->getStatusText() << std::endl;
- break;
-
- case MEDIA_EVENT_NAME_CHANGED:
- std::cerr << "Media event: MEDIA_EVENT_NAME_CHANGED, new name is: " << self->getMediaName() << std::endl;
- glutSetWindowTitle( self->getMediaName().c_str() );
- break;
-
- case MEDIA_EVENT_LOCATION_CHANGED:
- {
- std::cerr << "Media event: MEDIA_EVENT_LOCATION_CHANGED, new uri is: " << self->getLocation() << std::endl;
- mediaPanel* panel = findMediaPanel(self);
- if(panel != NULL)
- {
- panel->mStartUrl = self->getLocation();
- if(panel == mSelectedPanel)
- {
- mUrlEdit->set_text(const_cast<char*>(panel->mStartUrl.c_str()) );
- }
- }
- }
- break;
-
- case MEDIA_EVENT_NAVIGATE_ERROR_PAGE:
- std::cerr << "Media event: MEDIA_EVENT_NAVIGATE_ERROR_PAGE, uri is: " << self->getClickURL() << std::endl;
- break;
-
- case MEDIA_EVENT_CLICK_LINK_HREF:
- {
- std::cerr << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, uri is " << self->getClickURL() << ", target is " << self->getClickTarget() << std::endl;
- // retrieve the event parameters
- std::string url = self->getClickURL();
- std::string target = self->getClickTarget();
-
- if(target == "_external")
- {
- // this should open in an external browser, but since this is a test app we don't care.
- }
- else if(target == "_blank")
- {
- // Create a new panel with the specified URL.
- addMediaPanel(url);
- }
- else // other named target
- {
- mediaPanel *target_panel = findMediaPanel(target);
- if(target_panel)
- {
- target_panel = replaceMediaPanel(target_panel, url);
- }
- else
- {
- target_panel = addMediaPanel(url);
- }
-
- if(target_panel)
- {
- target_panel->mTarget = target;
- }
- }
- }
- break;
-
- case MEDIA_EVENT_CLICK_LINK_NOFOLLOW:
- std::cerr << "Media event: MEDIA_EVENT_CLICK_LINK_NOFOLLOW, uri is " << self->getClickURL() << std::endl;
- break;
-
- case MEDIA_EVENT_PLUGIN_FAILED:
- std::cerr << "Media event: MEDIA_EVENT_PLUGIN_FAILED" << std::endl;
- break;
-
- case MEDIA_EVENT_PLUGIN_FAILED_LAUNCH:
- std::cerr << "Media event: MEDIA_EVENT_PLUGIN_FAILED_LAUNCH" << std::endl;
- break;
-
- case MEDIA_EVENT_CLOSE_REQUEST:
- std::cerr << "Media event: MEDIA_EVENT_CLOSE_REQUEST" << std::endl;
- break;
-
- case MEDIA_EVENT_PICK_FILE_REQUEST:
- std::cerr << "Media event: MEDIA_EVENT_PICK_FILE_REQUEST" << std::endl;
- // TODO: display an actual file picker
- self->sendPickFileResponse("cake");
- break;
-
- case MEDIA_EVENT_GEOMETRY_CHANGE:
- std::cerr << "Media event: MEDIA_EVENT_GEOMETRY_CHANGE, uuid is " << self->getClickUUID()
- << ", x = " << self->getGeometryX()
- << ", y = " << self->getGeometryY()
- << ", width = " << self->getGeometryWidth()
- << ", height = " << self->getGeometryHeight()
- << std::endl;
- break;
-
- case MEDIA_EVENT_AUTH_REQUEST:
- {
- //std::cerr << "Media event: MEDIA_EVENT_AUTH_REQUEST, url " << self->getAuthURL() ", realm " << self->getAuthRealm() << std::endl;
-
- // TODO: display an auth dialog
- self->sendAuthResponse(false, "", "");
- }
- break;
-
- case MEDIA_EVENT_LINK_HOVERED:
- {
- std::cerr << "Media event: MEDIA_EVENT_LINK_HOVERED, hover text is: " << self->getHoverText() << std::endl;
- }
- break;
-
- default:
- {
- std::cerr << "Media event: <unknown>, code is: " << int(event) << std::endl;
- }
- break;
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-static void gluiCallbackWrapper( int control_id )
-{
- if ( gApplication )
- gApplication->gluiCallback( control_id );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void glutReshape( int width, int height )
-{
- if ( gApplication )
- gApplication->reshape( width, height );
-};
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void glutDisplay()
-{
- if ( gApplication )
- gApplication->display();
-};
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void glutIdle(int update_ms)
-{
- GLUI_Master.set_glutTimerFunc( update_ms, glutIdle, update_ms);
-
- if ( gApplication )
- gApplication->idle();
-
-};
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void glutKeyboard( unsigned char key, int x, int y )
-{
- if ( gApplication )
- gApplication->keyboard( key );
-};
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void glutMousePassive( int x, int y )
-{
- if ( gApplication )
- gApplication->mousePassive( x, y );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void glutMouseMove( int x , int y )
-{
- if ( gApplication )
- gApplication->mouseMove( x, y );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void glutMouseButton( int button, int state, int x, int y )
-{
- if ( gApplication )
- gApplication->mouseButton( button, state, x, y );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-int main( int argc, char* argv[] )
-{
-#if LL_DARWIN
- // Set the current working directory to <application bundle>/Contents/Resources/
- CFURLRef resources_url = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle());
- if(resources_url != NULL)
- {
- CFStringRef resources_string = CFURLCopyFileSystemPath(resources_url, kCFURLPOSIXPathStyle);
- CFRelease(resources_url);
- if(resources_string != NULL)
- {
- char buffer[PATH_MAX] = "";
- if(CFStringGetCString(resources_string, buffer, sizeof(buffer), kCFStringEncodingUTF8))
- {
- chdir(buffer);
- }
- CFRelease(resources_string);
- }
- }
-#endif
-
- glutInit( &argc, argv );
- glutInitDisplayMode( GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB );
-
- const int app_window_x = 80;
- const int app_window_y = 0;
- const int app_window_width = 960;
- const int app_window_height = 960;
-
- glutInitWindowPosition( app_window_x, app_window_y );
- glutInitWindowSize( app_window_width, app_window_height );
-
- int app_window_handle = glutCreateWindow( "LLMediaPluginTest" );
-
- glutDisplayFunc( glutDisplay );
-
- GLUI_Master.set_glutReshapeFunc( glutReshape );
- GLUI_Master.set_glutKeyboardFunc( glutKeyboard );
- GLUI_Master.set_glutMouseFunc( glutMouseButton );
-
- glutPassiveMotionFunc( glutMousePassive );
- glutMotionFunc( glutMouseMove );
-
- glutSetWindow( app_window_handle );
-
- gApplication = new LLMediaPluginTest( app_window_handle, app_window_width, app_window_height );
-
- // update at approximately 60hz
- int update_ms = 1000 / 60;
-
- GLUI_Master.set_glutTimerFunc( update_ms, glutIdle, update_ms);
-
- glutMainLoop();
-
- delete gApplication;
-}
diff --git a/indra/test_apps/llplugintest/llmediaplugintest.h b/indra/test_apps/llplugintest/llmediaplugintest.h
deleted file mode 100755
index 1f6f18e43c..0000000000
--- a/indra/test_apps/llplugintest/llmediaplugintest.h
+++ /dev/null
@@ -1,207 +0,0 @@
-/**
- * @file LLMediaPluginTest.cpp
- * @brief Primary test application for LLMedia (Separate Process) Plugin system
- *
- * $LicenseInfo:firstyear=2008&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_MEDIA_PLUGIN_TEST_H
-#define LL_MEDIA_PLUGIN_TEST_H
-
-#include <vector>
-#include <string>
-#include "llpluginclassmedia.h"
-#include "llgl.h"
-
-// Forward declarations
-class GLUI_Rotation;
-class GLUI_Translation;
-class GLUI_Listbox;
-class GLUI_EditText;
-class GLUI_StaticText;
-class GLUI;
-class GLUI_Button;
-
-////////////////////////////////////////////////////////////////////////////////
-//
-struct mediaPanel
-{
- public:
- mediaPanel();
- ~mediaPanel();
- int mId;
- std::string mStartUrl;
- std::string mMimeType;
- std::string mTarget;
- LLPluginClassMedia *mMediaSource;
- int mMediaWidth;
- int mMediaHeight;
- int mTextureWidth;
- int mTextureHeight;
- double mTextureScaleX;
- double mTextureScaleY;
- GLuint mMediaTextureHandle;
- GLuint mPickTextureHandle;
- unsigned char* mPickTexturePixels;
- bool mAppTextureCoordsOpenGL;
- bool mReadyToRender;
-};
-
-////////////////////////////////////////////////////////////////////////////////
-//
-class LLMediaPluginTest : public LLPluginClassMediaOwner
-{
- public:
- LLMediaPluginTest( int app_window, int window_width, int window_height );
- ~LLMediaPluginTest();
-
- void reshape( int width, int height );
- void display();
- void idle();
- void gluiCallback( int control_id );
- void keyboard( int key );
- void mousePassive( int x, int y );
- void mouseButton( int button, int state, int x, int y );
- void mouseMove( int x, int y );
-
- void bindTexture(GLuint texture, GLint row_length = 0, GLint alignment = 1);
- bool checkGLError(const char *name = "OpenGL");
- void drawGeometry( int panel, bool selected );
- void startPanelHighlight( float red, float green, float blue, float line_width );
- void endPanelHighlight();
- enum { DrawTypePickTexture, DrawTypeMediaTexture };
- void draw( int draw_type );
- void windowPosToTexturePos( int window_x, int window_y, int& media_x, int& media_y, int& id );
-
- mediaPanel* addMediaPanel( std::string url );
- void updateMediaPanel( mediaPanel* panel );
- void remMediaPanel( mediaPanel* panel );
- mediaPanel* replaceMediaPanel( mediaPanel* panel, std::string url );
- void getRandomMediaSize( int& width, int& height, std::string mime_type );
- void navigateToNewURI( std::string uri );
- void initUrlHistory( std::string uri );
- void selectPanelById( int id );
- void selectPanel( mediaPanel* panel );
- mediaPanel* findMediaPanel( LLPluginClassMedia* panel );
- mediaPanel* findMediaPanel( const std::string &target_name );
- void makePickTexture( int id, GLuint* texture_handle, unsigned char** texture_pixels );
- void makeChrome();
- void resetView();
-
- void dumpPanelInfo();
- void updateStatusBar();
-
- GLfloat distanceToCamera( GLfloat point_x, GLfloat point_y, GLfloat point_z );
-
-
- // Inherited from LLPluginClassMediaOwner
- /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, LLPluginClassMediaOwner::EMediaEvent);
-
- private:
- const int mVersionMajor;
- const int mVersionMinor;
- const int mVersionPatch;
- const int mMaxPanels;
- int mAppWindow;
- int mWindowWidth;
- int mWindowHeight;
- int mCurMouseX;
- int mCurMouseY;
- unsigned char mPixelReadColor[ 3 ];
- bool mFuzzyMedia;
- const std::string mHomeWebUrl;
-
- std::vector< mediaPanel* > mMediaPanels;
- mediaPanel* mSelectedPanel;
- std::string mimeTypeFromUrl( std::string& url );
- std::string pluginNameFromMimeType( std::string& mime_type );
-
- GLUI_Rotation* mViewRotationCtrl;
- GLUI_Translation* mViewScaleCtrl;
- GLUI_Translation* mViewTranslationCtrl;
- float mViewportAspect;
- float mViewPos[ 3 ];
- float mViewRotation[ 16 ];
-
- float mDistanceCameraToSelectedGeometry;
-
- int mIdControlAddPanel;
- int mIdControlRemPanel;
-
- std::vector< std::pair< std::string, std::string > > mBookmarks;
- GLUI_Listbox* mBookmarkList;
- int mIdBookmarks;
- int mIdUrlEdit;
- GLUI_EditText* mUrlEdit;
- int mIdUrlInitHistoryEdit;
- GLUI_EditText* mUrlInitHistoryEdit;
- int mSelBookmark;
- int mIdRandomPanelCount;
- int mRandomPanelCount;
- int mIdRandomBookmarks;
- int mRandomBookmarks;
- int mIdDisableTimeout;
- int mDisableTimeout;
- int mIdUsePluginReadThread;
- int mUsePluginReadThread;
- int mIdLargePanelSpacing;
- int mLargePanelSpacing;
- int mIdControlCrashPlugin;
- int mIdControlHangPlugin;
- int mIdControlExitApp;
-
- GLUI* mGluiMediaTimeControlWindow;
- int mIdMediaTimeControlPlay;
- int mIdMediaTimeControlLoop;
- int mIdMediaTimeControlPause;
- int mIdMediaTimeControlStop;
- int mIdMediaTimeControlSeek;
- int mIdMediaTimeControlVolume;
- int mMediaTimeControlVolume;
- int mIdMediaTimeControlSeekSeconds;
- int mMediaTimeControlSeekSeconds;
- int mIdMediaTimeControlRewind;
- int mIdMediaTimeControlFastForward;
-
- GLUI* mGluiMediaBrowserControlWindow;
- int mIdMediaBrowserControlBack;
- GLUI_Button* mMediaBrowserControlBackButton;
- int mIdMediaBrowserControlStop;
- int mIdMediaBrowserControlForward;
- GLUI_Button* mMediaBrowserControlForwardButton;
- bool mGluiMediaTimeControlWindowFlag;
- bool mGluiMediaBrowserControlWindowFlag;
- bool mMediaBrowserControlBackButtonFlag;
- bool mMediaBrowserControlForwardButtonFlag;
- int mIdMediaBrowserControlHome;
- int mIdMediaBrowserControlReload;
- int mIdMediaBrowserControlClearCache;
- int mIdMediaBrowserControlClearCookies;
- int mIdMediaBrowserControlEnableCookies;
- int mMediaBrowserControlEnableCookies;
-
- GLUI* mBottomGLUIWindow;
- GLUI_StaticText* mStatusText;
-};
-
-#endif // LL_MEDIA_PLUGIN_TEST_H
-