diff options
Diffstat (limited to 'indra')
64 files changed, 964 insertions, 408 deletions
| diff --git a/indra/cmake/BerkeleyDB.cmake b/indra/cmake/BerkeleyDB.cmake index d98e79179d..e3ca0fd77d 100644 --- a/indra/cmake/BerkeleyDB.cmake +++ b/indra/cmake/BerkeleyDB.cmake @@ -6,6 +6,11 @@ set(DB_FIND_REQUIRED ON)  if (STANDALONE)    include(FindBerkeleyDB)  else (STANDALONE) -  set(DB_LIBRARIES db-4.2) +  if (LINUX) +    # Need to add dependency pthread explicitely to support ld.gold. +    set(DB_LIBRARIES db-4.2 pthread) +  else (LINUX) +    set(DB_LIBRARIES db-4.2) +  endif (LINUX)    set(DB_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)  endif (STANDALONE) diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index 6470836286..3f421b270b 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -33,6 +33,7 @@ set(cmake_SOURCE_FILES      FindMySQL.cmake      FindOpenJPEG.cmake      FindXmlRpcEpi.cmake +    FindZLIB.cmake      FMOD.cmake      FreeType.cmake      GStreamer010Plugin.cmake diff --git a/indra/cmake/FindJsonCpp.cmake b/indra/cmake/FindJsonCpp.cmake index 9d16f2aaab..cf84b309c1 100644 --- a/indra/cmake/FindJsonCpp.cmake +++ b/indra/cmake/FindJsonCpp.cmake @@ -21,7 +21,12 @@ EXEC_PROGRAM(${CMAKE_CXX_COMPILER}              OUTPUT_STRIP_TRAILING_WHITESPACE              ) +# Try to find a library that was compiled with the same compiler version as we currently use.  SET(JSONCPP_NAMES ${JSONCPP_NAMES} libjson_linux-gcc-${_gcc_COMPILER_VERSION}_libmt.so) +IF (STANDALONE) +	# On standalone, assume that the system installed library was compiled with the used compiler. +	SET(JSONCPP_NAMES ${JSONCPP_NAMES} libjson.so) +ENDIF (STANDALONE)  FIND_LIBRARY(JSONCPP_LIBRARY    NAMES ${JSONCPP_NAMES}    PATHS /usr/lib /usr/local/lib diff --git a/indra/cmake/FindLLQtWebkit.cmake b/indra/cmake/FindLLQtWebkit.cmake new file mode 100644 index 0000000000..c747ec32a2 --- /dev/null +++ b/indra/cmake/FindLLQtWebkit.cmake @@ -0,0 +1,62 @@ +# -*- cmake -*- + +# - Find llqtwebkit +# Find the llqtwebkit includes and library +# This module defines +#  LLQTWEBKIT_INCLUDE_DIR, where to find llqtwebkit.h, etc. +#  LLQTWEBKIT_LIBRARY, the llqtwebkit library with full path. +#  LLQTWEBKIT_FOUND, If false, do not try to use llqtwebkit. +# also defined, but not for general use are +#  LLQTWEBKIT_LIBRARIES, the libraries needed to use llqtwebkit. +#  LLQTWEBKIT_LIBRARY_DIRS, where to find the llqtwebkit library. +#  LLQTWEBKIT_DEFINITIONS - You should add_definitions(${LLQTWEBKIT_DEFINITIONS}) +#      before compiling code that includes llqtwebkit library files. + +# Try to use pkg-config first. +# This allows to have two different libllqtwebkit packages installed: +# one for viewer 2.x and one for viewer 1.x. +include(FindPkgConfig) +if (PKG_CONFIG_FOUND) +    if (LLQtWebkit_FIND_REQUIRED AND LLQtWebkit_FIND_VERSION) +        set(_PACKAGE_ARGS libllqtwebkit>=${LLQtWebkit_FIND_VERSION} REQUIRED) +    else (LLQtWebkit_FIND_REQUIRED AND LLQtWebkit_FIND_VERSION) +        set(_PACKAGE_ARGS libllqtwebkit) +    endif (LLQtWebkit_FIND_REQUIRED AND LLQtWebkit_FIND_VERSION) +    if (NOT "${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" VERSION_LESS "2.8") +      # As virtually nobody will have a pkg-config file for this, do this check always quiet. +      # Unfortunately cmake 2.8 or higher is required for pkg_check_modules to have a 'QUIET'. +      set(_PACKAGE_ARGS ${_PACKAGE_ARGS} QUIET) +    endif () +    pkg_check_modules(LLQTWEBKIT ${_PACKAGE_ARGS}) +endif (PKG_CONFIG_FOUND) +set(LLQTWEBKIT_DEFINITIONS ${LLQTWEBKIT_CFLAGS_OTHER}) + +find_path(LLQTWEBKIT_INCLUDE_DIR llqtwebkit.h NO_SYSTEM_ENVIRONMENT_PATH HINTS ${LLQTWEBKIT_INCLUDE_DIRS}) + +find_library(LLQTWEBKIT_LIBRARY NAMES llqtwebkit NO_SYSTEM_ENVIRONMENT_PATH HINTS ${LLQTWEBKIT_LIBRARY_DIRS}) + +if (NOT PKG_CONFIG_FOUND OR NOT LLQTWEBKIT_FOUND)	# If pkg-config couldn't find it, pretend we don't have pkg-config. +   set(LLQTWEBKIT_LIBRARIES llqtwebkit) +   get_filename_component(LLQTWEBKIT_LIBRARY_DIRS ${LLQTWEBKIT_LIBRARY} PATH) +endif (NOT PKG_CONFIG_FOUND OR NOT LLQTWEBKIT_FOUND) + +# Handle the QUIETLY and REQUIRED arguments and set LLQTWEBKIT_FOUND +# to TRUE if all listed variables are TRUE. +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args( +  LLQTWEBKIT +  DEFAULT_MSG +  LLQTWEBKIT_LIBRARY +  LLQTWEBKIT_INCLUDE_DIR +  LLQTWEBKIT_LIBRARIES +  LLQTWEBKIT_LIBRARY_DIRS +  ) + +mark_as_advanced( +  LLQTWEBKIT_LIBRARY +  LLQTWEBKIT_INCLUDE_DIR +  LLQTWEBKIT_LIBRARIES +  LLQTWEBKIT_LIBRARY_DIRS +  LLQTWEBKIT_DEFINITIONS +  ) + diff --git a/indra/cmake/FindNDOF.cmake b/indra/cmake/FindNDOF.cmake new file mode 100644 index 0000000000..6dcf590a53 --- /dev/null +++ b/indra/cmake/FindNDOF.cmake @@ -0,0 +1,39 @@ +# -*- cmake -*- + +# - Find NDOF +# Find the NDOF includes and library +# This module defines +#  NDOF_INCLUDE_DIR, where to find ndofdev_external.h, etc. +#  NDOF_LIBRARY, the library needed to use NDOF. +#  NDOF_FOUND, If false, do not try to use NDOF. + +find_path(NDOF_INCLUDE_DIR ndofdev_external.h +  PATH_SUFFIXES ndofdev +  ) + +set(NDOF_NAMES ${NDOF_NAMES} ndofdev libndofdev) +find_library(NDOF_LIBRARY +  NAMES ${NDOF_NAMES} +  ) + +if (NDOF_LIBRARY AND NDOF_INCLUDE_DIR) +  set(NDOF_FOUND "YES") +else (NDOF_LIBRARY AND NDOF_INCLUDE_DIR) +  set(NDOF_FOUND "NO") +endif (NDOF_LIBRARY AND NDOF_INCLUDE_DIR) + + +if (NDOF_FOUND) +  if (NOT NDOF_FIND_QUIETLY) +    message(STATUS "Found NDOF: Library in '${NDOF_LIBRARY}' and header in '${NDOF_INCLUDE_DIR}' ") +  endif (NOT NDOF_FIND_QUIETLY) +else (NDOF_FOUND) +  if (NDOF_FIND_REQUIRED) +    message(FATAL_ERROR " * * *\nCould not find NDOF library!\nIf you don't need Space Navigator Joystick support you can skip this test by configuring with -DNDOF:BOOL=OFF\n * * *") +  endif (NDOF_FIND_REQUIRED) +endif (NDOF_FOUND) + +mark_as_advanced( +  NDOF_LIBRARY +  NDOF_INCLUDE_DIR +  ) diff --git a/indra/cmake/FindTut.cmake b/indra/cmake/FindTut.cmake index b5d58f6396..c2a9f43053 100644 --- a/indra/cmake/FindTut.cmake +++ b/indra/cmake/FindTut.cmake @@ -3,12 +3,11 @@  # - Find Tut  # Find the Tut unit test framework includes and library  # This module defines -#  TUT_INCLUDE_DIR, where to find tut.h, etc. +#  TUT_INCLUDE_DIR, where to find tut/tut.hpp.  #  TUT_FOUND, If false, do not try to use Tut. -find_path(TUT_INCLUDE_DIR tut.h -    /usr/local/include/ -    /usr/include +find_path(TUT_INCLUDE_DIR tut/tut.hpp +    NO_SYSTEM_ENVIRONMENT_PATH      )  if (TUT_INCLUDE_DIR) diff --git a/indra/cmake/FindZLIB.cmake b/indra/cmake/FindZLIB.cmake new file mode 100644 index 0000000000..6d630f1ba9 --- /dev/null +++ b/indra/cmake/FindZLIB.cmake @@ -0,0 +1,46 @@ +# -*- cmake -*- + +# - Find zlib +# Find the ZLIB includes and library +# This module defines +#  ZLIB_INCLUDE_DIRS, where to find zlib.h, etc. +#  ZLIB_LIBRARIES, the libraries needed to use zlib. +#  ZLIB_FOUND, If false, do not try to use zlib. +# +# This FindZLIB is about 43 times as fast the one provided with cmake (2.8.x), +# because it doesn't look up the version of zlib, resulting in a dramatic +# speed up for configure (from 4 minutes 22 seconds to 6 seconds). +# +# Note: Since this file is only used for standalone, the windows +# specific parts were left out. + +FIND_PATH(ZLIB_INCLUDE_DIR zlib.h +  NO_SYSTEM_ENVIRONMENT_PATH +  ) + +FIND_LIBRARY(ZLIB_LIBRARY z) + +if (ZLIB_LIBRARY AND ZLIB_INCLUDE_DIR) +  SET(ZLIB_INCLUDE_DIRS ${ZLIB_INCLUDE_DIR}) +  SET(ZLIB_LIBRARIES ${ZLIB_LIBRARY}) +  SET(ZLIB_FOUND "YES") +else (ZLIB_LIBRARY AND ZLIB_INCLUDE_DIR) +  SET(ZLIB_FOUND "NO") +endif (ZLIB_LIBRARY AND ZLIB_INCLUDE_DIR) + +if (ZLIB_FOUND) +  if (NOT ZLIB_FIND_QUIETLY) +	message(STATUS "Found ZLIB: ${ZLIB_LIBRARIES}") +	SET(ZLIB_FIND_QUIETLY TRUE) +  endif (NOT ZLIB_FIND_QUIETLY) +else (ZLIB_FOUND) +  if (ZLIB_FIND_REQUIRED) +	message(FATAL_ERROR "Could not find ZLIB library") +  endif (ZLIB_FIND_REQUIRED) +endif (ZLIB_FOUND) + +mark_as_advanced( +  ZLIB_LIBRARY +  ZLIB_INCLUDE_DIR +  ) + diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake index 29e2492551..62b764bb30 100644 --- a/indra/cmake/LLAddBuildTest.cmake +++ b/indra/cmake/LLAddBuildTest.cmake @@ -205,6 +205,9 @@ FUNCTION(LL_ADD_INTEGRATION_TEST    endif(TEST_DEBUG)
    ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})
    SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${EXE_STAGING_DIR}")
 +  if(STANDALONE)
 +    SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES COMPILE_FLAGS -I"${TUT_INCLUDE_DIR}")
 +  endif(STANDALONE)
    # Add link deps to the executable
    if(TEST_DEBUG)
 diff --git a/indra/cmake/LLCommon.cmake b/indra/cmake/LLCommon.cmake index d1ab264a41..17e211cb99 100644 --- a/indra/cmake/LLCommon.cmake +++ b/indra/cmake/LLCommon.cmake @@ -13,7 +13,14 @@ set(LLCOMMON_INCLUDE_DIRS      ${Boost_INCLUDE_DIRS}      ) -set(LLCOMMON_LIBRARIES llcommon) +if (LINUX) +    # In order to support using ld.gold on linux, we need to explicitely +    # specify all libraries that llcommon uses. +    # llcommon uses `clock_gettime' which is provided by librt on linux. +    set(LLCOMMON_LIBRARIES llcommon rt) +else (LINUX) +    set(LLCOMMON_LIBRARIES llcommon) +endif (LINUX)  add_definitions(${TCMALLOC_FLAG}) diff --git a/indra/cmake/LLPlugin.cmake b/indra/cmake/LLPlugin.cmake index 9722f16c3c..7ee404b9bd 100644 --- a/indra/cmake/LLPlugin.cmake +++ b/indra/cmake/LLPlugin.cmake @@ -5,4 +5,10 @@ set(LLPLUGIN_INCLUDE_DIRS      ${LIBS_OPEN_DIR}/llplugin      ) -set(LLPLUGIN_LIBRARIES llplugin) +if (LINUX) +    # In order to support using ld.gold on linux, we need to explicitely +    # specify all libraries that llplugin uses. +	set(LLPLUGIN_LIBRARIES llplugin pthread) +else (LINUX) +	set(LLPLUGIN_LIBRARIES llplugin) +endif (LINUX) diff --git a/indra/cmake/NDOF.cmake b/indra/cmake/NDOF.cmake index dad74e99b1..7a463d1190 100644 --- a/indra/cmake/NDOF.cmake +++ b/indra/cmake/NDOF.cmake @@ -1,14 +1,32 @@  # -*- cmake -*-  include(Prebuilt) -use_prebuilt_binary(ndofdev) +set(NDOF ON CACHE BOOL "Use NDOF space navigator joystick library.") -if (WINDOWS OR DARWIN OR LINUX) +if (NDOF) +  if (STANDALONE) +	set(NDOF_FIND_REQUIRED ON) +	include(FindNDOF) +  else (STANDALONE) +	use_prebuilt_binary(ndofdev) + +	if (WINDOWS) +	  set(NDOF_LIBRARY libndofdev) +	elseif (DARWIN OR LINUX) +	  set(NDOF_LIBRARY ndofdev) +	endif (WINDOWS) + +	set(NDOF_INCLUDE_DIR ${ARCH_PREBUILT_DIRS}/include/ndofdev) +	set(NDOF_FOUND 1) +  endif (STANDALONE) +endif (NDOF) + +if (NDOF_FOUND)    add_definitions(-DLIB_NDOF=1) -endif (WINDOWS OR DARWIN OR LINUX) +  include_directories(${NDOF_INCLUDE_DIR}) +else (NDOF_FOUND) +  message(STATUS "Building without N-DoF joystick support") +  set(NDOF_INCLUDE_DIR "") +  set(NDOF_LIBRARY "") +endif (NDOF_FOUND) -if (WINDOWS) -  set(NDOF_LIBRARY libndofdev) -elseif (DARWIN OR LINUX) -  set(NDOF_LIBRARY ndofdev) -endif (WINDOWS) diff --git a/indra/cmake/Tut.cmake b/indra/cmake/Tut.cmake index 784560471d..738c08c42f 100644 --- a/indra/cmake/Tut.cmake +++ b/indra/cmake/Tut.cmake @@ -6,7 +6,6 @@ set(TUT_FIND_QUIETLY TRUE)  if (STANDALONE)    include(FindTut) -  include_directories(${TUT_INCLUDE_DIR})  else (STANDALONE)    use_prebuilt_binary(tut)  endif (STANDALONE) diff --git a/indra/cmake/WebKitLibPlugin.cmake b/indra/cmake/WebKitLibPlugin.cmake index 12ba1b1b35..1f5b0f5d84 100644 --- a/indra/cmake/WebKitLibPlugin.cmake +++ b/indra/cmake/WebKitLibPlugin.cmake @@ -3,6 +3,29 @@ include(Linking)  include(Prebuilt)  if (STANDALONE) +  # 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 (STANDALONE) @@ -35,7 +58,7 @@ elseif (DARWIN)        )  elseif (LINUX)    if (STANDALONE)  -    set(WEBKIT_PLUGIN_LIBRARIES llqtwebkit) +    set(WEBKIT_PLUGIN_LIBRARIES ${LLQTWEBKIT_LIBRARY} ${QT_LIBRARIES} ${QT_PLUGIN_LIBRARIES})    else (STANDALONE)      set(WEBKIT_PLUGIN_LIBRARIES          llqtwebkit diff --git a/indra/lib/python/indra/util/test_win32_manifest.py b/indra/lib/python/indra/util/test_win32_manifest.py index 786521c068..da8ee6c545 100644 --- a/indra/lib/python/indra/util/test_win32_manifest.py +++ b/indra/lib/python/indra/util/test_win32_manifest.py @@ -52,20 +52,22 @@ def get_HKLM_registry_value(key_str, value_str):  def find_vc_dir():      supported_versions = (r'8.0', r'9.0') +    supported_products = (r'VisualStudio', r'VCExpress')      value_str = (r'ProductDir') -    for version in supported_versions: -        key_str = (r'SOFTWARE\Microsoft\VisualStudio\%s\Setup\VC' % -                   version) -        try: -            return get_HKLM_registry_value(key_str, value_str) -        except WindowsError, err: -            x64_key_str = (r'SOFTWARE\Wow6432Node\Microsoft\VisualStudio\%s\Setup\VS' % -                       version) +    for product in supported_products: +        for version in supported_versions: +            key_str = (r'SOFTWARE\Microsoft\%s\%s\Setup\VC' % +                      (product, version))              try: -                return get_HKLM_registry_value(x64_key_str, value_str) -            except: -                print >> sys.stderr, "Didn't find MS VC version %s " % version +                return get_HKLM_registry_value(key_str, value_str) +            except WindowsError, err: +                x64_key_str = (r'SOFTWARE\Wow6432Node\Microsoft\VisualStudio\%s\Setup\VS' % +                        version) +                try: +                    return get_HKLM_registry_value(x64_key_str, value_str) +                except: +                    print >> sys.stderr, "Didn't find MS %s version %s " % (product,version)      raise diff --git a/indra/llimage/CMakeLists.txt b/indra/llimage/CMakeLists.txt index 6834267d4b..ea8c1a1107 100644 --- a/indra/llimage/CMakeLists.txt +++ b/indra/llimage/CMakeLists.txt @@ -3,12 +3,13 @@  project(llimage)  include(00-Common) -include(LLAddBuildTest)  include(LLCommon)  include(LLImage)  include(LLMath)  include(LLVFS)  include(ZLIB) +include(LLAddBuildTest) +include(Tut)  include_directories(      ${LLCOMMON_INCLUDE_DIRS} @@ -63,4 +64,12 @@ target_link_libraries(llimage      )  # Add tests -#ADD_BUILD_TEST(llimageworker llimage) +if (LL_TESTS) +  SET(llimage_TEST_SOURCE_FILES +    llimageworker.cpp +    ) +  LL_ADD_PROJECT_UNIT_TESTS(llimage "${llimage_TEST_SOURCE_FILES}") +endif (LL_TESTS) + + + diff --git a/indra/llimage/tests/llimageworker_test.cpp b/indra/llimage/tests/llimageworker_test.cpp index a109276709..08476fb72c 100644 --- a/indra/llimage/tests/llimageworker_test.cpp +++ b/indra/llimage/tests/llimageworker_test.cpp @@ -26,10 +26,8 @@   */  // Precompiled header: almost always required for newview cpp files -#include <list> -#include <map> -#include <algorithm> -// Class to test +#include "linden_common.h" +// Class to test   #include "../llimageworker.h"  // For timer class  #include "../llcommon/lltimer.h" @@ -44,7 +42,17 @@  // * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code)  // * A simulator for a class can be implemented here. Please comment and document thoroughly. -LLImageBase::LLImageBase() {} +LLImageBase::LLImageBase()  +: mData(NULL), +mDataSize(0), +mWidth(0), +mHeight(0), +mComponents(0), +mBadBufferAllocation(false), +mAllowOverSize(false), +mMemType(LLMemType::MTYPE_IMAGEBASE) +{ +}  LLImageBase::~LLImageBase() {}  void LLImageBase::dump() { }  void LLImageBase::sanityCheck() { } diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp index 95e0997d5b..13b12c0928 100644 --- a/indra/llimagej2coj/llimagej2coj.cpp +++ b/indra/llimagej2coj/llimagej2coj.cpp @@ -90,6 +90,12 @@ void info_callback(const char* msg, void*)  	lldebugs << "LLImageJ2COJ: " << chomp(msg) << llendl;  } +// Divide a by 2 to the power of b and round upwards +int ceildivpow2(int a, int b) +{ +	return (a + (1 << b) - 1) >> b; +} +  LLImageJ2COJ::LLImageJ2COJ()  	: LLImageJ2CImpl() diff --git a/indra/llimagej2coj/llimagej2coj.h b/indra/llimagej2coj/llimagej2coj.h index 7edacbe97c..9476665ccb 100644 --- a/indra/llimagej2coj/llimagej2coj.h +++ b/indra/llimagej2coj/llimagej2coj.h @@ -34,17 +34,11 @@ class LLImageJ2COJ : public LLImageJ2CImpl  public:  	LLImageJ2COJ();  	virtual ~LLImageJ2COJ(); -  protected:  	/*virtual*/ BOOL getMetadata(LLImageJ2C &base);  	/*virtual*/ BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count);  	/*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,  								BOOL reversible = FALSE); -	int ceildivpow2(int a, int b) -	{ -		// Divide a by b to the power of 2 and round upwards. -		return (a + (1 << b) - 1) >> b; -	}  };  #endif diff --git a/indra/llkdu/CMakeLists.txt b/indra/llkdu/CMakeLists.txt index b8b44b44fc..7ed1c6c694 100644 --- a/indra/llkdu/CMakeLists.txt +++ b/indra/llkdu/CMakeLists.txt @@ -42,4 +42,14 @@ list(APPEND llkdu_SOURCE_FILES ${llkdu_HEADER_FILES})  if (USE_KDU)    add_library (${LLKDU_LIBRARIES} ${llkdu_SOURCE_FILES}) +  # Add tests +  if (LL_TESTS) +    include(LLAddBuildTest) +    include(Tut) +    SET(llkdu_TEST_SOURCE_FILES +      llimagej2ckdu.cpp +      ) +    LL_ADD_PROJECT_UNIT_TESTS(llkdu "${llkdu_TEST_SOURCE_FILES}") +  endif (LL_TESTS) +  endif (USE_KDU) diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index 1a286d1406..10ea5685e8 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -229,16 +229,17 @@ void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECod  		mCodeStreamp = NULL;  	} -	if (!mInputp) +	if (!mInputp && base.getData())  	{ -		llassert(base.getData());  		// The compressed data has been loaded -		// Setup the source for the codestrea +		// Setup the source for the codestream  		mInputp = new LLKDUMemSource(base.getData(), data_size);  	} -	llassert(mInputp); -	mInputp->reset(); +	if (mInputp) +	{ +		mInputp->reset(); +	}  	mCodeStreamp = new kdu_codestream;  	mCodeStreamp->create(mInputp); @@ -1017,7 +1018,7 @@ kdc_flow_control::kdc_flow_control (kdu_image_in_base *img_in, kdu_codestream co          comp->ratio_counter = 0;          comp->remaining_lines = comp->initial_lines = dims.size.y;      } -    assert(num_components > 0); +    assert(num_components >= 0);      tile.set_components_of_interest(num_components);      max_buffer_memory = engine.create(codestream,tile,false,NULL,false,1,NULL,NULL,false); diff --git a/indra/llkdu/llimagej2ckdu.h b/indra/llkdu/llimagej2ckdu.h index 03f289f8b1..5628f69eeb 100644 --- a/indra/llkdu/llimagej2ckdu.h +++ b/indra/llkdu/llimagej2ckdu.h @@ -50,17 +50,16 @@ public:  		MODE_RESILIENT = 1,  		MODE_FUSSY = 2  	}; -	 -public:  	LLImageJ2CKDU();  	virtual ~LLImageJ2CKDU(); - +	  protected:  	/*virtual*/ BOOL getMetadata(LLImageJ2C &base);  	/*virtual*/ BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count);  	/*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,  								BOOL reversible=FALSE); +private:  	void setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECodeStreamMode mode);  	void cleanupCodeStream();  	BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count ); diff --git a/indra/llkdu/tests/llimagej2ckdu_test.cpp b/indra/llkdu/tests/llimagej2ckdu_test.cpp new file mode 100644 index 0000000000..1ccee4bb64 --- /dev/null +++ b/indra/llkdu/tests/llimagej2ckdu_test.cpp @@ -0,0 +1,248 @@ +/**  + * @file llimagej2ckdu_test.cpp + * @author Merov Linden + * @date 2010-12-17 + * + * $LicenseInfo:firstyear=2006&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$ + */ + +#include "linden_common.h" +// Class to test  +#include "../llimagej2ckdu.h" +#include "../llkdumem.h" +// Tut header +#include "../test/lltut.h" + +// ------------------------------------------------------------------------------------------- +// Stubbing: Declarations required to link and run the class being tested +// Notes:  +// * Add here stubbed implementation of the few classes and methods used in the class to be tested +// * Add as little as possible (let the link errors guide you) +// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code) +// * A simulator for a class can be implemented here. Please comment and document thoroughly. + +// End Stubbing +// ------------------------------------------------------------------------------------------- +// Stubb the LL Image Classes +LLImageRaw::LLImageRaw() { } +LLImageRaw::~LLImageRaw() { } +U8* LLImageRaw::allocateData(S32 ) { return NULL; } +void LLImageRaw::deleteData() { } +U8* LLImageRaw::reallocateData(S32 ) { return NULL; } +BOOL LLImageRaw::resize(U16, U16, S8) { return TRUE; } // this method always returns TRUE... + +LLImageBase::LLImageBase() +: mData(NULL), +mDataSize(0), +mWidth(0), +mHeight(0), +mComponents(0), +mBadBufferAllocation(false), +mAllowOverSize(false), +mMemType(LLMemType::MTYPE_IMAGEBASE) +{ } +LLImageBase::~LLImageBase() { } +U8* LLImageBase::allocateData(S32 ) { return NULL; } +void LLImageBase::deleteData() { } +void LLImageBase::dump() { } +const U8* LLImageBase::getData() const { return NULL; } +U8* LLImageBase::getData() { return NULL; } +U8* LLImageBase::reallocateData(S32 ) { return NULL; } +void LLImageBase::sanityCheck() { } +void LLImageBase::setSize(S32 , S32 , S32 ) { } + +LLImageJ2CImpl::~LLImageJ2CImpl() { } + +LLImageFormatted::LLImageFormatted(S8 ) { } +LLImageFormatted::~LLImageFormatted() { } +U8* LLImageFormatted::allocateData(S32 ) { return NULL; } +S32 LLImageFormatted::calcDataSize(S32 ) { return 0; } +S32 LLImageFormatted::calcDiscardLevelBytes(S32 ) { return 0; } +BOOL LLImageFormatted::decodeChannels(LLImageRaw*, F32, S32, S32) { return FALSE; } +BOOL LLImageFormatted::copyData(U8 *, S32) { return TRUE; }  // this method always returns TRUE... +void LLImageFormatted::deleteData() { } +void LLImageFormatted::dump() { } +U8* LLImageFormatted::reallocateData(S32 ) { return NULL; } +void LLImageFormatted::resetLastError() { } +void LLImageFormatted::sanityCheck() { } +void LLImageFormatted::setLastError(const std::string& , const std::string& ) { } + +LLImageJ2C::LLImageJ2C() : LLImageFormatted(IMG_CODEC_J2C) { } +LLImageJ2C::~LLImageJ2C() { } +S32 LLImageJ2C::calcDataSize(S32 ) { return 0; } +S32 LLImageJ2C::calcDiscardLevelBytes(S32 ) { return 0; } +S32 LLImageJ2C::calcHeaderSize() { return 0; } +BOOL LLImageJ2C::decode(LLImageRaw*, F32) { return FALSE; } +BOOL LLImageJ2C::decodeChannels(LLImageRaw*, F32, S32, S32 ) { return FALSE; } +void LLImageJ2C::decodeFailed() { } +BOOL LLImageJ2C::encode(const LLImageRaw*, F32) { return FALSE; } +S8  LLImageJ2C::getRawDiscardLevel() { return 0; } +void LLImageJ2C::resetLastError() { } +void LLImageJ2C::setLastError(const std::string&, const std::string&) { } +BOOL LLImageJ2C::updateData() { return FALSE; } +void LLImageJ2C::updateRawDiscardLevel() { } + +LLKDUMemIn::LLKDUMemIn(const U8*, const U32, const U16, const U16, const U8, siz_params*) { } +LLKDUMemIn::~LLKDUMemIn() { } +bool LLKDUMemIn::get(int, kdu_line_buf&, int) { return false; } + +// Stub Kakadu Library calls +kdu_tile_comp kdu_tile::access_component(int ) { kdu_tile_comp a; return a; } +void kdu_tile::close(kdu_thread_env* ) { } +int kdu_tile::get_num_components() { return 0; } +bool kdu_tile::get_ycc() { return false; } +void kdu_tile::set_components_of_interest(int , const int* ) { } +kdu_resolution kdu_tile_comp::access_resolution() { kdu_resolution a; return a; } +int kdu_tile_comp::get_bit_depth(bool ) { return 8; } +bool kdu_tile_comp::get_reversible() { return false; } +kdu_subband kdu_resolution::access_subband(int ) { kdu_subband a; return a; } +void kdu_resolution::get_dims(kdu_dims& ) { } +int kdu_resolution::which() { return 0; } +kdu_decoder::kdu_decoder(kdu_subband , kdu_sample_allocator*, bool , float, int, kdu_thread_env*, kdu_thread_queue*) { } +kdu_synthesis::kdu_synthesis(kdu_resolution, kdu_sample_allocator*, bool, float, kdu_thread_env*, kdu_thread_queue*) { } +kdu_params::kdu_params(const char*, bool, bool, bool, bool, bool) { } +kdu_params::~kdu_params() { } +void kdu_params::set(const char* , int , int , bool ) { } +void kdu_params::set(const char* , int , int , int ) { } +void kdu_params::finalize_all(bool ) { } +void kdu_params::copy_from(kdu_params*, int, int, int, int, int, bool, bool, bool) { } +bool kdu_params::parse_string(const char*) { return false; } +bool kdu_params::get(const char*, int, int, bool&, bool, bool, bool) { return false; } +bool kdu_params::get(const char*, int, int, float&, bool, bool, bool) { return false; } +bool kdu_params::get(const char*, int, int, int&, bool, bool, bool) { return false; } +kdu_params* kdu_params::access_relation(int, int, int, bool) { return NULL; } +kdu_params* kdu_params::access_cluster(const char*) { return NULL; } +void kdu_codestream::set_fast() { } +void kdu_codestream::set_fussy() { } +void kdu_codestream::get_dims(int, kdu_dims&, bool ) { } +void kdu_codestream::change_appearance(bool, bool, bool) { } +void kdu_codestream::get_tile_dims(kdu_coords, int, kdu_dims&, bool ) { } +void kdu_codestream::destroy() { } +void kdu_codestream::collect_timing_stats(int ) { } +void kdu_codestream::set_max_bytes(kdu_long, bool, bool ) { } +void kdu_codestream::get_valid_tiles(kdu_dims& ) { } +void kdu_codestream::create(siz_params*, kdu_compressed_target*, kdu_dims*, int, kdu_long ) { } +void kdu_codestream::create(kdu_compressed_source*, kdu_thread_env*) { } +void kdu_codestream::apply_input_restrictions( int, int, int, int, kdu_dims*, kdu_component_access_mode ) { } +void kdu_codestream::get_subsampling(int , kdu_coords&, bool ) { } +void kdu_codestream::flush(kdu_long *, int , kdu_uint16 *, bool, bool, double, kdu_thread_env*) { } +void kdu_codestream::set_resilient(bool ) { } +int kdu_codestream::get_num_components(bool ) { return 0; } +siz_params* kdu_codestream::access_siz() { return NULL; } +kdu_tile kdu_codestream::open_tile(kdu_coords , kdu_thread_env* ) { kdu_tile a; return a; } +kdu_codestream_comment kdu_codestream::add_comment() { kdu_codestream_comment a; return a; } +bool kdu_codestream_comment::put_text(const char*) { return false; } +void kdu_customize_warnings(kdu_message*) { } +void kdu_customize_errors(kdu_message*) { } +void kdu_convert_ycc_to_rgb(kdu_line_buf&, kdu_line_buf&, kdu_line_buf&, int) { } +kdu_long kdu_multi_analysis::create(kdu_codestream, kdu_tile, bool, kdu_roi_image*, bool, int, kdu_thread_env*, kdu_thread_queue*, bool ) { kdu_long a = 0; return a; } +siz_params::siz_params() : kdu_params(NULL, false, false, false, false, false) { } +void siz_params::finalize(bool ) { } +void siz_params::copy_with_xforms(kdu_params*, int, int, bool, bool, bool) { } +int siz_params::write_marker_segment(kdu_output*, kdu_params*, int) { return 0; } +bool siz_params::check_marker_segment(kdu_uint16, int, kdu_byte a[], int&) { return false; } +bool siz_params::read_marker_segment(kdu_uint16, int, kdu_byte a[], int) { return false; } + +// ------------------------------------------------------------------------------------------- +// TUT +// ------------------------------------------------------------------------------------------- + +namespace tut +{ +	// Test wrapper declarations +	struct llimagej2ckdu_test +	{ +		// Derived test class +		class LLTestImageJ2CKDU : public LLImageJ2CKDU +		{ +		public: +			// Provides public access to some protected methods for testing +			BOOL callGetMetadata(LLImageJ2C &base) { return getMetadata(base); } +			BOOL callDecodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count) +			{ +				return decodeImpl(base, raw_image, decode_time, first_channel, max_channel_count); +			} +			BOOL callEncodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text) +			{ +				return encodeImpl(base, raw_image, comment_text); +			} +		}; +		// Instance to be tested +		LLTestImageJ2CKDU* mImage; +		 +		// Constructor and destructor of the test wrapper +		llimagej2ckdu_test() +		{ +			mImage = new LLTestImageJ2CKDU; +		} +		~llimagej2ckdu_test() +		{ +			delete mImage; +		} +	}; +	 +	// Tut templating thingamagic: test group, object and test instance +	typedef test_group<llimagej2ckdu_test> llimagej2ckdu_t; +	typedef llimagej2ckdu_t::object llimagej2ckdu_object_t; +	tut::llimagej2ckdu_t tut_llimagej2ckdu("LLImageJ2CKDU"); +	 +	// --------------------------------------------------------------------------------------- +	// Test functions +	// Notes: +	// * Test as many as you possibly can without requiring a full blown simulation of everything +	// * The tests are executed in sequence so the test instance state may change between calls +	// * Remember that you cannot test private methods with tut +	// --------------------------------------------------------------------------------------- + +	// Test 1 : test getMetadata() +	template<> template<> +	void llimagej2ckdu_object_t::test<1>() +	{ +		LLImageJ2C* image = new LLImageJ2C(); +		BOOL res = mImage->callGetMetadata(*image); +		// Trying to set up a data stream with all NIL values and stubbed KDU will "work" and return TRUE +		// Note that is linking with KDU, that call will throw an exception and fail, returning FALSE +		ensure("getMetadata() test failed", res == TRUE); +	} + +	// Test 2 : test decodeImpl() +	template<> template<> +	void llimagej2ckdu_object_t::test<2>() +	{ +		LLImageJ2C* image = new LLImageJ2C(); +		LLImageRaw* raw = new LLImageRaw(); +		BOOL res = mImage->callDecodeImpl(*image, *raw, 0.0, 0, 0); +		// Decoding returns TRUE whenever there's nothing else to do, including if decoding failed, so we'll get TRUE here +		ensure("decodeImpl() test failed", res == TRUE); +	} + +	// Test 3 : test encodeImpl() +	template<> template<> +	void llimagej2ckdu_object_t::test<3>() +	{ +		LLImageJ2C* image = new LLImageJ2C(); +		LLImageRaw* raw = new LLImageRaw(); +		BOOL res = mImage->callEncodeImpl(*image, *raw, NULL); +		// Encoding returns TRUE unless an exception was raised, so we'll get TRUE here though nothing really was done +		ensure("encodeImpl() test failed", res == TRUE); +	} +} diff --git a/indra/llmath/tests/m3math_test.cpp b/indra/llmath/tests/m3math_test.cpp index 8abf61b740..e4d31996a3 100644 --- a/indra/llmath/tests/m3math_test.cpp +++ b/indra/llmath/tests/m3math_test.cpp @@ -280,7 +280,6 @@ namespace tut  		llmat_obj.setRows(llvec1, llvec2, llvec3);  		llmat_obj.orthogonalize(); -		skip("Grr, LLMatrix3::orthogonalize test is failing.  Has it ever worked?");  		ensure("LLMatrix3::orthogonalize failed ",  		       is_approx_equal(0.19611613f, llmat_obj.mMatrix[0][0]) &&  		       is_approx_equal(0.78446454f, llmat_obj.mMatrix[0][1]) && diff --git a/indra/llplugin/CMakeLists.txt b/indra/llplugin/CMakeLists.txt index d3a73058c4..1dc05e0b20 100644 --- a/indra/llplugin/CMakeLists.txt +++ b/indra/llplugin/CMakeLists.txt @@ -20,6 +20,7 @@ include_directories(      ${LLRENDER_INCLUDE_DIRS}      ${LLXML_INCLUDE_DIRS}      ${LLWINDOW_INCLUDE_DIRS} +    ${LLQTWEBKIT_INCLUDE_DIR}      )  set(llplugin_SOURCE_FILES diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 1265733bf5..d30697e178 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -2910,7 +2910,9 @@ bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, const std::str  	params.from_xui = true;  	applyXUILayout(params, parent);   	initFromParams(params); -	 +	// chrome floaters don't take focus at all +	setFocusRoot(!getIsChrome()); +  	initFloater(params);  	LLMultiFloater* last_host = LLFloater::getFloaterHost(); diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt index bf3233f386..4d2677fd91 100644 --- a/indra/llwindow/CMakeLists.txt +++ b/indra/llwindow/CMakeLists.txt @@ -59,12 +59,13 @@ set(viewer_HEADER_FILES  # Libraries on which this library depends, needed for Linux builds  # Sort by high-level to low-level -if (NOT LINUX OR VIEWER) +if (LINUX AND VIEWER)    set(llwindow_LINK_LIBRARIES        ${UI_LIBRARIES}     # for GTK        ${SDL_LIBRARY} +      fontconfig          # For FCInit and other FC* functions.        ) -endif (NOT LINUX OR VIEWER) +endif (LINUX AND VIEWER)  if (DARWIN)    list(APPEND llwindow_SOURCE_FILES diff --git a/indra/media_plugins/webkit/CMakeLists.txt b/indra/media_plugins/webkit/CMakeLists.txt index 05f1236606..3b1f679540 100644 --- a/indra/media_plugins/webkit/CMakeLists.txt +++ b/indra/media_plugins/webkit/CMakeLists.txt @@ -27,6 +27,7 @@ include_directories(      ${LLIMAGE_INCLUDE_DIRS}      ${LLRENDER_INCLUDE_DIRS}      ${LLWINDOW_INCLUDE_DIRS} +    ${LLQTWEBKIT_INCLUDE_DIR}  ) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 8eb350da34..ce22a52460 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1891,6 +1891,8 @@ if (LL_TESTS)      llremoteparcelrequest.cpp      llviewerhelputil.cpp      llversioninfo.cpp +    llworldmap.cpp +    llworldmipmap.cpp    )    ################################################## @@ -1978,8 +1980,6 @@ if (LL_TESTS)    #ADD_VIEWER_BUILD_TEST(llmemoryview viewer)    #ADD_VIEWER_BUILD_TEST(llagentaccess viewer) -  #ADD_VIEWER_BUILD_TEST(llworldmap viewer) -  #ADD_VIEWER_BUILD_TEST(llworldmipmap viewer)    #ADD_VIEWER_BUILD_TEST(lltextureinfo viewer)    #ADD_VIEWER_BUILD_TEST(lltextureinfodetails viewer)    #ADD_VIEWER_BUILD_TEST(lltexturestatsuploader viewer) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index b3324ea6c6..ea7ac6beda 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -4780,6 +4780,17 @@        <key>Value</key>        <string>http://map.secondlife.com.s3.amazonaws.com/</string>      </map> +    <key>CurrentMapServerURL</key> +    <map> +      <key>Comment</key> +      <string>Current Session World map URL</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string></string> +    </map>      <key>MapShowEvents</key>      <map>        <key>Comment</key> @@ -12423,5 +12434,16 @@        <key>Value</key>        <string>name</string>      </map> +    <key>ReleaseNotesURL</key> +    <map> +      <key>Comment</key> +      <string>Release notes URL template</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>http://secondlife.com/app/releasenotes/?channel=[CHANNEL]&version=[VERSION]</string> +    </map>  </map>  </llsd> diff --git a/indra/newview/app_settings/shaders/shader_heirarchy.txt b/indra/newview/app_settings/shaders/shader_hierarchy.txt index d8bbf69b38..d8bbf69b38 100644 --- a/indra/newview/app_settings/shaders/shader_heirarchy.txt +++ b/indra/newview/app_settings/shaders/shader_hierarchy.txt diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index a95abd7dd1..a82c3da4c5 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -135,7 +135,7 @@ RenderFlexTimeFactor		1	1.0  RenderGlowResolutionPow		1	9  RenderMaxPartCount			1	4096  RenderObjectBump			1	1 -RenderReflectionDetail		1	2 +RenderReflectionDetail		1	0  RenderTerrainDetail			1	1  RenderTerrainLODFactor		1	2.0  RenderTransparentWater		1	1 diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index a52b32355d..a2cd4b834c 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -134,7 +134,7 @@ RenderFlexTimeFactor		1	1.0  RenderGlowResolutionPow		1	9  RenderMaxPartCount			1	4096  RenderObjectBump			1	1 -RenderReflectionDetail		1	2 +RenderReflectionDetail		1	0  RenderTerrainDetail			1	1  RenderTerrainLODFactor		1	2.0  RenderTransparentWater		1	1 diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index 6dabef53a8..3ad7f4e892 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -133,7 +133,7 @@ RenderGlowResolutionPow		1	9  RenderLightingDetail		1	1  RenderMaxPartCount			1	4096  RenderObjectBump			1	1 -RenderReflectionDetail		1	2 +RenderReflectionDetail		1	0  RenderTerrainDetail			1	1  RenderTerrainLODFactor		1	2.0  RenderTransparentWater		1	1 diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt index a09ba17c62..38e6bb1e5e 100644 --- a/indra/newview/featuretable_xp.txt +++ b/indra/newview/featuretable_xp.txt @@ -135,7 +135,7 @@ RenderFlexTimeFactor		1	1.0  RenderGlowResolutionPow		1	9  RenderMaxPartCount			1	4096  RenderObjectBump			1	1 -RenderReflectionDetail		1	2 +RenderReflectionDetail		1	0  RenderTerrainDetail			1	1  RenderTerrainLODFactor		1	2.0  RenderTransparentWater		1	1 diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 15f8e7bf4d..f01d5ff1f5 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -2695,6 +2695,9 @@ void LLAgentCamera::lookAtLastChat()  		new_camera_pos -= delta_pos * 0.4f;  		new_camera_pos += left * 0.3f;  		new_camera_pos += up * 0.2f; + +		setFocusOnAvatar(FALSE, FALSE); +  		if (chatter_av->mHeadp)  		{  			setFocusGlobal(gAgent.getPosGlobalFromAgent(chatter_av->mHeadp->getWorldPosition()), gAgent.getLastChatter()); @@ -2705,7 +2708,6 @@ void LLAgentCamera::lookAtLastChat()  			setFocusGlobal(chatter->getPositionGlobal(), gAgent.getLastChatter());  			mCameraFocusOffsetTarget = gAgent.getPosGlobalFromAgent(new_camera_pos) - chatter->getPositionGlobal();  		} -		setFocusOnAvatar(FALSE, TRUE);  	}  	else  	{ @@ -2725,9 +2727,10 @@ void LLAgentCamera::lookAtLastChat()  		new_camera_pos += left * 0.3f;  		new_camera_pos += up * 0.2f; +		setFocusOnAvatar(FALSE, FALSE); +  		setFocusGlobal(chatter->getPositionGlobal(), gAgent.getLastChatter());  		mCameraFocusOffsetTarget = gAgent.getPosGlobalFromAgent(new_camera_pos) - chatter->getPositionGlobal(); -		setFocusOnAvatar(FALSE, TRUE);  	}  } diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp index 351b9ac5da..1b94d8cbcd 100644 --- a/indra/newview/llfloatermap.cpp +++ b/indra/newview/llfloatermap.cpp @@ -83,7 +83,6 @@ LLFloaterMap::~LLFloaterMap()  BOOL LLFloaterMap::postBuild()  {  	mMap = getChild<LLNetMap>("Net Map"); -	mMap->setScale(gSavedSettings.getF32("MiniMapScale"));  	mMap->setToolTipMsg(getString("ToolTipMsg"));	  	sendChildToBack(mMap); @@ -288,7 +287,16 @@ void LLFloaterMap::handleZoom(const LLSD& userdata)  	std::string level = userdata.asString();  	F32 scale = 0.0f; -	if (level == std::string("close")) +	if (level == std::string("default")) +	{ +		LLControlVariable *pvar = gSavedSettings.getControl("MiniMapScale"); +		if(pvar) +		{ +			pvar->resetToDefault(); +			scale = gSavedSettings.getF32("MiniMapScale"); +		} +	} +	else if (level == std::string("close"))  		scale = LLNetMap::MAP_SCALE_MAX;  	else if (level == std::string("medium"))  		scale = LLNetMap::MAP_SCALE_MID; @@ -296,7 +304,6 @@ void LLFloaterMap::handleZoom(const LLSD& userdata)  		scale = LLNetMap::MAP_SCALE_MIN;  	if (scale != 0.0f)  	{ -		gSavedSettings.setF32("MiniMapScale", scale );  		mMap->setScale(scale);  	}  } diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index bdc0dfa7e2..f74ae92a7b 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -470,7 +470,7 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)  }  //static -bool LLIMFloater::resetAllowedRectPadding(const LLSD& newvalue) +bool LLIMFloater::resetAllowedRectPadding()  {  	//reset allowed rect right padding if "SidebarCameraMovement" option   	//or sidebar state changed @@ -482,10 +482,10 @@ void LLIMFloater::getAllowedRect(LLRect& rect)  {  	if (sAllowedRectRightPadding == RECT_PADDING_NOT_INIT) //wasn't initialized  	{ -		gSavedSettings.getControl("SidebarCameraMovement")->getSignal()->connect(boost::bind(&LLIMFloater::resetAllowedRectPadding, _2)); +		gSavedSettings.getControl("SidebarCameraMovement")->getSignal()->connect(boost::bind(&LLIMFloater::resetAllowedRectPadding));  		LLSideTray*	side_bar = LLSideTray::getInstance(); -		side_bar->getCollapseSignal().connect(boost::bind(&LLIMFloater::resetAllowedRectPadding, _2)); +		side_bar->setVisibleWidthChangeCallback(boost::bind(&LLIMFloater::resetAllowedRectPadding));  		sAllowedRectRightPadding = RECT_PADDING_NEED_RECALC;  	} @@ -500,10 +500,7 @@ void LLIMFloater::getAllowedRect(LLRect& rect)  		if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE)  		{ -			LLSideTray*	side_bar = LLSideTray::getInstance(); - -			if (side_bar->getVisible() && !side_bar->getCollapsed()) -				sAllowedRectRightPadding += side_bar->getRect().getWidth(); +			sAllowedRectRightPadding += LLSideTray::getInstance()->getVisibleWidth();  		}  	}  	rect.mRight -= sAllowedRectRightPadding; diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h index e80e45e64a..5158f6c1f7 100644 --- a/indra/newview/llimfloater.h +++ b/indra/newview/llimfloater.h @@ -156,7 +156,7 @@ private:  	static void closeHiddenIMToasts(); -	static bool resetAllowedRectPadding(const LLSD& newvalue); +	static bool resetAllowedRectPadding();  	//need to keep this static for performance issues  	static S32 sAllowedRectRightPadding; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index ab0acbae50..5108f68592 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -5344,11 +5344,6 @@ void LLRecentItemsFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	menuentry_vec_t disabled_items, items = getMenuItems(); -	items.erase(std::remove(items.begin(), items.end(), std::string("New Body Parts")), items.end()); -	items.erase(std::remove(items.begin(), items.end(), std::string("New Clothes")), items.end()); -	items.erase(std::remove(items.begin(), items.end(), std::string("New Note")), items.end()); -	items.erase(std::remove(items.begin(), items.end(), std::string("New Gesture")), items.end()); -	items.erase(std::remove(items.begin(), items.end(), std::string("New Script")), items.end());  	items.erase(std::remove(items.begin(), items.end(), std::string("New Folder")), items.end());  	hide_context_entries(menu, items, disabled_items); diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index cebfac86e7..de5439e4e0 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -527,7 +527,8 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)  	if( nearby_chat->getVisible()  		|| ( chat_msg.mSourceType == CHAT_SOURCE_AGENT -			&& gSavedSettings.getBOOL("UseChatBubbles") ) ) +			&& gSavedSettings.getBOOL("UseChatBubbles") ) +		|| !mChannel->getShowToasts() ) // to prevent toasts in Busy mode  		return;//no need in toast if chat is visible or if bubble chat is enabled  	// Handle irc styled messages for toast panel diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index f084002385..1a8ec4991d 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -94,10 +94,12 @@ LLNetMap::LLNetMap (const Params & p)  	mToolTipMsg()  {  	mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS); +	setScale(gSavedSettings.getF32("MiniMapScale"));  }  LLNetMap::~LLNetMap()  { +	gSavedSettings.setF32("MiniMapScale", mScale);  }  void LLNetMap::setScale( F32 scale ) diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 17433a557b..c83176d980 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -506,9 +506,6 @@ void LLPanelMainInventory::onFilterSelected()  		return;  	} -	BOOL recent_active = ("Recent Items" == mActivePanel->getName()); -	getChildView("add_btn_panel")->setVisible( !recent_active); -  	setFilterSubString(mFilterSubString);  	LLInventoryFilter* filter = mActivePanel->getFilter();  	LLFloaterInventoryFinder *finder = getFinder(); @@ -944,6 +941,11 @@ void LLPanelMainInventory::updateListCommands()  void LLPanelMainInventory::onAddButtonClick()  { +// Gray out the "New Folder" option when the Recent tab is active as new folders will not be displayed +// unless "Always show folders" is checked in the filter options. +	bool recent_active = ("Recent Items" == mActivePanel->getName()); +	mMenuAdd->getChild<LLMenuItemGL>("New Folder")->setEnabled(!recent_active); +  	setUploadCostIfNeeded();  	showActionMenu(mMenuAdd,"add_btn"); diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 1869e92c8c..00ac34efa5 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -753,6 +753,11 @@ void LLPanelPlaces::onOverflowButtonClicked()  		// there is no landmark already pointing to that parcel in agent's inventory.  		menu->getChild<LLMenuItemCallGL>("landmark")->setEnabled(is_agent_place_info_visible &&  																 !LLLandmarkActions::landmarkAlreadyExists()); +		// STORM-411 +		// Creating landmarks for remote locations is impossible. +		// So hide menu item "Make a Landmark" in "Teleport History Profile" panel. +		menu->setItemVisible("landmark", mPlaceInfoType != TELEPORT_HISTORY_INFO_TYPE); +		menu->arrangeAndClear();  	}  	else if (mPlaceInfoType == LANDMARK_INFO_TYPE && mLandmarkMenu != NULL)  	{ diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index d0ebf047e8..22ff362b5a 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -123,7 +123,9 @@ static bool have_script_upload_cap(LLUUID& object_id)  class LLLiveLSLFile : public LLLiveFile  {  public: -	LLLiveLSLFile(std::string file_path, LLLiveLSLEditor* parent); +	typedef boost::function<bool (const std::string& filename)> change_callback_t; + +	LLLiveLSLFile(std::string file_path, change_callback_t change_cb);  	~LLLiveLSLFile();  	void ignoreNextUpdate() { mIgnoreNextUpdate = true; } @@ -131,15 +133,16 @@ public:  protected:  	/*virtual*/ bool loadFile(); -	LLLiveLSLEditor*	mParent; +	change_callback_t	mOnChangeCallback;  	bool				mIgnoreNextUpdate;  }; -LLLiveLSLFile::LLLiveLSLFile(std::string file_path, LLLiveLSLEditor* parent) -:	mParent(parent) +LLLiveLSLFile::LLLiveLSLFile(std::string file_path, change_callback_t change_cb) +:	mOnChangeCallback(change_cb)  ,	mIgnoreNextUpdate(false)  ,	LLLiveFile(file_path, 1.0)  { +	llassert(mOnChangeCallback);  }  LLLiveLSLFile::~LLLiveLSLFile() @@ -155,14 +158,7 @@ bool LLLiveLSLFile::loadFile()  		return true;  	} -	if (!mParent->loadScriptText(filename())) -	{ -		return false; -	} - -	// Disable sync to avoid recursive load->save->load calls. -	mParent->saveIfNeeded(false); -	return true; +	return mOnChangeCallback(filename());  }  /// --------------------------------------------------------------------------- @@ -327,11 +323,11 @@ struct LLSECKeywordCompare  };  LLScriptEdCore::LLScriptEdCore( +	LLScriptEdContainer* container,  	const std::string& sample,  	const LLHandle<LLFloater>& floater_handle,  	void (*load_callback)(void*),  	void (*save_callback)(void*, BOOL), -	void (*edit_callback)(void*),  	void (*search_replace_callback) (void* userdata),  	void* userdata,  	S32 bottom_pad) @@ -341,19 +337,21 @@ LLScriptEdCore::LLScriptEdCore(  	mEditor( NULL ),  	mLoadCallback( load_callback ),  	mSaveCallback( save_callback ), -	mEditCallback( edit_callback ),  	mSearchReplaceCallback( search_replace_callback ),  	mUserdata( userdata ),  	mForceClose( FALSE ),  	mLastHelpToken(NULL),  	mLiveHelpHistorySize(0),  	mEnableSave(FALSE), +	mLiveFile(NULL), +	mContainer(container),  	mHasScriptData(FALSE)  {  	setFollowsAll();  	setBorderVisible(FALSE);  	setXMLFilename("panel_script_ed.xml"); +	llassert_always(mContainer != NULL);  }  LLScriptEdCore::~LLScriptEdCore() @@ -367,6 +365,8 @@ LLScriptEdCore::~LLScriptEdCore()  		script_search->closeFloater();  		delete script_search;  	} + +	delete mLiveFile;  }  BOOL LLScriptEdCore::postBuild() @@ -381,7 +381,7 @@ BOOL LLScriptEdCore::postBuild()  	childSetCommitCallback("lsl errors", &LLScriptEdCore::onErrorList, this);  	childSetAction("Save_btn", boost::bind(&LLScriptEdCore::doSave,this,FALSE)); -	childSetAction("Edit_btn", boost::bind(&LLScriptEdCore::onEditButtonClick, this)); +	childSetAction("Edit_btn", boost::bind(&LLScriptEdCore::openInExternalEditor, this));  	initMenu(); @@ -514,6 +514,79 @@ void LLScriptEdCore::setScriptText(const std::string& text, BOOL is_valid)  	}  } +bool LLScriptEdCore::loadScriptText(const std::string& filename) +{ +	if (filename.empty()) +	{ +		llwarns << "Empty file name" << llendl; +		return false; +	} + +	LLFILE* file = LLFile::fopen(filename, "rb");		/*Flawfinder: ignore*/ +	if (!file) +	{ +		llwarns << "Error opening " << filename << llendl; +		return false; +	} + +	// read in the whole file +	fseek(file, 0L, SEEK_END); +	size_t file_length = (size_t) ftell(file); +	fseek(file, 0L, SEEK_SET); +	char* buffer = new char[file_length+1]; +	size_t nread = fread(buffer, 1, file_length, file); +	if (nread < file_length) +	{ +		llwarns << "Short read" << llendl; +	} +	buffer[nread] = '\0'; +	fclose(file); + +	mEditor->setText(LLStringExplicit(buffer)); +	delete[] buffer; + +	return true; +} + +bool LLScriptEdCore::writeToFile(const std::string& filename) +{ +	LLFILE* fp = LLFile::fopen(filename, "wb"); +	if (!fp) +	{ +		llwarns << "Unable to write to " << filename << llendl; + +		LLSD row; +		row["columns"][0]["value"] = "Error writing to local file. Is your hard drive full?"; +		row["columns"][0]["font"] = "SANSSERIF_SMALL"; +		mErrorList->addElement(row); +		return false; +	} + +	std::string utf8text = mEditor->getText(); + +	// Special case for a completely empty script - stuff in one space so it can store properly.  See SL-46889 +	if (utf8text.size() == 0) +	{ +		utf8text = " "; +	} + +	fputs(utf8text.c_str(), fp); +	fclose(fp); +	return true; +} + +void LLScriptEdCore::sync() +{ +	// Sync with external editor. +	std::string tmp_file = mContainer->getTmpFileName(); +	llstat s; +	if (LLFile::stat(tmp_file, &s) == 0) // file exists +	{ +		if (mLiveFile) mLiveFile->ignoreNextUpdate(); +		writeToFile(tmp_file); +	} +} +  bool LLScriptEdCore::hasChanged()  {  	if (!mEditor) return false; @@ -690,6 +763,12 @@ BOOL LLScriptEdCore::canClose()  	}  } +void LLScriptEdCore::setEnableEditing(bool enable) +{ +	mEditor->setEnabled(enable); +	getChildView("Edit_btn")->setEnabled(enable); +} +  bool LLScriptEdCore::handleSaveChangesDialog(const LLSD& notification, const LLSD& response )  {  	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); @@ -862,11 +941,31 @@ void LLScriptEdCore::doSave( BOOL close_after_save )  	}  } -void LLScriptEdCore::onEditButtonClick() +void LLScriptEdCore::openInExternalEditor()  { -	if (mEditCallback) +	delete mLiveFile; // deletes file + +	// Save the script to a temporary file. +	std::string filename = mContainer->getTmpFileName(); +	writeToFile(filename); + +	// Start watching file changes. +	mLiveFile = new LLLiveLSLFile(filename, boost::bind(&LLScriptEdContainer::onExternalChange, mContainer, _1)); +	mLiveFile->addToEventTimer(); + +	// Open it in external editor.  	{ -		mEditCallback(mUserdata); +		LLExternalEditor ed; + +		if (!ed.setCommand("LL_SCRIPT_EDITOR")) +		{ +			std::string msg = "Select an editor by setting the environment variable LL_SCRIPT_EDITOR " +				"or the ExternalEditor setting"; // *TODO: localize +			LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", msg)); +			return; +		} + +		ed.run(filename);  	}  } @@ -983,6 +1082,43 @@ BOOL LLScriptEdCore::handleKeyHere(KEY key, MASK mask)  }  /// --------------------------------------------------------------------------- +/// LLScriptEdContainer +/// --------------------------------------------------------------------------- + +LLScriptEdContainer::LLScriptEdContainer(const LLSD& key) +:	LLPreview(key) +,	mScriptEd(NULL) +{ +} + +std::string LLScriptEdContainer::getTmpFileName() +{ +	// Take script inventory item id (within the object inventory) +	// to consideration so that it's possible to edit multiple scripts +	// in the same object inventory simultaneously (STORM-781). +	std::string script_id = mObjectUUID.asString() + "_" + mItemUUID.asString(); + +	// Use MD5 sum to make the file name shorter and not exceed maximum path length. +	char script_id_hash_str[33];               /* Flawfinder: ignore */ +	LLMD5 script_id_hash((const U8 *)script_id.c_str()); +	script_id_hash.hex_digest(script_id_hash_str); + +	return std::string(LLFile::tmpdir()) + "sl_script_" + script_id_hash_str + ".lsl"; +} + +bool LLScriptEdContainer::onExternalChange(const std::string& filename) +{ +	if (!mScriptEd->loadScriptText(filename)) +	{ +		return false; +	} + +	// Disable sync to avoid recursive load->save->load calls. +	saveIfNeeded(false); +	return true; +} + +/// ---------------------------------------------------------------------------  /// LLPreviewLSL  /// --------------------------------------------------------------------------- @@ -1005,11 +1141,11 @@ void* LLPreviewLSL::createScriptEdPanel(void* userdata)  	LLPreviewLSL *self = (LLPreviewLSL*)userdata;  	self->mScriptEd =  new LLScriptEdCore( +								   self,  								   HELLO_LSL,  								   self->getHandle(),  								   LLPreviewLSL::onLoad,  								   LLPreviewLSL::onSave, -								   NULL, // no edit callback  								   LLPreviewLSL::onSearchReplace,  								   self,  								   0); @@ -1019,7 +1155,7 @@ void* LLPreviewLSL::createScriptEdPanel(void* userdata)  LLPreviewLSL::LLPreviewLSL(const LLSD& key ) -  : LLPreview( key ), +:	LLScriptEdContainer(key),  	mPendingUploads(0)  {  	mFactoryMap["script panel"] = LLCallbackMap(LLPreviewLSL::createScriptEdPanel, this); @@ -1110,7 +1246,6 @@ void LLPreviewLSL::loadAsset()  		{  			mScriptEd->setScriptText(mScriptEd->getString("can_not_view"), FALSE);  			mScriptEd->mEditor->makePristine(); -			mScriptEd->mEditor->setEnabled(FALSE);  			mScriptEd->mFunctions->setEnabled(FALSE);  			mAssetStatus = PREVIEW_ASSET_LOADED;  		} @@ -1120,6 +1255,7 @@ void LLPreviewLSL::loadAsset()  	else  	{  		mScriptEd->setScriptText(std::string(HELLO_LSL), TRUE); +		mScriptEd->setEnableEditing(TRUE);  		mAssetStatus = PREVIEW_ASSET_LOADED;  	}  } @@ -1166,7 +1302,7 @@ void LLPreviewLSL::onSave(void* userdata, BOOL close_after_save)  // Save needs to compile the text in the buffer. If the compile  // succeeds, then save both assets out to the database. If the compile  // fails, go ahead and save the text anyway. -void LLPreviewLSL::saveIfNeeded() +void LLPreviewLSL::saveIfNeeded(bool sync /*= true*/)  {  	// llinfos << "LLPreviewLSL::saveIfNeeded()" << llendl;  	if(!mScriptEd->hasChanged()) @@ -1185,23 +1321,13 @@ void LLPreviewLSL::saveIfNeeded()  	std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,asset_id.asString());  	std::string filename = filepath + ".lsl"; -	LLFILE* fp = LLFile::fopen(filename, "wb"); -	if(!fp) -	{ -		llwarns << "Unable to write to " << filename << llendl; +	mScriptEd->writeToFile(filename); -		LLSD row; -		row["columns"][0]["value"] = "Error writing to local file. Is your hard drive full?"; -		row["columns"][0]["font"] = "SANSSERIF_SMALL"; -		mScriptEd->mErrorList->addElement(row); -		return; +	if (sync) +	{ +		mScriptEd->sync();  	} -	std::string utf8text = mScriptEd->mEditor->getText(); -	fputs(utf8text.c_str(), fp); -	fclose(fp); -	fp = NULL; -  	const LLInventoryItem *inv_item = getItem();  	// save it out to asset server  	std::string url = gAgent.getRegion()->getCapability("UpdateScriptAgent"); @@ -1433,7 +1559,7 @@ void LLPreviewLSL::onLoadComplete( LLVFS *vfs, const LLUUID& asset_uuid, LLAsset  			{  				is_modifiable = TRUE;		  			} -			preview->mScriptEd->mEditor->setEnabled(is_modifiable); +			preview->mScriptEd->setEnableEditing(is_modifiable);  			preview->mAssetStatus = PREVIEW_ASSET_LOADED;  		}  		else @@ -1474,11 +1600,11 @@ void* LLLiveLSLEditor::createScriptEdPanel(void* userdata)  	LLLiveLSLEditor *self = (LLLiveLSLEditor*)userdata;  	self->mScriptEd =  new LLScriptEdCore( +								   self,  								   HELLO_LSL,  								   self->getHandle(),  								   &LLLiveLSLEditor::onLoad,  								   &LLLiveLSLEditor::onSave, -								   &LLLiveLSLEditor::onEdit,  								   &LLLiveLSLEditor::onSearchReplace,  								   self,  								   0); @@ -1488,14 +1614,12 @@ void* LLLiveLSLEditor::createScriptEdPanel(void* userdata)  LLLiveLSLEditor::LLLiveLSLEditor(const LLSD& key) : -	LLPreview(key), -	mScriptEd(NULL), +	LLScriptEdContainer(key),  	mAskedForRunningInfo(FALSE),  	mHaveRunningInfo(FALSE),  	mCloseAfterSave(FALSE),  	mPendingUploads(0),  	mIsModifiable(FALSE), -	mLiveFile(NULL),  	mIsNew(false)  {  	mFactoryMap["script ed panel"] = LLCallbackMap(LLLiveLSLEditor::createScriptEdPanel, this); @@ -1519,11 +1643,6 @@ BOOL LLLiveLSLEditor::postBuild()  	return LLPreview::postBuild();  } -LLLiveLSLEditor::~LLLiveLSLEditor() -{ -	delete mLiveFile; -} -  // virtual  void LLLiveLSLEditor::callbackLSLCompileSucceeded(const LLUUID& task_id,  												  const LLUUID& item_id, @@ -1580,7 +1699,6 @@ void LLLiveLSLEditor::loadAsset()  				mItem = new LLViewerInventoryItem(item);  				mScriptEd->setScriptText(getString("not_allowed"), FALSE);  				mScriptEd->mEditor->makePristine(); -				mScriptEd->mEditor->setEnabled(FALSE);  				mScriptEd->enableSave(FALSE);  				mAssetStatus = PREVIEW_ASSET_LOADED;  			} @@ -1618,10 +1736,6 @@ void LLLiveLSLEditor::loadAsset()  			mIsModifiable = item && gAgent.allowOperation(PERM_MODIFY,   										item->getPermissions(),  				   						GP_OBJECT_MANIPULATE); -			if(!mIsModifiable) -			{ -				mScriptEd->mEditor->setEnabled(FALSE); -			}  			// This is commented out, because we don't completely  			// handle script exports yet. @@ -1677,6 +1791,7 @@ void LLLiveLSLEditor::onLoadComplete(LLVFS *vfs, const LLUUID& asset_id,  		if( LL_ERR_NOERR == status )  		{  			instance->loadScriptText(vfs, asset_id, type); +			instance->mScriptEd->setEnableEditing(TRUE);  			instance->mAssetStatus = PREVIEW_ASSET_LOADED;  		}  		else @@ -1703,40 +1818,6 @@ void LLLiveLSLEditor::onLoadComplete(LLVFS *vfs, const LLUUID& asset_id,  	delete xored_id;  } - bool LLLiveLSLEditor::loadScriptText(const std::string& filename) - { - 	if (filename.empty()) - 	{ - 		llwarns << "Empty file name" << llendl; - 		return false; - 	} - - 	LLFILE* file = LLFile::fopen(filename, "rb");		/*Flawfinder: ignore*/ - 	if (!file) - 	{ - 		llwarns << "Error opening " << filename << llendl; - 		return false; - 	} - - 	// read in the whole file -	fseek(file, 0L, SEEK_END); -	size_t file_length = (size_t) ftell(file); -	fseek(file, 0L, SEEK_SET); -	char* buffer = new char[file_length+1]; -	size_t nread = fread(buffer, 1, file_length, file); -	if (nread < file_length) -	{ -		llwarns << "Short read" << llendl; -	} -	buffer[nread] = '\0'; -	fclose(file); -	mScriptEd->mEditor->setText(LLStringExplicit(buffer)); -	//mScriptEd->mEditor->makePristine(); -	delete[] buffer; - -	return true; - } -  void LLLiveLSLEditor::loadScriptText(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type)  {  	LLVFile file(vfs, uuid, type); @@ -1890,7 +1971,8 @@ LLLiveLSLSaveData::LLLiveLSLSaveData(const LLUUID& id,  	mItem = new LLViewerInventoryItem(item);  } -void LLLiveLSLEditor::saveIfNeeded(bool sync) +// virtual +void LLLiveLSLEditor::saveIfNeeded(bool sync /*= true*/)  {  	LLViewerObject* object = gObjectList.findObject(mObjectUUID);  	if(!object) @@ -1941,18 +2023,11 @@ void LLLiveLSLEditor::saveIfNeeded(bool sync)  	mItem->setAssetUUID(asset_id);  	mItem->setTransactionID(tid); -	writeToFile(filename); +	mScriptEd->writeToFile(filename);  	if (sync)  	{ -		// Sync with external ed2itor. -		std::string tmp_file = getTmpFileName(); -		llstat s; -		if (LLFile::stat(tmp_file, &s) == 0) // file exists -		{ -			if (mLiveFile) mLiveFile->ignoreNextUpdate(); -			writeToFile(tmp_file); -		} +		mScriptEd->sync();  	}  	// save it out to asset server @@ -1970,83 +2045,6 @@ void LLLiveLSLEditor::saveIfNeeded(bool sync)  	}  } -void LLLiveLSLEditor::openExternalEditor() -{ -	LLViewerObject* object = gObjectList.findObject(mObjectUUID); -	if(!object) -	{ -		LLNotificationsUtil::add("SaveScriptFailObjectNotFound"); -		return; -	} - -	delete mLiveFile; // deletes file - -	// Save the script to a temporary file. -	std::string filename = getTmpFileName(); -	writeToFile(filename); - -	// Start watching file changes. -	mLiveFile = new LLLiveLSLFile(filename, this); -	mLiveFile->addToEventTimer(); - -	// Open it in external editor. -	{ -		LLExternalEditor ed; - -		if (!ed.setCommand("LL_SCRIPT_EDITOR")) -		{ -			std::string msg = "Select an editor by setting the environment variable LL_SCRIPT_EDITOR " -				"or the ExternalEditor setting"; // *TODO: localize -			LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", msg)); -			return; -		} - -		ed.run(filename); -	} -} - -bool LLLiveLSLEditor::writeToFile(const std::string& filename) -{ -	LLFILE* fp = LLFile::fopen(filename, "wb"); -	if (!fp) -	{ -		llwarns << "Unable to write to " << filename << llendl; - -		LLSD row; -		row["columns"][0]["value"] = "Error writing to local file. Is your hard drive full?"; -		row["columns"][0]["font"] = "SANSSERIF_SMALL"; -		mScriptEd->mErrorList->addElement(row); -		return false; -	} - -	std::string utf8text = mScriptEd->mEditor->getText(); - -	// Special case for a completely empty script - stuff in one space so it can store properly.  See SL-46889 -	if (utf8text.size() == 0) -	{ -		utf8text = " "; -	} - -	fputs(utf8text.c_str(), fp); -	fclose(fp); -	return true; -} - -std::string LLLiveLSLEditor::getTmpFileName() -{ -	// Take script inventory item id (within the object inventory) -	// to consideration so that it's possible to edit multiple scripts -	// in the same object inventory simultaneously (STORM-781). -	std::string script_id = mObjectUUID.asString() + "_" + mItemUUID.asString(); - -	// Use MD5 sum to make the file name shorter and not exceed maximum path length. -	char script_id_hash_str[33];               /* Flawfinder: ignore */ -	LLMD5 script_id_hash((const U8 *)script_id.c_str()); -	script_id_hash.hex_digest(script_id_hash_str); - -	return std::string(LLFile::tmpdir()) + "sl_script_" + script_id_hash_str + ".lsl"; -} -  void LLLiveLSLEditor::uploadAssetViaCaps(const std::string& url,  										 const std::string& filename,  										 const LLUUID& task_id, @@ -2271,13 +2269,6 @@ void LLLiveLSLEditor::onSave(void* userdata, BOOL close_after_save)  // static -void LLLiveLSLEditor::onEdit(void* userdata) -{ -	LLLiveLSLEditor* self = (LLLiveLSLEditor*)userdata; -	self->openExternalEditor(); -} - -// static  void LLLiveLSLEditor::processScriptRunningReply(LLMessageSystem* msg, void**)  {  	LLUUID item_id; diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index d35c6b8528..f86be615c4 100644 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -48,6 +48,7 @@ class LLFloaterScriptSearch;  class LLKeywordToken;  class LLVFS;  class LLViewerInventoryItem; +class LLScriptEdContainer;  // Inner, implementation class.  LLPreviewScript and LLLiveLSLEditor each own one of these.  class LLScriptEdCore : public LLPanel @@ -56,17 +57,20 @@ class LLScriptEdCore : public LLPanel  	friend class LLPreviewLSL;  	friend class LLLiveLSLEditor;  	friend class LLFloaterScriptSearch; +	friend class LLScriptEdContainer; -public: +protected: +	// Supposed to be invoked only by the container.  	LLScriptEdCore( +		LLScriptEdContainer* container,  		const std::string& sample,  		const LLHandle<LLFloater>& floater_handle,  		void (*load_callback)(void* userdata),  		void (*save_callback)(void* userdata, BOOL close_after_save), -		void (*edit_callback)(void*),  		void (*search_replace_callback)(void* userdata),  		void* userdata,  		S32 bottom_pad = 0);	// pad below bottom row of buttons +public:  	~LLScriptEdCore();  	void			initMenu(); @@ -74,15 +78,19 @@ public:  	virtual void	draw();  	/*virtual*/	BOOL	postBuild();  	BOOL			canClose(); +	void			setEnableEditing(bool enable);  	void            setScriptText(const std::string& text, BOOL is_valid); +	bool			loadScriptText(const std::string& filename); +	bool			writeToFile(const std::string& filename); +	void			sync();  	void			doSave( BOOL close_after_save );  	bool			handleSaveChangesDialog(const LLSD& notification, const LLSD& response);  	bool			handleReloadFromServerDialog(const LLSD& notification, const LLSD& response); -	void			onEditButtonClick(); +	void			openInExternalEditor();  	static void		onCheckLock(LLUICtrl*, void*);  	static void		onHelpComboCommit(LLUICtrl* ctrl, void* userdata); @@ -118,7 +126,6 @@ private:  	LLTextEditor*	mEditor;  	void			(*mLoadCallback)(void* userdata);  	void			(*mSaveCallback)(void* userdata, BOOL close_after_save); -	void			(*mEditCallback)(void* userdata);  	void			(*mSearchReplaceCallback) (void* userdata);  	void*			mUserdata;  	LLComboBox		*mFunctions; @@ -132,11 +139,28 @@ private:  	S32				mLiveHelpHistorySize;  	BOOL			mEnableSave;  	BOOL			mHasScriptData; +	LLLiveLSLFile*	mLiveFile; + +	LLScriptEdContainer* mContainer; // parent view  }; +class LLScriptEdContainer : public LLPreview +{ +	friend class LLScriptEdCore; + +public: +	LLScriptEdContainer(const LLSD& key); + +protected: +	std::string		getTmpFileName(); +	bool			onExternalChange(const std::string& filename); +	virtual void	saveIfNeeded(bool sync = true) = 0; + +	LLScriptEdCore*		mScriptEd; +};  // Used to view and edit a LSL from your inventory. -class LLPreviewLSL : public LLPreview +class LLPreviewLSL : public LLScriptEdContainer  {  public:  	LLPreviewLSL(const LLSD& key ); @@ -150,7 +174,7 @@ protected:  	void closeIfNeeded();  	virtual void loadAsset(); -	void saveIfNeeded(); +	/*virtual*/ void saveIfNeeded(bool sync = true);  	void uploadAssetViaCaps(const std::string& url,  							const std::string& filename,   							const LLUUID& item_id); @@ -174,7 +198,6 @@ protected:  protected: -	LLScriptEdCore* mScriptEd;  	// Can safely close only after both text and bytecode are uploaded  	S32 mPendingUploads; @@ -182,12 +205,11 @@ protected:  // Used to view and edit an LSL that is attached to an object. -class LLLiveLSLEditor : public LLPreview +class LLLiveLSLEditor : public LLScriptEdContainer  {  	friend class LLLiveLSLFile;  public:   	LLLiveLSLEditor(const LLSD& key); -	~LLLiveLSLEditor();  	static void processScriptRunningReply(LLMessageSystem* msg, void**); @@ -208,10 +230,7 @@ private:  	virtual void loadAsset();  	void loadAsset(BOOL is_new); -	void saveIfNeeded(bool sync = true); -	void openExternalEditor(); -	std::string getTmpFileName(); -	bool writeToFile(const std::string& filename); +	/*virtual*/ void saveIfNeeded(bool sync = true);  	void uploadAssetViaCaps(const std::string& url,  							const std::string& filename,   							const LLUUID& task_id, @@ -227,7 +246,6 @@ private:  	static void onSearchReplace(void* userdata);  	static void onLoad(void* userdata);  	static void onSave(void* userdata, BOOL close_after_save); -	static void onEdit(void* userdata);  	static void onLoadComplete(LLVFS *vfs, const LLUUID& asset_uuid,  							   LLAssetType::EType type, @@ -237,7 +255,6 @@ private:  	static void onRunningCheckboxClicked(LLUICtrl*, void* userdata);  	static void onReset(void* userdata); - 	bool loadScriptText(const std::string& filename);  	void loadScriptText(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type);  	static void onErrorList(LLUICtrl*, void* user_data); @@ -248,7 +265,6 @@ private:  private:  	bool				mIsNew; -	LLScriptEdCore*		mScriptEd;  	//LLUUID mTransmitID;  	LLCheckBoxCtrl*		mRunningCheckbox;  	BOOL				mAskedForRunningInfo; @@ -263,7 +279,6 @@ private:  	LLCheckBoxCtrl*	mMonoCheckbox;  	BOOL mIsModifiable; -	LLLiveLSLFile*		mLiveFile;  };  #endif  // LL_LLPREVIEWSCRIPT_H diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 0eeb89792b..e3bc67a414 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -83,11 +83,10 @@ bool  LLScreenChannelBase::isHovering()  	return mHoveredToast->isHovered();  } -bool LLScreenChannelBase::resetPositionAndSize(const LLSD& newvalue) +void LLScreenChannelBase::resetPositionAndSize()  {  	LLRect rc = gViewerWindow->getWorldViewRectScaled();  	updatePositionAndSize(rc, rc); -	return true;  }  void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect) @@ -99,10 +98,7 @@ void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect ne  	if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE  		&& LLSideTray::instanceCreated	())  	{ -		LLSideTray*	side_bar = LLSideTray::getInstance(); - -		if (side_bar->getVisible() && !side_bar->getCollapsed()) -			world_rect_padding += side_bar->getRect().getWidth(); +		world_rect_padding += LLSideTray::getInstance()->getVisibleWidth();  	} @@ -133,7 +129,7 @@ void LLScreenChannelBase::init(S32 channel_left, S32 channel_right)  	if(LLSideTray::instanceCreated())  	{  		LLSideTray*	side_bar = LLSideTray::getInstance(); -		side_bar->getCollapseSignal().connect(boost::bind(&LLScreenChannelBase::resetPositionAndSize, this, _2)); +		side_bar->setVisibleWidthChangeCallback(boost::bind(&LLScreenChannelBase::resetPositionAndSize, this));  	}  	// top and bottom set by updateBottom() @@ -214,10 +210,7 @@ void LLScreenChannel::updatePositionAndSize(LLRect old_world_rect, LLRect new_wo  	if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE   		&& LLSideTray::instanceCreated	())  	{ -		LLSideTray*	side_bar = LLSideTray::getInstance(); - -		if (side_bar->getVisible() && !side_bar->getCollapsed()) -			world_rect_padding += side_bar->getRect().getWidth(); +		world_rect_padding += LLSideTray::getInstance()->getVisibleWidth();  	} @@ -495,7 +488,7 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel)  //--------------------------------------------------------------------------  void LLScreenChannel::redrawToasts()  { -	if(mToastList.size() == 0 || isHovering()) +	if(mToastList.size() == 0)  		return;  	switch(mToastAlignment) @@ -841,8 +834,7 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)  		}  	} -	if(!isHovering()) -		redrawToasts(); +	redrawToasts();  }  //-------------------------------------------------------------------------- diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h index c536a21779..d207d13981 100644 --- a/indra/newview/llscreenchannel.h +++ b/indra/newview/llscreenchannel.h @@ -59,8 +59,8 @@ public:  	// Channel's outfit-functions  	// update channel's size and position in the World View  	virtual void		updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect); +	void				resetPositionAndSize(); -	bool resetPositionAndSize(const LLSD& newvalue);  	// initialization of channel's shape and position  	virtual void		init(S32 channel_left, S32 channel_right); diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 3bc3959e0b..aef665a35c 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -561,7 +561,7 @@ BOOL LLSideTray::postBuild()  	{  		if ((*it).channel)  		{ -			getCollapseSignal().connect(boost::bind(&LLScreenChannelBase::resetPositionAndSize, (*it).channel, _2)); +			setVisibleWidthChangeCallback(boost::bind(&LLScreenChannelBase::resetPositionAndSize, (*it).channel));  		}  	} @@ -980,9 +980,6 @@ void LLSideTray::reflectCollapseChange()  	}  	gFloaterView->refresh(); -	 -	LLSD new_value = mCollapsed; -	mCollapseSignal(this,new_value);  }  void LLSideTray::arrange() @@ -1262,9 +1259,29 @@ bool		LLSideTray::isPanelActive(const std::string& panel_name)  void	LLSideTray::updateSidetrayVisibility()  {  	// set visibility of parent container based on collapsed state -	if (getParent()) +	LLView* parent = getParent(); +	if (parent)  	{ -		getParent()->setVisible(!mCollapsed && !gAgentCamera.cameraMouselook()); +		bool old_visibility = parent->getVisible(); +		bool new_visibility = !mCollapsed && !gAgentCamera.cameraMouselook(); + +		if (old_visibility != new_visibility) +		{ +			parent->setVisible(new_visibility); + +			// Signal change of visible width. +			llinfos << "Visible: " << new_visibility << llendl; +			mVisibleWidthChangeSignal(this, new_visibility); +		}  	}  } +S32 LLSideTray::getVisibleWidth() +{ +	return (isInVisibleChain() && !mCollapsed) ? getRect().getWidth() : 0; +} + +void LLSideTray::setVisibleWidthChangeCallback(const commit_signal_t::slot_type& cb) +{ +	mVisibleWidthChangeSignal.connect(cb); +} diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 3c572dde95..184d78845f 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -165,9 +165,18 @@ public:  	void		reshape			(S32 width, S32 height, BOOL called_from_parent = TRUE); -	void		updateSidetrayVisibility(); +	/** +	 * @return side tray width if it's visible and expanded, 0 otherwise. +	 * +	 * Not that width of the tab buttons is not included. +	 * +	 * @see setVisibleWidthChangeCallback() +	 */ +	S32			getVisibleWidth(); + +	void		setVisibleWidthChangeCallback(const commit_signal_t::slot_type& cb); -	commit_signal_t& getCollapseSignal() { return mCollapseSignal; } +	void		updateSidetrayVisibility();  	void		handleLoginComplete(); @@ -216,7 +225,7 @@ private:  	tab_order_vector_t				mOriginalTabOrder;  	LLSideTrayTab*					mActiveTab;	 -	commit_signal_t					mCollapseSignal; +	commit_signal_t					mVisibleWidthChangeSignal;  	LLButton*						mCollapseButton;  	bool							mCollapsed; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index d945af0776..611f9de2e6 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -3095,7 +3095,16 @@ bool process_login_success_response()  	std::string map_server_url = response["map-server-url"];  	if(!map_server_url.empty())  	{ -		gSavedSettings.setString("MapServerURL", map_server_url);  +		// We got an answer from the grid -> use that for map for the current session +		gSavedSettings.setString("CurrentMapServerURL", map_server_url);  +		LL_INFOS("LLStartup") << "map-server-url : we got an answer from the grid : " << map_server_url << LL_ENDL; +	} +	else +	{ +		// No answer from the grid -> use the default setting for current session  +		map_server_url = gSavedSettings.getString("MapServerURL");  +		gSavedSettings.setString("CurrentMapServerURL", map_server_url);  +		LL_INFOS("LLStartup") << "map-server-url : no map-server-url answer, we use the default setting for the map : " << map_server_url << LL_ENDL;  	}  	// Default male and female avatars allowing the user to choose their avatar on first login. diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 7313463f1b..7dc5d96689 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -171,6 +171,31 @@ const BOOL SCRIPT_QUESTION_IS_CAUTION[SCRIPT_PERMISSION_EOF] =  	FALSE	// ControlYourCamera  }; +// Extract channel and version from a string like "SL Web Viewer Beta 10.11.29.215604". +// (channel: "SL Web Viewer Beta", version: "10.11.29.215604") +static bool parse_version_info(const std::string& version_info, std::string& channel, std::string& ver) +{ +	size_t last_space = version_info.rfind(" "); +	channel = version_info; + +	if (last_space != std::string::npos) +	{ +		try +		{ +			ver = version_info.substr(last_space + 1); +			channel.replace(last_space, ver.length() + 1, ""); // strip version +		} +		catch (std::out_of_range) +		{ +			return false; +		} + +		return true; +	} + +	return false; +} +  bool friendship_offer_callback(const LLSD& notification, const LLSD& response)  {  	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); @@ -3825,28 +3850,22 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)  	if (!gLastVersionChannel.empty())  	{ -		// work out the URL for this server's Release Notes -		std::string url ="http://wiki.secondlife.com/wiki/Release_Notes/"; -		std::string server_version = version_channel; -		std::vector<std::string> s_vect; -		boost::algorithm::split(s_vect, server_version, isspace); -		for(U32 i = 0; i < s_vect.size(); i++) +		std::string url = regionp->getCapability("ServerReleaseNotes"); +		if (url.empty())  		{ -			if (i != (s_vect.size() - 1)) -			{ -				if(i != (s_vect.size() - 2)) -				{ -				   url += s_vect[i] + "_"; -				} -				else -				{ -					url += s_vect[i] + "/"; -				} -			} -			else +			// The capability hasn't arrived yet or is not supported, +			// fall back to parsing server version channel. +			std::string channel, ver; +			if (!parse_version_info(version_channel, channel, ver))  			{ -				url += s_vect[i].substr(0,4); +				llwarns << "Failed to parse server version channel (" << version_channel << ")" << llendl;  			} + +			url = gSavedSettings.getString("ReleaseNotesURL"); +			LLSD args; +			args["CHANNEL"] = LLWeb::escapeURL(channel); +			args["VERSION"] = LLWeb::escapeURL(ver); +			LLStringUtil::format(url, args);  		}  		LLSD args; diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index b8fd944321..5eeb02b080 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -186,11 +186,6 @@ public:  	/*virtual*/ std::string translateString(const char* tag,  					const std::map<std::string, std::string>& args); -	// signal on bottom tray width changed -	typedef boost::function<void (void)> bottom_tray_callback_t; -	typedef boost::signals2::signal<void (void)> bottom_tray_signal_t; -	bottom_tray_signal_t mOnBottomTrayWidthChanged; -	boost::signals2::connection setOnBottomTrayWidthChanged(bottom_tray_callback_t cb) { return mOnBottomTrayWidthChanged.connect(cb); }  	// signal on update of WorldView rect  	typedef boost::function<void (LLRect old_world_rect, LLRect new_world_rect)> world_rect_callback_t;  	typedef boost::signals2::signal<void (LLRect old_world_rect, LLRect new_world_rect)> world_rect_signal_t; diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp index be8298daab..74ed844376 100644 --- a/indra/newview/llworldmipmap.cpp +++ b/indra/newview/llworldmipmap.cpp @@ -181,8 +181,7 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::getObjectsTile(U32 grid_x, U32  LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32 grid_y, S32 level)  {  	// Get the grid coordinates -	std::string imageurl = gSavedSettings.getString("MapServerURL") + llformat("map-%d-%d-%d-objects.jpg", level, grid_x, grid_y); - +	std::string imageurl = gSavedSettings.getString("CurrentMapServerURL") + llformat("map-%d-%d-%d-objects.jpg", level, grid_x, grid_y);  	// DO NOT COMMIT!! DEBUG ONLY!!!  	// Use a local jpeg for every tile to test map speed without S3 access diff --git a/indra/newview/skins/default/xui/en/inspect_object.xml b/indra/newview/skins/default/xui/en/inspect_object.xml index eb2e7ea788..8d14c974b4 100644 --- a/indra/newview/skins/default/xui/en/inspect_object.xml +++ b/indra/newview/skins/default/xui/en/inspect_object.xml @@ -76,13 +76,24 @@ L$30,000    </text>    <!-- Overlapping buttons for all default actions.  Show "Buy" if    for sale, "Sit" if can sit, etc. --> +  <icon +   name="secure_browsing" +   image_name="Lock" +   left="0" +   visible="false" +   width="18" +   height="18" +   top="103" +   tool_tip="Secure Browsing" +   follows="left|top" />     <text     follows="all"     font="SansSerifSmall"     height="13"     name="object_media_url" -   width="220" -   top_pad="0" +   width="207" +   left_pad="2" +   top_delta="0"     max_length = "50"     use_ellipses="true">     http://www.superdupertest.com @@ -135,16 +146,6 @@ L$30,000     name="open_btn"     top_delta="0"     width="80" /> -  <icon -   name="secure_browsing" -   image_name="Lock" -   left_delta="80" -   visible="false" -   width="18" -   height="18" -   top_delta="0" -   tool_tip="Secure Browsing" -   follows="left|top" />   <!--  non-overlapping buttons here -->       <button @@ -153,7 +154,7 @@ L$30,000       label="More"       layout="topleft"       name="more_info_btn" -     left_delta="10" +     left_pad="10"       top_delta="0"       tab_stop="false"       width="80" /> diff --git a/indra/newview/skins/default/xui/en/menu_mini_map.xml b/indra/newview/skins/default/xui/en/menu_mini_map.xml index 8fe89d3934..ea263d05ce 100644 --- a/indra/newview/skins/default/xui/en/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/en/menu_mini_map.xml @@ -8,7 +8,7 @@   top="724"   visible="false"   width="128"> -    <menu_item_call +	<menu_item_call       label="Zoom Close"       name="Zoom Close">          <menu_item_call.on_click @@ -29,7 +29,14 @@           function="Minimap.Zoom"           parameter="far" />      </menu_item_call> -    <menu_item_separator /> +	<menu_item_call +     label="Zoom Default" +     name="Zoom Default"> +		<menu_item_call.on_click +         function="Minimap.Zoom" +         parameter="default" /> +	</menu_item_call> +	<menu_item_separator />      <menu_item_check         label="Rotate Map"         name="Rotate Map"> diff --git a/indra/newview/skins/default/xui/en/menu_place.xml b/indra/newview/skins/default/xui/en/menu_place.xml index 1b96eb51f0..288811d2f6 100644 --- a/indra/newview/skins/default/xui/en/menu_place.xml +++ b/indra/newview/skins/default/xui/en/menu_place.xml @@ -24,26 +24,4 @@           function="Places.OverflowMenu.Enable"           parameter="can_create_pick" />      </menu_item_call> -    <menu_item_separator -     layout="topleft"/> -    <menu_item_call -     enabled="false" -     label="Buy Pass" -     layout="topleft" -     name="pass"> -        <menu_item_call.on_click -         function="Places.OverflowMenu.Action" -         parameter="pass" /> -    </menu_item_call> -    <menu_item_separator -     layout="topleft"/> -    <menu_item_call -     enabled="false" -     label="Edit" -     layout="topleft" -     name="edit"> -        <menu_item_call.on_click -         function="Places.OverflowMenu.Action" -         parameter="edit" /> -    </menu_item_call>  </toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/panel_group_invite.xml b/indra/newview/skins/default/xui/en/panel_group_invite.xml index 15a3191bdf..cd834b61ce 100644 --- a/indra/newview/skins/default/xui/en/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/en/panel_group_invite.xml @@ -94,7 +94,7 @@       left_pad="2"       name="cancel_button"       top_delta="0" -     width="70" /> +     width="65" />  	 <string   	 name="GroupInvitation">  	 Group Invitation diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml index 1270a21710..61d6cbb2d0 100644 --- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml @@ -117,7 +117,7 @@       name="map_button"       top_delta="-4"       left_pad="0" -     width="60" +     width="57"       enabled="false" />      <text       type="string" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index da366f30ae..f0ce8b849a 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -296,6 +296,7 @@  	<check_box  		name="media_auto_play_btn"  		control_name="ParcelMediaAutoPlayEnable" +		enabled_control="AudioStreamingMedia"  		value="true"  		follows="left|bottom|right"  		height="15" diff --git a/indra/newview/skins/default/xui/en/panel_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml index a041c9b229..627b12cfe1 100644 --- a/indra/newview/skins/default/xui/en/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml @@ -180,6 +180,7 @@       name="Save_btn"       width="81" />      <button +     enabled="false"       follows="right|bottom"       height="23"       label="Edit..." diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 51fba470cb..752bb6ed3a 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -1716,8 +1716,8 @@ integer llGetRegionAgentCount()  Returns the number of avatars in the region  	</string>  	<string name="LSLTipText_llTextBox" translate="false"> -llTextBox(key avatar, string message, integer chat_channel -Shows a dialog box on the avatar's screen with the message. +llTextBox(key avatar, string message, integer chat_channel) +Shows a window on the avatar's screen with the message.  It contains a text box for input, and if entered that text is chatted on chat_channel.  	</string>  	<string name="LSLTipText_llGetAgentLanguage" translate="false"> diff --git a/indra/newview/tests/llworldmap_test.cpp b/indra/newview/tests/llworldmap_test.cpp index b976ac5ea9..acc6e814bc 100644 --- a/indra/newview/tests/llworldmap_test.cpp +++ b/indra/newview/tests/llworldmap_test.cpp @@ -25,13 +25,16 @@   * $/LicenseInfo$   */ -// Precompiled header: almost always required for newview cpp files -#include "../llviewerprecompiledheaders.h" -// Class to test -#include "../llworldmap.h"  // Dependencies -#include "../llviewerimagelist.h" +#include "linden_common.h" +#include "llapr.h" +#include "llsingleton.h" +#include "lltrans.h" +#include "lluistring.h" +#include "../llviewertexture.h"  #include "../llworldmapmessage.h" +// Class to test +#include "../llworldmap.h"  // Tut header  #include "../test/lltut.h" @@ -44,34 +47,29 @@  // * A simulator for a class can be implemented here. Please comment and document thoroughly.  // Stub image calls -LLViewerImageList::LLViewerImageList() { } -LLViewerImageList::~LLViewerImageList() { } -LLViewerImageList gImageList; -LLViewerImage* LLViewerImageList::getImage(const LLUUID &image_id, -												   BOOL usemipmaps, -												   BOOL level_immediate, -												   LLGLint internal_format, -												   LLGLenum primary_format, -												   LLHost request_from_host) -{ return NULL; } -void LLViewerImage::setBoostLevel(S32 level) { } -void LLImageGL::setAddressMode(LLTexUnit::eTextureAddressMode mode) { } +void LLViewerTexture::setBoostLevel(S32 ) { } +void LLViewerTexture::setAddressMode(LLTexUnit::eTextureAddressMode ) { } +LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture(const LLUUID&, BOOL, LLViewerTexture::EBoostLevel, S8, +																  LLGLint, LLGLenum, LLHost ) { return NULL; }  // Stub related map calls  LLWorldMapMessage::LLWorldMapMessage() { }  LLWorldMapMessage::~LLWorldMapMessage() { }  void LLWorldMapMessage::sendItemRequest(U32 type, U64 handle) { }  void LLWorldMapMessage::sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent) { } +  LLWorldMipmap::LLWorldMipmap() { }  LLWorldMipmap::~LLWorldMipmap() { }  void LLWorldMipmap::reset() { }  void LLWorldMipmap::dropBoostLevels() { }  void LLWorldMipmap::equalizeBoostLevels() { } -LLPointer<LLViewerImage> LLWorldMipmap::getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load) -{ return NULL; } +LLPointer<LLViewerFetchedTexture> LLWorldMipmap::getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load) { return NULL; }  // Stub other stuff -BOOL gPacificDaylightTime; +std::string LLTrans::getString(const std::string &, const LLStringUtil::format_map_t& ) { return std::string("test_trans"); } +void LLUIString::updateResult() const { } +void LLUIString::setArg(const std::string& , const std::string& ) { } +void LLUIString::assign(const std::string& ) { }  // End Stubbing  // ------------------------------------------------------------------------------------------- @@ -237,7 +235,7 @@ namespace tut  		// Test 9 : setLandForSaleImage() / getLandForSaleImage()  		LLUUID id;  		mSim->setLandForSaleImage(id); -		LLPointer<LLViewerImage> image = mSim->getLandForSaleImage(); +		LLPointer<LLViewerFetchedTexture> image = mSim->getLandForSaleImage();  		ensure("LLSimInfo::getLandForSaleImage() test failed", image.isNull());  		// Test 10 : isPG()  		mSim->setAccess(SIM_ACCESS_PG); @@ -370,7 +368,7 @@ namespace tut   		}  		// Test 7 : getObjectsTile()  		try { -			LLPointer<LLViewerImage> image = mWorld->getObjectsTile((U32)(X_WORLD_TEST/REGION_WIDTH_METERS), (U32)(Y_WORLD_TEST/REGION_WIDTH_METERS), 1); +			LLPointer<LLViewerFetchedTexture> image = mWorld->getObjectsTile((U32)(X_WORLD_TEST/REGION_WIDTH_METERS), (U32)(Y_WORLD_TEST/REGION_WIDTH_METERS), 1);  			ensure("LLWorldMap::getObjectsTile() failed", image.isNull());  		} catch (...) {  			fail("LLWorldMap::getObjectsTile() test failed with exception"); diff --git a/indra/newview/tests/llworldmipmap_test.cpp b/indra/newview/tests/llworldmipmap_test.cpp index 54887ae219..4c0959d1a9 100644 --- a/indra/newview/tests/llworldmipmap_test.cpp +++ b/indra/newview/tests/llworldmipmap_test.cpp @@ -25,12 +25,12 @@   * $/LicenseInfo$   */ -// Precompiled header: almost always required for newview cpp files -#include "../llviewerprecompiledheaders.h" +// Dependencies +#include "linden_common.h" +#include "../llviewertexture.h" +#include "../llviewercontrol.h"  // Class to test  #include "../llworldmipmap.h" -// Dependencies -#include "../llviewerimagelist.h"  // Tut header  #include "../test/lltut.h" @@ -42,19 +42,14 @@  // * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code)  // * A simulator for a class can be implemented here. Please comment and document thoroughly. -LLViewerImageList::LLViewerImageList() { } -LLViewerImageList::~LLViewerImageList() { } - -LLViewerImageList gImageList; +void LLViewerTexture::setBoostLevel(S32 ) { } +LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromUrl(const std::string&, BOOL, LLViewerTexture::EBoostLevel, S8,  +																		 LLGLint, LLGLenum, const LLUUID& ) { return NULL; } -LLViewerImage* LLViewerImageList::getImageFromUrl(const std::string& url, -												   BOOL usemipmaps, -												   BOOL level_immediate, -												   LLGLint internal_format, -												   LLGLenum primary_format,  -												   const LLUUID& force_id) -{ return NULL; } -void LLViewerImage::setBoostLevel(S32 level) { } +LLControlGroup::LLControlGroup(const std::string& name) : LLInstanceTracker<LLControlGroup, std::string>(name) { } +LLControlGroup::~LLControlGroup() { } +std::string LLControlGroup::getString(const std::string& ) { return std::string("test_url"); } +LLControlGroup gSavedSettings("test_settings");  // End Stubbing  // ------------------------------------------------------------------------------------------- diff --git a/indra/test/CMakeLists.txt b/indra/test/CMakeLists.txt index 66c78a86c4..e9eb3c1884 100644 --- a/indra/test/CMakeLists.txt +++ b/indra/test/CMakeLists.txt @@ -27,6 +27,7 @@ include_directories(      ${LLXML_INCLUDE_DIRS}      ${LSCRIPT_INCLUDE_DIRS}      ${GOOGLEMOCK_INCLUDE_DIRS} +    ${TUT_INCLUDE_DIR}      )  set(test_SOURCE_FILES | 
