Merge branch 'master' of https://vcs.firestormviewer.org/phoenix-firestorm
commit
c890dd2b1e
|
|
@ -107,4 +107,4 @@ my_autobuild.xml
|
|||
|
||||
compile_commands.json
|
||||
# ignore tracy for now
|
||||
indra/tracy
|
||||
indra/tracy
|
||||
|
|
|
|||
|
|
@ -261,6 +261,36 @@
|
|||
<key>version</key>
|
||||
<string>1.2.15</string>
|
||||
</map>
|
||||
<key>Tracy</key>
|
||||
<map>
|
||||
<key>copyright</key>
|
||||
<string>Copyright (c) 2017-2021, Bartosz Taudul</string>
|
||||
<key>description</key>
|
||||
<string>A real time, nanosecond resolution, remote telemetry, hybrid frame and sampling profiler for games and other applications.</string>
|
||||
<key>license</key>
|
||||
<string>BSD</string>
|
||||
<key>license_file</key>
|
||||
<string>LICENSES/Tracy.txt</string>
|
||||
<key>name</key>
|
||||
<string>Tracy</string>
|
||||
<key>platforms</key>
|
||||
<map>
|
||||
<key>common</key>
|
||||
<map>
|
||||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>b0a0fc6b7bda02fe14cccea2dd342058</string>
|
||||
<key>url</key>
|
||||
<string>http://3p.firestormviewer.org/Tracy-0.7.6-windows-210902110.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>common</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>0.7.6</string>
|
||||
</map>
|
||||
<key>apr_suite</key>
|
||||
<map>
|
||||
<key>copyright</key>
|
||||
|
|
@ -796,9 +826,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>7599bb6b05a5e48ce78180735e5d3355</string>
|
||||
<string>9a586d333b3c35389b29c7e8c7ebcc8f</string>
|
||||
<key>url</key>
|
||||
<string>http://3p.firestormviewer.org/dullahan-1.8.0.202007261348_81.3.10_gb223419_chromium-81.0.4044.138-windows-202081313.tar.bz2</string>
|
||||
<string>http://3p.firestormviewer.org/dullahan-1.8.0.202011211324_81.3.10_gb223419_chromium-81.0.4044.138-windows-203261227.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -808,9 +838,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>92ced00cd0f89d0154ce2bcc6da086e0</string>
|
||||
<string>698e79226d0fb3b935509769a36bffd4</string>
|
||||
<key>url</key>
|
||||
<string>http://3p.firestormviewer.org/dullahan-1.8.0.202007261348_81.3.10_gb223419_chromium-81.0.4044.138-windows64-202081325.tar.bz2</string>
|
||||
<string>http://3p.firestormviewer.org/dullahan-1.8.0.202011211324_81.3.10_gb223419_chromium-81.0.4044.138-windows64-203261222.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
|
|
@ -1824,9 +1854,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>eba43dcfeb1c14aab25f588d9f625839</string>
|
||||
<string>dce2cc624e216eb991412ec0c5538cf9</string>
|
||||
<key>url</key>
|
||||
<string>file:///opt/firestorm/kdu-8.0.6-linux64-202302217.tar.bz2</string>
|
||||
<string>file:///opt/firestorm/kdu-8.1-linux64-210652339.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>linux64</string>
|
||||
|
|
@ -1836,9 +1866,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>f5c682b490672aadf97ec9b938b351a9</string>
|
||||
<string>1cd284c85b5f05fff6b286e85b55ebf2</string>
|
||||
<key>url</key>
|
||||
<string>file:///c:/cygwin/opt/firestorm/kdu-8.0.6-windows-202302209.tar.bz2</string>
|
||||
<string>file:///c:/cygwin/opt/firestorm/kdu-8.1-windows-210862059.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -1848,9 +1878,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>f5c682b490672aadf97ec9b938b351a9</string>
|
||||
<string>1cd284c85b5f05fff6b286e85b55ebf2</string>
|
||||
<key>url</key>
|
||||
<string>file:///c:/cygwin/opt/firestorm/kdu-8.0.6-windows-202302209.tar.bz2</string>
|
||||
<string>file:///c:/cygwin/opt/firestorm/kdu-8.1-windows-210862059.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
|
|
|
|||
|
|
@ -31,20 +31,20 @@ if (OPENSIM)
|
|||
add_definitions(-DOPENSIM=1)
|
||||
if (SINGLEGRID)
|
||||
add_definitions(-DSINGLEGRID=1 -DSINGLEGRID_URI=\"${SINGLEGRID_URI}\")
|
||||
message("compiling with OpenSim support - Single Grid version (${SINGLEGRID_URI})")
|
||||
message(STATUS "Compiling with OpenSim support - Single Grid version (${SINGLEGRID_URI})")
|
||||
else (SINGLEGRID)
|
||||
message("compiling with OpenSim support")
|
||||
message(STATUS "Compiling with OpenSim support")
|
||||
endif (SINGLEGRID)
|
||||
else (OPENSIM)
|
||||
if (SINGLEGRID)
|
||||
message( WARNING "Value for SINGLEGRID is unused during Havok/SecondLife builds" )
|
||||
message(WARNING "Value for SINGLEGRID is unused during Havok/SecondLife builds" )
|
||||
endif()
|
||||
message("compiling without OpenSim support")
|
||||
message(STATUS "Compiling without OpenSim support")
|
||||
endif (OPENSIM)
|
||||
|
||||
if (HAVOK_TPV)
|
||||
add_definitions(-DHAVOK_TPV=1)
|
||||
message("compiling with Havok libraries")
|
||||
message(STATUS "Compiling with Havok libraries")
|
||||
endif (HAVOK_TPV)
|
||||
#</FS:AW optional opensim support>
|
||||
|
||||
|
|
@ -52,7 +52,7 @@ endif (HAVOK_TPV)
|
|||
option(TESTBUILD "Generating test build" OFF)
|
||||
if(TESTBUILD AND TESTBUILDPERIOD)
|
||||
add_definitions(-DTESTBUILD=1 -DTESTBUILDPERIOD=${TESTBUILDPERIOD})
|
||||
message("creating test build version; test period: ${TESTBUILDPERIOD} days")
|
||||
message(STATUS "Creating test build version; test period: ${TESTBUILDPERIOD} days")
|
||||
endif(TESTBUILD AND TESTBUILDPERIOD)
|
||||
#</FS:Ansariel>
|
||||
|
||||
|
|
@ -64,18 +64,27 @@ if (USE_AVX_OPTIMIZATION)
|
|||
message(FATAL_ERROR "You cannot use AVX and AVX2 at the same time!")
|
||||
else (USE_AVX2_OPTIMIZATION)
|
||||
add_definitions(-DUSE_AVX_OPTIMIZATION=1)
|
||||
message("compiling with AVX optimizations")
|
||||
message(STATUS "Compiling with AVX optimizations")
|
||||
endif (USE_AVX2_OPTIMIZATION)
|
||||
elseif (USE_AVX2_OPTIMIZATION)
|
||||
add_definitions(-DUSE_AVX2_OPTIMIZATION=1)
|
||||
message("compiling with AVX2 optimizations")
|
||||
message(STATUS "Compiling with AVX2 optimizations")
|
||||
else (USE_AVX_OPTIMIZATION)
|
||||
message("compiling without AVX optimizations")
|
||||
message(STATUS "Compiling without AVX optimizations")
|
||||
endif (USE_AVX_OPTIMIZATION)
|
||||
# </FS:Ansariel> [AVX Optimization]
|
||||
|
||||
add_subdirectory(cmake)
|
||||
|
||||
# <FS:Beq> Tracy Profiler support
|
||||
option(USE_TRACY_PROFILER "Tracy Profiler support" OFF)
|
||||
if (USE_TRACY_PROFILER)
|
||||
message(STATUS "Compiling with Tracy profiler")
|
||||
else (USE_TRACY_PROFILER)
|
||||
message(STATUS "Compiling without Tracy profiler")
|
||||
endif (USE_TRACY_PROFILER)
|
||||
# </FS:Beq> Tracy Profiler support
|
||||
|
||||
add_subdirectory(${LIBS_OPEN_PREFIX}llaudio)
|
||||
add_subdirectory(${LIBS_OPEN_PREFIX}llappearance)
|
||||
add_subdirectory(${LIBS_OPEN_PREFIX}llcharacter)
|
||||
|
|
|
|||
|
|
@ -60,6 +60,15 @@ if (WINDOWS)
|
|||
# Don't build DLLs.
|
||||
set(BUILD_SHARED_LIBS OFF)
|
||||
|
||||
if( USE_COMPILERCACHE )
|
||||
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
|
||||
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
|
||||
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_REELASE}")
|
||||
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
|
||||
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
|
||||
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
|
||||
endif()
|
||||
|
||||
# for "backwards compatibility", cmake sneaks in the Zm1000 option which royally
|
||||
# screws incredibuild. this hack disables it.
|
||||
# for details see: http://connect.microsoft.com/VisualStudio/feedback/details/368107/clxx-fatal-error-c1027-inconsistent-values-for-ym-between-creation-and-use-of-precompiled-headers
|
||||
|
|
@ -139,7 +148,6 @@ if (WINDOWS)
|
|||
# /arch:SSE2
|
||||
/fp:fast
|
||||
)
|
||||
|
||||
# Nicky: x64 implies SSE2
|
||||
if( ADDRESS_SIZE EQUAL 32 )
|
||||
add_definitions( /arch:SSE2 )
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ if (NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/n
|
|||
|
||||
if (DEFINED ENV{revision})
|
||||
set(VIEWER_VERSION_REVISION $ENV{revision})
|
||||
message("Revision (from environment): ${VIEWER_VERSION_REVISION}")
|
||||
message(STATUS "Revision (from environment): ${VIEWER_VERSION_REVISION}")
|
||||
|
||||
elseif (DEFINED ENV{AUTOBUILD_BUILD_ID})
|
||||
set(VIEWER_VERSION_REVISION $ENV{AUTOBUILD_BUILD_ID})
|
||||
|
|
@ -38,23 +38,23 @@ if (NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/n
|
|||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
if ("${VIEWER_VERSION_REVISION}" MATCHES "^[0-9]+$")
|
||||
message("Revision (from hg) ${VIEWER_VERSION_REVISION}")
|
||||
message(STATUS "Revision (from hg) ${VIEWER_VERSION_REVISION}")
|
||||
else ("${VIEWER_VERSION_REVISION}" MATCHES "^[0-9]+$")
|
||||
message("Revision not set (repository not found?); using 0")
|
||||
message(STATUS "Revision not set (repository not found?); using 0")
|
||||
set(VIEWER_VERSION_REVISION 0 )
|
||||
endif ("${VIEWER_VERSION_REVISION}" MATCHES "^[0-9]+$")
|
||||
else (DEFINED MERCURIAL AND DEFINED SED)
|
||||
message("Revision not set: 'hg' or 'sed' not found; using 0")
|
||||
message(STATUS "Revision not set: 'hg' or 'sed' not found; using 0")
|
||||
set(VIEWER_VERSION_REVISION 0)
|
||||
endif (DEFINED MERCURIAL AND DEFINED SED)
|
||||
endif (DEFINED ENV{revision})
|
||||
message("Building '${VIEWER_CHANNEL}' Version ${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}")
|
||||
message(STATUS "Building '${VIEWER_CHANNEL}' Version ${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}")
|
||||
else ( EXISTS ${VIEWER_VERSION_BASE_FILE} )
|
||||
message(SEND_ERROR "Cannot get viewer version from '${VIEWER_VERSION_BASE_FILE}'")
|
||||
endif ( EXISTS ${VIEWER_VERSION_BASE_FILE} )
|
||||
|
||||
if ("${VIEWER_VERSION_REVISION}" STREQUAL "")
|
||||
message("Ultimate fallback, revision was blank or not set: will use 0")
|
||||
message(STATUS "Ultimate fallback, revision was blank or not set: will use 0")
|
||||
set(VIEWER_VERSION_REVISION 0)
|
||||
endif ("${VIEWER_VERSION_REVISION}" STREQUAL "")
|
||||
|
||||
|
|
|
|||
|
|
@ -86,6 +86,7 @@ set(cmake_SOURCE_FILES
|
|||
PulseAudio.cmake
|
||||
Python.cmake
|
||||
TemplateCheck.cmake
|
||||
Tracy.cmake
|
||||
Tut.cmake
|
||||
UI.cmake
|
||||
UnixInstall.cmake
|
||||
|
|
|
|||
|
|
@ -4,12 +4,21 @@ include(APR)
|
|||
include(Boost)
|
||||
include(EXPAT)
|
||||
include(ZLIB)
|
||||
include(Tracy) # <FS:Beq> Tracy profiler
|
||||
|
||||
# <FS:Beq> Add Tracy profiler support
|
||||
#set(LLCOMMON_INCLUDE_DIRS
|
||||
# ${LIBS_OPEN_DIR}/llcommon
|
||||
# ${APRUTIL_INCLUDE_DIR}
|
||||
# ${APR_INCLUDE_DIR}
|
||||
# )
|
||||
set(LLCOMMON_INCLUDE_DIRS
|
||||
${LIBS_OPEN_DIR}/llcommon
|
||||
${APRUTIL_INCLUDE_DIR}
|
||||
${APR_INCLUDE_DIR}
|
||||
${TRACY_INCLUDE_DIR}
|
||||
)
|
||||
# </FS:Beq>
|
||||
set(LLCOMMON_SYSTEM_INCLUDE_DIRS
|
||||
${Boost_INCLUDE_DIRS}
|
||||
)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
# Tracy Profiler support.
|
||||
if (USE_TRACY_PROFILER)
|
||||
include(Prebuilt)
|
||||
use_prebuilt_binary(Tracy)
|
||||
if (WINDOWS)
|
||||
# set(TRACY_LIBRARIES
|
||||
# ${ARCH_PREBUILT_DIRS_RELEASE}/Tracy.lib
|
||||
add_definitions(-DTRACY_ENABLE=1 -DTRACY_NO_FASTTIMERS -DWINVER=0x0601 )
|
||||
set(TRACY_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/tracy)
|
||||
elseif (DARWIN)
|
||||
message(FATAL_ERROR "Tracy is not yet implemented in FS for OSX.")
|
||||
else (WINDOWS)
|
||||
add_definitions(-DTRACY_ENABLE=1 -DTRACY_NO_FASTTIMERS )
|
||||
set(TRACY_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/tracy)
|
||||
endif (WINDOWS)
|
||||
endif (USE_TRACY_PROFILER)
|
||||
|
|
@ -804,7 +804,7 @@ bool LLAudioBufferFMODSTUDIO::loadWAV(const std::string& filename)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!LLAPRFile::isExist(filename, NULL, LL_APR_RPB))
|
||||
if (!gDirUtilp->fileExists(filename))
|
||||
{
|
||||
// File not found, abort.
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@ set(llcommon_SOURCE_FILES
|
|||
llinitparam.cpp
|
||||
llinitdestroyclass.cpp
|
||||
llinstancetracker.cpp
|
||||
llkeybind.cpp
|
||||
llleap.cpp
|
||||
llleaplistener.cpp
|
||||
llliveappconfig.cpp
|
||||
|
|
@ -180,6 +181,7 @@ set(llcommon_HEADER_FILES
|
|||
llinitdestroyclass.h
|
||||
llinitparam.h
|
||||
llinstancetracker.h
|
||||
llkeybind.h
|
||||
llkeythrottle.h
|
||||
llleap.h
|
||||
llleaplistener.h
|
||||
|
|
@ -254,6 +256,11 @@ set(llcommon_HEADER_FILES
|
|||
)
|
||||
|
||||
# <FS:ND> Add all nd* files. memory pool, intrinsics, ...
|
||||
# <FS:Beq> Tracy Profiler support
|
||||
list(APPEND llcommon_SOURCE_FILES fstelemetry.cpp)
|
||||
if (USE_TRACY_PROFILER)
|
||||
list(APPEND llcommon_SOURCE_FILES fstracyclient.cpp)
|
||||
endif()
|
||||
|
||||
SET( llcommon_ND_SOURCE_FILES
|
||||
nd/ndexceptions.cpp
|
||||
|
|
|
|||
|
|
@ -0,0 +1,31 @@
|
|||
/**
|
||||
* @file fstelemetry.cpp
|
||||
* @brief fstelemetry Telemetry abstraction for FS
|
||||
*
|
||||
* $LicenseInfo:firstyear=2021&license=fsviewerlgpl$
|
||||
* Phoenix Firestorm Viewer Source Code
|
||||
* Copyright (C) 2021, The Phoenix Firestorm Project, 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
|
||||
*
|
||||
* The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
|
||||
* http://www.firestormviewer.org
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
#include "fstelemetry.h"
|
||||
namespace FSTelemetry
|
||||
{
|
||||
bool active{false};
|
||||
}
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
#pragma once
|
||||
#ifndef FS_TELEMETRY_H_INCLUDED
|
||||
#define FS_TELEMETRY_H_INCLUDED
|
||||
/**
|
||||
* @file fstelemetry.h
|
||||
* @brief fstelemetry Telemetry abstraction for FS
|
||||
*
|
||||
* $LicenseInfo:firstyear=2021&license=fsviewerlgpl$
|
||||
* Phoenix Firestorm Viewer Source Code
|
||||
* Copyright (C) 2021, The Phoenix Firestorm Project, 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
|
||||
*
|
||||
* The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
|
||||
* http://www.firestormviewer.org
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
// define a simple set of empty macros that allow us to build without the Tracy profiler installed in 3p
|
||||
// this is similar to the profiler abstraction used by LL but as they have no plans to release that any time soon we'll replace it
|
||||
// Just a minimal set at the moment will add locks/gpu/memory and other stuff later.
|
||||
|
||||
// generic switch (in case we ever add others or incorporate commercial tools like RAD Games if LL were to share a license)
|
||||
// turn off in the else statement below.
|
||||
#define FS_HAS_TELEMETRY_SUPPORT
|
||||
|
||||
#ifdef TRACY_ENABLE // (Tracy open source telemetry)
|
||||
#include "Tracy.hpp"
|
||||
|
||||
#define FSZone ZoneNamed( ___tracy_scoped_zone, FSTelemetry::active)
|
||||
#define FSZoneN( name ) ZoneNamedN( ___tracy_scoped_zone, name, FSTelemetry::active)
|
||||
#define FSZoneC( color ) ZoneNamedC( ___tracy_scoped_zone, color, FSTelemetry::active)
|
||||
#define FSZoneNC( name, color ) ZoneNamedNC( ___tracy_scoped_zone, name, color, FSTelemetry::active)
|
||||
#define FSPlot( name, value ) TracyPlot( name, value)
|
||||
#define FSFrameMark FrameMark
|
||||
#define FSTelemetryIsConnected TracyIsConnected
|
||||
|
||||
#else // (no telemetry)
|
||||
|
||||
// No we don't want no stinkin' telemetry. move along
|
||||
#undef FS_HAS_TELEMETRY_SUPPORT
|
||||
|
||||
#define FSZone
|
||||
#define FSZoneN( name )
|
||||
#define FSZoneC( color )
|
||||
#define FSZoneNC( name, color )
|
||||
#define FSPlot( name, value )
|
||||
#define FSFrameMark
|
||||
#define FSTelemetryIsConnected
|
||||
#endif // TRACY_ENABLE
|
||||
|
||||
namespace FSTelemetry
|
||||
{
|
||||
extern bool active;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
//
|
||||
// Tracy profiler
|
||||
// ----------------
|
||||
//
|
||||
// For fast integration, compile and
|
||||
// link with this source file (and none
|
||||
// other) in your executable (or in the
|
||||
// main DLL / shared object on multi-DLL
|
||||
// projects).
|
||||
//
|
||||
|
||||
// Define TRACY_ENABLE to enable profiler.
|
||||
#include "common/TracySystem.cpp"
|
||||
|
||||
#ifdef TRACY_ENABLE
|
||||
|
||||
#ifdef LL_WINDOWS
|
||||
# pragma warning(push, 0)
|
||||
#endif
|
||||
|
||||
#include "common/tracy_lz4.cpp"
|
||||
#include "client/TracyProfiler.cpp"
|
||||
#include "client/TracyCallstack.cpp"
|
||||
#include "client/TracySysTime.cpp"
|
||||
|
||||
#include "client/TracySysTrace.cpp"
|
||||
|
||||
#include "common/TracySocket.cpp"
|
||||
#include "client/tracy_rpmalloc.cpp"
|
||||
#include "client/TracyDxt1.cpp"
|
||||
|
||||
#if TRACY_HAS_CALLSTACK == 2 || TRACY_HAS_CALLSTACK == 3 || TRACY_HAS_CALLSTACK == 4 || TRACY_HAS_CALLSTACK == 6
|
||||
# include "libbacktrace/alloc.cpp"
|
||||
# include "libbacktrace/dwarf.cpp"
|
||||
# include "libbacktrace/fileline.cpp"
|
||||
# include "libbacktrace/mmapio.cpp"
|
||||
# include "libbacktrace/posix.cpp"
|
||||
# include "libbacktrace/sort.cpp"
|
||||
# include "libbacktrace/state.cpp"
|
||||
# if TRACY_HAS_CALLSTACK == 4
|
||||
# include "libbacktrace/macho.cpp"
|
||||
# else
|
||||
# include "libbacktrace/elf.cpp"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef LL_WINDOWS
|
||||
# pragma comment(lib, "ws2_32.lib")
|
||||
# pragma comment(lib, "dbghelp.lib")
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -57,6 +57,17 @@ enum ETerrainBrushType
|
|||
E_LANDBRUSH_INVALID = 6
|
||||
};
|
||||
|
||||
enum EMouseClickType{
|
||||
CLICK_NONE = -1,
|
||||
CLICK_LEFT = 0,
|
||||
CLICK_MIDDLE,
|
||||
CLICK_RIGHT,
|
||||
CLICK_BUTTON4,
|
||||
CLICK_BUTTON5,
|
||||
CLICK_DOUBLELEFT,
|
||||
CLICK_COUNT // 'size', CLICK_NONE does not counts
|
||||
};
|
||||
|
||||
// keys
|
||||
// Bit masks for various keyboard modifier keys.
|
||||
const MASK MASK_NONE = 0x0000;
|
||||
|
|
|
|||
|
|
@ -60,7 +60,6 @@ namespace LLTrace
|
|||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// statics
|
||||
|
||||
bool BlockTimer::sLog = false;
|
||||
std::string BlockTimer::sLogName = "";
|
||||
bool BlockTimer::sMetricLog = false;
|
||||
|
|
|
|||
|
|
@ -38,7 +38,27 @@
|
|||
#define LL_FAST_TIMER_ON 1
|
||||
#define LL_FASTTIMER_USE_RDTSC 1
|
||||
|
||||
#define LL_RECORD_BLOCK_TIME(timer_stat) const LLTrace::BlockTimer& LL_GLUE_TOKENS(block_time_recorder, __LINE__)(LLTrace::timeThisBlock(timer_stat)); (void)LL_GLUE_TOKENS(block_time_recorder, __LINE__);
|
||||
// <FS:Beq> Add Tracy profiler support
|
||||
/*
|
||||
#define LL_RECORD_BLOCK_TIME(timer_stat) \
|
||||
const LLTrace::BlockTimer& LL_GLUE_TOKENS(block_time_recorder, __LINE__)(LLTrace::timeThisBlock(timer_stat)); (void)LL_GLUE_TOKENS(block_time_recorder, __LINE__);
|
||||
*/
|
||||
#include "fstelemetry.h"
|
||||
#ifdef TRACY_ENABLE
|
||||
// #undef TRACY_NO_FASTTIMERS // Uncomment if you want FASTTIMERS as well.
|
||||
#ifdef TRACY_NO_FASTTIMERS
|
||||
#define LL_RECORD_BLOCK_TIME(timer_stat) \
|
||||
FSZoneN( #timer_stat );
|
||||
#else // TRACY_NO_FASTTIMERS
|
||||
#define LL_RECORD_BLOCK_TIME(timer_stat) \
|
||||
FSZoneN( #timer_stat ); \
|
||||
const LLTrace::BlockTimer& LL_GLUE_TOKENS(block_time_recorder, __LINE__)(LLTrace::timeThisBlock(timer_stat)); (void)LL_GLUE_TOKENS(block_time_recorder, __LINE__);
|
||||
#endif // TRACY_NO_FASTTIMERS
|
||||
#else // TRACY_ENABLE
|
||||
#define LL_RECORD_BLOCK_TIME(timer_stat) \
|
||||
const LLTrace::BlockTimer& LL_GLUE_TOKENS(block_time_recorder, __LINE__)(LLTrace::timeThisBlock(timer_stat)); (void)LL_GLUE_TOKENS(block_time_recorder, __LINE__);
|
||||
#endif // TRACY_ENABLE
|
||||
// </FS:Beq>
|
||||
|
||||
namespace LLTrace
|
||||
{
|
||||
|
|
|
|||
|
|
@ -0,0 +1,395 @@
|
|||
/**
|
||||
* @file llkeybind.cpp
|
||||
* @brief Information about key combinations.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2019&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2019, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#include "linden_common.h"
|
||||
|
||||
#include "llkeybind.h"
|
||||
|
||||
#include "llsd.h"
|
||||
#include "llsdutil.h"
|
||||
|
||||
LLKeyData::LLKeyData()
|
||||
:
|
||||
mMouse(CLICK_NONE),
|
||||
mKey(KEY_NONE),
|
||||
mMask(MASK_NONE),
|
||||
mIgnoreMasks(false)
|
||||
{
|
||||
}
|
||||
|
||||
LLKeyData::LLKeyData(EMouseClickType mouse, KEY key, MASK mask)
|
||||
:
|
||||
mMouse(mouse),
|
||||
mKey(key),
|
||||
mMask(mask),
|
||||
mIgnoreMasks(false)
|
||||
{
|
||||
}
|
||||
|
||||
LLKeyData::LLKeyData(EMouseClickType mouse, KEY key, bool ignore_mask)
|
||||
:
|
||||
mMouse(mouse),
|
||||
mKey(key),
|
||||
mMask(MASK_NONE),
|
||||
mIgnoreMasks(ignore_mask)
|
||||
{
|
||||
}
|
||||
|
||||
LLKeyData::LLKeyData(EMouseClickType mouse, KEY key, MASK mask, bool ignore_mask)
|
||||
:
|
||||
mMouse(mouse),
|
||||
mKey(key),
|
||||
mMask(mask),
|
||||
mIgnoreMasks(ignore_mask)
|
||||
{
|
||||
}
|
||||
|
||||
LLKeyData::LLKeyData(const LLSD &key_data)
|
||||
{
|
||||
if (key_data.has("mouse"))
|
||||
{
|
||||
mMouse = (EMouseClickType)key_data["mouse"].asInteger();
|
||||
}
|
||||
if (key_data.has("key"))
|
||||
{
|
||||
mKey = key_data["key"].asInteger();
|
||||
}
|
||||
if (key_data.has("ignore_accelerators"))
|
||||
{
|
||||
mIgnoreMasks = key_data["ignore_accelerators"];
|
||||
}
|
||||
if (key_data.has("mask"))
|
||||
{
|
||||
mMask = key_data["mask"].asInteger();
|
||||
}
|
||||
}
|
||||
|
||||
LLSD LLKeyData::asLLSD() const
|
||||
{
|
||||
LLSD data;
|
||||
data["mouse"] = (LLSD::Integer)mMouse;
|
||||
data["key"] = (LLSD::Integer)mKey;
|
||||
data["mask"] = (LLSD::Integer)mMask;
|
||||
if (mIgnoreMasks)
|
||||
{
|
||||
data["ignore_accelerators"] = (LLSD::Boolean)mIgnoreMasks;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
bool LLKeyData::isEmpty() const
|
||||
{
|
||||
return mMouse == CLICK_NONE && mKey == KEY_NONE;
|
||||
}
|
||||
|
||||
void LLKeyData::reset()
|
||||
{
|
||||
mMouse = CLICK_NONE;
|
||||
mKey = KEY_NONE;
|
||||
mMask = MASK_NONE;
|
||||
mIgnoreMasks = false;
|
||||
}
|
||||
|
||||
LLKeyData& LLKeyData::operator=(const LLKeyData& rhs)
|
||||
{
|
||||
mMouse = rhs.mMouse;
|
||||
mKey = rhs.mKey;
|
||||
mMask = rhs.mMask;
|
||||
mIgnoreMasks = rhs.mIgnoreMasks;
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool LLKeyData::operator==(const LLKeyData& rhs)
|
||||
{
|
||||
if (mMouse != rhs.mMouse) return false;
|
||||
if (mKey != rhs.mKey) return false;
|
||||
if (mMask != rhs.mMask) return false;
|
||||
if (mIgnoreMasks != rhs.mIgnoreMasks) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool LLKeyData::operator!=(const LLKeyData& rhs)
|
||||
{
|
||||
if (mMouse != rhs.mMouse) return true;
|
||||
if (mKey != rhs.mKey) return true;
|
||||
if (mMask != rhs.mMask) return true;
|
||||
if (mIgnoreMasks != rhs.mIgnoreMasks) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool LLKeyData::canHandle(const LLKeyData& data) const
|
||||
{
|
||||
if (data.mKey == mKey
|
||||
&& data.mMouse == mMouse
|
||||
&& ((mIgnoreMasks && (data.mMask & mMask) == mMask) || data.mMask == mMask))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool LLKeyData::canHandle(EMouseClickType mouse, KEY key, MASK mask) const
|
||||
{
|
||||
if (mouse == mMouse
|
||||
&& key == mKey
|
||||
&& ((mIgnoreMasks && (mask & mMask) == mMask) || mask == mMask))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// LLKeyBind
|
||||
|
||||
LLKeyBind::LLKeyBind(const LLSD &key_bind)
|
||||
{
|
||||
if (key_bind.isArray())
|
||||
{
|
||||
for (LLSD::array_const_iterator data = key_bind.beginArray(), endLists = key_bind.endArray();
|
||||
data != endLists;
|
||||
data++
|
||||
)
|
||||
{
|
||||
mData.push_back(LLKeyData(*data));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool LLKeyBind::operator==(const LLKeyBind& rhs)
|
||||
{
|
||||
U32 size = mData.size();
|
||||
if (size != rhs.mData.size()) return false;
|
||||
|
||||
for (U32 i = 0; i < size; i++)
|
||||
{
|
||||
if (mData[i] != rhs.mData[i]) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool LLKeyBind::operator!=(const LLKeyBind& rhs)
|
||||
{
|
||||
U32 size = mData.size();
|
||||
if (size != rhs.mData.size()) return true;
|
||||
|
||||
for (U32 i = 0; i < size; i++)
|
||||
{
|
||||
if (mData[i] != rhs.mData[i]) return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool LLKeyBind::isEmpty() const
|
||||
{
|
||||
for (data_vector_t::const_iterator iter = mData.begin(); iter != mData.end(); iter++)
|
||||
{
|
||||
if (!iter->isEmpty()) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
LLSD LLKeyBind::asLLSD() const
|
||||
{
|
||||
S32 last = mData.size() - 1;
|
||||
while (mData[last].empty())
|
||||
{
|
||||
last--;
|
||||
}
|
||||
|
||||
LLSD data;
|
||||
for (S32 i = 0; i <= last; ++i)
|
||||
{
|
||||
// append even if empty to not affect visual representation
|
||||
data.append(mData[i].asLLSD());
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
bool LLKeyBind::canHandle(EMouseClickType mouse, KEY key, MASK mask) const
|
||||
{
|
||||
if (mouse == CLICK_NONE && key == KEY_NONE)
|
||||
{
|
||||
// assume placeholder
|
||||
return false;
|
||||
}
|
||||
|
||||
for (data_vector_t::const_iterator iter = mData.begin(); iter != mData.end(); iter++)
|
||||
{
|
||||
if (iter->canHandle(mouse, key, mask))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool LLKeyBind::canHandleKey(KEY key, MASK mask) const
|
||||
{
|
||||
return canHandle(CLICK_NONE, key, mask);
|
||||
}
|
||||
|
||||
bool LLKeyBind::canHandleMouse(EMouseClickType mouse, MASK mask) const
|
||||
{
|
||||
return canHandle(mouse, KEY_NONE, mask);
|
||||
}
|
||||
|
||||
bool LLKeyBind::hasKeyData(EMouseClickType mouse, KEY key, MASK mask, bool ignore) const
|
||||
{
|
||||
if (mouse != CLICK_NONE || key != KEY_NONE)
|
||||
{
|
||||
for (data_vector_t::const_iterator iter = mData.begin(); iter != mData.end(); iter++)
|
||||
{
|
||||
if (iter->mKey == key
|
||||
&& iter->mMask == mask
|
||||
&& iter->mMouse == mouse
|
||||
&& iter->mIgnoreMasks == ignore)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool LLKeyBind::hasKeyData(const LLKeyData& data) const
|
||||
{
|
||||
return hasKeyData(data.mMouse, data.mKey, data.mMask, data.mIgnoreMasks);
|
||||
}
|
||||
|
||||
bool LLKeyBind::hasKeyData(U32 index) const
|
||||
{
|
||||
return mData.size() > index;
|
||||
}
|
||||
|
||||
S32 LLKeyBind::findKeyData(EMouseClickType mouse, KEY key, MASK mask, bool ignore) const
|
||||
{
|
||||
if (mouse != CLICK_NONE || key != KEY_NONE)
|
||||
{
|
||||
for (S32 i = 0; i < mData.size(); ++i)
|
||||
{
|
||||
if (mData[i].mKey == key
|
||||
&& mData[i].mMask == mask
|
||||
&& mData[i].mMouse == mouse
|
||||
&& mData[i].mIgnoreMasks == ignore)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
S32 LLKeyBind::findKeyData(const LLKeyData& data) const
|
||||
{
|
||||
return findKeyData(data.mMouse, data.mKey, data.mMask, data.mIgnoreMasks);
|
||||
}
|
||||
|
||||
LLKeyData LLKeyBind::getKeyData(U32 index) const
|
||||
{
|
||||
if (mData.size() > index)
|
||||
{
|
||||
return mData[index];
|
||||
}
|
||||
return LLKeyData();
|
||||
}
|
||||
|
||||
bool LLKeyBind::addKeyData(EMouseClickType mouse, KEY key, MASK mask, bool ignore)
|
||||
{
|
||||
if (!hasKeyData(mouse, key, mask, ignore))
|
||||
{
|
||||
mData.push_back(LLKeyData(mouse, key, mask, ignore));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool LLKeyBind::addKeyData(const LLKeyData& data)
|
||||
{
|
||||
if (!hasKeyData(data))
|
||||
{
|
||||
mData.push_back(data);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void LLKeyBind::replaceKeyData(EMouseClickType mouse, KEY key, MASK mask, bool ignore, U32 index)
|
||||
{
|
||||
replaceKeyData(LLKeyData(mouse, key, mask, ignore), index);
|
||||
}
|
||||
|
||||
void LLKeyBind::replaceKeyData(const LLKeyData& data, U32 index)
|
||||
{
|
||||
if (!data.isEmpty())
|
||||
{
|
||||
// if both click and key are none (isEmpty()), we are inserting a placeholder, we don't want to reset anything
|
||||
// otherwise reset identical key
|
||||
for (data_vector_t::iterator iter = mData.begin(); iter != mData.end(); iter++)
|
||||
{
|
||||
if (iter->mKey == data.mKey
|
||||
&& iter->mMouse == data.mMouse
|
||||
&& iter->mIgnoreMasks == data.mIgnoreMasks
|
||||
&& iter->mMask == data.mMask)
|
||||
{
|
||||
// Replacing only fully equal combinations even in case 'ignore' is set
|
||||
// Reason: Simplicity and user might decide to do a 'move' command as W and Shift+Ctrl+W, and 'run' as Shift+W
|
||||
iter->reset();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mData.size() <= index)
|
||||
{
|
||||
mData.resize(index + 1);
|
||||
}
|
||||
mData[index] = data;
|
||||
}
|
||||
|
||||
void LLKeyBind::resetKeyData(S32 index)
|
||||
{
|
||||
if (mData.size() > index)
|
||||
{
|
||||
mData[index].reset();
|
||||
}
|
||||
}
|
||||
|
||||
void LLKeyBind::trimEmpty()
|
||||
{
|
||||
S32 last = mData.size() - 1;
|
||||
while (last >= 0 && mData[last].empty())
|
||||
{
|
||||
mData.erase(mData.begin() + last);
|
||||
last--;
|
||||
}
|
||||
}
|
||||
|
||||
U32 LLKeyBind::getDataCount()
|
||||
{
|
||||
return mData.size();
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,106 @@
|
|||
/**
|
||||
* @file llkeybind.h
|
||||
* @brief Information about key combinations.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifndef LL_KEYBIND_H
|
||||
#define LL_KEYBIND_H
|
||||
|
||||
#include "indra_constants.h"
|
||||
|
||||
// KeyData - single key combination (mouse/mask/keyboard)
|
||||
class LL_COMMON_API LLKeyData
|
||||
{
|
||||
public:
|
||||
LLKeyData();
|
||||
LLKeyData(EMouseClickType mouse, KEY key, MASK mask);
|
||||
LLKeyData(EMouseClickType mouse, KEY key, bool ignore_mask);
|
||||
LLKeyData(EMouseClickType mouse, KEY key, MASK mask, bool ignore_mask);
|
||||
LLKeyData(const LLSD &key_data);
|
||||
|
||||
LLSD asLLSD() const;
|
||||
bool isEmpty() const;
|
||||
bool empty() const { return isEmpty(); };
|
||||
void reset();
|
||||
LLKeyData& operator=(const LLKeyData& rhs);
|
||||
bool operator==(const LLKeyData& rhs);
|
||||
bool operator!=(const LLKeyData& rhs);
|
||||
|
||||
bool canHandle(const LLKeyData& data) const;
|
||||
bool canHandle(EMouseClickType mouse, KEY key, MASK mask) const;
|
||||
|
||||
EMouseClickType mMouse;
|
||||
KEY mKey;
|
||||
MASK mMask;
|
||||
// Either to expect exact match or ignore not expected masks as long as expected mask-bit is present
|
||||
bool mIgnoreMasks;
|
||||
};
|
||||
|
||||
// One function can bind to multiple Key options
|
||||
class LLKeyBind
|
||||
{
|
||||
public:
|
||||
LLKeyBind() {}
|
||||
LLKeyBind(const LLSD &key_bind);
|
||||
|
||||
bool operator==(const LLKeyBind& rhs);
|
||||
bool operator!=(const LLKeyBind& rhs);
|
||||
bool isEmpty() const;
|
||||
bool empty() const { return isEmpty(); };
|
||||
|
||||
LLSD asLLSD() const;
|
||||
|
||||
bool canHandle(EMouseClickType mouse, KEY key, MASK mask) const;
|
||||
bool canHandleKey(KEY key, MASK mask) const;
|
||||
bool canHandleMouse(EMouseClickType mouse, MASK mask) const;
|
||||
|
||||
// contains specified combination
|
||||
bool hasKeyData(EMouseClickType mouse, KEY key, MASK mask, bool ignore) const;
|
||||
bool hasKeyData(const LLKeyData& data) const;
|
||||
bool hasKeyData(U32 index) const;
|
||||
|
||||
// index of contained LLKeyData
|
||||
S32 findKeyData(EMouseClickType mouse, KEY key, MASK mask, bool ignore) const;
|
||||
S32 findKeyData(const LLKeyData& data) const;
|
||||
|
||||
LLKeyData getKeyData(U32 index) const;
|
||||
|
||||
// these methods enshure there will be no repeats
|
||||
bool addKeyData(EMouseClickType mouse, KEY key, MASK mask, bool ignore);
|
||||
bool addKeyData(const LLKeyData& data);
|
||||
void replaceKeyData(EMouseClickType mouse, KEY key, MASK mask, bool ignore, U32 index);
|
||||
void replaceKeyData(const LLKeyData& data, U32 index);
|
||||
void resetKeyData(S32 index);
|
||||
void clear() { mData.clear(); }
|
||||
// if there any empty LLKeyData in the end of the array, remove them
|
||||
void trimEmpty();
|
||||
U32 getDataCount();
|
||||
|
||||
private:
|
||||
typedef std::vector<LLKeyData> data_vector_t;
|
||||
data_vector_t mData;
|
||||
};
|
||||
|
||||
|
||||
#endif // LL_KEYBIND_H
|
||||
|
|
@ -57,6 +57,7 @@ LLFileSystem::~LLFileSystem()
|
|||
// static
|
||||
bool LLFileSystem::getExists(const LLUUID& file_id, const LLAssetType::EType file_type)
|
||||
{
|
||||
FSZoneC(tracy::Color::Gold); // <FS:Beq> measure cache performance
|
||||
std::string id_str;
|
||||
file_id.toString(id_str);
|
||||
const std::string extra_info = "";
|
||||
|
|
@ -85,6 +86,7 @@ bool LLFileSystem::getExists(const LLUUID& file_id, const LLAssetType::EType fil
|
|||
bool LLFileSystem::removeFile(const LLUUID& file_id, const LLAssetType::EType file_type, int suppress_error /*= 0*/)
|
||||
// </FS:Ansariel>
|
||||
{
|
||||
FSZoneC(tracy::Color::Gold); // <FS:Beq> measure cache performance
|
||||
std::string id_str;
|
||||
file_id.toString(id_str);
|
||||
const std::string extra_info = "";
|
||||
|
|
@ -102,6 +104,7 @@ bool LLFileSystem::removeFile(const LLUUID& file_id, const LLAssetType::EType fi
|
|||
bool LLFileSystem::renameFile(const LLUUID& old_file_id, const LLAssetType::EType old_file_type,
|
||||
const LLUUID& new_file_id, const LLAssetType::EType new_file_type)
|
||||
{
|
||||
FSZoneC(tracy::Color::Gold); // <FS:Beq> measure cache performance
|
||||
std::string old_id_str;
|
||||
old_file_id.toString(old_id_str);
|
||||
const std::string extra_info = "";
|
||||
|
|
@ -132,6 +135,7 @@ bool LLFileSystem::renameFile(const LLUUID& old_file_id, const LLAssetType::ETyp
|
|||
// static
|
||||
S32 LLFileSystem::getFileSize(const LLUUID& file_id, const LLAssetType::EType file_type)
|
||||
{
|
||||
FSZoneC(tracy::Color::Gold); // <FS:Beq> measure cache performance
|
||||
std::string id_str;
|
||||
file_id.toString(id_str);
|
||||
const std::string extra_info = "";
|
||||
|
|
@ -157,6 +161,7 @@ S32 LLFileSystem::getFileSize(const LLUUID& file_id, const LLAssetType::EType fi
|
|||
|
||||
BOOL LLFileSystem::read(U8* buffer, S32 bytes)
|
||||
{
|
||||
FSZoneC(tracy::Color::Gold); // <FS:Beq> measure cache performance
|
||||
BOOL success = TRUE;
|
||||
|
||||
std::string id;
|
||||
|
|
@ -215,16 +220,19 @@ BOOL LLFileSystem::read(U8* buffer, S32 bytes)
|
|||
|
||||
S32 LLFileSystem::getLastBytesRead()
|
||||
{
|
||||
FSZoneC(tracy::Color::Gold); // <FS:Beq> measure cache performance
|
||||
return mBytesRead;
|
||||
}
|
||||
|
||||
BOOL LLFileSystem::eof()
|
||||
{
|
||||
FSZoneC(tracy::Color::Gold); // <FS:Beq> measure cache performance
|
||||
return mPosition >= getSize();
|
||||
}
|
||||
|
||||
BOOL LLFileSystem::write(const U8* buffer, S32 bytes)
|
||||
{
|
||||
FSZoneC(tracy::Color::Gold); // <FS:Beq> measure cache performance
|
||||
std::string id_str;
|
||||
mFileID.toString(id_str);
|
||||
const std::string extra_info = "";
|
||||
|
|
@ -334,6 +342,7 @@ BOOL LLFileSystem::write(const U8* buffer, S32 bytes)
|
|||
|
||||
BOOL LLFileSystem::seek(S32 offset, S32 origin)
|
||||
{
|
||||
FSZoneC(tracy::Color::Gold); // <FS:Beq> measure cache performance
|
||||
if (-1 == origin)
|
||||
{
|
||||
origin = mPosition;
|
||||
|
|
@ -364,22 +373,26 @@ BOOL LLFileSystem::seek(S32 offset, S32 origin)
|
|||
|
||||
S32 LLFileSystem::tell() const
|
||||
{
|
||||
FSZoneC(tracy::Color::Gold); // <FS:Beq> measure cache performance
|
||||
return mPosition;
|
||||
}
|
||||
|
||||
S32 LLFileSystem::getSize()
|
||||
{
|
||||
FSZoneC(tracy::Color::Gold); // <FS:Beq> measure cache performance
|
||||
return LLFileSystem::getFileSize(mFileID, mFileType);
|
||||
}
|
||||
|
||||
S32 LLFileSystem::getMaxSize()
|
||||
{
|
||||
FSZoneC(tracy::Color::Gold); // <FS:Beq> measure cache performance
|
||||
// offer up a huge size since we don't care what the max is
|
||||
return INT_MAX;
|
||||
}
|
||||
|
||||
BOOL LLFileSystem::rename(const LLUUID& new_id, const LLAssetType::EType new_type)
|
||||
{
|
||||
FSZoneC(tracy::Color::Gold); // <FS:Beq> measure cache performance
|
||||
LLFileSystem::renameFile(mFileID, mFileType, new_id, new_type);
|
||||
|
||||
mFileID = new_id;
|
||||
|
|
@ -390,6 +403,7 @@ BOOL LLFileSystem::rename(const LLUUID& new_id, const LLAssetType::EType new_typ
|
|||
|
||||
BOOL LLFileSystem::remove()
|
||||
{
|
||||
FSZoneC(tracy::Color::Gold); // <FS:Beq> measure cache performance
|
||||
LLFileSystem::removeFile(mFileID, mFileType);
|
||||
|
||||
return TRUE;
|
||||
|
|
|
|||
|
|
@ -1121,7 +1121,7 @@ void set_default_colour_weights(kdu_params *siz)
|
|||
}
|
||||
|
||||
// <FS:Ansariel> Fix image encoding for KDU >= 8.0.4
|
||||
#if KDU_MAJOR_VERSION >= 8 && KDU_MINOR_VERSION >= 0 && KDU_PATCH_VERSION >= 4
|
||||
#if (KDU_MAJOR_VERSION*10000 + KDU_MINOR_VERSION*100 + KDU_PATCH_VERSION) >= 80004
|
||||
cod = siz->access_cluster(ENC_params);
|
||||
assert(cod != NULL);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
//
|
||||
// KDU core header files
|
||||
//
|
||||
#ifndef LL_WINDOWS
|
||||
#ifdef LL_DARWIN
|
||||
#define KDU_NO_THREADS
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
#define LL_LLKDUMEM_H
|
||||
|
||||
// Support classes for reading and writing from memory buffers in KDU
|
||||
#ifndef LL_WINDOWS
|
||||
#ifdef LL_DARWIN
|
||||
#define KDU_NO_THREADS
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ include(Python)
|
|||
include(Tut)
|
||||
include(Python)
|
||||
include(JsonCpp)
|
||||
include(LLXML) #<FS:Ansariel> For accessing settings
|
||||
|
||||
include_directories (${CMAKE_CURRENT_SOURCE_DIR})
|
||||
|
||||
|
|
@ -26,6 +27,7 @@ include_directories(
|
|||
${LLCOMMON_INCLUDE_DIRS}
|
||||
${LLCOREHTTP_INCLUDE_DIRS}
|
||||
${LLMATH_INCLUDE_DIRS}
|
||||
${LLXML_INCLUDE_DIRS} #<FS:Ansariel> For accessing settings
|
||||
${LLMESSAGE_INCLUDE_DIRS}
|
||||
${LLFILESYSTEM_INCLUDE_DIRS}
|
||||
${JSONCPP_INCLUDE_DIR}
|
||||
|
|
@ -217,6 +219,7 @@ target_link_libraries(
|
|||
${LLCOMMON_LIBRARIES}
|
||||
${LLFILESYSTEM_LIBRARIES}
|
||||
${LLMATH_LIBRARIES}
|
||||
${LLXML_LIBRARIES} #<FS:Ansariel> For accessing settings
|
||||
${JSONCPP_LIBRARIES}
|
||||
${OPENSSL_LIBRARIES}
|
||||
${CRYPTO_LIBRARIES}
|
||||
|
|
@ -235,6 +238,7 @@ target_link_libraries(
|
|||
${LLCOMMON_LIBRARIES}
|
||||
${LLFILESYSTEM_LIBRARIES}
|
||||
${LLMATH_LIBRARIES}
|
||||
${LLXML_LIBRARIES} #<FS:Ansariel> For accessing settings
|
||||
${JSONCPP_LIBRARIES}
|
||||
${OPENSSL_LIBRARIES}
|
||||
${CRYPTO_LIBRARIES}
|
||||
|
|
@ -265,6 +269,7 @@ if (LINUX)
|
|||
${WINDOWS_LIBRARIES}
|
||||
${LLFILESYSTEM_LIBRARIES}
|
||||
${LLMATH_LIBRARIES}
|
||||
${LLXML_LIBRARIES} #<FS:Ansariel> For accessing settings
|
||||
${CURL_LIBRARIES}
|
||||
${NGHTTP2_LIBRARIES}
|
||||
${LLCOMMON_LIBRARIES}
|
||||
|
|
@ -281,6 +286,7 @@ else (LINUX)
|
|||
${WINDOWS_LIBRARIES}
|
||||
${LLFILESYSTEM_LIBRARIES}
|
||||
${LLMATH_LIBRARIES}
|
||||
${LLXML_LIBRARIES} #<FS:Ansariel> For accessing settings
|
||||
${CURL_LIBRARIES}
|
||||
${NGHTTP2_LIBRARIES}
|
||||
${LLCOMMON_LIBRARIES}
|
||||
|
|
|
|||
|
|
@ -48,8 +48,9 @@
|
|||
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include "../newview/lggcontactsets.h"
|
||||
#include "../llxml/llcontrol.h"
|
||||
|
||||
#include "llcontrol.h" // <FS:Ansariel> Optional legacy name cache expiration
|
||||
|
||||
// Time-to-live for a temp cache entry.
|
||||
const F64 TEMP_CACHE_ENTRY_LIFETIME = 60.0;
|
||||
// Maximum time an unrefreshed cache entry is allowed.
|
||||
|
|
@ -213,13 +214,15 @@ void LLAvatarNameCache::handleAvNameCacheSuccess(const LLSD &data, const LLSD &h
|
|||
|
||||
LLAvatarName av_name;
|
||||
// <FS> Contact sets alias
|
||||
if (LGGContactSets::getInstance()->hasPseudonym(agent_id))
|
||||
bool dn_removed;
|
||||
std::string pseudonym;
|
||||
if (mCustomNameCheckCallback && mCustomNameCheckCallback(agent_id, dn_removed, pseudonym))
|
||||
{
|
||||
LLSD info(row);
|
||||
info["is_display_name_default"] = LGGContactSets::getInstance()->hasDisplayNameRemoved(agent_id);
|
||||
info["display_name"] = LGGContactSets::getInstance()->hasDisplayNameRemoved(agent_id)
|
||||
info["is_display_name_default"] = dn_removed;
|
||||
info["display_name"] = dn_removed
|
||||
? (info["legacy_first_name"].asString() + " " + info["legacy_last_name"].asString())
|
||||
: LGGContactSets::getInstance()->getPseudonym(agent_id);
|
||||
: pseudonym;
|
||||
av_name.fromLLSD(info);
|
||||
}
|
||||
else
|
||||
|
|
@ -647,13 +650,15 @@ bool LLAvatarNameCache::getName(const LLUUID& agent_id, LLAvatarName *av_name)
|
|||
{
|
||||
*av_name = it->second;
|
||||
// <FS> Contact sets alias
|
||||
if (LGGContactSets::getInstance()->hasPseudonym(agent_id))
|
||||
bool dn_removed;
|
||||
std::string pseudonym;
|
||||
if (mCustomNameCheckCallback && mCustomNameCheckCallback(agent_id, dn_removed, pseudonym))
|
||||
{
|
||||
LLSD info = av_name->asLLSD();
|
||||
info["is_display_name_default"] = LGGContactSets::getInstance()->hasDisplayNameRemoved(agent_id);
|
||||
info["display_name"] = LGGContactSets::getInstance()->hasDisplayNameRemoved(agent_id)
|
||||
info["is_display_name_default"] = dn_removed;
|
||||
info["display_name"] = dn_removed
|
||||
? (info["legacy_first_name"].asString() + " " + info["legacy_last_name"].asString())
|
||||
: LGGContactSets::getInstance()->getPseudonym(agent_id);
|
||||
: pseudonym;
|
||||
av_name->fromLLSD(info);
|
||||
}
|
||||
// <FS/> Contact sets alias
|
||||
|
|
@ -711,14 +716,15 @@ LLAvatarNameCache::callback_connection_t LLAvatarNameCache::getNameCallback(cons
|
|||
LLSD test = av_name.asLLSD();
|
||||
|
||||
// <FS> Contact sets alias
|
||||
if (LGGContactSets::getInstance()->hasPseudonym(agent_id))
|
||||
bool dn_removed;
|
||||
std::string pseudonym;
|
||||
if (mCustomNameCheckCallback && mCustomNameCheckCallback(agent_id, dn_removed, pseudonym))
|
||||
{
|
||||
LL_DEBUGS("AvNameCache") << "DN cache hit via alias " << agent_id << LL_ENDL;
|
||||
LLSD info = av_name.asLLSD();
|
||||
info["is_display_name_default"] = LGGContactSets::getInstance()->hasDisplayNameRemoved(agent_id);
|
||||
info["display_name"] = LGGContactSets::getInstance()->hasDisplayNameRemoved(agent_id)
|
||||
info["is_display_name_default"] = dn_removed;
|
||||
info["display_name"] = dn_removed
|
||||
? (info["legacy_first_name"].asString() + " " + info["legacy_last_name"].asString())
|
||||
: LGGContactSets::getInstance()->getPseudonym(agent_id);
|
||||
: pseudonym;
|
||||
av_name.fromLLSD(info);
|
||||
}
|
||||
// </FS> Contact sets alias
|
||||
|
|
|
|||
|
|
@ -44,6 +44,14 @@ public:
|
|||
typedef boost::signals2::signal<void (void)> use_display_name_signal_t;
|
||||
typedef boost::function<void (const LLUUID id, const LLAvatarName& av_name)> account_name_changed_callback_t;
|
||||
|
||||
// <FS:Ansariel> Contact sets
|
||||
typedef boost::function<bool(const LLUUID& id, bool& dn_removed, std::string& custom_name)> custom_name_check_callback_t;
|
||||
void setCustomNameCheckCallback(custom_name_check_callback_t cb)
|
||||
{
|
||||
mCustomNameCheckCallback = cb;
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
// Import/export the name cache to file.
|
||||
bool importFile(std::istream& istr);
|
||||
void exportFile(std::ostream& ostr);
|
||||
|
|
@ -200,6 +208,9 @@ private:
|
|||
|
||||
// Time when unrefreshed cached names were checked last.
|
||||
F64 mLastExpireCheck;
|
||||
|
||||
// <FS:Ansariel> Contact sets
|
||||
custom_name_check_callback_t mCustomNameCheckCallback;
|
||||
};
|
||||
|
||||
// Parse a cache-control header to get the max-age delta-seconds.
|
||||
|
|
|
|||
|
|
@ -446,7 +446,7 @@ void LLModel::generateNormals(F32 angle_cutoff)
|
|||
|
||||
if (vol_face.mNumIndices > 65535)
|
||||
{
|
||||
LL_WARNS() << "Too many vertices for normal generation to work." << LL_ENDL;
|
||||
LL_WARNS("MESHSKININFO") << "Too many vertices for normal generation to work." << LL_ENDL;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -1115,7 +1115,7 @@ bool LLModel::loadModel(std::istream& is)
|
|||
{
|
||||
if (!LLSDSerialize::fromBinary(header, is, 1024*1024*1024))
|
||||
{
|
||||
LL_WARNS() << "Mesh header parse error. Not a valid mesh asset!" << LL_ENDL;
|
||||
LL_WARNS("MESHSKININFO") << "Mesh header parse error. Not a valid mesh asset!" << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -1147,7 +1147,7 @@ bool LLModel::loadModel(std::istream& is)
|
|||
if (header[lod_name[lod]]["offset"].asInteger() == -1 ||
|
||||
header[lod_name[lod]]["size"].asInteger() == 0 )
|
||||
{ //cannot load requested LOD
|
||||
LL_WARNS() << "LoD data is invalid!" << LL_ENDL;
|
||||
LL_WARNS("MESHSKININFO") << "LoD data is invalid!" << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -1210,7 +1210,7 @@ bool LLModel::loadModel(std::istream& is)
|
|||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "unpackVolumeFaces failed!" << LL_ENDL;
|
||||
LL_WARNS("MESHSKININFO") << "unpackVolumeFaces failed!" << LL_ENDL;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
@ -1238,7 +1238,7 @@ bool LLModel::isMaterialListSubset( LLModel* ref )
|
|||
|
||||
if (!foundRef)
|
||||
{
|
||||
LL_INFOS() << "Could not find material " << mMaterialList[src] << " in reference model " << ref->mLabel << LL_ENDL;
|
||||
LL_INFOS("MESHSKININFO") << "Could not find material " << mMaterialList[src] << " in reference model " << ref->mLabel << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -1274,7 +1274,7 @@ bool LLModel::matchMaterialOrder(LLModel* ref, int& refFaceCnt, int& modelFaceCn
|
|||
bool isASubset = isMaterialListSubset( ref );
|
||||
if ( !isASubset )
|
||||
{
|
||||
LL_INFOS()<<"Material of model is not a subset of reference."<<LL_ENDL;
|
||||
LL_INFOS("MESHSKININFO")<<"Material of model is not a subset of reference."<<LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -1416,6 +1416,14 @@ void LLMeshSkinInfo::fromLLSD(LLSD& skin)
|
|||
|
||||
mInvBindMatrix.push_back(mat);
|
||||
}
|
||||
|
||||
if (mJointNames.size() != mInvBindMatrix.size())
|
||||
{
|
||||
LL_WARNS("MESHSKININFO") << "Joints vs bind matrix count mismatch. Dropping joint bindings." << LL_ENDL;
|
||||
mJointNames.clear();
|
||||
mJointNums.clear();
|
||||
mInvBindMatrix.clear();
|
||||
}
|
||||
}
|
||||
|
||||
if (skin.has("bind_shape_matrix"))
|
||||
|
|
@ -1863,14 +1871,14 @@ bool validate_face(const LLVolumeFace& face)
|
|||
{
|
||||
if (face.mIndices[i] >= face.mNumVertices)
|
||||
{
|
||||
LL_WARNS() << "Face has invalid index." << LL_ENDL;
|
||||
LL_WARNS("MESHSKININFO") << "Face has invalid index." << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (face.mNumIndices % 3 != 0 || face.mNumIndices == 0)
|
||||
{
|
||||
LL_WARNS() << "Face has invalid number of indices." << LL_ENDL;
|
||||
LL_WARNS("MESHSKININFO") << "Face has invalid number of indices." << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -1900,7 +1908,7 @@ bool validate_model(const LLModel* mdl)
|
|||
{
|
||||
if (mdl->getNumVolumeFaces() == 0)
|
||||
{
|
||||
LL_WARNS() << "Model has no faces!" << LL_ENDL;
|
||||
LL_WARNS("MESHSKININFO") << "Model has no faces!" << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -1908,13 +1916,13 @@ bool validate_model(const LLModel* mdl)
|
|||
{
|
||||
if (mdl->getVolumeFace(i).mNumVertices == 0)
|
||||
{
|
||||
LL_WARNS() << "Face has no vertices." << LL_ENDL;
|
||||
LL_WARNS("MESHSKININFO") << "Face has no vertices." << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mdl->getVolumeFace(i).mNumIndices == 0)
|
||||
{
|
||||
LL_WARNS() << "Face has no indices." << LL_ENDL;
|
||||
LL_WARNS("MESHSKININFO") << "Face has no indices." << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1100,6 +1100,13 @@ LLFontGL* LLFontGL::getFontOCRA()
|
|||
static LLFontGL* fontp = getFont(LLFontDescriptor("OCRA","Monospace",0));
|
||||
return fontp;
|
||||
}
|
||||
|
||||
//static
|
||||
LLFontGL* LLFontGL::getFontCascadia()
|
||||
{
|
||||
static LLFontGL* fontp = getFont(LLFontDescriptor("Cascadia", "Cascadia", 0));
|
||||
return fontp;
|
||||
}
|
||||
// </FS:CR>
|
||||
|
||||
//static
|
||||
|
|
@ -1152,6 +1159,10 @@ LLFontGL* LLFontGL::getFontByName(const std::string& name)
|
|||
{
|
||||
return getFontMonospace();
|
||||
}
|
||||
else if (name == "Cascadia")
|
||||
{
|
||||
return getFontCascadia();
|
||||
}
|
||||
// </FS:CR>
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -193,6 +193,7 @@ public:
|
|||
// <FS:CR> Advanced script editor
|
||||
static LLFontGL* getFontScripting();
|
||||
static LLFontGL* getFontOCRA();
|
||||
static LLFontGL* getFontCascadia();
|
||||
// </FS:CR>
|
||||
static LLFontGL* getFontExtChar();
|
||||
static LLFontGL* getFont(const LLFontDescriptor& desc);
|
||||
|
|
|
|||
|
|
@ -169,6 +169,8 @@ LLFontDescriptor LLFontDescriptor::normalize() const
|
|||
// <FS:Ansariel> Advanced script editor
|
||||
if (new_size != s_template_string && new_size.empty() && findSubString(new_name,"Scripting"))
|
||||
new_size = "Scripting";
|
||||
if (new_size != s_template_string && new_size.empty() && findSubString(new_name, "Cascadia"))
|
||||
new_size = "Cascadia";
|
||||
// </FS:Ansariel>
|
||||
if (new_size.empty())
|
||||
new_size = "Medium";
|
||||
|
|
|
|||
|
|
@ -47,6 +47,10 @@ LLContainerView::LLContainerView(const LLContainerView::Params& p)
|
|||
: LLView(p),
|
||||
mShowLabel(p.show_label),
|
||||
mLabel(p.label),
|
||||
// <FS:Zi> Add background visible flag and color to container_view so we can have blank scrollview containers
|
||||
mBackgroundVisible(p.background_visible),
|
||||
mBackgroundColor(p.bg_color),
|
||||
// </FS:Zi>
|
||||
mDisplayChildren(p.display_children)
|
||||
{
|
||||
mScrollContainer = NULL;
|
||||
|
|
@ -111,10 +115,14 @@ BOOL LLContainerView::handleMouseUp(S32 x, S32 y, MASK mask)
|
|||
|
||||
void LLContainerView::draw()
|
||||
{
|
||||
// <FS:Zi> Add background visible flag and color to container_view so we can have blank scrollview containers
|
||||
if (mBackgroundVisible)
|
||||
{
|
||||
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
|
||||
|
||||
gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 0, LLColor4(0.f, 0.f, 0.f, 0.25f));
|
||||
// <FS:Zi> Add background visible flag and color to container_view so we can have blank scrollview containers
|
||||
// gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 0, LLColor4(0.f, 0.f, 0.f, 0.25f));
|
||||
gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 0, mBackgroundColor);
|
||||
}
|
||||
|
||||
// Draw the label
|
||||
|
|
|
|||
|
|
@ -47,9 +47,17 @@ public:
|
|||
Optional<std::string> label;
|
||||
Optional<bool> show_label;
|
||||
Optional<bool> display_children;
|
||||
// <FS:Zi> Add background visible flag and color to container_view so we can have blank scrollview containers
|
||||
Optional<bool> background_visible;
|
||||
Optional<LLUIColor> bg_color;
|
||||
// </FS:Zi>
|
||||
Params()
|
||||
: label("label"),
|
||||
show_label("show_label", FALSE),
|
||||
// <FS:Zi> Add background visible flag and color to container_view so we can have blank scrollview containers
|
||||
background_visible("background_visible", true),
|
||||
bg_color("bg_color", LLColor4(0.f, 0.f, 0.f, 0.25f)),
|
||||
// </FS:Zi>
|
||||
display_children("display_children", TRUE)
|
||||
{
|
||||
changeDefault(mouse_opaque, false);
|
||||
|
|
@ -90,5 +98,9 @@ public:
|
|||
protected:
|
||||
BOOL mDisplayChildren;
|
||||
std::string mLabel;
|
||||
// <FS:Zi> Add background visible flag and color to container_view so we can have blank scrollview containers
|
||||
bool mBackgroundVisible;
|
||||
LLUIColor mBackgroundColor;
|
||||
// </FS:Zi>
|
||||
};
|
||||
#endif // LL_CONTAINERVIEW_
|
||||
|
|
|
|||
|
|
@ -223,6 +223,12 @@ LLSD LLMenuItemGL::getValue() const
|
|||
return getLabel();
|
||||
}
|
||||
|
||||
//virtual
|
||||
bool LLMenuItemGL::hasAccelerator(const KEY &key, const MASK &mask) const
|
||||
{
|
||||
return (mAcceleratorKey == key) && (mAcceleratorMask == mask);
|
||||
}
|
||||
|
||||
//virtual
|
||||
BOOL LLMenuItemGL::handleAcceleratorKey(KEY key, MASK mask)
|
||||
{
|
||||
|
|
@ -284,13 +290,13 @@ BOOL LLMenuItemGL::handleRightMouseUp(S32 x, S32 y, MASK mask)
|
|||
|
||||
// This function checks to see if the accelerator key is already in use;
|
||||
// if not, it will be added to the list
|
||||
BOOL LLMenuItemGL::addToAcceleratorList(std::list <LLKeyBinding*> *listp)
|
||||
BOOL LLMenuItemGL::addToAcceleratorList(std::list <LLMenuKeyboardBinding*> *listp)
|
||||
{
|
||||
LLKeyBinding *accelerator = NULL;
|
||||
LLMenuKeyboardBinding *accelerator = NULL;
|
||||
|
||||
if (mAcceleratorKey != KEY_NONE)
|
||||
{
|
||||
std::list<LLKeyBinding*>::iterator list_it;
|
||||
std::list<LLMenuKeyboardBinding*>::iterator list_it;
|
||||
for (list_it = listp->begin(); list_it != listp->end(); ++list_it)
|
||||
{
|
||||
accelerator = *list_it;
|
||||
|
|
@ -314,7 +320,7 @@ BOOL LLMenuItemGL::addToAcceleratorList(std::list <LLKeyBinding*> *listp)
|
|||
}
|
||||
if (!accelerator)
|
||||
{
|
||||
accelerator = new LLKeyBinding;
|
||||
accelerator = new LLMenuKeyboardBinding;
|
||||
if (accelerator)
|
||||
{
|
||||
accelerator->mKey = mAcceleratorKey;
|
||||
|
|
@ -1038,6 +1044,11 @@ BOOL LLMenuItemBranchGL::handleMouseUp(S32 x, S32 y, MASK mask)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
bool LLMenuItemBranchGL::hasAccelerator(const KEY &key, const MASK &mask) const
|
||||
{
|
||||
return getBranch() && getBranch()->hasAccelerator(key, mask);
|
||||
}
|
||||
|
||||
BOOL LLMenuItemBranchGL::handleAcceleratorKey(KEY key, MASK mask)
|
||||
{
|
||||
return getBranch() && getBranch()->handleAcceleratorKey(key, mask);
|
||||
|
|
@ -1045,7 +1056,7 @@ BOOL LLMenuItemBranchGL::handleAcceleratorKey(KEY key, MASK mask)
|
|||
|
||||
// This function checks to see if the accelerator key is already in use;
|
||||
// if not, it will be added to the list
|
||||
BOOL LLMenuItemBranchGL::addToAcceleratorList(std::list<LLKeyBinding*> *listp)
|
||||
BOOL LLMenuItemBranchGL::addToAcceleratorList(std::list<LLMenuKeyboardBinding*> *listp)
|
||||
{
|
||||
LLMenuGL* branch = getBranch();
|
||||
if (!branch)
|
||||
|
|
@ -3050,6 +3061,27 @@ void LLMenuGL::updateParent(LLView* parentp)
|
|||
}
|
||||
}
|
||||
|
||||
bool LLMenuGL::hasAccelerator(const KEY &key, const MASK &mask) const
|
||||
{
|
||||
if (key == KEY_NONE)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
// Note: checking this way because mAccelerators seems to be broken
|
||||
// mAccelerators probably needs to be cleaned up or fixed
|
||||
// It was used for dupplicate accelerator avoidance.
|
||||
item_list_t::const_iterator item_iter;
|
||||
for (item_iter = mItems.begin(); item_iter != mItems.end(); ++item_iter)
|
||||
{
|
||||
LLMenuItemGL* itemp = *item_iter;
|
||||
if (itemp->hasAccelerator(key, mask))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
BOOL LLMenuGL::handleAcceleratorKey(KEY key, MASK mask)
|
||||
{
|
||||
// don't handle if not enabled
|
||||
|
|
|
|||
|
|
@ -42,6 +42,13 @@
|
|||
extern S32 MENU_BAR_HEIGHT;
|
||||
extern S32 MENU_BAR_WIDTH;
|
||||
|
||||
class LLMenuKeyboardBinding
|
||||
{
|
||||
public:
|
||||
KEY mKey;
|
||||
MASK mMask;
|
||||
};
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Class LLMenuItemGL
|
||||
//
|
||||
|
|
@ -92,6 +99,7 @@ public:
|
|||
/*virtual*/ void setValue(const LLSD& value);
|
||||
/*virtual*/ LLSD getValue() const;
|
||||
|
||||
virtual bool hasAccelerator(const KEY &key, const MASK &mask) const;
|
||||
virtual BOOL handleAcceleratorKey(KEY key, MASK mask);
|
||||
|
||||
LLColor4 getHighlightBgColor() { return mHighlightBackground.get(); }
|
||||
|
|
@ -110,7 +118,7 @@ public:
|
|||
virtual void setBriefItem(BOOL brief);
|
||||
virtual BOOL isBriefItem() const;
|
||||
|
||||
virtual BOOL addToAcceleratorList(std::list<LLKeyBinding*> *listp);
|
||||
virtual BOOL addToAcceleratorList(std::list<LLMenuKeyboardBinding*> *listp);
|
||||
void setAllowKeyRepeat(BOOL allow) { mAllowKeyRepeat = allow; }
|
||||
BOOL getAllowKeyRepeat() const { return mAllowKeyRepeat; }
|
||||
|
||||
|
|
@ -437,7 +445,8 @@ public:
|
|||
/*virtual*/ bool addChild(LLView* view, S32 tab_group = 0);
|
||||
/*virtual*/ void removeChild( LLView* ctrl);
|
||||
/*virtual*/ BOOL postBuild();
|
||||
|
||||
|
||||
virtual bool hasAccelerator(const KEY &key, const MASK &mask) const;
|
||||
virtual BOOL handleAcceleratorKey(KEY key, MASK mask);
|
||||
|
||||
LLMenuGL* findChildMenuByName(const std::string& name, BOOL recurse) const;
|
||||
|
|
@ -633,10 +642,11 @@ public:
|
|||
|
||||
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
|
||||
|
||||
virtual bool hasAccelerator(const KEY &key, const MASK &mask) const;
|
||||
virtual BOOL handleAcceleratorKey(KEY key, MASK mask);
|
||||
|
||||
// check if we've used these accelerators already
|
||||
virtual BOOL addToAcceleratorList(std::list <LLKeyBinding*> *listp);
|
||||
virtual BOOL addToAcceleratorList(std::list <LLMenuKeyboardBinding*> *listp);
|
||||
|
||||
// called to rebuild the draw label
|
||||
virtual void buildDrawLabel( void );
|
||||
|
|
@ -809,7 +819,7 @@ private:
|
|||
|
||||
void checkMenuTrigger();
|
||||
|
||||
std::list <LLKeyBinding*> mAccelerators;
|
||||
std::list <LLMenuKeyboardBinding*> mAccelerators;
|
||||
BOOL mAltKeyTrigger;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -50,6 +50,10 @@ LLScrollListCell* LLScrollListCell::create(const LLScrollListCell::Params& cell_
|
|||
{
|
||||
cell = new LLScrollListDate(cell_p);
|
||||
}
|
||||
else if (cell_p.type() == "icontext")
|
||||
{
|
||||
cell = new LLScrollListIconText(cell_p);
|
||||
}
|
||||
else // default is "text"
|
||||
{
|
||||
cell = new LLScrollListText(cell_p);
|
||||
|
|
@ -168,7 +172,7 @@ U32 LLScrollListText::sCount = 0;
|
|||
|
||||
LLScrollListText::LLScrollListText(const LLScrollListCell::Params& p)
|
||||
: LLScrollListCell(p),
|
||||
mText(p.value().asString()),
|
||||
mText(p.label.isProvided() ? p.label() : p.value().asString()),
|
||||
mFont(p.font),
|
||||
mColor(p.color),
|
||||
mUseColor(p.color.isProvided()),
|
||||
|
|
@ -192,7 +196,7 @@ LLScrollListText::LLScrollListText(const LLScrollListCell::Params& p)
|
|||
void LLScrollListText::highlightText(S32 offset, S32 num_chars)
|
||||
{
|
||||
mHighlightOffset = offset;
|
||||
mHighlightCount = num_chars;
|
||||
mHighlightCount = llmax(0, num_chars);
|
||||
}
|
||||
|
||||
//virtual
|
||||
|
|
@ -292,11 +296,12 @@ void LLScrollListText::draw(const LLColor4& color, const LLColor4& highlight_col
|
|||
|
||||
if (mHighlightCount > 0)
|
||||
{
|
||||
// Highlight text
|
||||
S32 left = 0;
|
||||
switch(mFontAlignment)
|
||||
{
|
||||
case LLFontGL::LEFT:
|
||||
left = mFont->getWidth(mText.getString(), 0, mHighlightOffset);
|
||||
left = mFont->getWidth(mText.getString(), 1, mHighlightOffset);
|
||||
break;
|
||||
case LLFontGL::RIGHT:
|
||||
left = getWidth() - mFont->getWidth(mText.getString(), mHighlightOffset, S32_MAX);
|
||||
|
|
@ -319,7 +324,7 @@ void LLScrollListText::draw(const LLColor4& color, const LLColor4& highlight_col
|
|||
switch(mFontAlignment)
|
||||
{
|
||||
case LLFontGL::LEFT:
|
||||
start_x = 0.f;
|
||||
start_x = 1.f;
|
||||
break;
|
||||
case LLFontGL::RIGHT:
|
||||
start_x = (F32)getWidth();
|
||||
|
|
@ -435,3 +440,139 @@ const LLSD LLScrollListDate::getValue() const
|
|||
{
|
||||
return mDate;
|
||||
}
|
||||
|
||||
//
|
||||
// LLScrollListIconText
|
||||
//
|
||||
LLScrollListIconText::LLScrollListIconText(const LLScrollListCell::Params& p)
|
||||
: LLScrollListText(p),
|
||||
mIcon(p.value().isUUID() ? LLUI::getUIImageByID(p.value().asUUID()) : LLUI::getUIImage(p.value().asString())),
|
||||
mPad(4)
|
||||
{
|
||||
mTextWidth = getWidth() - mPad /*padding*/ - mFont->getLineHeight();
|
||||
}
|
||||
|
||||
LLScrollListIconText::~LLScrollListIconText()
|
||||
{
|
||||
}
|
||||
|
||||
const LLSD LLScrollListIconText::getValue() const
|
||||
{
|
||||
if (mIcon.isNull())
|
||||
{
|
||||
return LLStringUtil::null;
|
||||
}
|
||||
return mIcon->getName();
|
||||
}
|
||||
|
||||
void LLScrollListIconText::setValue(const LLSD& value)
|
||||
{
|
||||
if (value.isUUID())
|
||||
{
|
||||
// don't use default image specified by LLUUID::null, use no image in that case
|
||||
LLUUID image_id = value.asUUID();
|
||||
mIcon = image_id.notNull() ? LLUI::getUIImageByID(image_id) : LLUIImagePtr(NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string value_string = value.asString();
|
||||
if (LLUUID::validate(value_string))
|
||||
{
|
||||
setValue(LLUUID(value_string));
|
||||
}
|
||||
else if (!value_string.empty())
|
||||
{
|
||||
mIcon = LLUI::getUIImage(value.asString());
|
||||
}
|
||||
else
|
||||
{
|
||||
mIcon = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLScrollListIconText::setWidth(S32 width)
|
||||
{
|
||||
LLScrollListCell::setWidth(width);
|
||||
// Assume that iamge height and width is identical to font height and width
|
||||
mTextWidth = width - mPad /*padding*/ - mFont->getLineHeight();
|
||||
}
|
||||
|
||||
|
||||
void LLScrollListIconText::draw(const LLColor4& color, const LLColor4& highlight_color) const
|
||||
{
|
||||
LLColor4 display_color;
|
||||
if (mUseColor)
|
||||
{
|
||||
display_color = mColor;
|
||||
}
|
||||
else
|
||||
{
|
||||
display_color = color;
|
||||
}
|
||||
|
||||
S32 icon_height = mFont->getLineHeight();
|
||||
S32 icon_space = mIcon ? (icon_height + mPad) : 0;
|
||||
|
||||
if (mHighlightCount > 0)
|
||||
{
|
||||
S32 left = 0;
|
||||
switch (mFontAlignment)
|
||||
{
|
||||
case LLFontGL::LEFT:
|
||||
left = mFont->getWidth(mText.getString(), icon_space + 1, mHighlightOffset);
|
||||
break;
|
||||
case LLFontGL::RIGHT:
|
||||
left = getWidth() - mFont->getWidth(mText.getString(), mHighlightOffset, S32_MAX) - icon_space;
|
||||
break;
|
||||
case LLFontGL::HCENTER:
|
||||
left = (getWidth() - mFont->getWidth(mText.getString()) - icon_space) / 2;
|
||||
break;
|
||||
}
|
||||
LLRect highlight_rect(left - 2,
|
||||
mFont->getLineHeight() + 1,
|
||||
left + mFont->getWidth(mText.getString(), mHighlightOffset, mHighlightCount) + 1,
|
||||
1);
|
||||
mRoundedRectImage->draw(highlight_rect, highlight_color);
|
||||
}
|
||||
|
||||
// Try to draw the entire string
|
||||
F32 right_x;
|
||||
U32 string_chars = mText.length();
|
||||
F32 start_text_x = 0.f;
|
||||
S32 start_icon_x = 0;
|
||||
switch (mFontAlignment)
|
||||
{
|
||||
case LLFontGL::LEFT:
|
||||
start_text_x = icon_space + 1;
|
||||
start_icon_x = 1;
|
||||
break;
|
||||
case LLFontGL::RIGHT:
|
||||
start_text_x = (F32)getWidth();
|
||||
start_icon_x = getWidth() - mFont->getWidth(mText.getString()) - icon_space;
|
||||
break;
|
||||
case LLFontGL::HCENTER:
|
||||
F32 center = (F32)getWidth()* 0.5f;
|
||||
start_text_x = center + ((F32)icon_space * 0.5f);
|
||||
start_icon_x = center - (((F32)icon_space + mFont->getWidth(mText.getString())) * 0.5f);
|
||||
break;
|
||||
}
|
||||
mFont->render(mText.getWString(), 0,
|
||||
start_text_x, 0.f,
|
||||
display_color,
|
||||
mFontAlignment,
|
||||
LLFontGL::BOTTOM,
|
||||
0,
|
||||
LLFontGL::NO_SHADOW,
|
||||
string_chars,
|
||||
getTextWidth(),
|
||||
&right_x,
|
||||
TRUE);
|
||||
|
||||
if (mIcon)
|
||||
{
|
||||
mIcon->draw(start_icon_x, 0, icon_height, icon_height, mColor);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -59,7 +59,8 @@ public:
|
|||
visible;
|
||||
|
||||
Optional<void*> userdata;
|
||||
Optional<LLSD> value;
|
||||
Optional<LLSD> value; // state of checkbox, icon id/name, date
|
||||
Optional<std::string> label; // description or text
|
||||
Optional<std::string> tool_tip;
|
||||
|
||||
Optional<const LLFontGL*> font;
|
||||
|
|
@ -75,6 +76,7 @@ public:
|
|||
enabled("enabled", true),
|
||||
visible("visible", true),
|
||||
value("value"),
|
||||
label("label"),
|
||||
tool_tip("tool_tip", ""),
|
||||
font("font", LLFontGL::getFontSansSerifSmall()),
|
||||
font_color("font_color", LLColor4::black),
|
||||
|
|
@ -152,11 +154,12 @@ public:
|
|||
void setText(const LLStringExplicit& text);
|
||||
void setFontStyle(const U8 font_style);
|
||||
|
||||
private:
|
||||
protected:
|
||||
LLUIString mText;
|
||||
S32 mTextWidth;
|
||||
const LLFontGL* mFont;
|
||||
LLColor4 mColor;
|
||||
LLColor4 mHighlightColor;
|
||||
U8 mUseColor;
|
||||
LLFontGL::HAlign mFontAlignment;
|
||||
BOOL mVisible;
|
||||
|
|
@ -169,7 +172,7 @@ private:
|
|||
};
|
||||
|
||||
/*
|
||||
* Cell displaying an image.
|
||||
* Cell displaying an image. AT the moment, this is specifically UI image
|
||||
*/
|
||||
class LLScrollListIcon : public LLScrollListCell
|
||||
{
|
||||
|
|
@ -223,4 +226,26 @@ private:
|
|||
LLDate mDate;
|
||||
};
|
||||
|
||||
/*
|
||||
* Cell displaying icon and text.
|
||||
*/
|
||||
|
||||
class LLScrollListIconText : public LLScrollListText
|
||||
{
|
||||
public:
|
||||
LLScrollListIconText(const LLScrollListCell::Params& p);
|
||||
/*virtual*/ ~LLScrollListIconText();
|
||||
/*virtual*/ void draw(const LLColor4& color, const LLColor4& highlight_color) const;
|
||||
/*virtual*/ const LLSD getValue() const;
|
||||
/*virtual*/ void setValue(const LLSD& value);
|
||||
|
||||
|
||||
S32 getIconWidth() const;
|
||||
/*virtual*/ void setWidth(S32 width);/* { LLScrollListCell::setWidth(width); mTextWidth = width - ; }*/
|
||||
|
||||
private:
|
||||
LLPointer<LLUIImage> mIcon;
|
||||
S32 mPad;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -117,6 +117,13 @@ struct SortScrollListItem
|
|||
// LLScrollListCtrl
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void LLScrollListCtrl::SelectionTypeNames::declareValues()
|
||||
{
|
||||
declare("row", LLScrollListCtrl::ROW);
|
||||
declare("cell", LLScrollListCtrl::CELL);
|
||||
declare("header", LLScrollListCtrl::HEADER);
|
||||
}
|
||||
|
||||
LLScrollListCtrl::Contents::Contents()
|
||||
: columns("column"),
|
||||
rows("row")
|
||||
|
|
@ -130,9 +137,11 @@ LLScrollListCtrl::Params::Params()
|
|||
has_border("draw_border"),
|
||||
draw_heading("draw_heading"),
|
||||
search_column("search_column", 0),
|
||||
selection_type("selection_type", ROW),
|
||||
sort_column("sort_column", -1),
|
||||
sort_ascending("sort_ascending", true),
|
||||
sort_lazily("sort_lazily", false), // <FS:Beq> FIRE-30732 deferred sort as a UI property
|
||||
can_sort("can_sort", true),
|
||||
persist_sort_order("persist_sort_order", false), // <FS:Ansariel> Persists sort order of scroll lists
|
||||
primary_sort_only("primary_sort_only", false), // <FS:Ansariel> Option to only sort by one column
|
||||
mouse_wheel_opaque("mouse_wheel_opaque", false),
|
||||
|
|
@ -170,8 +179,10 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p)
|
|||
mCommitOnKeyboardMovement(p.commit_on_keyboard_movement),
|
||||
mCommitOnSelectionChange(p.commit_on_selection_change),
|
||||
mSelectionChanged(false),
|
||||
mSelectionType(p.selection_type),
|
||||
mNeedsScroll(false),
|
||||
mCanSelect(true),
|
||||
mCanSort(p.can_sort),
|
||||
mColumnsDirty(false),
|
||||
mMaxItemCount(INT_MAX),
|
||||
mBorderThickness( 2 ),
|
||||
|
|
@ -932,7 +943,15 @@ BOOL LLScrollListCtrl::selectFirstItem()
|
|||
{
|
||||
if (!itemp->getSelected())
|
||||
{
|
||||
selectItem(itemp);
|
||||
switch (mSelectionType)
|
||||
{
|
||||
case CELL:
|
||||
selectItem(itemp, 0);
|
||||
break;
|
||||
case HEADER:
|
||||
case ROW:
|
||||
selectItem(itemp, -1);
|
||||
}
|
||||
}
|
||||
success = TRUE;
|
||||
mOriginalSelection = 0;
|
||||
|
|
@ -1001,7 +1020,8 @@ BOOL LLScrollListCtrl::selectItemRange( S32 first_index, S32 last_index )
|
|||
{
|
||||
if( itemp->getEnabled() )
|
||||
{
|
||||
selectItem(itemp, FALSE);
|
||||
// TODO: support range selection for cells
|
||||
selectItem(itemp, -1, FALSE);
|
||||
success = TRUE;
|
||||
}
|
||||
}
|
||||
|
|
@ -1127,10 +1147,14 @@ void LLScrollListCtrl::clearHighlightedItems()
|
|||
|
||||
void LLScrollListCtrl::mouseOverHighlightNthItem(S32 target_index)
|
||||
{
|
||||
if (mHighlightedItem != target_index)
|
||||
{
|
||||
mHighlightedItem = target_index;
|
||||
}
|
||||
if (mHighlightedItem != target_index)
|
||||
{
|
||||
if (mHighlightedItem >= 0 && mHighlightedItem < mItemList.size())
|
||||
{
|
||||
mItemList[mHighlightedItem]->setHoverCell(-1);
|
||||
}
|
||||
mHighlightedItem = target_index;
|
||||
}
|
||||
}
|
||||
|
||||
S32 LLScrollListCtrl::selectMultiple( uuid_vec_t ids )
|
||||
|
|
@ -1145,7 +1169,8 @@ S32 LLScrollListCtrl::selectMultiple( uuid_vec_t ids )
|
|||
{
|
||||
if (item->getEnabled() && (item->getUUID() == (*iditr)))
|
||||
{
|
||||
selectItem(item,FALSE);
|
||||
// TODO: support multiple selection for cells
|
||||
selectItem(item, -1, FALSE);
|
||||
++count;
|
||||
break;
|
||||
}
|
||||
|
|
@ -1224,7 +1249,7 @@ void LLScrollListCtrl::selectPrevItem( BOOL extend_selection)
|
|||
{
|
||||
if (prev_item)
|
||||
{
|
||||
selectItem(prev_item, !extend_selection);
|
||||
selectItem(prev_item, cur_item->getSelectedCell(), !extend_selection);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1268,7 +1293,7 @@ void LLScrollListCtrl::selectNextItem( BOOL extend_selection)
|
|||
{
|
||||
if (next_item)
|
||||
{
|
||||
selectItem(next_item, !extend_selection);
|
||||
selectItem(next_item, cur_item->getSelectedCell(), !extend_selection);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1347,7 +1372,7 @@ BOOL LLScrollListCtrl::selectItemByLabel(const std::string& label, BOOL case_sen
|
|||
bool found = NULL != item;
|
||||
if(found)
|
||||
{
|
||||
selectItem(item);
|
||||
selectItem(item, -1);
|
||||
}
|
||||
|
||||
if (mCommitOnSelectionChange)
|
||||
|
|
@ -1422,7 +1447,7 @@ BOOL LLScrollListCtrl::selectItemByStringMatch(const LLWString& target, bool pre
|
|||
BOOL select = cellp ? item->getEnabled() && ('\0' == cellp->getValue().asString()[0]) : FALSE;
|
||||
if (select)
|
||||
{
|
||||
selectItem(item);
|
||||
selectItem(item, -1);
|
||||
found = TRUE;
|
||||
break;
|
||||
}
|
||||
|
|
@ -1473,7 +1498,7 @@ BOOL LLScrollListCtrl::selectItemByStringMatch(const LLWString& target, bool pre
|
|||
// find offset of matching text (might have leading whitespace)
|
||||
S32 offset = item_label.find(target_trimmed);
|
||||
cellp->highlightText(offset, target_trimmed.size());
|
||||
selectItem(item);
|
||||
selectItem(item, -1);
|
||||
found = TRUE;
|
||||
break;
|
||||
}
|
||||
|
|
@ -1568,7 +1593,7 @@ BOOL LLScrollListCtrl::setSelectedByValue(const LLSD& value, BOOL selected)
|
|||
{
|
||||
if (selected)
|
||||
{
|
||||
selectItem(item);
|
||||
selectItem(item, -1);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1650,7 +1675,7 @@ void LLScrollListCtrl::drawItems()
|
|||
|
||||
S32 max_columns = 0;
|
||||
|
||||
LLColor4 highlight_color = LLColor4::white;
|
||||
LLColor4 highlight_color = LLColor4::white; // ex: text inside cells
|
||||
static LLUICachedControl<F32> type_ahead_timeout ("TypeAheadTimeout", 0);
|
||||
highlight_color.mV[VALPHA] = clamp_rescale(mSearchTimer.getElapsedTimeF32(), type_ahead_timeout * 0.7f, type_ahead_timeout(), 0.4f, 0.f);
|
||||
|
||||
|
|
@ -1702,7 +1727,8 @@ void LLScrollListCtrl::drawItems()
|
|||
max_columns = llmax(max_columns, item->getNumColumns());
|
||||
|
||||
LLColor4 fg_color;
|
||||
LLColor4 bg_color(LLColor4::transparent);
|
||||
LLColor4 hover_color(LLColor4::transparent);
|
||||
LLColor4 select_color(LLColor4::transparent);
|
||||
|
||||
if( mScrollLines <= line && line < mScrollLines + num_page_lines )
|
||||
{
|
||||
|
|
@ -1711,45 +1737,45 @@ void LLScrollListCtrl::drawItems()
|
|||
{
|
||||
if(item->getHighlighted()) // if it's highlighted, average the colors
|
||||
{
|
||||
bg_color = lerp(mBgSelectedColor.get(), mHighlightedColor.get(), 0.5f);
|
||||
select_color = lerp(mBgSelectedColor.get(), mHighlightedColor.get(), 0.5f);
|
||||
}
|
||||
else // otherwise just select-highlight it
|
||||
{
|
||||
bg_color = mBgSelectedColor.get();
|
||||
select_color = mBgSelectedColor.get();
|
||||
}
|
||||
|
||||
fg_color = (item->getEnabled() ? mFgSelectedColor.get() : mFgDisabledColor.get());
|
||||
}
|
||||
else if (mHighlightedItem == line && mCanSelect)
|
||||
if (mHighlightedItem == line && mCanSelect)
|
||||
{
|
||||
if(item->getHighlighted()) // if it's highlighted, average the colors
|
||||
{
|
||||
bg_color = lerp(mHoveredColor.get(), mHighlightedColor.get(), 0.5f);
|
||||
hover_color = lerp(mHoveredColor.get(), mHighlightedColor.get(), 0.5f);
|
||||
}
|
||||
else // otherwise just hover-highlight it
|
||||
{
|
||||
bg_color = mHoveredColor.get();
|
||||
hover_color = mHoveredColor.get();
|
||||
}
|
||||
}
|
||||
else if (item->getHighlighted())
|
||||
{
|
||||
bg_color = mHighlightedColor.get();
|
||||
hover_color = mHighlightedColor.get();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Why no stripes in single columns? This should be decided by the skin. -Zi
|
||||
if (mDrawStripes && (line % 2 == 0)) // && (max_columns > 1))
|
||||
{
|
||||
bg_color = mBgStripeColor.get();
|
||||
hover_color = mBgStripeColor.get();
|
||||
}
|
||||
}
|
||||
|
||||
if (!item->getEnabled())
|
||||
{
|
||||
bg_color = mBgReadOnlyColor.get();
|
||||
hover_color = mBgReadOnlyColor.get();
|
||||
}
|
||||
|
||||
item->draw(item_rect, fg_color % alpha, bg_color% alpha, highlight_color % alpha, mColumnPadding);
|
||||
item->draw(item_rect, fg_color % alpha, hover_color% alpha, select_color% alpha, highlight_color % alpha, mColumnPadding);
|
||||
|
||||
cur_y -= mLineHeight;
|
||||
}
|
||||
|
|
@ -1925,7 +1951,7 @@ BOOL LLScrollListCtrl::selectItemAt(S32 x, S32 y, MASK mask)
|
|||
{
|
||||
if (mLastSelected == NULL)
|
||||
{
|
||||
selectItem(hit_item);
|
||||
selectItem(hit_item, getColumnIndexFromOffset(x));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1955,7 +1981,7 @@ BOOL LLScrollListCtrl::selectItemAt(S32 x, S32 y, MASK mask)
|
|||
// </FS:Ansariel> Fix for FS-specific people list (radar)
|
||||
if (item == hit_item || item == lastSelected)
|
||||
{
|
||||
selectItem(item, FALSE);
|
||||
selectItem(item, getColumnIndexFromOffset(x), FALSE);
|
||||
selecting = !selecting;
|
||||
if (hit_item == lastSelected)
|
||||
{
|
||||
|
|
@ -1965,7 +1991,7 @@ BOOL LLScrollListCtrl::selectItemAt(S32 x, S32 y, MASK mask)
|
|||
}
|
||||
if (selecting)
|
||||
{
|
||||
selectItem(item, FALSE);
|
||||
selectItem(item, getColumnIndexFromOffset(x), FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1980,7 +2006,7 @@ BOOL LLScrollListCtrl::selectItemAt(S32 x, S32 y, MASK mask)
|
|||
{
|
||||
if(!(mMaxSelectable > 0 && getAllSelected().size() >= mMaxSelectable))
|
||||
{
|
||||
selectItem(hit_item, FALSE);
|
||||
selectItem(hit_item, getColumnIndexFromOffset(x), FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1994,12 +2020,12 @@ BOOL LLScrollListCtrl::selectItemAt(S32 x, S32 y, MASK mask)
|
|||
else
|
||||
{
|
||||
deselectAllItems(TRUE);
|
||||
selectItem(hit_item);
|
||||
selectItem(hit_item, getColumnIndexFromOffset(x));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
selectItem(hit_item);
|
||||
selectItem(hit_item, getColumnIndexFromOffset(x));
|
||||
}
|
||||
|
||||
selection_changed = mSelectionChanged;
|
||||
|
|
@ -2420,8 +2446,29 @@ BOOL LLScrollListCtrl::handleHover(S32 x,S32 y,MASK mask)
|
|||
{
|
||||
LLScrollListItem* item = hitItem(x, y);
|
||||
if (item)
|
||||
{
|
||||
mouseOverHighlightNthItem(getItemIndex(item));
|
||||
{
|
||||
mouseOverHighlightNthItem(getItemIndex(item));
|
||||
switch (mSelectionType)
|
||||
{
|
||||
case CELL:
|
||||
item->setHoverCell(getColumnIndexFromOffset(x));
|
||||
break;
|
||||
case HEADER:
|
||||
{
|
||||
S32 cell = getColumnIndexFromOffset(x);
|
||||
if (cell > 0)
|
||||
{
|
||||
item->setHoverCell(cell);
|
||||
}
|
||||
else
|
||||
{
|
||||
item->setHoverCell(-1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ROW:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -2469,6 +2516,58 @@ BOOL LLScrollListCtrl::handleKeyHere(KEY key,MASK mask )
|
|||
handled = TRUE;
|
||||
}
|
||||
break;
|
||||
case KEY_LEFT:
|
||||
if (mAllowKeyboardMovement || hasFocus())
|
||||
{
|
||||
// TODO: support multi-select
|
||||
LLScrollListItem *item = getFirstSelected();
|
||||
if (item)
|
||||
{
|
||||
S32 cell = item->getSelectedCell();
|
||||
switch (mSelectionType)
|
||||
{
|
||||
case CELL:
|
||||
if (cell < mColumns.size()) cell++;
|
||||
break;
|
||||
case HEADER:
|
||||
if (cell == -1) cell = 1;
|
||||
else if (cell > 1 && cell < mColumns.size()) cell++; // skip header
|
||||
break;
|
||||
case ROW:
|
||||
cell = -1;
|
||||
break;
|
||||
}
|
||||
item->setSelectedCell(cell);
|
||||
handled = TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case KEY_RIGHT:
|
||||
if (mAllowKeyboardMovement || hasFocus())
|
||||
{
|
||||
// TODO: support multi-select
|
||||
LLScrollListItem *item = getFirstSelected();
|
||||
if (item)
|
||||
{
|
||||
S32 cell = item->getSelectedCell();
|
||||
switch (mSelectionType)
|
||||
{
|
||||
case CELL:
|
||||
if (cell >= 0) cell--;
|
||||
break;
|
||||
case HEADER:
|
||||
if (cell > 1) cell--;
|
||||
else if (cell == 1) cell = -1; // skip header
|
||||
break;
|
||||
case ROW:
|
||||
cell = -1;
|
||||
break;
|
||||
}
|
||||
item->setSelectedCell(cell);
|
||||
handled = TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case KEY_PAGE_UP:
|
||||
if (mAllowKeyboardMovement || hasFocus())
|
||||
{
|
||||
|
|
@ -2777,7 +2876,7 @@ BOOL LLScrollListCtrl::handleUnicodeCharHere(llwchar uni_char)
|
|||
LLWString item_label = utf8str_to_wstring(cellp->getValue().asString());
|
||||
if (item->getEnabled() && LLStringOps::toLower(item_label[0]) == uni_char)
|
||||
{
|
||||
selectItem(item);
|
||||
selectItem(item, -1);
|
||||
mNeedsScroll = true;
|
||||
cellp->highlightText(0, 1);
|
||||
mSearchTimer.reset();
|
||||
|
|
@ -2829,7 +2928,7 @@ BOOL LLScrollListCtrl::isRepeatedChars(const LLWString& string) const
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
void LLScrollListCtrl::selectItem(LLScrollListItem* itemp, BOOL select_single_item)
|
||||
void LLScrollListCtrl::selectItem(LLScrollListItem* itemp, S32 cell, BOOL select_single_item)
|
||||
{
|
||||
if (!itemp) return;
|
||||
|
||||
|
|
@ -2848,6 +2947,18 @@ void LLScrollListCtrl::selectItem(LLScrollListItem* itemp, BOOL select_single_it
|
|||
deselectAllItems(TRUE);
|
||||
}
|
||||
itemp->setSelected(TRUE);
|
||||
switch (mSelectionType)
|
||||
{
|
||||
case CELL:
|
||||
itemp->setSelectedCell(cell);
|
||||
break;
|
||||
case HEADER:
|
||||
itemp->setSelectedCell(cell <= 0 ? -1 : cell);
|
||||
break;
|
||||
case ROW:
|
||||
itemp->setSelectedCell(-1);
|
||||
break;
|
||||
}
|
||||
mLastSelected = itemp;
|
||||
mSelectionChanged = true;
|
||||
}
|
||||
|
|
@ -3125,7 +3236,7 @@ void LLScrollListCtrl::selectAll()
|
|||
LLScrollListItem *itemp = *iter;
|
||||
if( itemp->getEnabled() )
|
||||
{
|
||||
selectItem(itemp, FALSE);
|
||||
selectItem(itemp, -1, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3302,6 +3413,8 @@ void LLScrollListCtrl::onClickColumn(void *userdata)
|
|||
LLScrollListCtrl *parent = info->mParentCtrl;
|
||||
if (!parent) return;
|
||||
|
||||
if (!parent->mCanSort) return;
|
||||
|
||||
S32 column_index = info->mIndex;
|
||||
|
||||
LLScrollListColumn* column = parent->mColumnsIndexed[info->mIndex];
|
||||
|
|
@ -3666,7 +3779,7 @@ void LLScrollListCtrl::setFilterString(const std::string& str)
|
|||
{
|
||||
if (!isFiltered(*iter))
|
||||
{
|
||||
selectItem(*iter);
|
||||
selectItem(*iter, -1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -54,6 +54,18 @@ class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler,
|
|||
public LLCtrlListInterface, public LLCtrlScrollInterface
|
||||
{
|
||||
public:
|
||||
typedef enum e_selection_type
|
||||
{
|
||||
ROW, // default
|
||||
CELL, // does not support multi-selection
|
||||
HEADER, // when pointing to cells in column 0 will highlight whole row, otherwise cell, no multi-select
|
||||
} ESelectionType;
|
||||
|
||||
struct SelectionTypeNames : public LLInitParam::TypeValuesHelper<LLScrollListCtrl::ESelectionType, SelectionTypeNames>
|
||||
{
|
||||
static void declareValues();
|
||||
};
|
||||
|
||||
struct Contents : public LLInitParam::Block<Contents>
|
||||
{
|
||||
Multiple<LLScrollListColumn::Params> columns;
|
||||
|
|
@ -100,6 +112,8 @@ public:
|
|||
commit_on_selection_change,
|
||||
mouse_wheel_opaque;
|
||||
|
||||
Optional<ESelectionType, SelectionTypeNames> selection_type;
|
||||
|
||||
// display flags
|
||||
Optional<bool> has_border,
|
||||
draw_heading,
|
||||
|
|
@ -116,7 +130,8 @@ public:
|
|||
// sort and search behavior
|
||||
Optional<S32> search_column,
|
||||
sort_column;
|
||||
Optional<bool> sort_ascending;
|
||||
Optional<bool> sort_ascending,
|
||||
can_sort; // whether user is allowed to sort
|
||||
Optional<bool> sort_lazily; // <FS:Beq> FIRE-30732 deferred sort as a UI property
|
||||
Optional<bool> persist_sort_order; // <FS:Ansariel> Persists sort order of scroll lists
|
||||
Optional<bool> primary_sort_only; // <FS:Ansariel> Option to only sort by one column
|
||||
|
|
@ -466,7 +481,7 @@ private:
|
|||
void updateLineHeightInsert(LLScrollListItem* item);
|
||||
void reportInvalidInput();
|
||||
BOOL isRepeatedChars(const LLWString& string) const;
|
||||
void selectItem(LLScrollListItem* itemp, BOOL single_select = TRUE);
|
||||
void selectItem(LLScrollListItem* itemp, S32 cell, BOOL single_select = TRUE);
|
||||
void deselectItem(LLScrollListItem* itemp);
|
||||
void commitIfChanged();
|
||||
BOOL setSort(S32 column, BOOL ascending);
|
||||
|
|
@ -495,9 +510,11 @@ private:
|
|||
bool mCommitOnKeyboardMovement;
|
||||
bool mCommitOnSelectionChange;
|
||||
bool mSelectionChanged;
|
||||
ESelectionType mSelectionType;
|
||||
bool mNeedsScroll;
|
||||
bool mMouseWheelOpaque;
|
||||
bool mCanSelect;
|
||||
bool mCanSort; // Whether user is allowed to sort
|
||||
bool mDisplayColumnHeaders;
|
||||
bool mColumnsDirty;
|
||||
bool mColumnWidthsDirty;
|
||||
|
|
|
|||
|
|
@ -40,6 +40,8 @@
|
|||
LLScrollListItem::LLScrollListItem( const Params& p )
|
||||
: mSelected(FALSE),
|
||||
mHighlighted(FALSE),
|
||||
mHoverIndex(-1),
|
||||
mSelectedIndex(-1),
|
||||
mEnabled(p.enabled),
|
||||
mUserdata(p.userdata),
|
||||
mItemValue(p.value)
|
||||
|
|
@ -53,6 +55,28 @@ LLScrollListItem::~LLScrollListItem()
|
|||
mColumns.clear();
|
||||
}
|
||||
|
||||
void LLScrollListItem::setSelected(BOOL b)
|
||||
{
|
||||
mSelected = b;
|
||||
mSelectedIndex = -1;
|
||||
}
|
||||
|
||||
void LLScrollListItem::setHighlighted(BOOL b)
|
||||
{
|
||||
mHighlighted = b;
|
||||
mHoverIndex = -1;
|
||||
}
|
||||
|
||||
void LLScrollListItem::setHoverCell(S32 cell)
|
||||
{
|
||||
mHoverIndex = cell;
|
||||
}
|
||||
|
||||
void LLScrollListItem::setSelectedCell(S32 cell)
|
||||
{
|
||||
mSelectedIndex = cell;
|
||||
}
|
||||
|
||||
void LLScrollListItem::addColumn(const LLScrollListCell::Params& p)
|
||||
{
|
||||
mColumns.push_back(LLScrollListCell::create(p));
|
||||
|
|
@ -120,12 +144,21 @@ std::string LLScrollListItem::getContentsCSV() const
|
|||
}
|
||||
|
||||
|
||||
void LLScrollListItem::draw(const LLRect& rect, const LLColor4& fg_color, const LLColor4& bg_color, const LLColor4& highlight_color, S32 column_padding)
|
||||
void LLScrollListItem::draw(const LLRect& rect, const LLColor4& fg_color, const LLColor4& hover_color, const LLColor4& select_color, const LLColor4& highlight_color, S32 column_padding)
|
||||
{
|
||||
// draw background rect
|
||||
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
|
||||
LLRect bg_rect = rect;
|
||||
gl_rect_2d( bg_rect, bg_color );
|
||||
if (mSelectedIndex < 0 && getSelected())
|
||||
{
|
||||
// Whole item is highlighted/selected
|
||||
gl_rect_2d(bg_rect, select_color);
|
||||
}
|
||||
else if (mHoverIndex < 0)
|
||||
{
|
||||
// Whole item is highlighted/selected
|
||||
gl_rect_2d(bg_rect, hover_color);
|
||||
}
|
||||
|
||||
S32 cur_x = rect.mLeft;
|
||||
S32 num_cols = getNumColumns();
|
||||
|
|
@ -141,6 +174,25 @@ void LLScrollListItem::draw(const LLRect& rect, const LLColor4& fg_color, const
|
|||
{
|
||||
LLUI::translate((F32) cur_x, (F32) rect.mBottom);
|
||||
|
||||
if (mSelectedIndex == cur_col)
|
||||
{
|
||||
// select specific cell
|
||||
LLRect highlight_rect(0,
|
||||
cell->getHeight(),
|
||||
cell->getWidth(),
|
||||
0);
|
||||
gl_rect_2d(highlight_rect, select_color);
|
||||
}
|
||||
else if (mHoverIndex == cur_col)
|
||||
{
|
||||
// highlight specific cell
|
||||
LLRect highlight_rect(0,
|
||||
cell->getHeight(),
|
||||
cell->getWidth() ,
|
||||
0);
|
||||
gl_rect_2d(highlight_rect, hover_color);
|
||||
}
|
||||
|
||||
cell->draw( fg_color, highlight_color );
|
||||
}
|
||||
LLUI::popMatrix();
|
||||
|
|
|
|||
|
|
@ -77,15 +77,21 @@ public:
|
|||
|
||||
virtual ~LLScrollListItem();
|
||||
|
||||
void setSelected( BOOL b ) { mSelected = b; }
|
||||
void setSelected( BOOL b );
|
||||
BOOL getSelected() const { return mSelected; }
|
||||
|
||||
void setEnabled( BOOL b ) { mEnabled = b; }
|
||||
BOOL getEnabled() const { return mEnabled; }
|
||||
|
||||
void setHighlighted( BOOL b ) { mHighlighted = b; }
|
||||
void setHighlighted( BOOL b );
|
||||
BOOL getHighlighted() const { return mHighlighted; }
|
||||
|
||||
void setSelectedCell( S32 cell );
|
||||
S32 getSelectedCell() const { return mSelectedIndex; }
|
||||
|
||||
void setHoverCell( S32 cell );
|
||||
S32 getHoverCell() const { return mHoverIndex; }
|
||||
|
||||
void setUserdata( void* userdata ) { mUserdata = userdata; }
|
||||
void* getUserdata() const { return mUserdata; }
|
||||
|
||||
|
|
@ -107,14 +113,21 @@ public:
|
|||
|
||||
std::string getContentsCSV() const;
|
||||
|
||||
virtual void draw(const LLRect& rect, const LLColor4& fg_color, const LLColor4& bg_color, const LLColor4& highlight_color, S32 column_padding);
|
||||
virtual void draw(const LLRect& rect,
|
||||
const LLColor4& fg_color,
|
||||
const LLColor4& hover_color, // highlight/hover selection of whole item or cell
|
||||
const LLColor4& select_color, // highlight/hover selection of whole item or cell
|
||||
const LLColor4& highlight_color, // highlights contents of cells (ex: text)
|
||||
S32 column_padding);
|
||||
|
||||
protected:
|
||||
LLScrollListItem( const Params& );
|
||||
|
||||
private:
|
||||
BOOL mSelected;
|
||||
BOOL mHighlighted;
|
||||
BOOL mHighlighted;
|
||||
S32 mHoverIndex;
|
||||
S32 mSelectedIndex;
|
||||
BOOL mEnabled;
|
||||
void* mUserdata;
|
||||
LLSD mItemValue;
|
||||
|
|
|
|||
|
|
@ -327,7 +327,7 @@ BOOL LLKeyboard::keyFromString(const std::string& str, KEY *key)
|
|||
|
||||
|
||||
// static
|
||||
std::string LLKeyboard::stringFromKey(KEY key)
|
||||
std::string LLKeyboard::stringFromKey(KEY key, bool translate)
|
||||
{
|
||||
std::string res = get_if_there(sKeysToNames, key, std::string());
|
||||
if (res.empty())
|
||||
|
|
@ -338,16 +338,60 @@ std::string LLKeyboard::stringFromKey(KEY key)
|
|||
res = std::string(buffer);
|
||||
}
|
||||
|
||||
LLKeyStringTranslatorFunc *trans = gKeyboard->mStringTranslator;
|
||||
if (trans != NULL)
|
||||
if (translate)
|
||||
{
|
||||
res = trans(res.c_str());
|
||||
LLKeyStringTranslatorFunc *trans = gKeyboard->mStringTranslator;
|
||||
if (trans != NULL)
|
||||
{
|
||||
res = trans(res.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
//static
|
||||
std::string LLKeyboard::stringFromAccelerator(MASK accel_mask)
|
||||
{
|
||||
std::string res;
|
||||
|
||||
LLKeyStringTranslatorFunc *trans = gKeyboard->mStringTranslator;
|
||||
|
||||
if (trans == NULL)
|
||||
{
|
||||
LL_ERRS() << "No mKeyStringTranslator" << LL_ENDL;
|
||||
return res;
|
||||
}
|
||||
|
||||
// Append any masks
|
||||
#ifdef LL_DARWIN
|
||||
// Standard Mac names for modifier keys in menu equivalents
|
||||
// We could use the symbol characters, but they only exist in certain fonts.
|
||||
if (accel_mask & MASK_CONTROL)
|
||||
{
|
||||
if (accel_mask & MASK_MAC_CONTROL)
|
||||
{
|
||||
res.append(trans("accel-mac-control"));
|
||||
}
|
||||
else
|
||||
{
|
||||
res.append(trans("accel-mac-command")); // Symbol would be "\xE2\x8C\x98"
|
||||
}
|
||||
}
|
||||
if (accel_mask & MASK_ALT)
|
||||
res.append(trans("accel-mac-option")); // Symbol would be "\xE2\x8C\xA5"
|
||||
if (accel_mask & MASK_SHIFT)
|
||||
res.append(trans("accel-mac-shift")); // Symbol would be "\xE2\x8C\xA7"
|
||||
#else
|
||||
if (accel_mask & MASK_CONTROL)
|
||||
res.append(trans("accel-win-control"));
|
||||
if (accel_mask & MASK_ALT)
|
||||
res.append(trans("accel-win-alt"));
|
||||
if (accel_mask & MASK_SHIFT)
|
||||
res.append(trans("accel-win-shift"));
|
||||
#endif
|
||||
return res;
|
||||
}
|
||||
//static
|
||||
std::string LLKeyboard::stringFromAccelerator( MASK accel_mask, KEY key )
|
||||
{
|
||||
|
|
@ -359,41 +403,7 @@ std::string LLKeyboard::stringFromAccelerator( MASK accel_mask, KEY key )
|
|||
return res;
|
||||
}
|
||||
|
||||
LLKeyStringTranslatorFunc *trans = gKeyboard->mStringTranslator;
|
||||
|
||||
if( trans == NULL )
|
||||
{
|
||||
LL_ERRS() << "No mKeyStringTranslator" << LL_ENDL;
|
||||
return res;
|
||||
}
|
||||
|
||||
// Append any masks
|
||||
#ifdef LL_DARWIN
|
||||
// Standard Mac names for modifier keys in menu equivalents
|
||||
// We could use the symbol characters, but they only exist in certain fonts.
|
||||
if( accel_mask & MASK_CONTROL )
|
||||
{
|
||||
if ( accel_mask & MASK_MAC_CONTROL )
|
||||
{
|
||||
res.append( trans("accel-mac-control") );
|
||||
}
|
||||
else
|
||||
{
|
||||
res.append( trans("accel-mac-command") ); // Symbol would be "\xE2\x8C\x98"
|
||||
}
|
||||
}
|
||||
if( accel_mask & MASK_ALT )
|
||||
res.append( trans("accel-mac-option") ); // Symbol would be "\xE2\x8C\xA5"
|
||||
if( accel_mask & MASK_SHIFT )
|
||||
res.append( trans("accel-mac-shift") ); // Symbol would be "\xE2\x8C\xA7"
|
||||
#else
|
||||
if( accel_mask & MASK_CONTROL )
|
||||
res.append( trans("accel-win-control") );
|
||||
if( accel_mask & MASK_ALT )
|
||||
res.append( trans("accel-win-alt") );
|
||||
if( accel_mask & MASK_SHIFT )
|
||||
res.append( trans("accel-win-shift") );
|
||||
#endif
|
||||
res.append(stringFromAccelerator(accel_mask));
|
||||
std::string key_string = LLKeyboard::stringFromKey(key);
|
||||
if ((accel_mask & MASK_NORMALKEYS) &&
|
||||
(key_string[0] == '-' || key_string[0] == '=' || key_string[0] == '+'))
|
||||
|
|
|
|||
|
|
@ -38,10 +38,10 @@ enum EKeystate
|
|||
{
|
||||
KEYSTATE_DOWN,
|
||||
KEYSTATE_LEVEL,
|
||||
KEYSTATE_UP
|
||||
KEYSTATE_UP
|
||||
};
|
||||
|
||||
typedef boost::function<void(EKeystate keystate)> LLKeyFunc;
|
||||
typedef boost::function<bool(EKeystate keystate)> LLKeyFunc;
|
||||
typedef std::string (LLKeyStringTranslatorFunc)(const char *label);
|
||||
|
||||
enum EKeyboardInsertMode
|
||||
|
|
@ -50,15 +50,6 @@ enum EKeyboardInsertMode
|
|||
LL_KIM_OVERWRITE
|
||||
};
|
||||
|
||||
class LLKeyBinding
|
||||
{
|
||||
public:
|
||||
KEY mKey;
|
||||
MASK mMask;
|
||||
// const char *mName; // unused
|
||||
LLKeyFunc mFunction;
|
||||
};
|
||||
|
||||
class LLWindowCallbacks;
|
||||
|
||||
class LLKeyboard
|
||||
|
|
@ -103,7 +94,8 @@ public:
|
|||
|
||||
static BOOL maskFromString(const std::string& str, MASK *mask); // False on failure
|
||||
static BOOL keyFromString(const std::string& str, KEY *key); // False on failure
|
||||
static std::string stringFromKey(KEY key);
|
||||
static std::string stringFromKey(KEY key, bool translate = true);
|
||||
static std::string stringFromAccelerator( MASK accel_mask ); // separated for convinience, returns with "+": "Shift+" or "Shift+Alt+"...
|
||||
static std::string stringFromAccelerator( MASK accel_mask, KEY key );
|
||||
|
||||
void setCallbacks(LLWindowCallbacks *cbs) { mCallbacks = cbs; }
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
#include "llmousehandler.h"
|
||||
|
||||
//virtual
|
||||
BOOL LLMouseHandler::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktype, BOOL down)
|
||||
BOOL LLMouseHandler::handleAnyMouseClick(S32 x, S32 y, MASK mask, EMouseClickType clicktype, BOOL down)
|
||||
{
|
||||
BOOL handled = FALSE;
|
||||
if (down)
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
|
||||
#include "linden_common.h"
|
||||
#include "llrect.h"
|
||||
#include "indra_constants.h"
|
||||
|
||||
// Mostly-abstract interface.
|
||||
// Intended for use via multiple inheritance.
|
||||
|
|
@ -46,16 +47,7 @@ public:
|
|||
SHOW_ALWAYS,
|
||||
} EShowToolTip;
|
||||
|
||||
typedef enum {
|
||||
CLICK_LEFT,
|
||||
CLICK_MIDDLE,
|
||||
CLICK_RIGHT,
|
||||
CLICK_BUTTON4,
|
||||
CLICK_BUTTON5,
|
||||
CLICK_DOUBLELEFT
|
||||
} EClickType;
|
||||
|
||||
virtual BOOL handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktype, BOOL down);
|
||||
virtual BOOL handleAnyMouseClick(S32 x, S32 y, MASK mask, EMouseClickType clicktype, BOOL down);
|
||||
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) = 0;
|
||||
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) = 0;
|
||||
virtual BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask) = 0;
|
||||
|
|
|
|||
|
|
@ -250,7 +250,7 @@ set(viewer_SOURCE_FILES
|
|||
llblockedlistitem.cpp
|
||||
llblocklist.cpp
|
||||
llbox.cpp
|
||||
llbreadcrumbview.cpp
|
||||
#llbreadcrumbview.cpp #<FS:Ansariel> Unused
|
||||
llbrowsernotification.cpp
|
||||
llbuycurrencyhtml.cpp
|
||||
llcallingcard.cpp
|
||||
|
|
@ -487,10 +487,11 @@ set(viewer_SOURCE_FILES
|
|||
llinventoryobserver.cpp
|
||||
llinventorypanel.cpp
|
||||
lljoystickbutton.cpp
|
||||
llkeyconflict.cpp
|
||||
lllandmarkactions.cpp
|
||||
lllandmarklist.cpp
|
||||
lllegacyatmospherics.cpp
|
||||
lllistbrowser.cpp
|
||||
#lllistbrowser.cpp #<FS:Ansariel> Unused
|
||||
lllistcontextmenu.cpp
|
||||
lllistview.cpp
|
||||
lllocalbitmaps.cpp
|
||||
|
|
@ -652,7 +653,7 @@ set(viewer_SOURCE_FILES
|
|||
llregioninfomodel.cpp
|
||||
llregionposition.cpp
|
||||
llremoteparcelrequest.cpp
|
||||
llsavedsettingsglue.cpp
|
||||
#llsavedsettingsglue.cpp #<FS:Ansariel> Unused
|
||||
llsaveoutfitcombobtn.cpp
|
||||
llscenemonitor.cpp
|
||||
llsceneview.cpp
|
||||
|
|
@ -668,6 +669,7 @@ set(viewer_SOURCE_FILES
|
|||
llsecapi.cpp
|
||||
llsechandler_basic.cpp
|
||||
llselectmgr.cpp
|
||||
llsetkeybinddialog.cpp
|
||||
llsettingspicker.cpp
|
||||
llsettingsvo.cpp
|
||||
llshareavatarhandler.cpp
|
||||
|
|
@ -747,7 +749,7 @@ set(viewer_SOURCE_FILES
|
|||
llurlhistory.cpp
|
||||
llurllineeditorctrl.cpp
|
||||
llurlwhitelist.cpp
|
||||
llvectorperfoptions.cpp
|
||||
#llvectorperfoptions.cpp #<FS:Ansariel> Unused
|
||||
llversioninfo.cpp
|
||||
llviewchildren.cpp
|
||||
llviewerassetstats.cpp
|
||||
|
|
@ -774,7 +776,7 @@ set(viewer_SOURCE_FILES
|
|||
llviewerjointattachment.cpp
|
||||
llviewerjointmesh.cpp
|
||||
llviewerjoystick.cpp
|
||||
llviewerkeyboard.cpp
|
||||
llviewerinput.cpp
|
||||
llviewerlayer.cpp
|
||||
llviewermedia.cpp
|
||||
llviewermedia_streamingaudio.cpp
|
||||
|
|
@ -1018,7 +1020,7 @@ set(viewer_HEADER_FILES
|
|||
llblockedlistitem.h
|
||||
llblocklist.h
|
||||
llbox.h
|
||||
llbreadcrumbview.h
|
||||
#llbreadcrumbview.h #<FS:Ansariel> Unused
|
||||
llbuycurrencyhtml.h
|
||||
llcallingcard.h
|
||||
llcapabilityprovider.h
|
||||
|
|
@ -1256,10 +1258,11 @@ set(viewer_HEADER_FILES
|
|||
llinventoryobserver.h
|
||||
llinventorypanel.h
|
||||
lljoystickbutton.h
|
||||
llkeyconflict.h
|
||||
lllandmarkactions.h
|
||||
lllandmarklist.h
|
||||
lllightconstants.h
|
||||
lllistbrowser.h
|
||||
#lllistbrowser.h #<FS:Ansariel> Unused
|
||||
lllistcontextmenu.h
|
||||
lllistview.h
|
||||
lllocalbitmaps.h
|
||||
|
|
@ -1410,7 +1413,7 @@ set(viewer_HEADER_FILES
|
|||
llremoteparcelrequest.h
|
||||
llresourcedata.h
|
||||
llrootview.h
|
||||
llsavedsettingsglue.h
|
||||
#llsavedsettingsglue.h #<FS:Ansariel> Unused
|
||||
llsaveoutfitcombobtn.h
|
||||
llscenemonitor.h
|
||||
llsceneview.h
|
||||
|
|
@ -1427,6 +1430,7 @@ set(viewer_HEADER_FILES
|
|||
llsecapi.h
|
||||
llsechandler_basic.h
|
||||
llselectmgr.h
|
||||
llsetkeybinddialog.h
|
||||
llsettingspicker.h
|
||||
llsettingsvo.h
|
||||
llsidepanelappearance.h
|
||||
|
|
@ -1509,7 +1513,7 @@ set(viewer_HEADER_FILES
|
|||
llurlhistory.h
|
||||
llurllineeditorctrl.h
|
||||
llurlwhitelist.h
|
||||
llvectorperfoptions.h
|
||||
#llvectorperfoptions.h #<FS:Ansariel> Unused
|
||||
llversioninfo.h
|
||||
llviewchildren.h
|
||||
llviewerassetstats.h
|
||||
|
|
@ -1535,7 +1539,7 @@ set(viewer_HEADER_FILES
|
|||
llviewerjointattachment.h
|
||||
llviewerjointmesh.h
|
||||
llviewerjoystick.h
|
||||
llviewerkeyboard.h
|
||||
llviewerinput.h
|
||||
llviewerlayer.h
|
||||
llviewermedia.h
|
||||
llviewermediafocus.h
|
||||
|
|
@ -2061,8 +2065,7 @@ set(viewer_APPSETTINGS_FILES
|
|||
app_settings/growl_notifications.xml
|
||||
app_settings/high_graphics.xml
|
||||
app_settings/ignorable_dialogs.xml
|
||||
app_settings/keys.xml
|
||||
app_settings/keys_azerty.xml
|
||||
app_settings/key_bindings.xml
|
||||
app_settings/keywords.ini
|
||||
app_settings/keywords_lsl_default.xml
|
||||
app_settings/logcontrol.xml
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
6.4.17
|
||||
6.4.18
|
||||
|
|
|
|||
|
|
@ -28,34 +28,11 @@
|
|||
<binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
|
||||
<binding key="A" mask="SHIFT" command="slide_left"/>
|
||||
<binding key="D" mask="SHIFT" command="slide_right"/>
|
||||
<binding key="W" mask="SHIFT" command="push_forward"/>
|
||||
<binding key="S" mask="SHIFT" command="push_backward"/>
|
||||
<binding key="E" mask="SHIFT" command="jump"/>
|
||||
<binding key="C" mask="SHIFT" command="push_down"/>
|
||||
<binding key="F" mask="SHIFT" command="toggle_fly"/>
|
||||
|
||||
<binding key="SPACE" mask="NONE" command="stop_moving"/>
|
||||
<binding key="ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
|
||||
<binding key="LEFT" mask="SHIFT" command="slide_left"/>
|
||||
<binding key="RIGHT" mask="SHIFT" command="slide_right"/>
|
||||
<binding key="UP" mask="SHIFT" command="push_forward"/>
|
||||
<binding key="DOWN" mask="SHIFT" command="push_backward"/>
|
||||
<binding key="PGUP" mask="SHIFT" command="jump"/>
|
||||
<binding key="PGDN" mask="SHIFT" command="push_down"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/>
|
||||
<binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/>
|
||||
<binding key="PAD_UP" mask="SHIFT" command="push_forward"/>
|
||||
<binding key="PAD_DOWN" mask="SHIFT" command="push_backward"/>
|
||||
<binding key="PAD_PGUP" mask="SHIFT" command="jump"/>
|
||||
<binding key="PAD_PGDN" mask="SHIFT" command="push_down"/>
|
||||
<binding key="PAD_HOME" mask="SHIFT" command="toggle_fly"/>
|
||||
<binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/>
|
||||
<binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/>
|
||||
</first_person>
|
||||
<third_person>
|
||||
<binding key="A" mask="NONE" command="turn_left"/>
|
||||
|
|
@ -64,15 +41,10 @@
|
|||
<binding key="D" mask="SHIFT" command="slide_right"/>
|
||||
<binding key="W" mask="NONE" command="push_forward"/>
|
||||
<binding key="S" mask="NONE" command="push_backward"/>
|
||||
<binding key="W" mask="SHIFT" command="push_forward"/>
|
||||
<binding key="S" mask="SHIFT" command="push_backward"/>
|
||||
<binding key="E" mask="NONE" command="jump"/>
|
||||
<binding key="C" mask="NONE" command="push_down"/>
|
||||
<binding key="E" mask="SHIFT" command="jump"/>
|
||||
<binding key="C" mask="SHIFT" command="push_down"/>
|
||||
|
||||
<binding key="F" mask="NONE" command="toggle_fly"/>
|
||||
<binding key="F" mask="SHIFT" command="toggle_fly"/>
|
||||
|
||||
<binding key="SPACE" mask="NONE" command="stop_moving"/>
|
||||
<binding key="ENTER" mask="NONE" command="start_chat"/>
|
||||
|
|
@ -84,13 +56,8 @@
|
|||
<binding key="RIGHT" mask="SHIFT" command="slide_right"/>
|
||||
<binding key="UP" mask="NONE" command="push_forward"/>
|
||||
<binding key="DOWN" mask="NONE" command="push_backward"/>
|
||||
<binding key="UP" mask="SHIFT" command="push_forward"/>
|
||||
<binding key="DOWN" mask="SHIFT" command="push_backward"/>
|
||||
<binding key="PGUP" mask="NONE" command="jump"/>
|
||||
<binding key="PGDN" mask="NONE" command="push_down"/>
|
||||
<binding key="PGUP" mask="SHIFT" command="jump"/>
|
||||
<binding key="PGDN" mask="SHIFT" command="push_down"/>
|
||||
<binding key="HOME" mask="SHIFT" command="toggle_fly"/>
|
||||
<binding key="HOME" mask="NONE" command="toggle_fly"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="NONE" command="turn_left"/>
|
||||
|
|
@ -99,20 +66,12 @@
|
|||
<binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/>
|
||||
<binding key="PAD_UP" mask="NONE" command="push_forward"/>
|
||||
<binding key="PAD_DOWN" mask="NONE" command="push_backward"/>
|
||||
<binding key="PAD_UP" mask="SHIFT" command="push_forward"/>
|
||||
<binding key="PAD_DOWN" mask="SHIFT" command="push_backward"/>
|
||||
<binding key="PAD_PGUP" mask="NONE" command="jump"/>
|
||||
<binding key="PAD_PGDN" mask="NONE" command="push_down"/>
|
||||
<binding key="PAD_PGUP" mask="SHIFT" command="jump"/>
|
||||
<binding key="PAD_PGDN" mask="SHIFT" command="push_down"/>
|
||||
<binding key="PAD_HOME" mask="NONE" command="toggle_fly"/>
|
||||
<binding key="PAD_HOME" mask="SHIFT" command="toggle_fly"/>
|
||||
<binding key="PAD_CENTER" mask="NONE" command="stop_moving"/>
|
||||
<binding key="PAD_CENTER" mask="SHIFT" command="stop_moving"/>
|
||||
<binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
<binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/>
|
||||
|
||||
<!--Camera controls in third person on Alt-->
|
||||
<binding key="LEFT" mask="ALT" command="spin_around_cw"/>
|
||||
|
|
@ -139,28 +98,14 @@
|
|||
<binding key="PAD_DIVIDE" mask="ALT" command="start_gesture"/>
|
||||
|
||||
<!--mimic alt zoom behavior with keyboard only-->
|
||||
<binding key="A" mask="CTL_ALT" command="spin_around_cw"/>
|
||||
<binding key="D" mask="CTL_ALT" command="spin_around_ccw"/>
|
||||
<binding key="W" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="S" mask="CTL_ALT" command="spin_under"/>
|
||||
<binding key="E" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="C" mask="CTL_ALT" command="spin_under"/>
|
||||
|
||||
<binding key="LEFT" mask="CTL_ALT" command="spin_around_cw"/>
|
||||
<binding key="RIGHT" mask="CTL_ALT" command="spin_around_ccw"/>
|
||||
<binding key="UP" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="DOWN" mask="CTL_ALT" command="spin_under"/>
|
||||
<binding key="PGUP" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="PGDN" mask="CTL_ALT" command="spin_under"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="CTL_ALT" command="spin_around_cw"/>
|
||||
<binding key="PAD_RIGHT" mask="CTL_ALT" command="spin_around_ccw"/>
|
||||
<binding key="PAD_UP" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="PAD_DOWN" mask="CTL_ALT" command="spin_under"/>
|
||||
<binding key="PAD_PGUP" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="PAD_PGDN" mask="CTL_ALT" command="spin_under"/>
|
||||
<binding key="PAD_ENTER" mask="CTL_ALT" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="CTL_ALT" command="start_gesture"/>
|
||||
|
||||
<!--Therefore pan on Alt-Shift-->
|
||||
<binding key="A" mask="CTL_ALT_SHIFT" command="pan_left"/>
|
||||
|
|
@ -179,63 +124,10 @@
|
|||
<binding key="PAD_DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/>
|
||||
<binding key="PAD_ENTER" mask="CTL_ALT_SHIFT" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="CTL_ALT_SHIFT" command="start_gesture"/>
|
||||
|
||||
<binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/>
|
||||
<binding key="" mask="NONE" mouse="LMB" command="walk_to"/>
|
||||
</third_person>
|
||||
|
||||
<!-- Basic editing camera control -->
|
||||
<edit>
|
||||
<binding key="A" mask="NONE" command="spin_around_cw"/>
|
||||
<binding key="D" mask="NONE" command="spin_around_ccw"/>
|
||||
<binding key="W" mask="NONE" command="move_forward"/>
|
||||
<binding key="S" mask="NONE" command="move_backward"/>
|
||||
<binding key="E" mask="NONE" command="spin_over"/>
|
||||
<binding key="C" mask="NONE" command="spin_under"/>
|
||||
<binding key="ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
<binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
|
||||
<binding key="LEFT" mask="NONE" command="spin_around_cw"/>
|
||||
<binding key="RIGHT" mask="NONE" command="spin_around_ccw"/>
|
||||
<binding key="UP" mask="NONE" command="move_forward"/>
|
||||
<binding key="DOWN" mask="NONE" command="move_backward"/>
|
||||
<binding key="PGUP" mask="NONE" command="spin_over"/>
|
||||
<binding key="PGDN" mask="NONE" command="spin_under"/>
|
||||
|
||||
<binding key="A" mask="SHIFT" command="pan_left"/>
|
||||
<binding key="D" mask="SHIFT" command="pan_right"/>
|
||||
<binding key="W" mask="SHIFT" command="pan_up"/>
|
||||
<binding key="S" mask="SHIFT" command="pan_down"/>
|
||||
|
||||
<binding key="LEFT" mask="SHIFT" command="pan_left"/>
|
||||
<binding key="RIGHT" mask="SHIFT" command="pan_right"/>
|
||||
<binding key="UP" mask="SHIFT" command="pan_up"/>
|
||||
<binding key="DOWN" mask="SHIFT" command="pan_down"/>
|
||||
|
||||
<!--Walking works with ALT held down.-->
|
||||
<binding key="A" mask="ALT" command="slide_left"/>
|
||||
<binding key="D" mask="ALT" command="slide_right"/>
|
||||
<binding key="W" mask="ALT" command="push_forward"/>
|
||||
<binding key="S" mask="ALT" command="push_backward"/>
|
||||
<binding key="E" mask="ALT" command="jump"/>
|
||||
<binding key="C" mask="ALT" command="push_down"/>
|
||||
|
||||
<binding key="LEFT" mask="ALT" command="slide_left"/>
|
||||
<binding key="RIGHT" mask="ALT" command="slide_right"/>
|
||||
<binding key="UP" mask="ALT" command="push_forward"/>
|
||||
<binding key="DOWN" mask="ALT" command="push_backward"/>
|
||||
<binding key="PGUP" mask="ALT" command="jump"/>
|
||||
<binding key="PGDN" mask="ALT" command="push_down"/>
|
||||
<binding key="HOME" mask="ALT" command="toggle_fly"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="ALT" command="slide_left"/>
|
||||
<binding key="PAD_RIGHT" mask="ALT" command="slide_right"/>
|
||||
<binding key="PAD_UP" mask="ALT" command="push_forward"/>
|
||||
<binding key="PAD_DOWN" mask="ALT" command="push_backward"/>
|
||||
<binding key="PAD_PGUP" mask="ALT" command="jump"/>
|
||||
<binding key="PAD_PGDN" mask="ALT" command="push_down"/>
|
||||
<binding key="PAD_ENTER" mask="ALT" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="ALT" command="start_gesture"/>
|
||||
</edit>
|
||||
<sitting>
|
||||
<binding key="A" mask="ALT" command="spin_around_cw"/>
|
||||
<binding key="D" mask="ALT" command="spin_around_ccw"/>
|
||||
|
|
@ -251,15 +143,11 @@
|
|||
<binding key="PGUP" mask="ALT" command="spin_over"/>
|
||||
<binding key="PGDN" mask="ALT" command="spin_under"/>
|
||||
|
||||
<binding key="A" mask="CTL_ALT" command="spin_around_cw"/>
|
||||
<binding key="D" mask="CTL_ALT" command="spin_around_ccw"/>
|
||||
<binding key="W" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="S" mask="CTL_ALT" command="spin_under"/>
|
||||
<binding key="E" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="C" mask="CTL_ALT" command="spin_under"/>
|
||||
|
||||
<binding key="LEFT" mask="CTL_ALT" command="spin_around_cw"/>
|
||||
<binding key="RIGHT" mask="CTL_ALT" command="spin_around_ccw"/>
|
||||
<binding key="UP" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="DOWN" mask="CTL_ALT" command="spin_under"/>
|
||||
<binding key="PGUP" mask="CTL_ALT" command="spin_over"/>
|
||||
|
|
@ -294,23 +182,23 @@
|
|||
<binding key="A" mask="SHIFT" command="slide_left"/>
|
||||
<binding key="D" mask="SHIFT" command="slide_right"/>
|
||||
<binding key="W" mask="SHIFT" command="move_forward_sitting"/>
|
||||
<binding key="S" mask="SHIFT" command="move_backward_sitting"/>
|
||||
<binding key="E" mask="SHIFT" command="spin_over_sitting"/>
|
||||
<binding key="C" mask="SHIFT" command="spin_under_sitting"/>
|
||||
<binding key="S" mask="SHIFT" command="move_backward_sitting"/>
|
||||
<binding key="E" mask="SHIFT" command="spin_over_sitting"/>
|
||||
<binding key="C" mask="SHIFT" command="spin_under_sitting"/>
|
||||
|
||||
<binding key="LEFT" mask="SHIFT" command="slide_left"/>
|
||||
<binding key="RIGHT" mask="SHIFT" command="slide_right"/>
|
||||
<binding key="UP" mask="SHIFT" command="move_forward_sitting"/>
|
||||
<binding key="DOWN" mask="SHIFT" command="move_backward_sitting"/>
|
||||
<binding key="PGUP" mask="SHIFT" command="spin_over_sitting"/>
|
||||
<binding key="PGDN" mask="SHIFT" command="spin_under_sitting"/>
|
||||
<binding key="DOWN" mask="SHIFT" command="move_backward_sitting"/>
|
||||
<binding key="PGUP" mask="SHIFT" command="spin_over_sitting"/>
|
||||
<binding key="PGDN" mask="SHIFT" command="spin_under_sitting"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/>
|
||||
<binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/>
|
||||
<binding key="PAD_UP" mask="SHIFT" command="move_forward_sitting"/>
|
||||
<binding key="PAD_DOWN" mask="SHIFT" command="move_backward_sitting"/>
|
||||
<binding key="PAD_PGUP" mask="SHIFT" command="spin_over_sitting"/>
|
||||
<binding key="PAD_PGDN" mask="SHIFT" command="spin_under_sitting"/>
|
||||
<binding key="PAD_DOWN" mask="SHIFT" command="move_backward_sitting"/>
|
||||
<binding key="PAD_PGUP" mask="SHIFT" command="spin_over_sitting"/>
|
||||
<binding key="PAD_PGDN" mask="SHIFT" command="spin_under_sitting"/>
|
||||
<binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/>
|
||||
|
||||
|
|
@ -334,6 +222,8 @@
|
|||
|
||||
<binding key="ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
|
||||
<binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/>
|
||||
</sitting>
|
||||
<edit_avatar>
|
||||
<!--Avatar editing camera controls-->
|
||||
|
|
@ -359,5 +249,7 @@
|
|||
<binding key="PAD_PGDN" mask="NONE" command="edit_avatar_spin_under"/>
|
||||
<binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
|
||||
<binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/>
|
||||
</edit_avatar>
|
||||
</keys>
|
||||
|
|
@ -1,363 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<keys>
|
||||
<first_person>
|
||||
<binding key="Q" mask="NONE" command="slide_left"/>
|
||||
<binding key="D" mask="NONE" command="slide_right"/>
|
||||
<binding key="Z" mask="NONE" command="push_forward"/>
|
||||
<binding key="S" mask="NONE" command="push_backward"/>
|
||||
<binding key="E" mask="NONE" command="jump"/>
|
||||
<binding key="C" mask="NONE" command="push_down"/>
|
||||
<binding key="F" mask="NONE" command="toggle_fly"/>
|
||||
|
||||
<binding key="LEFT" mask="NONE" command="slide_left"/>
|
||||
<binding key="RIGHT" mask="NONE" command="slide_right"/>
|
||||
<binding key="UP" mask="NONE" command="push_forward"/>
|
||||
<binding key="DOWN" mask="NONE" command="push_backward"/>
|
||||
<binding key="PGUP" mask="NONE" command="jump"/>
|
||||
<binding key="PGDN" mask="NONE" command="push_down"/>
|
||||
<binding key="HOME" mask="NONE" command="toggle_fly"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="NONE" command="slide_left"/>
|
||||
<binding key="PAD_RIGHT" mask="NONE" command="slide_right"/>
|
||||
<binding key="PAD_UP" mask="NONE" command="push_forward"/>
|
||||
<binding key="PAD_DOWN" mask="NONE" command="push_backward"/>
|
||||
<binding key="PAD_PGUP" mask="NONE" command="jump"/>
|
||||
<binding key="PAD_PGDN" mask="NONE" command="push_down"/>
|
||||
<binding key="PAD_HOME" mask="NONE" command="toggle_fly"/>
|
||||
<binding key="PAD_CENTER" mask="NONE" command="stop_moving"/>
|
||||
<binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
|
||||
<binding key="Q" mask="NONE" command="slide_left"/>
|
||||
<binding key="D" mask="NONE" command="slide_right"/>
|
||||
<binding key="Z" mask="NONE" command="push_forward"/>
|
||||
<binding key="S" mask="NONE" command="push_backward"/>
|
||||
<binding key="E" mask="NONE" command="jump"/>
|
||||
<binding key="C" mask="NONE" command="push_down"/>
|
||||
<binding key="F" mask="NONE" command="toggle_fly"/>
|
||||
|
||||
<binding key="SPACE" mask="NONE" command="stop_moving"/>
|
||||
<binding key="ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
|
||||
<binding key="LEFT" mask="SHIFT" command="slide_left"/>
|
||||
<binding key="RIGHT" mask="SHIFT" command="slide_right"/>
|
||||
<binding key="UP" mask="SHIFT" command="push_forward"/>
|
||||
<binding key="DOWN" mask="SHIFT" command="push_backward"/>
|
||||
<binding key="PGUP" mask="SHIFT" command="jump"/>
|
||||
<binding key="PGDN" mask="SHIFT" command="push_down"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/>
|
||||
<binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/>
|
||||
<binding key="PAD_UP" mask="SHIFT" command="push_forward"/>
|
||||
<binding key="PAD_DOWN" mask="SHIFT" command="push_backward"/>
|
||||
<binding key="PAD_PGUP" mask="SHIFT" command="jump"/>
|
||||
<binding key="PAD_PGDN" mask="SHIFT" command="push_down"/>
|
||||
<binding key="PAD_HOME" mask="SHIFT" command="toggle_fly"/>
|
||||
<binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/>
|
||||
</first_person>
|
||||
<third_person>
|
||||
<binding key="Q" mask="NONE" command="turn_left"/>
|
||||
<binding key="D" mask="NONE" command="turn_right"/>
|
||||
<binding key="Q" mask="SHIFT" command="slide_left"/>
|
||||
<binding key="D" mask="SHIFT" command="slide_right"/>
|
||||
<binding key="Z" mask="NONE" command="push_forward"/>
|
||||
<binding key="S" mask="NONE" command="push_backward"/>
|
||||
<binding key="Z" mask="SHIFT" command="push_forward"/>
|
||||
<binding key="S" mask="SHIFT" command="push_backward"/>
|
||||
<binding key="E" mask="NONE" command="jump"/>
|
||||
<binding key="C" mask="NONE" command="push_down"/>
|
||||
<binding key="E" mask="SHIFT" command="jump"/>
|
||||
<binding key="C" mask="SHIFT" command="push_down"/>
|
||||
|
||||
<binding key="F" mask="NONE" command="toggle_fly"/>
|
||||
<binding key="F" mask="SHIFT" command="toggle_fly"/>
|
||||
|
||||
<binding key="SPACE" mask="NONE" command="stop_moving"/>
|
||||
<binding key="ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
|
||||
<binding key="LEFT" mask="NONE" command="turn_left"/>
|
||||
<binding key="LEFT" mask="SHIFT" command="slide_left"/>
|
||||
<binding key="RIGHT" mask="NONE" command="turn_right"/>
|
||||
<binding key="RIGHT" mask="SHIFT" command="slide_right"/>
|
||||
<binding key="UP" mask="NONE" command="push_forward"/>
|
||||
<binding key="DOWN" mask="NONE" command="push_backward"/>
|
||||
<binding key="UP" mask="SHIFT" command="push_forward"/>
|
||||
<binding key="DOWN" mask="SHIFT" command="push_backward"/>
|
||||
<binding key="PGUP" mask="NONE" command="jump"/>
|
||||
<binding key="PGDN" mask="NONE" command="push_down"/>
|
||||
<binding key="PGUP" mask="SHIFT" command="jump"/>
|
||||
<binding key="PGDN" mask="SHIFT" command="push_down"/>
|
||||
<binding key="HOME" mask="SHIFT" command="toggle_fly"/>
|
||||
<binding key="HOME" mask="NONE" command="toggle_fly"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="NONE" command="turn_left"/>
|
||||
<binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/>
|
||||
<binding key="PAD_RIGHT" mask="NONE" command="turn_right"/>
|
||||
<binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/>
|
||||
<binding key="PAD_UP" mask="NONE" command="push_forward"/>
|
||||
<binding key="PAD_DOWN" mask="NONE" command="push_backward"/>
|
||||
<binding key="PAD_UP" mask="SHIFT" command="push_forward"/>
|
||||
<binding key="PAD_DOWN" mask="SHIFT" command="push_backward"/>
|
||||
<binding key="PAD_PGUP" mask="NONE" command="jump"/>
|
||||
<binding key="PAD_PGDN" mask="NONE" command="push_down"/>
|
||||
<binding key="PAD_PGUP" mask="SHIFT" command="jump"/>
|
||||
<binding key="PAD_PGDN" mask="SHIFT" command="push_down"/>
|
||||
<binding key="PAD_HOME" mask="NONE" command="toggle_fly"/>
|
||||
<binding key="PAD_HOME" mask="SHIFT" command="toggle_fly"/>
|
||||
<binding key="PAD_CENTER" mask="NONE" command="stop_moving"/>
|
||||
<binding key="PAD_CENTER" mask="SHIFT" command="stop_moving"/>
|
||||
<binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
<binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/>
|
||||
|
||||
<!--Camera controls in third person on Alt-->
|
||||
<binding key="LEFT" mask="ALT" command="spin_around_cw"/>
|
||||
<binding key="RIGHT" mask="ALT" command="spin_around_ccw"/>
|
||||
<binding key="UP" mask="ALT" command="move_forward"/>
|
||||
<binding key="DOWN" mask="ALT" command="move_backward"/>
|
||||
<binding key="PGUP" mask="ALT" command="spin_over"/>
|
||||
<binding key="PGDN" mask="ALT" command="spin_under"/>
|
||||
|
||||
<binding key="Q" mask="ALT" command="spin_around_cw"/>
|
||||
<binding key="D" mask="ALT" command="spin_around_ccw"/>
|
||||
<binding key="Z" mask="ALT" command="move_forward"/>
|
||||
<binding key="S" mask="ALT" command="move_backward"/>
|
||||
<binding key="E" mask="ALT" command="spin_over"/>
|
||||
<binding key="C" mask="ALT" command="spin_under"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="ALT" command="spin_around_cw"/>
|
||||
<binding key="PAD_RIGHT" mask="ALT" command="spin_around_ccw"/>
|
||||
<binding key="PAD_UP" mask="ALT" command="move_forward"/>
|
||||
<binding key="PAD_DOWN" mask="ALT" command="move_backward"/>
|
||||
<binding key="PAD_PGUP" mask="ALT" command="spin_over"/>
|
||||
<binding key="PAD_PGDN" mask="ALT" command="spin_under"/>
|
||||
<binding key="PAD_ENTER" mask="ALT" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="ALT" command="start_gesture"/>
|
||||
|
||||
<!--mimic alt zoom behavior with keyboard only-->
|
||||
<binding key="Q" mask="CTL_ALT" command="spin_around_cw"/>
|
||||
<binding key="D" mask="CTL_ALT" command="spin_around_ccw"/>
|
||||
<binding key="Z" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="S" mask="CTL_ALT" command="spin_under"/>
|
||||
<binding key="E" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="C" mask="CTL_ALT" command="spin_under"/>
|
||||
|
||||
<binding key="LEFT" mask="CTL_ALT" command="spin_around_cw"/>
|
||||
<binding key="RIGHT" mask="CTL_ALT" command="spin_around_ccw"/>
|
||||
<binding key="UP" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="DOWN" mask="CTL_ALT" command="spin_under"/>
|
||||
<binding key="PGUP" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="PGDN" mask="CTL_ALT" command="spin_under"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="CTL_ALT" command="spin_around_cw"/>
|
||||
<binding key="PAD_RIGHT" mask="CTL_ALT" command="spin_around_ccw"/>
|
||||
<binding key="PAD_UP" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="PAD_DOWN" mask="CTL_ALT" command="spin_under"/>
|
||||
<binding key="PAD_PGUP" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="PAD_PGDN" mask="CTL_ALT" command="spin_under"/>
|
||||
<binding key="PAD_ENTER" mask="CTL_ALT" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="CTL_ALT" command="start_gesture"/>
|
||||
|
||||
<!--Therefore pan on Alt-Shift-->
|
||||
<binding key="Q" mask="CTL_ALT_SHIFT" command="pan_left"/>
|
||||
<binding key="D" mask="CTL_ALT_SHIFT" command="pan_right"/>
|
||||
<binding key="Z" mask="CTL_ALT_SHIFT" command="pan_up"/>
|
||||
<binding key="S" mask="CTL_ALT_SHIFT" command="pan_down"/>
|
||||
|
||||
<binding key="LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/>
|
||||
<binding key="RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/>
|
||||
<binding key="UP" mask="CTL_ALT_SHIFT" command="pan_up"/>
|
||||
<binding key="DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/>
|
||||
<binding key="PAD_RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/>
|
||||
<binding key="PAD_UP" mask="CTL_ALT_SHIFT" command="pan_up"/>
|
||||
<binding key="PAD_DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/>
|
||||
<binding key="PAD_ENTER" mask="CTL_ALT_SHIFT" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="CTL_ALT_SHIFT" command="start_gesture"/>
|
||||
</third_person>
|
||||
|
||||
<!--Basic editing camera control-->
|
||||
<edit>
|
||||
<binding key="Q" mask="NONE" command="spin_around_cw"/>
|
||||
<binding key="D" mask="NONE" command="spin_around_ccw"/>
|
||||
<binding key="Z" mask="NONE" command="move_forward"/>
|
||||
<binding key="S" mask="NONE" command="move_backward"/>
|
||||
<binding key="E" mask="NONE" command="spin_over"/>
|
||||
<binding key="C" mask="NONE" command="spin_under"/>
|
||||
<binding key="ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
<binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
|
||||
<binding key="LEFT" mask="NONE" command="spin_around_cw"/>
|
||||
<binding key="RIGHT" mask="NONE" command="spin_around_ccw"/>
|
||||
<binding key="UP" mask="NONE" command="move_forward"/>
|
||||
<binding key="DOWN" mask="NONE" command="move_backward"/>
|
||||
<binding key="PGUP" mask="NONE" command="spin_over"/>
|
||||
<binding key="PGDN" mask="NONE" command="spin_under"/>
|
||||
|
||||
<binding key="Q" mask="SHIFT" command="pan_left"/>
|
||||
<binding key="D" mask="SHIFT" command="pan_right"/>
|
||||
<binding key="Z" mask="SHIFT" command="pan_up"/>
|
||||
<binding key="S" mask="SHIFT" command="pan_down"/>
|
||||
|
||||
<binding key="LEFT" mask="SHIFT" command="pan_left"/>
|
||||
<binding key="RIGHT" mask="SHIFT" command="pan_right"/>
|
||||
<binding key="UP" mask="SHIFT" command="pan_up"/>
|
||||
<binding key="DOWN" mask="SHIFT" command="pan_down"/>
|
||||
|
||||
<!--Walking works with ALT held down.-->
|
||||
<binding key="Q" mask="ALT" command="slide_left"/>
|
||||
<binding key="D" mask="ALT" command="slide_right"/>
|
||||
<binding key="Z" mask="ALT" command="push_forward"/>
|
||||
<binding key="S" mask="ALT" command="push_backward"/>
|
||||
<binding key="E" mask="ALT" command="jump"/>
|
||||
<binding key="C" mask="ALT" command="push_down"/>
|
||||
|
||||
<binding key="LEFT" mask="ALT" command="slide_left"/>
|
||||
<binding key="RIGHT" mask="ALT" command="slide_right"/>
|
||||
<binding key="UP" mask="ALT" command="push_forward"/>
|
||||
<binding key="DOWN" mask="ALT" command="push_backward"/>
|
||||
<binding key="PGUP" mask="ALT" command="jump"/>
|
||||
<binding key="PGDN" mask="ALT" command="push_down"/>
|
||||
<binding key="HOME" mask="ALT" command="toggle_fly"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="ALT" command="slide_left"/>
|
||||
<binding key="PAD_RIGHT" mask="ALT" command="slide_right"/>
|
||||
<binding key="PAD_UP" mask="ALT" command="push_forward"/>
|
||||
<binding key="PAD_DOWN" mask="ALT" command="push_backward"/>
|
||||
<binding key="PAD_PGUP" mask="ALT" command="jump"/>
|
||||
<binding key="PAD_PGDN" mask="ALT" command="push_down"/>
|
||||
<binding key="PAD_ENTER" mask="ALT" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="ALT" command="start_gesture"/>
|
||||
</edit>
|
||||
<sitting>
|
||||
<binding key="Q" mask="ALT" command="spin_around_cw"/>
|
||||
<binding key="D" mask="ALT" command="spin_around_ccw"/>
|
||||
<binding key="Z" mask="ALT" command="move_forward"/>
|
||||
<binding key="S" mask="ALT" command="move_backward"/>
|
||||
<binding key="E" mask="ALT" command="spin_over_sitting"/>
|
||||
<binding key="C" mask="ALT" command="spin_under_sitting"/>
|
||||
|
||||
<binding key="LEFT" mask="ALT" command="spin_around_cw"/>
|
||||
<binding key="RIGHT" mask="ALT" command="spin_around_ccw"/>
|
||||
<binding key="UP" mask="ALT" command="move_forward"/>
|
||||
<binding key="DOWN" mask="ALT" command="move_backward"/>
|
||||
<binding key="PGUP" mask="ALT" command="spin_over"/>
|
||||
<binding key="PGDN" mask="ALT" command="spin_under"/>
|
||||
|
||||
<binding key="Q" mask="CTL_ALT" command="spin_around_cw"/>
|
||||
<binding key="D" mask="CTL_ALT" command="spin_around_ccw"/>
|
||||
<binding key="Z" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="S" mask="CTL_ALT" command="spin_under"/>
|
||||
<binding key="E" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="C" mask="CTL_ALT" command="spin_under"/>
|
||||
|
||||
<binding key="LEFT" mask="CTL_ALT" command="spin_around_cw"/>
|
||||
<binding key="RIGHT" mask="CTL_ALT" command="spin_around_ccw"/>
|
||||
<binding key="UP" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="DOWN" mask="CTL_ALT" command="spin_under"/>
|
||||
<binding key="PGUP" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="PGDN" mask="CTL_ALT" command="spin_under"/>
|
||||
|
||||
|
||||
<binding key="Q" mask="NONE" command="spin_around_cw_sitting"/>
|
||||
<binding key="D" mask="NONE" command="spin_around_ccw_sitting"/>
|
||||
<binding key="Z" mask="NONE" command="move_forward_sitting"/>
|
||||
<binding key="S" mask="NONE" command="move_backward_sitting"/>
|
||||
<binding key="E" mask="NONE" command="spin_over_sitting"/>
|
||||
<binding key="C" mask="NONE" command="spin_under_sitting"/>
|
||||
|
||||
<binding key="LEFT" mask="NONE" command="spin_around_cw_sitting"/>
|
||||
<binding key="RIGHT" mask="NONE" command="spin_around_ccw_sitting"/>
|
||||
<binding key="UP" mask="NONE" command="move_forward_sitting"/>
|
||||
<binding key="DOWN" mask="NONE" command="move_backward_sitting"/>
|
||||
<binding key="PGUP" mask="NONE" command="spin_over_sitting"/>
|
||||
<binding key="PGDN" mask="NONE" command="spin_under_sitting"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="NONE" command="spin_around_cw_sitting"/>
|
||||
<binding key="PAD_RIGHT" mask="NONE" command="spin_around_ccw_sitting"/>
|
||||
<binding key="PAD_UP" mask="NONE" command="move_forward_sitting"/>
|
||||
<binding key="PAD_DOWN" mask="NONE" command="move_backward_sitting"/>
|
||||
<binding key="PAD_PGUP" mask="NONE" command="spin_over_sitting"/>
|
||||
<binding key="PAD_PGDN" mask="NONE" command="spin_under_sitting"/>
|
||||
<binding key="PAD_CENTER" mask="NONE" command="stop_moving"/>
|
||||
<binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
|
||||
<!--these are for passing controls when sitting on vehicles-->
|
||||
<binding key="Q" mask="SHIFT" command="slide_left"/>
|
||||
<binding key="D" mask="SHIFT" command="slide_right"/>
|
||||
<binding key="Z" mask="SHIFT" command="move_forward_sitting"/>
|
||||
<binding key="S" mask="SHIFT" command="move_backward_sitting"/>
|
||||
<binding key="E" mask="SHIFT" command="spin_over_sitting"/>
|
||||
<binding key="C" mask="SHIFT" command="spin_under_sitting"/>
|
||||
|
||||
<binding key="LEFT" mask="SHIFT" command="slide_left"/>
|
||||
<binding key="RIGHT" mask="SHIFT" command="slide_right"/>
|
||||
<binding key="UP" mask="SHIFT" command="move_forward_sitting"/>
|
||||
<binding key="DOWN" mask="SHIFT" command="move_backward_sitting"/>
|
||||
<binding key="PGUP" mask="SHIFT" command="spin_over_sitting"/>
|
||||
<binding key="PGDN" mask="SHIFT" command="spin_under_sitting"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/>
|
||||
<binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/>
|
||||
<binding key="PAD_UP" mask="SHIFT" command="move_forward_sitting"/>
|
||||
<binding key="PAD_DOWN" mask="SHIFT" command="move_backward_sitting"/>
|
||||
<binding key="PAD_PGUP" mask="SHIFT" command="spin_over_sitting"/>
|
||||
<binding key="PAD_PGDN" mask="SHIFT" command="spin_under_sitting"/>
|
||||
<binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/>
|
||||
|
||||
<!--pan on Alt-Shift-->
|
||||
<binding key="Q" mask="CTL_ALT_SHIFT" command="pan_left"/>
|
||||
<binding key="D" mask="CTL_ALT_SHIFT" command="pan_right"/>
|
||||
<binding key="Z" mask="CTL_ALT_SHIFT" command="pan_up"/>
|
||||
<binding key="S" mask="CTL_ALT_SHIFT" command="pan_down"/>
|
||||
|
||||
<binding key="LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/>
|
||||
<binding key="RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/>
|
||||
<binding key="UP" mask="CTL_ALT_SHIFT" command="pan_up"/>
|
||||
<binding key="DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/>
|
||||
<binding key="PAD_RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/>
|
||||
<binding key="PAD_UP" mask="CTL_ALT_SHIFT" command="pan_up"/>
|
||||
<binding key="PAD_DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/>
|
||||
<binding key="PAD_ENTER" mask="CTL_ALT_SHIFT" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="CTL_ALT_SHIFT" command="start_gesture"/>
|
||||
|
||||
<binding key="ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
</sitting>
|
||||
<edit_avatar>
|
||||
<!--Avatar editing camera controls-->
|
||||
<binding key="Q" mask="NONE" command="edit_avatar_spin_cw"/>
|
||||
<binding key="D" mask="NONE" command="edit_avatar_spin_ccw"/>
|
||||
<binding key="Z" mask="NONE" command="edit_avatar_move_forward"/>
|
||||
<binding key="S" mask="NONE" command="edit_avatar_move_backward"/>
|
||||
<binding key="E" mask="NONE" command="edit_avatar_spin_over"/>
|
||||
<binding key="C" mask="NONE" command="edit_avatar_spin_under"/>
|
||||
<binding key="LEFT" mask="NONE" command="edit_avatar_spin_cw"/>
|
||||
<binding key="RIGHT" mask="NONE" command="edit_avatar_spin_ccw"/>
|
||||
<binding key="UP" mask="NONE" command="edit_avatar_move_forward"/>
|
||||
<binding key="DOWN" mask="NONE" command="edit_avatar_move_backward"/>
|
||||
<binding key="PGUP" mask="NONE" command="edit_avatar_spin_over"/>
|
||||
<binding key="PGDN" mask="NONE" command="edit_avatar_spin_under"/>
|
||||
<binding key="ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
<binding key="PAD_LEFT" mask="NONE" command="edit_avatar_spin_cw"/>
|
||||
<binding key="PAD_RIGHT" mask="NONE" command="edit_avatar_spin_ccw"/>
|
||||
<binding key="PAD_UP" mask="NONE" command="edit_avatar_move_forward"/>
|
||||
<binding key="PAD_DOWN" mask="NONE" command="edit_avatar_move_backward"/>
|
||||
<binding key="PAD_PGUP" mask="NONE" command="edit_avatar_spin_over"/>
|
||||
<binding key="PAD_PGDN" mask="NONE" command="edit_avatar_spin_under"/>
|
||||
<binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
</edit_avatar>
|
||||
</keys>
|
||||
|
|
@ -5613,7 +5613,7 @@
|
|||
<key>DoubleClickAutoPilot</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable double-click auto pilot</string>
|
||||
<string>(Obsolete)Enable double-click auto pilot</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -5621,10 +5621,10 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>DoubleClickTeleport</key>
|
||||
<key>DoubleClickTeleport</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable double-click to teleport where allowed</string>
|
||||
<string>Enable double-click to teleport where allowed (afects minimap and people panel)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -11077,7 +11077,7 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>PushToTalkButton</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Which button or keyboard key is used for push-to-talk</string>
|
||||
<string>(Obsolete)Which button or keyboard key is used for push-to-talk</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -19912,7 +19912,7 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>ClickToWalk</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Click in world to walk to location</string>
|
||||
<string>(obsolete)Click in world to walk to location</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -21148,17 +21148,6 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>FSUseAzertyKeyboardLayout</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Uses a keyboard layout suitable for keyboards with AZERTY layout.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>FSNameTagZOffsetCorrection</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -24628,6 +24617,28 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>FSTelemetryEnableWhenConnected</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable telemetry as soon as a server connects</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>FSTelemetryActive</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable profiling as soon as a server connects. Off by default and non-persistent. Use with FSTelemetryEnableWhenConnected to initiate on startup</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>FSFilterGrowlKeywordDuplicateIMs</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -0,0 +1,80 @@
|
|||
FONTLOG for Cascadia Code
|
||||
===================================
|
||||
|
||||
This file provides detailed information on the Cascadia Code font. This information should be distributed along with the Cascadia Code font and any derivative works.
|
||||
|
||||
Basic Font Information
|
||||
-----------------------------------
|
||||
|
||||
Cascadia Code is a monospaced font shipped by Microsoft. It includes programming ligatures and is intended for use in terminal applications as well as text editors.
|
||||
|
||||
Contribution Information
|
||||
-----------------------------------
|
||||
|
||||
Documentation and contribution guidelines can be found at: https://github.com/microsoft/cascadia-code
|
||||
|
||||
ChangeLog
|
||||
-----------------------------------
|
||||
|
||||
09-25-2019 (Aaron Bell) Bug Fixes and Improvements
|
||||
|
||||
09-18-2019 (Aaron Bell) Cascadia Code Version 1909.16
|
||||
- Initial release
|
||||
|
||||
10-04-2019 (Aaron Bell) Cascadia Code Version 1910.04
|
||||
- Addition of Latin-1 characters
|
||||
- Addition of box drawing glyphs
|
||||
11-20-2019 (Aaron Bell) Cascadia Code Version 1911.20
|
||||
- Cyrillic, Greek, Vietnamese, and many other symbols added
|
||||
- Font converted to UFO with a build workflow
|
||||
- font rehinted
|
||||
- many other fixes!
|
||||
|
||||
04-29-2020 (Aaron Bell) April bug fixes
|
||||
- Many small bug fixes from the last few months
|
||||
|
||||
05-05-2020 Font vertical metrics locked
|
||||
|
||||
05-15-2020 (Aaron Bell, Dustin Howett) [Version 2005.15]
|
||||
Fixed WinDescent value to improve line spacing
|
||||
|
||||
06-29-2020 (Aaron Bell) Variable font conversion
|
||||
Converted Cascadia Code to a Variable font with a weight axis
|
||||
|
||||
|
||||
06-29-2020 (Aaron Bell) [Version 2007.01]
|
||||
Reworked Cascadia Code to be a variable font with 6 named variations ranging
|
||||
from ExtraLight to Bold.
|
||||
Split the long equals ligature (==) for earier reading
|
||||
Removed the hexadeciaml 'x' alternate
|
||||
Corrected malformed IJacute dioacritics
|
||||
Introduced a compatibility layout for PowerLine glyphs that will
|
||||
be used in GDI
|
||||
|
||||
08-25-2020 (Aaron Bell) [Version 2008.25]
|
||||
Started generating static TTFs and hinting them with ttfautohint
|
||||
Aligned the powerline glyphs to the font metrics exactly
|
||||
Realigned the box drawing glyphs to match the letters
|
||||
Added anchors to all alphabetic characters (and brevecomb-cy)
|
||||
added fi/fl ligatures (decomposed!)
|
||||
Fixed the weight of horncomb in bold
|
||||
|
||||
9-14-2020
|
||||
1) Added support for Salishan language groups
|
||||
2) Remastered mark positioning for glyphs with 2 diacritics (needed for Salishan)
|
||||
3) Rebuild Build Script to simplify code
|
||||
4) Fixed minor other hinting issues
|
||||
5) Fixed RVRN substitutions for heavy weight
|
||||
|
||||
9-21-2020
|
||||
1) Correcting mark positioning for salishan
|
||||
|
||||
Acknowledgements
|
||||
-----------------------------------
|
||||
|
||||
If you make modifications, be sure to add your name (N), email (E), web-address (if you have one) (W), and description (D). This list is in alphabetical order.
|
||||
|
||||
N: Aaron Bell
|
||||
E: aaron@sajatypeworks.com
|
||||
W: http://sajatypeworks.com
|
||||
D: Original font designer
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
Copyright (c) 2019 - Present, Microsoft Corporation,
|
||||
with Reserved Font Name Cascadia Code.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
|
|
@ -32,6 +32,9 @@
|
|||
<file>STIXGeneral.otf</file>
|
||||
<file>Thonburi.ttc</file>
|
||||
</os>
|
||||
<os name="Linux">
|
||||
<file>DejaVuSans.ttf</file>
|
||||
</os>
|
||||
</font>
|
||||
|
||||
<font name="SansSerifBold"
|
||||
|
|
@ -88,6 +91,11 @@
|
|||
<file>ocra.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="Cascadia"
|
||||
comment="Name of an optional Cascadia Code font used for the script editor">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="DejaVu"
|
||||
comment="Name of DejaVu font">
|
||||
<file>DejaVuSans.ttf</file>
|
||||
|
|
@ -172,6 +180,10 @@
|
|||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.0"
|
||||
/>
|
||||
<font_size name="Cascadia"
|
||||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.6"
|
||||
/>
|
||||
<font_size name="Huge"
|
||||
comment="Size of huge font (points, or 1/72 of an inch)"
|
||||
size="16.0"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,207 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<fonts>
|
||||
|
||||
<font name="default" comment="default font files (global fallbacks)">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
<os name="Windows">
|
||||
<file>meiryo.TTC</file>
|
||||
<file>YuGothR.ttc</file>
|
||||
<file>MSGOTHIC.TTC</file>
|
||||
<file>gulim.ttc</file>
|
||||
<file>simhei.ttf</file>
|
||||
<file>ArialUni.ttf</file>
|
||||
<file>msyh.ttc</file>
|
||||
<file>seguisym.ttf</file>
|
||||
<file>nirmala.ttf</file>
|
||||
<file>tahoma.ttf</file>
|
||||
<file load_collection="true">Cambria.ttc</file>
|
||||
<file>micross.ttf</file>
|
||||
<file>malgun.ttf</file>
|
||||
</os>
|
||||
<os name="Mac">
|
||||
<file>ヒラギノ角ゴシック W3.ttc</file>
|
||||
<file>ヒラギノ角ゴ Pro W3.otf</file>
|
||||
<file>ヒラギノ角ゴ ProN W3.otf</file>
|
||||
<file>ヒラギノ明朝 ProN W3.ttc</file>
|
||||
<file>AppleGothic.dfont</file>
|
||||
<file>AppleGothic.ttf</file>
|
||||
<file>AppleSDGothicNeo-Regular.otf</file>
|
||||
<file>AppleSDGothicNeo.ttc</file>
|
||||
<file>华文细黑.ttf</file>
|
||||
<file>PingFang.ttc</file>
|
||||
<file>STIXGeneral.otf</file>
|
||||
<file>Thonburi.ttc</file>
|
||||
</os>
|
||||
<os name="Linux">
|
||||
<file>DejaVuSans.ttf</file>
|
||||
</os>
|
||||
</font>
|
||||
|
||||
<font name="SansSerifBold"
|
||||
comment="Name of bold sans-serif font">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
<os name="Windows">
|
||||
<file>arialbd.ttf</file>
|
||||
</os>
|
||||
<os name="Mac">
|
||||
<file>Helvetica.dfont</file>
|
||||
</os>
|
||||
</font>
|
||||
|
||||
<font name="SansSerif" comment="Name of san-serif font (Truetype file name)">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
<os name="Windows">
|
||||
<file>arial.ttf</file>
|
||||
</os>
|
||||
<os name="Mac">
|
||||
<file>Helvetica.dfont</file>
|
||||
</os>
|
||||
</font>
|
||||
|
||||
<font name="SansSerif"
|
||||
comment="Name of bold sans-serif font"
|
||||
font_style="BOLD">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="SansSerif"
|
||||
comment="Name of italic sans-serif font"
|
||||
font_style="ITALIC">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="SansSerif"
|
||||
comment="Name of bold italic sans-serif font"
|
||||
font_style="BOLD|ITALIC">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="Monospace"
|
||||
comment="Name of monospace font">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="Scripting"
|
||||
comment="Name of an optional font used for the script editor">
|
||||
<file>SourceCodePro-Regular.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="OCRA"
|
||||
comment="OCRA machine character recognition used in script editor compile errors">
|
||||
<file>ocra.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="Cascadia"
|
||||
comment="Name of an optional Cascadia Code font used for the script editor">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="DejaVu"
|
||||
comment="Name of DejaVu font">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="DejaVu"
|
||||
comment="Name of DejaVu font (bold)"
|
||||
font_style="BOLD">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="DejaVu"
|
||||
comment="Name of DejaVu font (italic)"
|
||||
font_style="ITALIC">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="DejaVu"
|
||||
comment="Name of DejaVu font (bold italic)"
|
||||
font_style="BOLD|ITALIC">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="Helvetica"
|
||||
comment="Name of Helvetica font">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
<os name="Windows">
|
||||
<file>arial.ttf</file>
|
||||
</os>
|
||||
<os name="Mac">
|
||||
<file>arial.ttf</file>
|
||||
</os>
|
||||
</font>
|
||||
|
||||
<font name="Helvetica"
|
||||
comment="Name of Helvetica font (bold)"
|
||||
font_style="BOLD">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
<os name="Windows">
|
||||
<file>arialbd.ttf</file>
|
||||
</os>
|
||||
<os name="Mac">
|
||||
<file>arialbd.ttf</file>
|
||||
</os>
|
||||
</font>
|
||||
|
||||
<font name="Helvetica"
|
||||
comment="Name of Helvetica font (italic)"
|
||||
font_style="ITALIC">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
<os name="Windows">
|
||||
<file>ariali.ttf</file>
|
||||
</os>
|
||||
<os name="Mac">
|
||||
<file>ariali.ttf</file>
|
||||
</os>
|
||||
</font>
|
||||
|
||||
<font name="Helvetica"
|
||||
comment="Name of Helvetica font (bold italic)"
|
||||
font_style="BOLD|ITALIC">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
<os name="Windows">
|
||||
<file>arialbi.ttf</file>
|
||||
</os>
|
||||
<os name="Mac">
|
||||
<file>arialbi.ttf</file>
|
||||
</os>
|
||||
</font>
|
||||
|
||||
<font name="OverrideTest"
|
||||
comment="Name of font to test overriding">
|
||||
<file>times.ttf</file>
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font_size name="Scripting"
|
||||
comment="Size of script editor font (points, or 1/72 of an inch)"
|
||||
size="8.6"
|
||||
/>
|
||||
<font_size name="Monospace"
|
||||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.0"
|
||||
/>
|
||||
<font_size name="Cascadia"
|
||||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.6"
|
||||
/>
|
||||
<font_size name="Huge"
|
||||
comment="Size of huge font (points, or 1/72 of an inch)"
|
||||
size="16.0"
|
||||
/>
|
||||
<font_size name="Large"
|
||||
comment="Size of large font (points, or 1/72 of an inch)"
|
||||
size="10.6"
|
||||
/>
|
||||
<font_size name="Medium"
|
||||
comment="Size of medium font (points, or 1/72 of an inch)"
|
||||
size="8.6"
|
||||
/>
|
||||
<font_size name="Small"
|
||||
comment="Size of small font (points, or 1/72 of an inch)"
|
||||
size="7.6"
|
||||
/>
|
||||
<font_size name="Pie"
|
||||
comment="Size of pie menu font (points, or 1/72 of an inch)"
|
||||
size="7.3"
|
||||
/>
|
||||
</fonts>
|
||||
|
|
@ -32,6 +32,9 @@
|
|||
<file>STIXGeneral.otf</file>
|
||||
<file>Thonburi.ttc</file>
|
||||
</os>
|
||||
<os name="Linux">
|
||||
<file>DejaVuSans.ttf</file>
|
||||
</os>
|
||||
</font>
|
||||
|
||||
<font name="SansSerifBold"
|
||||
|
|
@ -88,6 +91,11 @@
|
|||
<file>ocra.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="Cascadia"
|
||||
comment="Name of an optional Cascadia Code font used for the script editor">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="DejaVu"
|
||||
comment="Name of DejaVu font">
|
||||
<file>DejaVuSans.ttf</file>
|
||||
|
|
@ -172,6 +180,10 @@
|
|||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.0"
|
||||
/>
|
||||
<font_size name="Cascadia"
|
||||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.6"
|
||||
/>
|
||||
<font_size name="Huge"
|
||||
comment="Size of huge font (points, or 1/72 of an inch)"
|
||||
size="17.8"
|
||||
|
|
|
|||
|
|
@ -30,6 +30,9 @@
|
|||
<file>PingFang.ttc</file>
|
||||
<file>STIXGeneral.otf</file>
|
||||
</os>
|
||||
<os name="Linux">
|
||||
<file>DejaVuSans.ttf</file>
|
||||
</os>
|
||||
</font>
|
||||
|
||||
<font name="SansSerifBold"
|
||||
|
|
@ -86,6 +89,11 @@
|
|||
<file>ocra.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="Cascadia"
|
||||
comment="Name of an optional Cascadia Code font used for the script editor">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="DejaVu"
|
||||
comment="Name of DejaVu font">
|
||||
<file>DejaVuSansAllCaps.ttf</file>
|
||||
|
|
@ -170,6 +178,10 @@
|
|||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.0"
|
||||
/>
|
||||
<font_size name="Cascadia"
|
||||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.6"
|
||||
/>
|
||||
<font_size name="Huge"
|
||||
comment="Size of huge font (points, or 1/72 of an inch)"
|
||||
size="16.0"
|
||||
|
|
|
|||
|
|
@ -32,6 +32,9 @@
|
|||
<file>STIXGeneral.otf</file>
|
||||
<file>Thonburi.ttc</file>
|
||||
</os>
|
||||
<os name="Linux">
|
||||
<file>DejaVuSans.ttf</file>
|
||||
</os>
|
||||
</font>
|
||||
|
||||
<font name="SansSerifBold"
|
||||
|
|
@ -87,7 +90,12 @@
|
|||
comment="OCRA machine character recognition used in script editor compile errors">
|
||||
<file>ocra.ttf</file>
|
||||
</font>
|
||||
|
||||
|
||||
<font name="Cascadia"
|
||||
comment="Name of an optional Cascadia Code font used for the script editor">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="DejaVu"
|
||||
comment="Name of DejaVu font">
|
||||
<file>DroidSans.ttf</file>
|
||||
|
|
@ -172,6 +180,10 @@
|
|||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.0"
|
||||
/>
|
||||
<font_size name="Cascadia"
|
||||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.6"
|
||||
/>
|
||||
<font_size name="Huge"
|
||||
comment="Size of huge font (points, or 1/72 of an inch)"
|
||||
size="16.0"
|
||||
|
|
|
|||
|
|
@ -32,6 +32,9 @@
|
|||
<file>STIXGeneral.otf</file>
|
||||
<file>Thonburi.ttc</file>
|
||||
</os>
|
||||
<os name="Linux">
|
||||
<file>DejaVuSans.ttf</file>
|
||||
</os>
|
||||
</font>
|
||||
|
||||
<font name="SansSerifBold"
|
||||
|
|
@ -88,6 +91,11 @@
|
|||
<file>ocra.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="Cascadia"
|
||||
comment="Name of an optional Cascadia Code font used for the script editor">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="DejaVu"
|
||||
comment="Name of DejaVu font">
|
||||
<file>opendyslexic.ttf</file>
|
||||
|
|
@ -172,6 +180,10 @@
|
|||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.0"
|
||||
/>
|
||||
<font_size name="Cascadia"
|
||||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.6"
|
||||
/>
|
||||
<font_size name="Huge"
|
||||
comment="Size of huge font (points, or 1/72 of an inch)"
|
||||
size="16.0"
|
||||
|
|
|
|||
|
|
@ -32,6 +32,9 @@
|
|||
<file>STIXGeneral.otf</file>
|
||||
<file>Thonburi.ttc</file>
|
||||
</os>
|
||||
<os name="Linux">
|
||||
<file>DejaVuSans.ttf</file>
|
||||
</os>
|
||||
</font>
|
||||
|
||||
<font name="SansSerifBold"
|
||||
|
|
@ -88,6 +91,11 @@
|
|||
<file>ocra.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="Cascadia"
|
||||
comment="Name of an optional Cascadia Code font used for the script editor">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="DejaVu"
|
||||
comment="Name of DejaVu font">
|
||||
<file>DejaVuSans.ttf</file>
|
||||
|
|
@ -172,6 +180,10 @@
|
|||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="9.0"
|
||||
/>
|
||||
<font_size name="Cascadia"
|
||||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.6"
|
||||
/>
|
||||
<font_size name="Huge"
|
||||
comment="Size of huge font (points, or 1/72 of an inch)"
|
||||
size="16.0"
|
||||
|
|
|
|||
|
|
@ -32,6 +32,9 @@
|
|||
<file>STIXGeneral.otf</file>
|
||||
<file>Thonburi.ttc</file>
|
||||
</os>
|
||||
<os name="Linux">
|
||||
<file>DejaVuSans.ttf</file>
|
||||
</os>
|
||||
</font>
|
||||
|
||||
<font name="SansSerifBold"
|
||||
|
|
@ -88,6 +91,11 @@
|
|||
<file>ocra.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="Cascadia"
|
||||
comment="Name of an optional Cascadia Code font used for the script editor">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="DejaVu"
|
||||
comment="Name of DejaVu font">
|
||||
<file>MobiSans.ttf</file>
|
||||
|
|
@ -172,6 +180,10 @@
|
|||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.0"
|
||||
/>
|
||||
<font_size name="Cascadia"
|
||||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.6"
|
||||
/>
|
||||
<font_size name="Huge"
|
||||
comment="Size of huge font (points, or 1/72 of an inch)"
|
||||
size="16.0"
|
||||
|
|
|
|||
|
|
@ -32,6 +32,9 @@
|
|||
<file>STIXGeneral.otf</file>
|
||||
<file>Thonburi.ttc</file>
|
||||
</os>
|
||||
<os name="Linux">
|
||||
<file>DejaVuSans.ttf</file>
|
||||
</os>
|
||||
</font>
|
||||
|
||||
<font name="SansSerifBold"
|
||||
|
|
@ -88,6 +91,11 @@
|
|||
<file>ocra.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="Cascadia"
|
||||
comment="Name of an optional Cascadia Code font used for the script editor">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="DejaVu"
|
||||
comment="Name of DejaVu font">
|
||||
<file>NotoSansCombined-Regular.ttf</file>
|
||||
|
|
@ -172,6 +180,10 @@
|
|||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.0"
|
||||
/>
|
||||
<font_size name="Cascadia"
|
||||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.6"
|
||||
/>
|
||||
<font_size name="Huge"
|
||||
comment="Size of huge font (points, or 1/72 of an inch)"
|
||||
size="16.0"
|
||||
|
|
|
|||
|
|
@ -32,6 +32,9 @@
|
|||
<file>STIXGeneral.otf</file>
|
||||
<file>Thonburi.ttc</file>
|
||||
</os>
|
||||
<os name="Linux">
|
||||
<file>DejaVuSans.ttf</file>
|
||||
</os>
|
||||
</font>
|
||||
|
||||
<font name="SansSerifBold"
|
||||
|
|
@ -88,6 +91,11 @@
|
|||
<file>ocra.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="Cascadia"
|
||||
comment="Name of an optional Cascadia Code font used for the script editor">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="DejaVu"
|
||||
comment="Name of DejaVu font">
|
||||
<file>Roboto-Regular.ttf</file>
|
||||
|
|
@ -172,6 +180,10 @@
|
|||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.0"
|
||||
/>
|
||||
<font_size name="Cascadia"
|
||||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.6"
|
||||
/>
|
||||
<font_size name="Huge"
|
||||
comment="Size of huge font (points, or 1/72 of an inch)"
|
||||
size="16.0"
|
||||
|
|
|
|||
|
|
@ -32,6 +32,9 @@
|
|||
<file>STIXGeneral.otf</file>
|
||||
<file>Thonburi.ttc</file>
|
||||
</os>
|
||||
<os name="Linux">
|
||||
<file>DejaVuSans.ttf</file>
|
||||
</os>
|
||||
</font>
|
||||
|
||||
<font name="SansSerifBold"
|
||||
|
|
@ -88,6 +91,11 @@
|
|||
<file>ocra.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="Cascadia"
|
||||
comment="Name of an optional Cascadia Code font used for the script editor">
|
||||
<file>CascadiaCode-Light.ttf</file>
|
||||
</font>
|
||||
|
||||
<font name="DejaVu"
|
||||
comment="Name of DejaVu font">
|
||||
<file>DejaVuSans.ttf</file>
|
||||
|
|
@ -176,6 +184,10 @@
|
|||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.0"
|
||||
/>
|
||||
<font_size name="Cascadia"
|
||||
comment="Size for monospaced font (points, or 1/72 of an inch)"
|
||||
size="8.6"
|
||||
/>
|
||||
<font_size name="Huge"
|
||||
comment="Size of huge font (points, or 1/72 of an inch)"
|
||||
size="16.0"
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@
|
|||
#include "lllineeditor.h"
|
||||
#include "llspinctrl.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewerkeyboard.h"
|
||||
#include "llviewerinput.h"
|
||||
#include "llviewerstats.h"
|
||||
#include "llworld.h"
|
||||
#include "rlvactions.h"
|
||||
|
|
|
|||
|
|
@ -996,7 +996,10 @@ void FSPanelLogin::onClickNewAccount(void*)
|
|||
LLWeb::loadURLInternal(grid_info[GRID_REGISTER_NEW_ACCOUNT]);
|
||||
else
|
||||
#endif // OPENSIM
|
||||
LLWeb::loadURLExternal(LLTrans::getString("create_account_url"));
|
||||
// <FS:PP> Load Firestorm's registration page from within the viewer itself
|
||||
// LLWeb::loadURLExternal(LLTrans::getString("create_account_url"));
|
||||
LLWeb::loadURLInternal(LLTrans::getString("create_account_url"));
|
||||
// </FS:PP>
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -408,7 +408,7 @@ CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT.lnk" \
|
|||
|
||||
WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Create Account.url" \
|
||||
"InternetShortcut" "URL" \
|
||||
"https://join.secondlife.com/"
|
||||
"https://www.firestormviewer.org/join-secondlife/"
|
||||
WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Your Account.url" \
|
||||
"InternetShortcut" "URL" \
|
||||
"https://www.secondlife.com/account/"
|
||||
|
|
|
|||
|
|
@ -1048,6 +1048,13 @@ LGGContactSets::ContactSet* LGGContactSets::getContactSet(const std::string& set
|
|||
return NULL;
|
||||
}
|
||||
|
||||
bool LGGContactSets::checkCustomName(const LLUUID& id, bool& dn_removed, std::string& pseudonym)
|
||||
{
|
||||
dn_removed = hasDisplayNameRemoved(id);
|
||||
pseudonym = getPseudonym(id);
|
||||
return hasPseudonym(id);
|
||||
}
|
||||
|
||||
// static
|
||||
bool LGGContactSets::handleAddContactSetCallback(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -72,6 +72,8 @@ public:
|
|||
bool hasDisplayNameRemoved(const LLUUID& friend_id);
|
||||
bool hasDisplayNameRemoved(uuid_vec_t ids);
|
||||
|
||||
bool checkCustomName(const LLUUID& id, bool& dn_removed, std::string& pseudonym);
|
||||
|
||||
string_vec_t getFriendSets(const LLUUID& friend_id);
|
||||
string_vec_t getAllContactSets();
|
||||
|
||||
|
|
|
|||
|
|
@ -3011,10 +3011,19 @@ void LLAgentCamera::setFocusOnAvatar(BOOL focus_on_avatar, BOOL animate, BOOL re
|
|||
LLVector3 at_axis;
|
||||
if (!isAgentAvatarValid() || !gAgentAvatarp->getParent())
|
||||
{
|
||||
at_axis = LLViewerCamera::getInstance()->getAtAxis();
|
||||
at_axis.mV[VZ] = 0.f;
|
||||
at_axis.normalize();
|
||||
gAgent.resetAxes(at_axis);
|
||||
// In case of front view rotate agent to look into direction opposite to camera
|
||||
// In case of rear view rotate agent into diraction same as camera, e t c
|
||||
LLVector3 vect = getCameraOffsetInitial();
|
||||
F32 rotxy = F32(atan2(vect.mV[VY], vect.mV[VX]));
|
||||
|
||||
LLCoordFrame frameCamera = *((LLCoordFrame*)LLViewerCamera::getInstance());
|
||||
// front view angle rotxy is zero, rear view rotxy angle is 180, compensate
|
||||
frameCamera.yaw((180 * DEG_TO_RAD) - rotxy);
|
||||
at_axis = frameCamera.getAtAxis();
|
||||
at_axis.mV[VZ] = 0.f;
|
||||
at_axis.normalize();
|
||||
gAgent.resetAxes(at_axis);
|
||||
gAgent.yaw(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3456,7 +3456,7 @@ void LLAppearanceMgr::updateIsDirty()
|
|||
{
|
||||
LLViewerInventoryItem *item = *i;
|
||||
|
||||
if (item->getName() == FSLSLBridge::instance().currentFullName())
|
||||
if (FSLSLBridge::instance().isBridgeValid() && item && item->getLinkedUUID() == FSLSLBridge::instance().getBridge()->getUUID())
|
||||
{
|
||||
cof_items.erase( i );
|
||||
break;
|
||||
|
|
@ -3688,6 +3688,19 @@ void update_base_outfit_after_ordering()
|
|||
}
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Exclude LSL bridge or the following size check will always fail!
|
||||
for (LLInventoryModel::item_array_t::iterator i = cof_item_array.begin(); i != cof_item_array.end(); ++i)
|
||||
{
|
||||
LLViewerInventoryItem *item = *i;
|
||||
|
||||
if (FSLSLBridge::instance().isBridgeValid() && item && item->getLinkedUUID() == FSLSLBridge::instance().getBridge()->getUUID())
|
||||
{
|
||||
cof_item_array.erase(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
if (outfit_item_array.size() != cof_item_array.size())
|
||||
{
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@
|
|||
#include "llwindow.h"
|
||||
#include "llviewerstats.h"
|
||||
#include "llviewerstatsrecorder.h"
|
||||
#include "llkeyconflict.h" // for legacy keybinding support, remove later
|
||||
#include "llmarketplacefunctions.h"
|
||||
#include "llmarketplacenotifications.h"
|
||||
#include "llmd5.h"
|
||||
|
|
@ -164,7 +165,7 @@
|
|||
#include "llapr.h"
|
||||
#include <boost/lexical_cast.hpp>
|
||||
|
||||
#include "llviewerkeyboard.h"
|
||||
#include "llviewerinput.h"
|
||||
#include "lllfsthread.h"
|
||||
#include "llworkerthread.h"
|
||||
#include "lltexturecache.h"
|
||||
|
|
@ -282,6 +283,8 @@
|
|||
#include "fsradar.h"
|
||||
#include "fsassetblacklist.h"
|
||||
|
||||
#include "fstelemetry.h" // <FS:Beq> Tracy profiler support
|
||||
|
||||
#if (LL_LINUX || LL_SOLARIS) && LL_GTK
|
||||
#include "glib.h"
|
||||
#endif // (LL_LINUX || LL_SOLARIS) && LL_GTK
|
||||
|
|
@ -1194,31 +1197,6 @@ bool LLAppViewer::init()
|
|||
gGLManager.getGLInfo(gDebugInfo);
|
||||
gGLManager.printGLInfoString();
|
||||
|
||||
// Load Default bindings
|
||||
// <FS:Ansariel> Optional AZERTY keyboard layout
|
||||
//std::string key_bindings_file = gDirUtilp->findFile("keys.xml",
|
||||
std::string keyBindingFileName("keys.xml");
|
||||
if (gSavedSettings.getBOOL("FSUseAzertyKeyboardLayout"))
|
||||
{
|
||||
keyBindingFileName = "keys_azerty.xml";
|
||||
}
|
||||
std::string key_bindings_file = gDirUtilp->findFile(keyBindingFileName,
|
||||
// </FS:Ansariel>
|
||||
gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, ""),
|
||||
gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
|
||||
|
||||
|
||||
if (!gViewerKeyboard.loadBindingsXML(key_bindings_file))
|
||||
{
|
||||
std::string key_bindings_file = gDirUtilp->findFile("keys.ini",
|
||||
gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, ""),
|
||||
gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
|
||||
if (!gViewerKeyboard.loadBindings(key_bindings_file))
|
||||
{
|
||||
LL_ERRS("InitInfo") << "Unable to open keys.ini" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
// If we don't have the right GL requirements, exit.
|
||||
if (!gGLManager.mHasRequirements)
|
||||
{
|
||||
|
|
@ -1517,6 +1495,9 @@ bool LLAppViewer::init()
|
|||
//onChangeFrameLimit(gSavedSettings.getLLSD("FramePerSecondLimit"));
|
||||
// </FS:Ansariel>
|
||||
|
||||
// Load User's bindings
|
||||
loadKeyBindings();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -1652,7 +1633,28 @@ bool LLAppViewer::doFrame()
|
|||
{
|
||||
LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop"));
|
||||
LLSD newFrame;
|
||||
|
||||
// <FS:Beq> telemetry enabling.
|
||||
// This ifdef is optional but better to avoid even low overhead code in main loop where not needed.
|
||||
#ifdef FS_HAS_TELEMETRY_SUPPORT
|
||||
static bool one_time{false};
|
||||
static LLCachedControl<bool> profiling_enabled_when_connected(gSavedSettings, "FSTelemetryEnableWhenConnected");
|
||||
if( !one_time && (gFrameCount % 10 == 0) )
|
||||
{
|
||||
if(!FSTelemetry::active && profiling_enabled_when_connected && FSTelemetryIsConnected)
|
||||
{
|
||||
FSTelemetry::active = true;
|
||||
gSavedSettings.setBOOL("FSTelemetryActive", TRUE); // keep the setting in sync.
|
||||
one_time=true; // prevent reset race if we disable manually.
|
||||
LL_INFOS() << "Profiler or collector connected" << LL_ENDL;
|
||||
}
|
||||
else if(!profiling_enabled_when_connected)
|
||||
{
|
||||
// no point in checking if we are not waiting.
|
||||
one_time = true;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
// </FS:Beq>
|
||||
// <FS:Ansariel> MaxFPS Viewer-Chui merge error
|
||||
LLTimer periodicRenderingTimer;
|
||||
BOOL restore_rendering_masks = FALSE;
|
||||
|
|
@ -1755,6 +1757,7 @@ bool LLAppViewer::doFrame()
|
|||
{
|
||||
joystick->scanJoystick();
|
||||
gKeyboard->scanKeyboard();
|
||||
gViewerInput.scanMouse();
|
||||
// <FS:Ansariel> Chalice Yao's crouch toggle
|
||||
static LLCachedControl<bool> fsCrouchToggle(gSavedPerAccountSettings, "FSCrouchToggle");
|
||||
static LLCachedControl<bool> fsCrouchToggleStatus(gSavedPerAccountSettings, "FSCrouchToggleStatus");
|
||||
|
|
@ -1953,7 +1956,7 @@ bool LLAppViewer::doFrame()
|
|||
|
||||
LL_INFOS() << "Exiting main_loop" << LL_ENDL;
|
||||
}
|
||||
|
||||
FSFrameMark; // <FS:Beq> Tracy support delineate Frame
|
||||
return ! LLApp::isRunning();
|
||||
}
|
||||
|
||||
|
|
@ -5088,6 +5091,134 @@ void LLAppViewer::addOnIdleCallback(const boost::function<void()>& cb)
|
|||
LLDeferredTaskList::instance().addTask(cb);
|
||||
}
|
||||
|
||||
void LLAppViewer::loadKeyBindings()
|
||||
{
|
||||
std::string key_bindings_file = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "key_bindings.xml");
|
||||
#if 1
|
||||
// Legacy support
|
||||
// Remove #if-#endif section half a year after DRTVWR-501 releases.
|
||||
// Mouse actions are part of keybinding file since DRTVWR-501 instead of being stored in
|
||||
// settings.xml. To support legacy viewers that were storing in settings.xml we need to
|
||||
// transfer old variables to new format.
|
||||
// Also part of backward compatibility is present in LLKeyConflictHandler to modify
|
||||
// legacy variables on changes in new system (to make sure we won't enforce
|
||||
// legacy values again if user dropped to defaults in new system)
|
||||
if (LLVersionInfo::getInstance()->getChannelAndVersion() != gLastRunVersion
|
||||
|| !gDirUtilp->fileExists(key_bindings_file)) // if file is missing, assume that there were no changes by user yet
|
||||
{
|
||||
// copy mouse actions and voice key changes to new file
|
||||
LL_INFOS("InitInfo") << "Converting legacy mouse bindings to new format" << LL_ENDL;
|
||||
// Load settings from file
|
||||
LLKeyConflictHandler third_person_view(LLKeyConflictHandler::MODE_THIRD_PERSON);
|
||||
LLKeyConflictHandler sitting_view(LLKeyConflictHandler::MODE_SITTING);
|
||||
|
||||
// Since we are only modifying keybindings if personal file doesn't exist yet,
|
||||
// it should be safe to just overwrite the value
|
||||
// If key is already in use somewhere by default, LLKeyConflictHandler should resolve it.
|
||||
BOOL value = gSavedSettings.getBOOL("DoubleClickAutoPilot");
|
||||
third_person_view.registerControl("walk_to",
|
||||
0,
|
||||
value ? EMouseClickType::CLICK_DOUBLELEFT : EMouseClickType::CLICK_NONE,
|
||||
KEY_NONE,
|
||||
MASK_NONE,
|
||||
value);
|
||||
|
||||
U32 index = value ? 1 : 0; // we can store multiple combinations per action, so if first is in use by doubleclick, go to second
|
||||
value = gSavedSettings.getBOOL("ClickToWalk");
|
||||
third_person_view.registerControl("walk_to",
|
||||
index,
|
||||
value ? EMouseClickType::CLICK_LEFT : EMouseClickType::CLICK_NONE,
|
||||
KEY_NONE,
|
||||
MASK_NONE,
|
||||
value);
|
||||
|
||||
value = gSavedSettings.getBOOL("DoubleClickTeleport");
|
||||
third_person_view.registerControl("teleport_to",
|
||||
0,
|
||||
value ? EMouseClickType::CLICK_DOUBLELEFT : EMouseClickType::CLICK_NONE,
|
||||
KEY_NONE,
|
||||
MASK_NONE,
|
||||
value);
|
||||
|
||||
// sitting also supports teleport
|
||||
sitting_view.registerControl("teleport_to",
|
||||
0,
|
||||
value ? EMouseClickType::CLICK_DOUBLELEFT : EMouseClickType::CLICK_NONE,
|
||||
KEY_NONE,
|
||||
MASK_NONE,
|
||||
value);
|
||||
|
||||
std::string key_string = gSavedSettings.getString("PushToTalkButton");
|
||||
EMouseClickType mouse = EMouseClickType::CLICK_NONE;
|
||||
KEY key = KEY_NONE;
|
||||
if (key_string == "MiddleMouse")
|
||||
{
|
||||
mouse = EMouseClickType::CLICK_MIDDLE;
|
||||
}
|
||||
else if (key_string == "MouseButton4")
|
||||
{
|
||||
mouse = EMouseClickType::CLICK_BUTTON4;
|
||||
}
|
||||
else if (key_string == "MouseButton5")
|
||||
{
|
||||
mouse = EMouseClickType::CLICK_BUTTON5;
|
||||
}
|
||||
else
|
||||
{
|
||||
LLKeyboard::keyFromString(key_string, &key);
|
||||
}
|
||||
|
||||
value = gSavedSettings.getBOOL("PushToTalkToggle");
|
||||
std::string control_name = value ? "toggle_voice" : "voice_follow_key";
|
||||
third_person_view.registerControl(control_name, 0, mouse, key, MASK_NONE, true);
|
||||
sitting_view.registerControl(control_name, 0, mouse, key, MASK_NONE, true);
|
||||
|
||||
if (third_person_view.hasUnsavedChanges())
|
||||
{
|
||||
// calls loadBindingsXML()
|
||||
third_person_view.saveToSettings();
|
||||
}
|
||||
|
||||
if (sitting_view.hasUnsavedChanges())
|
||||
{
|
||||
// calls loadBindingsXML()
|
||||
sitting_view.saveToSettings();
|
||||
}
|
||||
|
||||
// in case of voice we need to repeat this in other modes
|
||||
|
||||
for (U32 i = 0; i < LLKeyConflictHandler::MODE_COUNT - 1; ++i)
|
||||
{
|
||||
// edit and first person modes; MODE_SAVED_SETTINGS not in use at the moment
|
||||
if (i != LLKeyConflictHandler::MODE_THIRD_PERSON && i != LLKeyConflictHandler::MODE_SITTING)
|
||||
{
|
||||
LLKeyConflictHandler handler((LLKeyConflictHandler::ESourceMode)i);
|
||||
|
||||
handler.registerControl(control_name, 0, mouse, key, MASK_NONE, true);
|
||||
|
||||
if (handler.hasUnsavedChanges())
|
||||
{
|
||||
// calls loadBindingsXML()
|
||||
handler.saveToSettings();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// since something might have gone wrong or there might have been nothing to save
|
||||
// (and because otherwise following code will have to be encased in else{}),
|
||||
// load everything one last time
|
||||
#endif
|
||||
if (!gDirUtilp->fileExists(key_bindings_file) || !gViewerInput.loadBindingsXML(key_bindings_file))
|
||||
{
|
||||
// Failed to load custom bindings, try default ones
|
||||
key_bindings_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "key_bindings.xml");
|
||||
if (!gViewerInput.loadBindingsXML(key_bindings_file))
|
||||
{
|
||||
LL_ERRS("InitInfo") << "Unable to open default key bindings from " << key_bindings_file << LL_ENDL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLAppViewer::purgeCache()
|
||||
{
|
||||
LL_INFOS("AppCache") << "Purging Cache and Texture Cache..." << LL_ENDL;
|
||||
|
|
@ -6174,6 +6305,7 @@ void LLAppViewer::disconnectViewer()
|
|||
gInventory.getLibraryOwnerID());
|
||||
}
|
||||
|
||||
LLAvatarNameCache::instance().setCustomNameCheckCallback(LLAvatarNameCache::custom_name_check_callback_t()); // <FS:Ansariel> Contact sets
|
||||
saveNameCache();
|
||||
if (LLExperienceCache::instanceExists())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -208,6 +208,8 @@ public:
|
|||
void purgeCache(); // Clear the local cache.
|
||||
void purgeCacheImmediate(); //clear local cache immediately.
|
||||
S32 updateTextureThreads(F32 max_time);
|
||||
|
||||
void loadKeyBindings();
|
||||
|
||||
// mute/unmute the system's master audio
|
||||
virtual void setMasterSystemAudioMute(bool mute);
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@
|
|||
#include "llmimetypes.h"
|
||||
#include "llnotifications.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llsavedsettingsglue.h"
|
||||
// #include "llsavedsettingsglue.h" #<FS:Ansariel> Unused
|
||||
#include "llviewertexturelist.h"
|
||||
#include "llviewerparcelmgr.h"
|
||||
#include "llviewerregion.h"
|
||||
|
|
|
|||
|
|
@ -250,6 +250,21 @@ void activate_camera_tool()
|
|||
/*static*/ bool LLFloaterCamera::inFreeCameraMode()
|
||||
{
|
||||
LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance();
|
||||
|
||||
// <FS:Ansariel> Phototools camera
|
||||
if (!floater_camera)
|
||||
{
|
||||
floater_camera = LLFloaterCamera::findPhototoolsInstance();
|
||||
}
|
||||
// <FS:Ansariel>
|
||||
|
||||
// <FS:Ansariel> Optional small camera floater
|
||||
if (!floater_camera)
|
||||
{
|
||||
floater_camera = LLFloaterCamera::findSmallInstance();
|
||||
}
|
||||
// <FS:Ansariel>
|
||||
|
||||
if (floater_camera && floater_camera->mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA && gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK)
|
||||
{
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -52,6 +52,11 @@
|
|||
#include <dinput.h>
|
||||
#endif
|
||||
|
||||
// <FS:Zi> FIRE-14344 - show joystick buttons
|
||||
const std::string JOYSTICK_BUTTON_ON ( "\xE2\xAC\xA4" ); // U+2B24 BLACK LARGE CIRCLE
|
||||
const std::string JOYSTICK_BUTTON_OFF( "\xE2\x97\xAF" ); // U+25EF WHITE LARGE CIRCLE
|
||||
// </FS:Zi>
|
||||
|
||||
static LLTrace::SampleStatHandle<> sJoystickAxis0("Joystick axis 0"),
|
||||
sJoystickAxis1("Joystick axis 1"),
|
||||
sJoystickAxis2("Joystick axis 2"),
|
||||
|
|
@ -68,7 +73,6 @@ static LLTrace::SampleStatHandle<>* sJoystickAxes[6] =
|
|||
&sJoystickAxis5
|
||||
};
|
||||
|
||||
|
||||
#if LL_WINDOWS && !LL_MESA_HEADLESS
|
||||
|
||||
BOOL CALLBACK di8_list_devices_callback(LPCDIDEVICEINSTANCE device_instance_ptr, LPVOID pvRef)
|
||||
|
|
@ -113,10 +117,20 @@ void LLFloaterJoystick::draw()
|
|||
refreshListOfDevices();
|
||||
}
|
||||
|
||||
// <FS:Zi> FIRE-14344 - If we are on the login screen, this value will be 0.0f and we know we
|
||||
// have to update the joystick status by ourselves
|
||||
if (gFrameIntervalSeconds.value() == 0.0f)
|
||||
{
|
||||
joystick->updateStatus();
|
||||
}
|
||||
// </FS:Zi>
|
||||
|
||||
for (U32 i = 0; i < 6; i++)
|
||||
{
|
||||
F32 value = joystick->getJoystickAxis(i);
|
||||
sample(*sJoystickAxes[i], value * gFrameIntervalSeconds.value());
|
||||
// <FS:Zi> FIRE-14344 - using the frame interval seems to break the graphs
|
||||
// sample(*sJoystickAxes[i], value * gFrameIntervalSeconds.value());
|
||||
sample(*sJoystickAxes[i], value);
|
||||
if (mAxisStatsBar[i])
|
||||
{
|
||||
F32 minbar, maxbar;
|
||||
|
|
@ -129,6 +143,23 @@ void LLFloaterJoystick::draw()
|
|||
}
|
||||
}
|
||||
|
||||
// <FS:Zi> FIRE-14344 - show joystick buttons
|
||||
std::string buttons;
|
||||
for (U32 i = 0; i < 16; i++)
|
||||
{
|
||||
U32 value = joystick->getJoystickButton(i);
|
||||
if (value == 0)
|
||||
{
|
||||
buttons += JOYSTICK_BUTTON_OFF;
|
||||
}
|
||||
else
|
||||
{
|
||||
buttons += JOYSTICK_BUTTON_ON;
|
||||
}
|
||||
}
|
||||
mJoystickButtons->setText(buttons);
|
||||
// </FS:Zi>
|
||||
|
||||
LLFloater::draw();
|
||||
}
|
||||
|
||||
|
|
@ -137,7 +168,10 @@ BOOL LLFloaterJoystick::postBuild()
|
|||
center();
|
||||
// <FS:CR> Micro Save on calls to gSavedSettings
|
||||
//F32 range = gSavedSettings.getBOOL("Cursor3D") ? 128.f : 2.f;
|
||||
F32 range = m3DCursor ? 128.f : 2.f;
|
||||
// <FS:Zi> FIRE-14344 - use 1.f for the graph ranges instead of 128.f : 2.f to get better resolution -
|
||||
// needs testing with an actual absolute pointer device if the range scales in a useful way when
|
||||
// not starting at 128.f
|
||||
F32 range = 1.f;
|
||||
|
||||
for (U32 i = 0; i < 6; i++)
|
||||
{
|
||||
|
|
@ -160,6 +194,9 @@ BOOL LLFloaterJoystick::postBuild()
|
|||
childSetAction("cancel_btn", onClickCancel, this);
|
||||
childSetAction("ok_btn", onClickOK, this);
|
||||
|
||||
// <FS:Zi> FIRE-14344 - show joystick buttons
|
||||
mJoystickButtons = getChild<LLTextBase>("joystick_buttons");
|
||||
|
||||
refresh();
|
||||
refreshListOfDevices();
|
||||
return TRUE;
|
||||
|
|
@ -294,7 +331,9 @@ void LLFloaterJoystick::refreshListOfDevices()
|
|||
std::string desc = LLViewerJoystick::getInstance()->getDescription();
|
||||
if (!desc.empty())
|
||||
{
|
||||
LLSD value = LLSD::Integer(0);
|
||||
// <FS:Zi> FIRE-30846 - Select the first detected device, don't fall back to 0 which will select "None"
|
||||
// LLSD value = LLSD::Integer(0);
|
||||
LLSD value = LLSD::Integer(1);
|
||||
addDevice(desc, value);
|
||||
mHasDeviceList = true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -97,6 +97,9 @@ private:
|
|||
|
||||
// stats view
|
||||
LLStatBar* mAxisStatsBar[6];
|
||||
|
||||
// <FS:Zi> FIRE-14344 - show joystick buttons
|
||||
LLTextBase* mJoystickButtons;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -37,6 +37,8 @@
|
|||
#include "llavatarpropertiesprocessor.h"
|
||||
#include "llconversationlog.h"
|
||||
#include "llsearcheditor.h"
|
||||
#include "llsetkeybinddialog.h"
|
||||
#include "llkeyconflict.h"
|
||||
|
||||
#include "llaudioengine.h" // <FS:Ansariel> Output device selection
|
||||
|
||||
|
|
@ -45,13 +47,18 @@ class LLPanelPreference;
|
|||
class LLPanelLCD;
|
||||
class LLPanelDebug;
|
||||
class LLMessageSystem;
|
||||
class LLComboBox;
|
||||
class LLScrollListCtrl;
|
||||
class LLScrollListCell;
|
||||
class LLSliderCtrl;
|
||||
class LLSD;
|
||||
class LLTextBox;
|
||||
class LLComboBox;
|
||||
class LLLineEditor;
|
||||
|
||||
// <FS:Zi> FIRE-19539 - Include the alert messages in Prefs>Notifications>Alerts in preference Search.
|
||||
class LLFilterEditor;
|
||||
|
||||
namespace ll
|
||||
{
|
||||
namespace prefs
|
||||
|
|
@ -80,7 +87,9 @@ public:
|
|||
|
||||
void apply();
|
||||
void cancel();
|
||||
/*virtual*/ void draw();
|
||||
// <FS:Zi> FIRE-19539 - Include the alert messages in Prefs>Notifications>Alerts in preference Search.
|
||||
// /*virtual*/ void draw();
|
||||
// </FS:Zi>
|
||||
/*virtual*/ BOOL postBuild();
|
||||
/*virtual*/ void onOpen(const LLSD& key);
|
||||
/*virtual*/ void onClose(bool app_quitting);
|
||||
|
|
@ -108,6 +117,8 @@ public:
|
|||
void selectPrivacyPanel();
|
||||
void selectChatPanel();
|
||||
void getControlNames(std::vector<std::string>& names);
|
||||
// updates click/double-click action controls depending on values from settings.xml
|
||||
void updateClickActionViews();
|
||||
|
||||
// <FS:CR> Make onBtnOk() public for settings backup panel
|
||||
//protected:
|
||||
|
|
@ -146,10 +157,9 @@ protected:
|
|||
|
||||
// callback for commit in the "Single click on land" and "Double click on land" comboboxes.
|
||||
void onClickActionChange();
|
||||
// updates click/double-click action settings depending on controls values
|
||||
void updateClickActionSettings();
|
||||
// updates click/double-click action controls depending on values from settings.xml
|
||||
// updates click/double-click action keybindngs depending on view values
|
||||
void updateClickActionControls();
|
||||
|
||||
// <FS:PP> updates UI Sounds controls depending on values from settings.xml
|
||||
void updateUISoundsControls();
|
||||
|
||||
|
|
@ -166,7 +176,6 @@ protected:
|
|||
|
||||
// <FS:Zi> Group Notices and chiclets location setting conversion BOOL => S32
|
||||
void onShowGroupNoticesTopRightChanged();
|
||||
|
||||
// <FS:Ansariel> Dynamic texture memory calculation
|
||||
void handleDynamicTextureMemoryChanged();
|
||||
|
||||
|
|
@ -198,11 +207,6 @@ public:
|
|||
void onClickBrowseSettingsDir();
|
||||
void onClickSkin(LLUICtrl* ctrl,const LLSD& userdata);
|
||||
void onSelectSkin();
|
||||
void onClickSetKey();
|
||||
void onClickClearKey(); // <FS:Ansariel> FIRE-3803: Clear voice toggle button
|
||||
void setKey(KEY key);
|
||||
void setMouse(LLMouseHandler::EClickType click);
|
||||
void onClickSetMiddleMouse();
|
||||
// void onClickSetSounds(); //<FS:KC> Handled centrally now
|
||||
void onClickPreviewUISound(const LLSD& ui_sound_id); // <FS:PP> FIRE-8190: Preview function for "UI Sounds" Panel
|
||||
void setPreprocInclude();
|
||||
|
|
@ -211,8 +215,12 @@ public:
|
|||
void setExternalEditor();
|
||||
void changeExternalEditorPath(const std::vector<std::string>& filenames);
|
||||
// </FS:LO>
|
||||
void onClickEnablePopup();
|
||||
void onClickDisablePopup();
|
||||
// <FS:Zi> FIRE-19539 - Include the alert messages in Prefs>Notifications>Alerts in preference Search.
|
||||
// void onClickEnablePopup();
|
||||
// void onClickDisablePopup();
|
||||
void onSelectPopup();
|
||||
void onUpdatePopupFilter();
|
||||
// </FS:Zi>
|
||||
void resetAllIgnored();
|
||||
void setAllIgnored();
|
||||
void onClickLogPath();
|
||||
|
|
@ -271,7 +279,12 @@ public:
|
|||
void applyUIColor(LLUICtrl* ctrl, const LLSD& param);
|
||||
void getUIColor(LLUICtrl* ctrl, const LLSD& param);
|
||||
void onLogChatHistorySaved();
|
||||
void buildPopupLists();
|
||||
|
||||
// <FS:Zi> FIRE-19539 - Include the alert messages in Prefs>Notifications>Alerts in preference Search.
|
||||
// void buildPopupLists();
|
||||
void buildPopupList();
|
||||
// </FS:Zi>
|
||||
|
||||
static void refreshSkin(void* data);
|
||||
void selectPanel(const LLSD& name);
|
||||
// <FS:Ansariel> Build fix
|
||||
|
|
@ -289,7 +302,6 @@ private:
|
|||
|
||||
static std::string sSkin;
|
||||
notifications_map mNotificationOptions;
|
||||
bool mClickActionDirty; ///< Set to true when the click/double-click options get changed by user.
|
||||
bool mGotPersonalInfo;
|
||||
bool mOriginalIMViaEmail;
|
||||
bool mLanguageChanged;
|
||||
|
|
@ -308,6 +320,11 @@ private:
|
|||
|
||||
void onUpdateFilterTerm( bool force = false );
|
||||
void collectSearchableItems();
|
||||
|
||||
// <FS:Zi> FIRE-19539 - Include the alert messages in Prefs>Notifications>Alerts in preference Search.
|
||||
LLScrollListCtrl* mPopupList;
|
||||
LLFilterEditor* mPopupFilter;
|
||||
// </FS.Zi>
|
||||
};
|
||||
|
||||
class LLPanelPreference : public LLPanel
|
||||
|
|
@ -399,6 +416,60 @@ private:
|
|||
LOG_CLASS(LLPanelPreferenceGraphics);
|
||||
};
|
||||
|
||||
class LLPanelPreferenceControls : public LLPanelPreference, public LLKeyBindResponderInterface
|
||||
{
|
||||
LOG_CLASS(LLPanelPreferenceControls);
|
||||
public:
|
||||
LLPanelPreferenceControls();
|
||||
virtual ~LLPanelPreferenceControls();
|
||||
|
||||
BOOL postBuild();
|
||||
|
||||
void apply();
|
||||
void cancel();
|
||||
void saveSettings();
|
||||
void resetDirtyChilds();
|
||||
|
||||
void onListCommit();
|
||||
void onModeCommit();
|
||||
void onRestoreDefaultsBtn();
|
||||
void onRestoreDefaultsResponse(const LLSD& notification, const LLSD& response);
|
||||
|
||||
// Bypass to let Move & view read values without need to create own key binding handler
|
||||
// Todo: consider a better way to share access to keybindings
|
||||
bool canKeyBindHandle(const std::string &control, EMouseClickType click, KEY key, MASK mask);
|
||||
// Bypasses to let Move & view modify values without need to create own key binding handler
|
||||
void setKeyBind(const std::string &control, EMouseClickType click, KEY key, MASK mask, bool set /*set or reset*/ );
|
||||
void updateAndApply();
|
||||
|
||||
// from interface
|
||||
/*virtual*/ bool onSetKeyBind(EMouseClickType click, KEY key, MASK mask, bool all_modes);
|
||||
/*virtual*/ void onDefaultKeyBind(bool all_modes);
|
||||
/*virtual*/ void onCancelKeyBind();
|
||||
|
||||
private:
|
||||
// reloads settings, discards current changes, updates table
|
||||
void regenerateControls();
|
||||
|
||||
// These fuctions do not clean previous content
|
||||
bool addControlTableColumns(const std::string &filename);
|
||||
bool addControlTableRows(const std::string &filename);
|
||||
void addControlTableSeparator();
|
||||
|
||||
// Cleans content and then adds content from xml files according to current mEditingMode
|
||||
void populateControlTable();
|
||||
|
||||
// Updates keybindings from storage to table
|
||||
void updateTable();
|
||||
|
||||
LLScrollListCtrl* pControlsTable;
|
||||
LLComboBox *pKeyModeBox;
|
||||
LLKeyConflictHandler mConflictHandler[LLKeyConflictHandler::MODE_COUNT];
|
||||
std::string mEditingControl;
|
||||
S32 mEditingColumn;
|
||||
S32 mEditingMode;
|
||||
};
|
||||
|
||||
class LLFloaterPreferenceGraphicsAdvanced : public LLFloater
|
||||
{
|
||||
public:
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,175 @@
|
|||
/**
|
||||
* @file llkeyconflict.h
|
||||
* @brief
|
||||
*
|
||||
* $LicenseInfo:firstyear=2019&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2019, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifndef LL_LLKEYCONFLICT_H
|
||||
#define LL_LLKEYCONFLICT_H
|
||||
|
||||
#include "llkeybind.h"
|
||||
#include "llviewerinput.h"
|
||||
|
||||
|
||||
class LLKeyConflict
|
||||
{
|
||||
public:
|
||||
LLKeyConflict() : mAssignable(true), mConflictMask(U32_MAX) {} //temporary assignable, don't forget to change once all keys are recorded
|
||||
LLKeyConflict(bool assignable, U32 conflict_mask)
|
||||
: mAssignable(assignable), mConflictMask(conflict_mask) {}
|
||||
LLKeyConflict(const LLKeyBind &bind, bool assignable, U32 conflict_mask)
|
||||
: mAssignable(assignable), mConflictMask(conflict_mask), mKeyBind(bind) {}
|
||||
|
||||
LLKeyData getPrimaryKeyData() { return mKeyBind.getKeyData(0); }
|
||||
LLKeyData getKeyData(U32 index) { return mKeyBind.getKeyData(index); }
|
||||
void setPrimaryKeyData(const LLKeyData& data) { mKeyBind.replaceKeyData(data, 0); }
|
||||
void setKeyData(const LLKeyData& data, U32 index) { mKeyBind.replaceKeyData(data, index); }
|
||||
bool canHandle(EMouseClickType mouse, KEY key, MASK mask) { return mKeyBind.canHandle(mouse, key, mask); }
|
||||
|
||||
LLKeyBind mKeyBind;
|
||||
bool mAssignable; // whether user can change key or key simply acts as placeholder
|
||||
U32 mConflictMask;
|
||||
};
|
||||
|
||||
class LLKeyConflictHandler
|
||||
{
|
||||
public:
|
||||
|
||||
enum ESourceMode // partially repeats e_keyboard_mode
|
||||
{
|
||||
MODE_FIRST_PERSON,
|
||||
MODE_THIRD_PERSON,
|
||||
MODE_EDIT_AVATAR,
|
||||
MODE_SITTING,
|
||||
MODE_SAVED_SETTINGS, // for settings from saved settings
|
||||
MODE_COUNT
|
||||
};
|
||||
|
||||
const U32 CONFLICT_NOTHING = 0;
|
||||
// at the moment this just means that key will conflict with everything that is identical
|
||||
const U32 CONFLICT_ANY = U32_MAX;
|
||||
|
||||
// Note: missed selection and edition commands (would be really nice to go through selection via MB4/5 or wheel)
|
||||
|
||||
LLKeyConflictHandler();
|
||||
LLKeyConflictHandler(ESourceMode mode);
|
||||
~LLKeyConflictHandler();
|
||||
|
||||
bool canHandleControl(const std::string &control_name, EMouseClickType mouse_ind, KEY key, MASK mask);
|
||||
bool canHandleKey(const std::string &control_name, KEY key, MASK mask);
|
||||
bool canHandleMouse(const std::string &control_name, EMouseClickType mouse_ind, MASK mask);
|
||||
bool canHandleMouse(const std::string &control_name, S32 mouse_ind, MASK mask); //Just for convinience
|
||||
bool canAssignControl(const std::string &control_name);
|
||||
static bool isReservedByMenu(const KEY &key, const MASK &mask);
|
||||
static bool isReservedByMenu(const LLKeyData &data);
|
||||
|
||||
// @control_name - see REGISTER_KEYBOARD_ACTION in llviewerinput for avaliable options,
|
||||
// usually this is just name of the function
|
||||
// @data_index - single control (function) can have multiple key combinations trigering
|
||||
// it, this index indicates combination function will change/add; Note that preferences
|
||||
// floater can only display up to 3 options, but data_index can be bigger than that
|
||||
// @mouse_ind - mouse action (middle click, MB5 etc)
|
||||
// @key - keyboard key action
|
||||
// @mask - shift/ctrl/alt flags
|
||||
// @ignore_mask - Either to expect exact match (ctrl+K will not trigger if ctrl+shift+K
|
||||
// is active) or ignore not expected masks as long as expected mask is present
|
||||
// (ctrl+K will be triggered if ctrl+shift+K is active)
|
||||
bool registerControl(const std::string &control_name, U32 data_index, EMouseClickType mouse_ind, KEY key, MASK mask, bool ignore_mask); //todo: return conflicts?
|
||||
bool clearControl(const std::string &control_name, U32 data_index);
|
||||
|
||||
LLKeyData getControl(const std::string &control_name, U32 data_index);
|
||||
bool isControlEmpty(const std::string &control_name);
|
||||
|
||||
// localized string
|
||||
static std::string getStringFromKeyData(const LLKeyData& keydata);
|
||||
std::string getControlString(const std::string &control_name, U32 data_index);
|
||||
|
||||
// Load single control, overrides existing one if names match
|
||||
void loadFromControlSettings(const std::string &name);
|
||||
// Drops any changes loads controls with ones from 'saved settings' or from xml
|
||||
void loadFromSettings(ESourceMode load_mode);
|
||||
|
||||
// Saves settings to 'saved settings' or to xml
|
||||
// If 'temporary' is set, function will save settings to temporary
|
||||
// file and reload input bindings from temporary file.
|
||||
// 'temporary' does not support gSavedSettings, those are handled
|
||||
// by preferences, so 'temporary' is such case will simply not
|
||||
// reset mHasUnsavedChanges
|
||||
//
|
||||
// 'temporary' exists to support ability of live-editing settings in
|
||||
// preferences: temporary for testing changes 'live' without saving them,
|
||||
// then hitting ok/cancel and save/discard values permanently.
|
||||
void saveToSettings(bool apply_temporary = false);
|
||||
|
||||
LLKeyData getDefaultControl(const std::string &control_name, U32 data_index);
|
||||
// Resets keybinding to default variant from 'saved settings' or xml
|
||||
void resetToDefault(const std::string &control_name, U32 index);
|
||||
void resetToDefault(const std::string &control_name);
|
||||
// resets current mode to defaults
|
||||
void resetToDefaults();
|
||||
|
||||
bool empty() { return mControlsMap.empty(); }
|
||||
void clear();
|
||||
|
||||
// reloads bindings from last valid user's xml or from default xml
|
||||
// to keyboard's handler
|
||||
static void resetKeyboardBindings();
|
||||
|
||||
bool hasUnsavedChanges() { return mHasUnsavedChanges; }
|
||||
void setLoadMode(ESourceMode mode) { mLoadMode = mode; }
|
||||
ESourceMode getLoadMode() { return mLoadMode; }
|
||||
|
||||
private:
|
||||
void resetToDefaultAndResolve(const std::string &control_name, bool ignore_conflicts);
|
||||
void resetToDefaults(ESourceMode mode);
|
||||
|
||||
// at the moment these kind of control is not savable, but takes part in conflict resolution
|
||||
void registerTemporaryControl(const std::string &control_name, EMouseClickType mouse_ind, KEY key, MASK mask, U32 conflict_mask);
|
||||
void registerTemporaryControl(const std::string &control_name, U32 conflict_mask = 0);
|
||||
|
||||
typedef std::map<std::string, LLKeyConflict> control_map_t;
|
||||
void loadFromSettings(const LLViewerInput::KeyMode& keymode, control_map_t *destination);
|
||||
bool loadFromSettings(const ESourceMode &load_mode, const std::string &filename, control_map_t *destination);
|
||||
void generatePlaceholders(ESourceMode load_mode); //E.x. non-assignable values
|
||||
// returns false in case user is trying to reuse control that can't be reassigned
|
||||
bool removeConflicts(const LLKeyData &data, const U32 &conlict_mask);
|
||||
|
||||
// removes flags and removes temporary file, returns 'true' if file was removed
|
||||
bool clearUnsavedChanges();
|
||||
// return true if there was a file to remove
|
||||
static bool clearTemporaryFile();
|
||||
|
||||
control_map_t mControlsMap;
|
||||
control_map_t mDefaultsMap;
|
||||
bool mHasUnsavedChanges;
|
||||
ESourceMode mLoadMode;
|
||||
|
||||
// To implement 'apply immediately'+revert on cancel, class applies changes to temporary file
|
||||
// but this only works for settings from keybndings files (key_bindings.xml)
|
||||
// saved setting rely onto external mechanism of preferences floater
|
||||
bool mUsesTemporaryFile;
|
||||
static S32 sTemporaryFileUseCount;
|
||||
};
|
||||
|
||||
|
||||
#endif // LL_LLKEYCONFLICT_H
|
||||
|
|
@ -373,11 +373,11 @@ BOOL LLPreviewGesture::postBuild()
|
|||
mReplaceEditor = edit;
|
||||
|
||||
combo = getChild<LLComboBox>( "modifier_combo");
|
||||
combo->setCommitCallback(onCommitSetDirty, this);
|
||||
combo->setCommitCallback(boost::bind(&LLPreviewGesture::onCommitKeyorModifier, this));
|
||||
mModifierCombo = combo;
|
||||
|
||||
combo = getChild<LLComboBox>( "key_combo");
|
||||
combo->setCommitCallback(onCommitSetDirty, this);
|
||||
combo->setCommitCallback(boost::bind(&LLPreviewGesture::onCommitKeyorModifier, this));
|
||||
mKeyCombo = combo;
|
||||
|
||||
list = getChild<LLScrollListCtrl>("library_list");
|
||||
|
|
@ -944,12 +944,18 @@ void LLPreviewGesture::loadUIFromGesture(LLMultiGesture* gesture)
|
|||
break;
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Allow CTRL-F10 shortcut for gestures
|
||||
//mModifierCombo->setEnabledByValue(CTRL_LABEL, gesture->mKey != KEY_F10);
|
||||
|
||||
mKeyCombo->setCurrentByIndex(0);
|
||||
if (gesture->mKey != KEY_NONE)
|
||||
{
|
||||
mKeyCombo->setSimple(LLKeyboard::stringFromKey(gesture->mKey));
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Allow CTRL-F10 shortcut for gestures
|
||||
//mKeyCombo->setEnabledByValue(LLKeyboard::stringFromKey(KEY_F10), gesture->mMask != MASK_CONTROL);
|
||||
|
||||
// Make UI steps for each gesture step
|
||||
S32 i;
|
||||
S32 count = gesture->mSteps.size();
|
||||
|
|
@ -1344,6 +1350,19 @@ LLMultiGesture* LLPreviewGesture::createGesture()
|
|||
}
|
||||
|
||||
|
||||
void LLPreviewGesture::onCommitKeyorModifier()
|
||||
{
|
||||
// SL-14139: ctrl-F10 is currently used to access top menu,
|
||||
// so don't allow to bound gestures to this combination.
|
||||
|
||||
// <FS:Ansariel> Allow CTRL-F10 shortcut for gestures
|
||||
//mKeyCombo->setEnabledByValue(LLKeyboard::stringFromKey(KEY_F10), mModifierCombo->getSimple() != CTRL_LABEL);
|
||||
//mModifierCombo->setEnabledByValue(CTRL_LABEL, mKeyCombo->getSimple() != LLKeyboard::stringFromKey(KEY_F10));
|
||||
// </FS:Ansariel>
|
||||
mDirty = TRUE;
|
||||
refresh();
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPreviewGesture::updateLabel(LLScrollListItem* item)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -101,6 +101,8 @@ protected:
|
|||
LLScrollListItem* addStep(const enum EStepType step_type);
|
||||
|
||||
void onVisibilityChanged ( const LLSD& new_visibility );
|
||||
|
||||
void onCommitKeyorModifier();
|
||||
|
||||
static std::string getLabel(std::vector<std::string> labels);
|
||||
static void updateLabel(LLScrollListItem* item);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,380 @@
|
|||
/**
|
||||
* @file llsetkeybinddialog.cpp
|
||||
* @brief LLSetKeyBindDialog class implementation.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2019&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2019, 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 "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llsetkeybinddialog.h"
|
||||
|
||||
#include "llbutton.h"
|
||||
#include "llcheckboxctrl.h"
|
||||
#include "lleventtimer.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfocusmgr.h"
|
||||
#include "llkeyconflict.h"
|
||||
#include "llviewercontrol.h"
|
||||
|
||||
class LLSetKeyBindDialog::Updater : public LLEventTimer
|
||||
{
|
||||
public:
|
||||
|
||||
typedef boost::function<void(MASK)> callback_t;
|
||||
|
||||
Updater(callback_t cb, F32 period, MASK mask)
|
||||
:LLEventTimer(period),
|
||||
mMask(mask),
|
||||
mCallback(cb)
|
||||
{
|
||||
mEventTimer.start();
|
||||
}
|
||||
|
||||
virtual ~Updater(){}
|
||||
|
||||
protected:
|
||||
BOOL tick()
|
||||
{
|
||||
mCallback(mMask);
|
||||
// Deletes itseft after execution
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
private:
|
||||
MASK mMask;
|
||||
callback_t mCallback;
|
||||
};
|
||||
|
||||
bool LLSetKeyBindDialog::sRecordKeys = false;
|
||||
|
||||
LLSetKeyBindDialog::LLSetKeyBindDialog(const LLSD& key)
|
||||
: LLModalDialog(key),
|
||||
pParent(NULL),
|
||||
mKeyFilterMask(DEFAULT_KEY_FILTER),
|
||||
pUpdater(NULL),
|
||||
mLastMaskKey(0),
|
||||
mContextConeOpacity(0.f),
|
||||
mContextConeInAlpha(0.f),
|
||||
mContextConeOutAlpha(0.f),
|
||||
mContextConeFadeTime(0.f)
|
||||
{
|
||||
mContextConeInAlpha = gSavedSettings.getF32("ContextConeInAlpha");
|
||||
mContextConeOutAlpha = gSavedSettings.getF32("ContextConeOutAlpha");
|
||||
mContextConeFadeTime = gSavedSettings.getF32("ContextConeFadeTime");
|
||||
}
|
||||
|
||||
LLSetKeyBindDialog::~LLSetKeyBindDialog()
|
||||
{
|
||||
}
|
||||
|
||||
//virtual
|
||||
BOOL LLSetKeyBindDialog::postBuild()
|
||||
{
|
||||
childSetAction("SetEmpty", onBlank, this);
|
||||
childSetAction("Default", onDefault, this);
|
||||
childSetAction("Cancel", onCancel, this);
|
||||
getChild<LLUICtrl>("Cancel")->setFocus(TRUE);
|
||||
|
||||
pCheckBox = getChild<LLCheckBoxCtrl>("apply_all");
|
||||
pDesription = getChild<LLTextBase>("descritption");
|
||||
|
||||
gFocusMgr.setKeystrokesOnly(TRUE);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//virtual
|
||||
void LLSetKeyBindDialog::onOpen(const LLSD& data)
|
||||
{
|
||||
sRecordKeys = true;
|
||||
LLModalDialog::onOpen(data);
|
||||
}
|
||||
|
||||
//virtual
|
||||
void LLSetKeyBindDialog::onClose(bool app_quiting)
|
||||
{
|
||||
sRecordKeys = false;
|
||||
if (pParent)
|
||||
{
|
||||
pParent->onCancelKeyBind();
|
||||
pParent = NULL;
|
||||
}
|
||||
if (pUpdater)
|
||||
{
|
||||
// Doubleclick timer has't fired, delete it
|
||||
delete pUpdater;
|
||||
pUpdater = NULL;
|
||||
}
|
||||
LLModalDialog::onClose(app_quiting);
|
||||
}
|
||||
|
||||
void LLSetKeyBindDialog::drawFrustum()
|
||||
{
|
||||
static LLCachedControl<F32> max_opacity(gSavedSettings, "PickerContextOpacity", 0.4f);
|
||||
drawConeToOwner(mContextConeOpacity, max_opacity, mFrustumOrigin.get(), mContextConeFadeTime, mContextConeInAlpha, mContextConeOutAlpha);
|
||||
}
|
||||
|
||||
//virtual
|
||||
void LLSetKeyBindDialog::draw()
|
||||
{
|
||||
drawFrustum();
|
||||
LLModalDialog::draw();
|
||||
}
|
||||
|
||||
void LLSetKeyBindDialog::setParent(LLKeyBindResponderInterface* parent, LLView* frustum_origin, U32 key_mask)
|
||||
{
|
||||
pParent = parent;
|
||||
mFrustumOrigin = frustum_origin->getHandle();
|
||||
mKeyFilterMask = key_mask;
|
||||
|
||||
std::string input;
|
||||
if ((key_mask & ALLOW_MOUSE) != 0)
|
||||
{
|
||||
input = getString("mouse");
|
||||
}
|
||||
if ((key_mask & ALLOW_KEYS) != 0)
|
||||
{
|
||||
if (!input.empty())
|
||||
{
|
||||
input += ", ";
|
||||
}
|
||||
input += getString("keyboard");
|
||||
}
|
||||
pDesription->setText(getString("basic_description"));
|
||||
pDesription->setTextArg("[INPUT]", input);
|
||||
}
|
||||
|
||||
// static
|
||||
bool LLSetKeyBindDialog::recordKey(KEY key, MASK mask, BOOL down)
|
||||
{
|
||||
if (sRecordKeys)
|
||||
{
|
||||
LLSetKeyBindDialog* dialog = LLFloaterReg::getTypedInstance<LLSetKeyBindDialog>("keybind_dialog", LLSD());
|
||||
if (dialog && dialog->getVisible())
|
||||
{
|
||||
return dialog->recordAndHandleKey(key, mask, down);
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "Key recording was set despite no open dialog" << LL_ENDL;
|
||||
sRecordKeys = false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool LLSetKeyBindDialog::recordAndHandleKey(KEY key, MASK mask, BOOL down)
|
||||
{
|
||||
if ((key == 'Q' && mask == MASK_CONTROL)
|
||||
|| key == KEY_ESCAPE)
|
||||
{
|
||||
sRecordKeys = false;
|
||||
closeFloater();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (key == KEY_DELETE)
|
||||
{
|
||||
setKeyBind(CLICK_NONE, KEY_NONE, MASK_NONE, false);
|
||||
sRecordKeys = false;
|
||||
closeFloater();
|
||||
return false;
|
||||
}
|
||||
|
||||
// forbidden keys
|
||||
if (key == KEY_NONE
|
||||
|| key == KEY_RETURN
|
||||
|| key == KEY_BACKSPACE)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (key == KEY_CONTROL || key == KEY_SHIFT || key == KEY_ALT)
|
||||
{
|
||||
// Mask keys get special treatment
|
||||
if ((mKeyFilterMask & ALLOW_MASKS) == 0)
|
||||
{
|
||||
// Masks by themself are not allowed
|
||||
return false;
|
||||
}
|
||||
if (down == TRUE)
|
||||
{
|
||||
// Most keys are handled on 'down' event because menu is handled on 'down'
|
||||
// masks are exceptions to let other keys be handled
|
||||
mLastMaskKey = key;
|
||||
return false;
|
||||
}
|
||||
if (mLastMaskKey != key)
|
||||
{
|
||||
// This was mask+key combination that got rejected, don't handle mask's key
|
||||
// Or user did something like: press shift, press ctrl, release shift
|
||||
return false;
|
||||
}
|
||||
// Mask up event often generates things like 'shift key + shift mask', filter it out.
|
||||
if (key == KEY_CONTROL)
|
||||
{
|
||||
mask &= ~MASK_CONTROL;
|
||||
}
|
||||
if (key == KEY_SHIFT)
|
||||
{
|
||||
mask &= ~MASK_SHIFT;
|
||||
}
|
||||
if (key == KEY_ALT)
|
||||
{
|
||||
mask &= ~MASK_ALT;
|
||||
}
|
||||
}
|
||||
if ((mKeyFilterMask & ALLOW_KEYS) == 0)
|
||||
{
|
||||
// basic keys not allowed
|
||||
return false;
|
||||
}
|
||||
else if ((mKeyFilterMask & ALLOW_MASK_KEYS) == 0 && mask != 0)
|
||||
{
|
||||
// masked keys not allowed
|
||||
return false;
|
||||
}
|
||||
|
||||
if (LLKeyConflictHandler::isReservedByMenu(key, mask))
|
||||
{
|
||||
pDesription->setText(getString("reserved_by_menu"));
|
||||
pDesription->setTextArg("[KEYSTR]", LLKeyboard::stringFromAccelerator(mask,key));
|
||||
mLastMaskKey = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
setKeyBind(CLICK_NONE, key, mask, pCheckBox->getValue().asBoolean());
|
||||
// Note/Todo: To warranty zero interference we should also consume
|
||||
// an 'up' event if we recorded on 'down', not just close floater
|
||||
// on first recorded combination.
|
||||
sRecordKeys = false;
|
||||
closeFloater();
|
||||
return true;
|
||||
}
|
||||
|
||||
BOOL LLSetKeyBindDialog::handleAnyMouseClick(S32 x, S32 y, MASK mask, EMouseClickType clicktype, BOOL down)
|
||||
{
|
||||
BOOL result = FALSE;
|
||||
if (!pParent)
|
||||
{
|
||||
// we already processed 'down' event, this is 'up', consume
|
||||
closeFloater();
|
||||
result = TRUE;
|
||||
}
|
||||
if (!result && clicktype == CLICK_LEFT)
|
||||
{
|
||||
// try handling buttons first
|
||||
if (down)
|
||||
{
|
||||
result = LLView::handleMouseDown(x, y, mask);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = LLView::handleMouseUp(x, y, mask);
|
||||
}
|
||||
if (result)
|
||||
{
|
||||
setFocus(TRUE);
|
||||
gFocusMgr.setKeystrokesOnly(TRUE);
|
||||
}
|
||||
// ignore selection related combinations
|
||||
else if (down && (mask & (MASK_SHIFT | MASK_CONTROL)) == 0)
|
||||
{
|
||||
// this can be a double click, wait a bit;
|
||||
if (!pUpdater)
|
||||
{
|
||||
// Note: default doubleclick time is 500ms, but can stretch up to 5s
|
||||
pUpdater = new Updater(boost::bind(&onClickTimeout, this, _1), 0.7f, mask);
|
||||
result = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!result
|
||||
&& (clicktype != CLICK_LEFT) // subcases were handled above
|
||||
&& ((mKeyFilterMask & ALLOW_MOUSE) != 0)
|
||||
&& (clicktype != CLICK_RIGHT || mask != 0) // reassigning menu button is not supported
|
||||
&& ((mKeyFilterMask & ALLOW_MASK_MOUSE) != 0 || mask == 0)) // reserved for selection
|
||||
{
|
||||
setKeyBind(clicktype, KEY_NONE, mask, pCheckBox->getValue().asBoolean());
|
||||
result = TRUE;
|
||||
if (!down)
|
||||
{
|
||||
// wait for 'up' event before closing
|
||||
// alternative: set pUpdater
|
||||
closeFloater();
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
//static
|
||||
void LLSetKeyBindDialog::onCancel(void* user_data)
|
||||
{
|
||||
LLSetKeyBindDialog* self = (LLSetKeyBindDialog*)user_data;
|
||||
self->closeFloater();
|
||||
}
|
||||
|
||||
//static
|
||||
void LLSetKeyBindDialog::onBlank(void* user_data)
|
||||
{
|
||||
LLSetKeyBindDialog* self = (LLSetKeyBindDialog*)user_data;
|
||||
// tmp needs 'no key' button
|
||||
self->setKeyBind(CLICK_NONE, KEY_NONE, MASK_NONE, false);
|
||||
self->closeFloater();
|
||||
}
|
||||
|
||||
//static
|
||||
void LLSetKeyBindDialog::onDefault(void* user_data)
|
||||
{
|
||||
LLSetKeyBindDialog* self = (LLSetKeyBindDialog*)user_data;
|
||||
if (self->pParent)
|
||||
{
|
||||
self->pParent->onDefaultKeyBind(self->pCheckBox->getValue().asBoolean());
|
||||
self->pParent = NULL;
|
||||
}
|
||||
self->closeFloater();
|
||||
}
|
||||
|
||||
//static
|
||||
void LLSetKeyBindDialog::onClickTimeout(void* user_data, MASK mask)
|
||||
{
|
||||
LLSetKeyBindDialog* self = (LLSetKeyBindDialog*)user_data;
|
||||
|
||||
// timer will delete itself after timeout
|
||||
self->pUpdater = NULL;
|
||||
|
||||
self->setKeyBind(CLICK_LEFT, KEY_NONE, mask, self->pCheckBox->getValue().asBoolean());
|
||||
self->closeFloater();
|
||||
}
|
||||
|
||||
void LLSetKeyBindDialog::setKeyBind(EMouseClickType click, KEY key, MASK mask, bool all_modes)
|
||||
{
|
||||
if (pParent)
|
||||
{
|
||||
pParent->onSetKeyBind(click, key, mask, all_modes);
|
||||
pParent = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,106 @@
|
|||
/**
|
||||
* @file llsetkeybinddialog.h
|
||||
* @brief LLSetKeyBindDialog class definition
|
||||
*
|
||||
* $LicenseInfo:firstyear=2019&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2019, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
#ifndef LL_LLSETKEYBINDDIALOG_H
|
||||
#define LL_LLSETKEYBINDDIALOG_H
|
||||
|
||||
#include "llmodaldialog.h"
|
||||
|
||||
class LLCheckBoxCtrl;
|
||||
class LLTextBase;
|
||||
|
||||
// Filters for LLSetKeyBindDialog
|
||||
static const U32 ALLOW_MOUSE = 1;
|
||||
static const U32 ALLOW_MASK_MOUSE = 2;
|
||||
static const U32 ALLOW_KEYS = 4; //keyboard
|
||||
static const U32 ALLOW_MASK_KEYS = 8;
|
||||
static const U32 ALLOW_MASKS = 16;
|
||||
static const U32 DEFAULT_KEY_FILTER = ALLOW_MOUSE | ALLOW_MASK_MOUSE | ALLOW_KEYS | ALLOW_MASKS | ALLOW_MASK_KEYS;
|
||||
|
||||
|
||||
class LLKeyBindResponderInterface
|
||||
{
|
||||
public:
|
||||
virtual ~LLKeyBindResponderInterface() {};
|
||||
|
||||
virtual void onCancelKeyBind() = 0;
|
||||
virtual void onDefaultKeyBind(bool all_modes) = 0;
|
||||
// returns true if parent failed to set key due to key being in use
|
||||
virtual bool onSetKeyBind(EMouseClickType click, KEY key, MASK mask, bool all_modes) = 0;
|
||||
};
|
||||
|
||||
class LLSetKeyBindDialog : public LLModalDialog
|
||||
{
|
||||
public:
|
||||
LLSetKeyBindDialog(const LLSD& key);
|
||||
~LLSetKeyBindDialog();
|
||||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
/*virtual*/ void onOpen(const LLSD& data);
|
||||
/*virtual*/ void onClose(bool app_quiting);
|
||||
/*virtual*/ void draw();
|
||||
|
||||
void setParent(LLKeyBindResponderInterface* parent, LLView* frustum_origin, U32 key_mask = DEFAULT_KEY_FILTER);
|
||||
|
||||
// Wrapper around recordAndHandleKey
|
||||
// It does not record, it handles, but handleKey function is already in use
|
||||
static bool recordKey(KEY key, MASK mask, BOOL down);
|
||||
|
||||
BOOL handleAnyMouseClick(S32 x, S32 y, MASK mask, EMouseClickType clicktype, BOOL down);
|
||||
static void onCancel(void* user_data);
|
||||
static void onBlank(void* user_data);
|
||||
static void onDefault(void* user_data);
|
||||
static void onClickTimeout(void* user_data, MASK mask);
|
||||
|
||||
class Updater;
|
||||
|
||||
private:
|
||||
bool recordAndHandleKey(KEY key, MASK mask, BOOL down);
|
||||
void setKeyBind(EMouseClickType click, KEY key, MASK mask, bool all_modes);
|
||||
LLKeyBindResponderInterface *pParent;
|
||||
LLCheckBoxCtrl *pCheckBox;
|
||||
LLTextBase *pDesription;
|
||||
|
||||
U32 mKeyFilterMask;
|
||||
Updater *pUpdater;
|
||||
KEY mLastMaskKey;
|
||||
|
||||
static bool sRecordKeys; // for convinience and not to check instance each time
|
||||
|
||||
// drawFrustum
|
||||
private:
|
||||
void drawFrustum();
|
||||
|
||||
LLHandle <LLView> mFrustumOrigin;
|
||||
F32 mContextConeOpacity;
|
||||
F32 mContextConeInAlpha;
|
||||
F32 mContextConeOutAlpha;
|
||||
F32 mContextConeFadeTime;
|
||||
};
|
||||
|
||||
|
||||
#endif // LL_LLSETKEYBINDDIALOG_H
|
||||
|
|
@ -372,7 +372,8 @@ void LLSkinningUtil::updateRiggingInfo(const LLMeshSkinInfo* skin, LLVOAvatar *a
|
|||
if (vol_face.mJointRiggingInfoTab.needsUpdate())
|
||||
{
|
||||
S32 num_verts = vol_face.mNumVertices;
|
||||
if (num_verts>0 && vol_face.mWeights && (skin->mJointNames.size()>0))
|
||||
S32 num_joints = skin->mJointNames.size();
|
||||
if (num_verts > 0 && vol_face.mWeights && num_joints > 0)
|
||||
{
|
||||
initJointNums(const_cast<LLMeshSkinInfo*>(skin), avatar);
|
||||
if (vol_face.mJointRiggingInfoTab.size()==0)
|
||||
|
|
@ -406,7 +407,7 @@ void LLSkinningUtil::updateRiggingInfo(const LLMeshSkinInfo* skin, LLVOAvatar *a
|
|||
for (U32 k=0; k<4; ++k)
|
||||
{
|
||||
S32 joint_index = idx[k];
|
||||
if (wght[k] > 0.0f)
|
||||
if (wght[k] > 0.0f && num_joints > joint_index)
|
||||
{
|
||||
S32 joint_num = skin->mJointNums[joint_index];
|
||||
if (joint_num >= 0 && joint_num < LL_CHARACTER_MAX_ANIMATED_JOINTS)
|
||||
|
|
@ -457,35 +458,6 @@ void LLSkinningUtil::updateRiggingInfo(const LLMeshSkinInfo* skin, LLVOAvatar *a
|
|||
}
|
||||
}
|
||||
|
||||
void LLSkinningUtil::updateRiggingInfo_(LLMeshSkinInfo* skin, LLVOAvatar *avatar, S32 num_verts, LLVector4a* weights, LLVector4a* positions, U8* joint_indices, LLJointRiggingInfoTab &rig_info_tab)
|
||||
{
|
||||
LL_RECORD_BLOCK_TIME(FTM_FACE_RIGGING_INFO);
|
||||
for (S32 i=0; i < num_verts; i++)
|
||||
{
|
||||
LLVector4a& pos = positions[i];
|
||||
LLVector4a& wght = weights[i];
|
||||
for (U32 k=0; k<4; ++k)
|
||||
{
|
||||
S32 joint_num = skin->mJointNums[joint_indices[k]];
|
||||
llassert(joint_num >= 0 && joint_num < LL_CHARACTER_MAX_ANIMATED_JOINTS);
|
||||
{
|
||||
rig_info_tab[joint_num].setIsRiggedTo(true);
|
||||
LLMatrix4a bind_shape;
|
||||
bind_shape.loadu(skin->mBindShapeMatrix);
|
||||
LLMatrix4a inv_bind;
|
||||
inv_bind.loadu(skin->mInvBindMatrix[joint_indices[k]]);
|
||||
LLMatrix4a mat;
|
||||
matMul(bind_shape, inv_bind, mat);
|
||||
LLVector4a pos_joint_space;
|
||||
mat.affineTransform(pos, pos_joint_space);
|
||||
pos_joint_space.mul(wght[k]);
|
||||
LLVector4a *extents = rig_info_tab[joint_num].getRiggedExtents();
|
||||
update_min_max(extents[0], extents[1], pos_joint_space);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This is used for extracting rotation from a bind shape matrix that
|
||||
// already has scales baked in
|
||||
LLQuaternion LLSkinningUtil::getUnscaledQuaternion(const LLMatrix4& mat4)
|
||||
|
|
|
|||
|
|
@ -70,7 +70,6 @@ namespace LLSkinningUtil
|
|||
|
||||
void initJointNums(LLMeshSkinInfo* skin, LLVOAvatar *avatar);
|
||||
void updateRiggingInfo(const LLMeshSkinInfo* skin, LLVOAvatar *avatar, LLVolumeFace& vol_face);
|
||||
void updateRiggingInfo_(LLMeshSkinInfo* skin, LLVOAvatar *avatar, S32 num_verts, LLVector4a* weights, LLVector4a* positions, U8* joint_indices, LLJointRiggingInfoTab &rig_info_tab);
|
||||
LLQuaternion getUnscaledQuaternion(const LLMatrix4& mat4);
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1011,8 +1011,8 @@ LLSpatialGroup *LLSpatialPartition::put(LLDrawable *drawablep, BOOL was_visible)
|
|||
}
|
||||
|
||||
LLSpatialGroup* group = drawablep->getSpatialGroup();
|
||||
// <FS:Beq/> avoid crash for race condition with unseating of an avatar
|
||||
// llassert(group != NULL);
|
||||
//llassert(group != NULL);
|
||||
|
||||
if (group && was_visible && group->isOcclusionState(LLSpatialGroup::QUERY_PENDING))
|
||||
{
|
||||
group->setOcclusionState(LLSpatialGroup::DISCARD_QUERY, LLSpatialGroup::STATE_MODE_ALL_CAMERAS);
|
||||
|
|
|
|||
|
|
@ -2086,7 +2086,10 @@ bool idle_startup()
|
|||
|
||||
// update the voice settings *after* gCacheName initialization
|
||||
// so that we can construct voice UI that relies on the name cache
|
||||
LLVoiceClient::getInstance()->updateSettings();
|
||||
if (LLVoiceClient::instanceExists())
|
||||
{
|
||||
LLVoiceClient::getInstance()->updateSettings();
|
||||
}
|
||||
display_startup();
|
||||
|
||||
// <FS:Ansariel> OpenSim support: Init with defaults - we get the OpenSimExtras later during login
|
||||
|
|
@ -2504,8 +2507,12 @@ bool idle_startup()
|
|||
LLAvatarTracker::instance().addBuddyList(list);
|
||||
display_startup();
|
||||
}
|
||||
|
||||
LGGContactSets::getInstance()->loadFromDisk(); // [FS:CR] Load contact sets
|
||||
|
||||
// <FS:Ansariel> Contact sets
|
||||
LGGContactSets* cs_instance = LGGContactSets::getInstance();
|
||||
cs_instance->loadFromDisk();
|
||||
LLAvatarNameCache::instance().setCustomNameCheckCallback(boost::bind(&LGGContactSets::checkCustomName, cs_instance, _1, _2, _3));
|
||||
// </FS:Ansariel>
|
||||
|
||||
bool show_hud = false;
|
||||
LLSD tutorial_setting = response["tutorial_setting"];
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ LLTool::~LLTool()
|
|||
}
|
||||
}
|
||||
|
||||
BOOL LLTool::handleAnyMouseClick(S32 x, S32 y, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down)
|
||||
BOOL LLTool::handleAnyMouseClick(S32 x, S32 y, MASK mask, EMouseClickType clicktype, BOOL down)
|
||||
{
|
||||
BOOL result = LLMouseHandler::handleAnyMouseClick(x, y, mask, clicktype, down);
|
||||
|
||||
|
|
@ -83,9 +83,9 @@ BOOL LLTool::handleMouseDown(S32 x, S32 y, MASK mask)
|
|||
LL_INFOS() << "LLTool left mouse down" << LL_ENDL;
|
||||
}
|
||||
// by default, didn't handle it
|
||||
// AGENT_CONTROL_LBUTTON_DOWN is handled by scanMouse() and scanKey()
|
||||
// LL_INFOS() << "LLTool::handleMouseDown" << LL_ENDL;
|
||||
gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_DOWN);
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL LLTool::handleMouseUp(S32 x, S32 y, MASK mask)
|
||||
|
|
@ -95,8 +95,8 @@ BOOL LLTool::handleMouseUp(S32 x, S32 y, MASK mask)
|
|||
LL_INFOS() << "LLTool left mouse up" << LL_ENDL;
|
||||
}
|
||||
// by default, didn't handle it
|
||||
// AGENT_CONTROL_LBUTTON_UP is handled by scanMouse() and scanKey()
|
||||
// LL_INFOS() << "LLTool::handleMouseUp" << LL_ENDL;
|
||||
gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_UP);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ public:
|
|||
virtual BOOL isView() const { return FALSE; }
|
||||
|
||||
// Virtual functions inherited from LLMouseHandler
|
||||
virtual BOOL handleAnyMouseClick(S32 x, S32 y, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down);
|
||||
virtual BOOL handleAnyMouseClick(S32 x, S32 y, MASK mask, EMouseClickType clicktype, BOOL down);
|
||||
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
|
||||
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
|
||||
virtual BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask);
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@
|
|||
#include "llagentcamera.h"
|
||||
#include "llbutton.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewerkeyboard.h"//<FS:JL> Mouse movement by Singularity
|
||||
#include "llviewerinput.h"//<FS:JL> Mouse movement by Singularity
|
||||
#include "lldrawable.h"
|
||||
#include "lltooltip.h"
|
||||
#include "llhudmanager.h"
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@
|
|||
#include "llviewerparcelmgr.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llviewerwindow.h"
|
||||
#include "llviewerinput.h"
|
||||
#include "llviewermedia.h"
|
||||
#include "llvoavatarself.h"
|
||||
#include "llviewermediafocus.h"
|
||||
|
|
@ -92,7 +93,6 @@ LLToolPie::LLToolPie()
|
|||
mMouseOutsideSlop( false ),
|
||||
mMouseSteerX(-1),
|
||||
mMouseSteerY(-1),
|
||||
mBlockClickToWalk(false),
|
||||
mClickAction(0),
|
||||
mClickActionBuyEnabled( gSavedSettings.getBOOL("ClickActionBuyEnabled") ),
|
||||
mClickActionPayEnabled( gSavedSettings.getBOOL("ClickActionPayEnabled") ),
|
||||
|
|
@ -100,7 +100,7 @@ LLToolPie::LLToolPie()
|
|||
{
|
||||
}
|
||||
|
||||
BOOL LLToolPie::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktype, BOOL down)
|
||||
BOOL LLToolPie::handleAnyMouseClick(S32 x, S32 y, MASK mask, EMouseClickType clicktype, BOOL down)
|
||||
{
|
||||
BOOL result = LLMouseHandler::handleAnyMouseClick(x, y, mask, clicktype, down);
|
||||
|
||||
|
|
@ -187,10 +187,8 @@ BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
|
|||
mPick.mKeyMask = mask;
|
||||
|
||||
mMouseButtonDown = true;
|
||||
|
||||
handleLeftClickPick();
|
||||
|
||||
return TRUE;
|
||||
return handleLeftClickPick();
|
||||
}
|
||||
|
||||
// Spawn context menus on right mouse down so you can drag over and select
|
||||
|
|
@ -442,8 +440,6 @@ BOOL LLToolPie::handleLeftClickPick()
|
|||
// put focus back "in world"
|
||||
if (gFocusMgr.getKeyboardFocus())
|
||||
{
|
||||
// don't click to walk on attempt to give focus to world
|
||||
mBlockClickToWalk = true;
|
||||
gFocusMgr.setKeyboardFocus(NULL);
|
||||
}
|
||||
|
||||
|
|
@ -499,10 +495,7 @@ BOOL LLToolPie::handleLeftClickPick()
|
|||
}
|
||||
object = (LLViewerObject*)object->getParent();
|
||||
}
|
||||
// <FS:Ansariel> FIRE-15189: Fix ClickToWalk not allowing mouse-walk (behavior change)
|
||||
//if (object && object == gAgentAvatarp && !gSavedSettings.getBOOL("ClickToWalk"))
|
||||
if (object && object == gAgentAvatarp)
|
||||
// </FS:Ansariel>
|
||||
{
|
||||
// we left clicked on avatar, switch to focus mode
|
||||
mMouseButtonDown = false;
|
||||
|
|
@ -520,7 +513,6 @@ BOOL LLToolPie::handleLeftClickPick()
|
|||
// LLFirstUse::useLeftClickNoHit();
|
||||
/////////
|
||||
|
||||
// Eat the event
|
||||
return LLTool::handleMouseDown(x, y, mask);
|
||||
}
|
||||
|
||||
|
|
@ -642,17 +634,140 @@ void LLToolPie::resetSelection()
|
|||
mClickAction = 0;
|
||||
}
|
||||
|
||||
void LLToolPie::walkToClickedLocation()
|
||||
bool LLToolPie::walkToClickedLocation()
|
||||
{
|
||||
if(mAutoPilotDestination) { mAutoPilotDestination->markDead(); }
|
||||
mAutoPilotDestination = (LLHUDEffectBlob *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BLOB, FALSE);
|
||||
mAutoPilotDestination->setPositionGlobal(mPick.mPosGlobal);
|
||||
mAutoPilotDestination->setPixelSize(5);
|
||||
mAutoPilotDestination->setColor(LLColor4U(170, 210, 190));
|
||||
mAutoPilotDestination->setDuration(3.f);
|
||||
if (gAgent.getFlying() // don't auto-navigate while flying until that works
|
||||
|| !gAgentAvatarp
|
||||
|| gAgentAvatarp->isSitting())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
LLVector3d pos = LLToolPie::getInstance()->getPick().mPosGlobal;
|
||||
gAgent.startAutoPilotGlobal(pos, std::string(), NULL, NULL, NULL, 0.f, 0.03f, FALSE);
|
||||
LLPickInfo saved_pick = mPick;
|
||||
if (gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK)
|
||||
{
|
||||
mPick = gViewerWindow->pickImmediate(mHoverPick.mMousePt.mX, mHoverPick.mMousePt.mY,
|
||||
FALSE /* ignore transparent */,
|
||||
FALSE /* ignore rigged */,
|
||||
FALSE /* ignore particles */);
|
||||
}
|
||||
else
|
||||
{
|
||||
// We do not handle hover in mouselook as we do in other modes, so
|
||||
// use croshair's position to do a pick
|
||||
mPick = gViewerWindow->pickImmediate(gViewerWindow->getWorldViewRectScaled().getWidth() / 2,
|
||||
gViewerWindow->getWorldViewRectScaled().getHeight() / 2,
|
||||
FALSE /* ignore transparent */,
|
||||
FALSE /* ignore rigged */,
|
||||
FALSE /* ignore particles */);
|
||||
}
|
||||
|
||||
if (mPick.mPickType == LLPickInfo::PICK_OBJECT)
|
||||
{
|
||||
if (mPick.getObject() && mPick.getObject()->isHUDAttachment())
|
||||
{
|
||||
mPick = saved_pick;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
LLViewerObject* avatar_object = mPick.getObject();
|
||||
|
||||
// get pointer to avatar
|
||||
while (avatar_object && !avatar_object->isAvatar())
|
||||
{
|
||||
avatar_object = (LLViewerObject*)avatar_object->getParent();
|
||||
}
|
||||
|
||||
if (avatar_object && ((LLVOAvatar*)avatar_object)->isSelf())
|
||||
{
|
||||
const F64 SELF_CLICK_WALK_DISTANCE = 3.0;
|
||||
// pretend we picked some point a bit in front of avatar
|
||||
mPick.mPosGlobal = gAgent.getPositionGlobal() + LLVector3d(LLViewerCamera::instance().getAtAxis()) * SELF_CLICK_WALK_DISTANCE;
|
||||
}
|
||||
|
||||
if ((mPick.mPickType == LLPickInfo::PICK_LAND && !mPick.mPosGlobal.isExactlyZero()) ||
|
||||
(mPick.mObjectID.notNull() && !mPick.mPosGlobal.isExactlyZero()))
|
||||
{
|
||||
// [RLVa:KB] - Checked: RLVa-2.0.0
|
||||
if (RlvActions::isRlvEnabled() && !RlvActions::canTeleportToLocal(mPick.mPosGlobal))
|
||||
{
|
||||
RlvUtil::notifyBlocked(RlvStringKeys::Blocked::AutoPilot);
|
||||
mPick = saved_pick;
|
||||
return false;
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
gAgentCamera.setFocusOnAvatar(TRUE, TRUE);
|
||||
|
||||
if (mAutoPilotDestination) { mAutoPilotDestination->markDead(); }
|
||||
mAutoPilotDestination = (LLHUDEffectBlob *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BLOB, FALSE);
|
||||
mAutoPilotDestination->setPositionGlobal(mPick.mPosGlobal);
|
||||
mAutoPilotDestination->setPixelSize(5);
|
||||
mAutoPilotDestination->setColor(LLColor4U(170, 210, 190));
|
||||
mAutoPilotDestination->setDuration(3.f);
|
||||
|
||||
LLVector3d pos = LLToolPie::getInstance()->getPick().mPosGlobal;
|
||||
gAgent.startAutoPilotGlobal(pos, std::string(), NULL, NULL, NULL, 0.f, 0.03f, FALSE);
|
||||
LLFirstUse::notMoving(false);
|
||||
showVisualContextMenuEffect();
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS() << "walk target was "
|
||||
<< (mPick.mPosGlobal.isExactlyZero() ? "zero" : "not zero")
|
||||
<< ", pick type was " << (mPick.mPickType == LLPickInfo::PICK_LAND ? "land" : "not land")
|
||||
<< ", pick object was " << mPick.mObjectID
|
||||
<< LL_ENDL;
|
||||
mPick = saved_pick;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool LLToolPie::teleportToClickedLocation()
|
||||
{
|
||||
if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK)
|
||||
{
|
||||
// We do not handle hover in mouselook as we do in other modes, so
|
||||
// use croshair's position to do a pick
|
||||
BOOL pick_rigged = false;
|
||||
mHoverPick = gViewerWindow->pickImmediate(gViewerWindow->getWorldViewRectScaled().getWidth() / 2,
|
||||
gViewerWindow->getWorldViewRectScaled().getHeight() / 2,
|
||||
FALSE,
|
||||
pick_rigged);
|
||||
}
|
||||
LLViewerObject* objp = mHoverPick.getObject();
|
||||
LLViewerObject* parentp = objp ? objp->getRootEdit() : NULL;
|
||||
|
||||
bool is_in_world = mHoverPick.mObjectID.notNull() && objp && !objp->isHUDAttachment();
|
||||
bool is_land = mHoverPick.mPickType == LLPickInfo::PICK_LAND;
|
||||
bool pos_non_zero = !mHoverPick.mPosGlobal.isExactlyZero();
|
||||
bool has_touch_handler = (objp && objp->flagHandleTouch()) || (parentp && parentp->flagHandleTouch());
|
||||
bool has_click_action = final_click_action(objp);
|
||||
|
||||
// <FS:Ansariel> FIRE-1765: Allow double-click walk/teleport to scripted objects
|
||||
//if (pos_non_zero && (is_land || (is_in_world && !has_touch_handler && !has_click_action)))
|
||||
bool allowDoubleClickOnScriptedObjects = gSavedSettings.getBOOL("FSAllowDoubleClickOnScriptedObjects");
|
||||
if (pos_non_zero && (is_land || (is_in_world && ((allowDoubleClickOnScriptedObjects && objp->getClickAction() != CLICK_ACTION_SIT) || (!has_touch_handler && !has_click_action)))))
|
||||
// </FS:Ansariel>
|
||||
{
|
||||
// [RLVa:KB] - Checked: RLVa-2.0.0
|
||||
if (RlvActions::isRlvEnabled() && !RlvActions::canTeleportToLocal(mPick.mPosGlobal))
|
||||
{
|
||||
RlvUtil::notifyBlocked(RlvStringKeys::Blocked::AutoPilot);
|
||||
return false;
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
LLVector3d pos = mHoverPick.mPosGlobal;
|
||||
pos.mdV[VZ] += gAgentAvatarp->getPelvisToFoot();
|
||||
gAgent.teleportViaLocationLookAt(pos);
|
||||
mPick = mHoverPick;
|
||||
showVisualContextMenuEffect();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// When we get object properties after left-clicking on an object
|
||||
|
|
@ -736,8 +851,9 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
|
|||
LL_DEBUGS("UserInput") << "hover handled by LLToolPie (inactive)" << LL_ENDL;
|
||||
}
|
||||
else if (!mMouseOutsideSlop
|
||||
&& mMouseButtonDown
|
||||
&& gSavedSettings.getBOOL("ClickToWalk"))
|
||||
&& mMouseButtonDown
|
||||
// disable camera steering if click on land is not used for moving
|
||||
&& gViewerInput.isMouseBindUsed(CLICK_LEFT))
|
||||
{
|
||||
S32 delta_x = x - mMouseDownX;
|
||||
S32 delta_y = y - mMouseDownY;
|
||||
|
|
@ -835,84 +951,10 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
|
|||
mDoubleClickTimer.reset();
|
||||
}
|
||||
LLViewerObject* obj = mPick.getObject();
|
||||
U8 click_action = final_click_action(obj);
|
||||
|
||||
// let media have first pass at click
|
||||
if (handleMediaMouseUp() || LLViewerMediaFocus::getInstance()->getFocus())
|
||||
{
|
||||
mBlockClickToWalk = true;
|
||||
}
|
||||
stopCameraSteering();
|
||||
mMouseButtonDown = false;
|
||||
|
||||
if (click_action == CLICK_ACTION_NONE // not doing 1-click action
|
||||
&& gSavedSettings.getBOOL("ClickToWalk") // click to walk enabled
|
||||
&& !gAgent.getFlying() // don't auto-navigate while flying until that works
|
||||
&& gAgentAvatarp
|
||||
&& !gAgentAvatarp->isSitting()
|
||||
&& !mBlockClickToWalk // another behavior hasn't cancelled click to walk
|
||||
)
|
||||
{
|
||||
// We may be doing click to walk, but we don't want to use a target on
|
||||
// a transparent object because the user thought they were clicking on
|
||||
// whatever they were seeing through it, so recompute what was clicked on
|
||||
// ignoring transparent objects
|
||||
LLPickInfo savedPick = mPick;
|
||||
mPick = gViewerWindow->pickImmediate(savedPick.mMousePt.mX, savedPick.mMousePt.mY,
|
||||
FALSE /* ignore transparent */,
|
||||
FALSE /* ignore rigged */,
|
||||
FALSE /* ignore particles */);
|
||||
|
||||
// if (!mPick.mPosGlobal.isExactlyZero() // valid coordinates for pick
|
||||
// && (mPick.mPickType == LLPickInfo::PICK_LAND // we clicked on land
|
||||
// || mPick.mObjectID.notNull())) // or on an object
|
||||
// [RLVa:KB] - Checked: RLVa-2.0.0
|
||||
bool fValidPick = (!mPick.mPosGlobal.isExactlyZero() // valid coordinates for pick
|
||||
&& (mPick.mPickType == LLPickInfo::PICK_LAND // we clicked on land
|
||||
|| mPick.mObjectID.notNull())); // or on an object
|
||||
|
||||
if ( (fValidPick) && (RlvActions::isRlvEnabled()) && (!RlvActions::canTeleportToLocal(mPick.mPosGlobal)) )
|
||||
{
|
||||
RlvUtil::notifyBlocked(RlvStringKeys::Blocked::AutoPilot);
|
||||
fValidPick = false;
|
||||
}
|
||||
|
||||
if (fValidPick)
|
||||
// [/RLVa:KB]
|
||||
{
|
||||
|
||||
// handle special cases of steering picks
|
||||
LLViewerObject* avatar_object = mPick.getObject();
|
||||
|
||||
// get pointer to avatar
|
||||
while (avatar_object && !avatar_object->isAvatar())
|
||||
{
|
||||
avatar_object = (LLViewerObject*)avatar_object->getParent();
|
||||
}
|
||||
|
||||
if (avatar_object && ((LLVOAvatar*)avatar_object)->isSelf())
|
||||
{
|
||||
const F64 SELF_CLICK_WALK_DISTANCE = 3.0;
|
||||
// pretend we picked some point a bit in front of avatar
|
||||
mPick.mPosGlobal = gAgent.getPositionGlobal() + LLVector3d(LLViewerCamera::instance().getAtAxis()) * SELF_CLICK_WALK_DISTANCE;
|
||||
}
|
||||
gAgentCamera.setFocusOnAvatar(TRUE, TRUE);
|
||||
walkToClickedLocation();
|
||||
LLFirstUse::notMoving(false);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS("maint5901") << "walk target was "
|
||||
<< (mPick.mPosGlobal.isExactlyZero() ? "zero" : "not zero")
|
||||
<< ", pick type was " << (mPick.mPickType == LLPickInfo::PICK_LAND ? "land" : "not land")
|
||||
<< ", pick object was " << mPick.mObjectID
|
||||
<< LL_ENDL;
|
||||
// we didn't click to walk, so restore the original target
|
||||
mPick = savedPick;
|
||||
}
|
||||
}
|
||||
gViewerWindow->setCursor(UI_CURSOR_ARROW);
|
||||
if (hasMouseCapture())
|
||||
{
|
||||
|
|
@ -922,7 +964,6 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
|
|||
LLToolMgr::getInstance()->clearTransientTool();
|
||||
gAgentCamera.setLookAt(LOOKAT_TARGET_CONVERSATION, obj); // maybe look at object/person clicked on
|
||||
|
||||
mBlockClickToWalk = false;
|
||||
return LLTool::handleMouseUp(x, y, mask);
|
||||
}
|
||||
|
||||
|
|
@ -947,13 +988,11 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
|
|||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// <FS:Ansariel> FIRE-1765: Allow double-click walk/teleport to scripted objects
|
||||
bool allowDoubleClickOnScriptedObjects = gSavedSettings.getBOOL("FSAllowDoubleClickOnScriptedObjects");
|
||||
|
||||
// <FS:Ansariel> FIRE-1765: Allow double-click walk/teleport to scripted objects
|
||||
//if (!mDoubleClickTimer.getStarted() || (mDoubleClickTimer.getElapsedTimeF32() > 0.3f))
|
||||
if (!allowDoubleClickOnScriptedObjects && (!mDoubleClickTimer.getStarted() || (mDoubleClickTimer.getElapsedTimeF32() > 0.3f)))
|
||||
//if (!mDoubleClickTimer.getStarted() || (mDoubleClickTimer.getElapsedTimeF32() > 0.3f))
|
||||
bool allowDoubleClickOnScriptedObjects = gSavedSettings.getBOOL("FSAllowDoubleClickOnScriptedObjects");
|
||||
if (!allowDoubleClickOnScriptedObjects && (!mDoubleClickTimer.getStarted() || (mDoubleClickTimer.getElapsedTimeF32() > 0.3f)))
|
||||
// </FS:Ansariel>
|
||||
{
|
||||
mDoubleClickTimer.stop();
|
||||
|
|
@ -961,74 +1000,6 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
|
|||
}
|
||||
mDoubleClickTimer.stop();
|
||||
|
||||
if (gSavedSettings.getBOOL("DoubleClickAutoPilot"))
|
||||
{
|
||||
// We may be doing double click to walk, but we don't want to use a target on
|
||||
// a transparent object because the user thought they were clicking on
|
||||
// whatever they were seeing through it, so recompute what was clicked on
|
||||
// ignoring transparent objects
|
||||
LLPickInfo savedPick = mPick;
|
||||
mPick = gViewerWindow->pickImmediate(savedPick.mMousePt.mX, savedPick.mMousePt.mY,
|
||||
FALSE /* ignore transparent */,
|
||||
FALSE /* ignore rigged */,
|
||||
FALSE /* ignore particles */);
|
||||
|
||||
if(mPick.mPickType == LLPickInfo::PICK_OBJECT)
|
||||
{
|
||||
if (mPick.getObject() && mPick.getObject()->isHUDAttachment())
|
||||
{
|
||||
mPick = savedPick;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
// if ((mPick.mPickType == LLPickInfo::PICK_LAND && !mPick.mPosGlobal.isExactlyZero()) ||
|
||||
// (mPick.mObjectID.notNull() && !mPick.mPosGlobal.isExactlyZero()))
|
||||
// [RLVa:KB] - Checked: RLVa-2.0.0
|
||||
bool fValidPick = ((mPick.mPickType == LLPickInfo::PICK_LAND && !mPick.mPosGlobal.isExactlyZero()) ||
|
||||
(mPick.mObjectID.notNull() && !mPick.mPosGlobal.isExactlyZero()));
|
||||
|
||||
if ( (fValidPick) && (RlvActions::isRlvEnabled()) && (!RlvActions::canTeleportToLocal(mPick.mPosGlobal)) )
|
||||
{
|
||||
RlvUtil::notifyBlocked(RlvStringKeys::Blocked::AutoPilot);
|
||||
fValidPick = false;
|
||||
}
|
||||
|
||||
if (fValidPick)
|
||||
// [/RLVa:KB]
|
||||
{
|
||||
walkToClickedLocation();
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
// restore the original pick for any other purpose
|
||||
mPick = savedPick;
|
||||
}
|
||||
}
|
||||
else if (gSavedSettings.getBOOL("DoubleClickTeleport"))
|
||||
{
|
||||
LLViewerObject* objp = mPick.getObject();
|
||||
LLViewerObject* parentp = objp ? objp->getRootEdit() : NULL;
|
||||
|
||||
bool is_in_world = mPick.mObjectID.notNull() && objp && !objp->isHUDAttachment();
|
||||
bool is_land = mPick.mPickType == LLPickInfo::PICK_LAND;
|
||||
bool pos_non_zero = !mPick.mPosGlobal.isExactlyZero();
|
||||
bool has_touch_handler = (objp && objp->flagHandleTouch()) || (parentp && parentp->flagHandleTouch());
|
||||
bool has_click_action = final_click_action(objp);
|
||||
|
||||
// <FS:Ansariel> FIRE-1765: Allow double-click walk/teleport to scripted objects
|
||||
//if (pos_non_zero && (is_land || (is_in_world && !has_touch_handler && !has_click_action)))
|
||||
if (pos_non_zero && (is_land || (is_in_world && ((allowDoubleClickOnScriptedObjects && objp->getClickAction() != CLICK_ACTION_SIT) || (!has_touch_handler && !has_click_action)))))
|
||||
// </FS:Ansariel>
|
||||
{
|
||||
LLVector3d pos = mPick.mPosGlobal;
|
||||
pos.mdV[VZ] += gAgentAvatarp->getPelvisToFoot();
|
||||
gAgent.teleportViaLocationLookAt(pos);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
|
@ -1782,7 +1753,6 @@ void LLToolPie::VisitHomePage(const LLPickInfo& info)
|
|||
void LLToolPie::handleSelect()
|
||||
{
|
||||
// tool is reselected when app gets focus, etc.
|
||||
mBlockClickToWalk = true;
|
||||
}
|
||||
|
||||
void LLToolPie::handleDeselect()
|
||||
|
|
@ -1847,7 +1817,7 @@ void LLToolPie::stopCameraSteering()
|
|||
|
||||
bool LLToolPie::inCameraSteerMode()
|
||||
{
|
||||
return mMouseButtonDown && mMouseOutsideSlop && gSavedSettings.getBOOL("ClickToWalk");
|
||||
return mMouseButtonDown && mMouseOutsideSlop;
|
||||
}
|
||||
|
||||
// true if x,y outside small box around start_x,start_y
|
||||
|
|
@ -2431,7 +2401,6 @@ void LLToolPie::startCameraSteering()
|
|||
{
|
||||
LLFirstUse::notMoving(false);
|
||||
mMouseOutsideSlop = true;
|
||||
mBlockClickToWalk = true;
|
||||
|
||||
if (gAgentCamera.getFocusOnAvatar())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ class LLToolPie : public LLTool, public LLSingleton<LLToolPie>
|
|||
public:
|
||||
|
||||
// Virtual functions inherited from LLMouseHandler
|
||||
virtual BOOL handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktype, BOOL down);
|
||||
virtual BOOL handleAnyMouseClick(S32 x, S32 y, MASK mask, EMouseClickType clicktype, BOOL down);
|
||||
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
|
||||
virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
|
||||
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
|
||||
|
|
@ -71,8 +71,8 @@ public:
|
|||
LLViewerObject* getClickActionObject() { return mClickActionObject; }
|
||||
LLObjectSelection* getLeftClickSelection() { return (LLObjectSelection*)mLeftClickSelection; }
|
||||
void resetSelection();
|
||||
void walkToClickedLocation();
|
||||
void blockClickToWalk() { mBlockClickToWalk = true; }
|
||||
bool walkToClickedLocation();
|
||||
bool teleportToClickedLocation();
|
||||
void stopClickToWalk();
|
||||
|
||||
static void selectionPropertiesReceived();
|
||||
|
|
@ -121,7 +121,6 @@ private:
|
|||
LLPointer<LLHUDEffectBlob> mAutoPilotDestination;
|
||||
LLPointer<LLHUDEffectBlob> mMouseSteerGrabPoint;
|
||||
bool mClockwise;
|
||||
bool mBlockClickToWalk;
|
||||
LLUUID mMediaMouseCaptureID;
|
||||
LLPickInfo mPick;
|
||||
LLPickInfo mHoverPick;
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@
|
|||
#include "llnotificationsutil.h"
|
||||
#include "llpanelplaces.h"
|
||||
#include "llstatusbar.h"
|
||||
#include "llviewerkeyboard.h"
|
||||
#include "llviewerinput.h"
|
||||
#include "llviewerobjectlist.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "NACLantispam.h"
|
||||
|
|
@ -629,7 +629,10 @@ bool handleHighResSnapshotChanged(const LLSD& newvalue)
|
|||
|
||||
bool handleVoiceClientPrefsChanged(const LLSD& newvalue)
|
||||
{
|
||||
LLVoiceClient::getInstance()->updateSettings();
|
||||
if (LLVoiceClient::instanceExists())
|
||||
{
|
||||
LLVoiceClient::getInstance()->updateSettings();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -876,23 +879,6 @@ void handleUsernameFormatOptionChanged(const LLSD& newvalue)
|
|||
}
|
||||
// </FS:CR>
|
||||
|
||||
// <FS:Ansariel> Allow instant change of keyboard layout
|
||||
void handleKeyboardLayoutChanged(const LLSD& newvalue)
|
||||
{
|
||||
std::string keyBindingFileName("keys.xml");
|
||||
if (newvalue.asBoolean())
|
||||
{
|
||||
keyBindingFileName = "keys_azerty.xml";
|
||||
}
|
||||
|
||||
std::string key_bindings_file = gDirUtilp->findFile(keyBindingFileName,
|
||||
gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, ""),
|
||||
gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
|
||||
|
||||
gViewerKeyboard.loadBindingsXML(key_bindings_file);
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
// <FS:Ansariel> Global online status toggle
|
||||
void handleGlobalOnlineStatusChanged(const LLSD& newvalue)
|
||||
{
|
||||
|
|
@ -1278,8 +1264,6 @@ void settings_setup_listeners()
|
|||
gSavedSettings.getControl("FSNameTagShowLegacyUsernames")->getCommitSignal()->connect(boost::bind(&handleUsernameFormatOptionChanged, _2));
|
||||
gSavedSettings.getControl("FSTrimLegacyNames")->getCommitSignal()->connect(boost::bind(&handleLegacyTrimOptionChanged, _2));
|
||||
|
||||
gSavedSettings.getControl("FSUseAzertyKeyboardLayout")->getCommitSignal()->connect(boost::bind(&handleKeyboardLayoutChanged, _2));
|
||||
|
||||
// <FS:Ansariel> [FS communication UI]
|
||||
gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&FSFloaterIM::processChatHistoryStyleUpdate, _2));
|
||||
gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&FSFloaterNearbyChat::processChatHistoryStyleUpdate, _2));
|
||||
|
|
|
|||
|
|
@ -1427,8 +1427,9 @@ void render_ui(F32 zoom_factor, int subfield)
|
|||
// Finalize scene
|
||||
gPipeline.renderFinalize();
|
||||
|
||||
LL_RECORD_BLOCK_TIME(FTM_RENDER_HUD);
|
||||
render_hud_elements();
|
||||
{// <FS:Beq/> give unique scope
|
||||
LL_RECORD_BLOCK_TIME(FTM_RENDER_HUD);
|
||||
render_hud_elements();
|
||||
// [RLVa:KB] - Checked: RLVa-2.2 (@setoverlay)
|
||||
if (RlvActions::hasBehaviour(RLV_BHVR_SETOVERLAY))
|
||||
{
|
||||
|
|
@ -1436,7 +1437,7 @@ void render_ui(F32 zoom_factor, int subfield)
|
|||
}
|
||||
// [/RLVa:KB]
|
||||
render_hud_attachments();
|
||||
|
||||
} // <FS:Beq/> unique scope
|
||||
LLGLSDefault gls_default;
|
||||
LLGLSUIDefault gls_ui;
|
||||
{
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,179 @@
|
|||
/**
|
||||
* @file llviewerinput.h
|
||||
* @brief LLViewerInput class header file
|
||||
*
|
||||
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifndef LL_LLVIEWERINPUT_H
|
||||
#define LL_LLVIEWERINPUT_H
|
||||
|
||||
#include "llkeyboard.h" // For EKeystate
|
||||
#include "llinitparam.h"
|
||||
|
||||
const S32 MAX_KEY_BINDINGS = 128; // was 60
|
||||
|
||||
class LLNamedFunction
|
||||
{
|
||||
public:
|
||||
LLNamedFunction() : mFunction(NULL) { };
|
||||
~LLNamedFunction() { };
|
||||
|
||||
std::string mName;
|
||||
LLKeyFunc mFunction;
|
||||
};
|
||||
|
||||
class LLKeyboardBinding
|
||||
{
|
||||
public:
|
||||
KEY mKey;
|
||||
MASK mMask;
|
||||
|
||||
LLKeyFunc mFunction;
|
||||
};
|
||||
|
||||
class LLMouseBinding
|
||||
{
|
||||
public:
|
||||
EMouseClickType mMouse;
|
||||
MASK mMask;
|
||||
|
||||
LLKeyFunc mFunction;
|
||||
};
|
||||
|
||||
|
||||
typedef enum e_keyboard_mode
|
||||
{
|
||||
MODE_FIRST_PERSON,
|
||||
MODE_THIRD_PERSON,
|
||||
MODE_EDIT_AVATAR,
|
||||
MODE_SITTING,
|
||||
MODE_COUNT
|
||||
} EKeyboardMode;
|
||||
|
||||
class LLWindow;
|
||||
|
||||
void bind_keyboard_functions();
|
||||
|
||||
class LLViewerInput
|
||||
{
|
||||
public:
|
||||
struct KeyBinding : public LLInitParam::Block<KeyBinding>
|
||||
{
|
||||
Mandatory<std::string> key,
|
||||
mask,
|
||||
command;
|
||||
Optional<std::string> mouse; // Note, not mandatory for the sake of backward campatibility with keys.xml
|
||||
|
||||
KeyBinding();
|
||||
};
|
||||
|
||||
struct KeyMode : public LLInitParam::Block<KeyMode>
|
||||
{
|
||||
Multiple<KeyBinding> bindings;
|
||||
|
||||
KeyMode();
|
||||
};
|
||||
|
||||
struct Keys : public LLInitParam::Block<Keys>
|
||||
{
|
||||
Optional<KeyMode> first_person,
|
||||
third_person,
|
||||
sitting,
|
||||
edit_avatar;
|
||||
|
||||
Keys();
|
||||
};
|
||||
|
||||
LLViewerInput();
|
||||
|
||||
BOOL handleKey(KEY key, MASK mask, BOOL repeated);
|
||||
BOOL handleKeyUp(KEY key, MASK mask);
|
||||
|
||||
S32 loadBindingsXML(const std::string& filename); // returns number bound, 0 on error
|
||||
EKeyboardMode getMode() const;
|
||||
|
||||
static BOOL modeFromString(const std::string& string, S32 *mode); // False on failure
|
||||
static BOOL mouseFromString(const std::string& string, EMouseClickType *mode);// False on failure
|
||||
|
||||
bool scanKey(KEY key,
|
||||
BOOL key_down,
|
||||
BOOL key_up,
|
||||
BOOL key_level) const;
|
||||
|
||||
// handleMouse() records state, scanMouse() goes through states, scanMouse(click) processes individual saved states after UI is done with them
|
||||
BOOL handleMouse(LLWindow *window_impl, LLCoordGL pos, MASK mask, EMouseClickType clicktype, BOOL down);
|
||||
void scanMouse();
|
||||
|
||||
bool isMouseBindUsed(const EMouseClickType mouse, const MASK mask = MASK_NONE, const S32 mode = MODE_THIRD_PERSON);
|
||||
|
||||
private:
|
||||
bool scanKey(const std::vector<LLKeyboardBinding> &binding,
|
||||
S32 binding_count,
|
||||
KEY key,
|
||||
MASK mask,
|
||||
BOOL key_down,
|
||||
BOOL key_up,
|
||||
BOOL key_level,
|
||||
bool repeat) const;
|
||||
|
||||
enum EMouseState
|
||||
{
|
||||
MOUSE_STATE_DOWN, // key down this frame
|
||||
MOUSE_STATE_CLICK, // key went up and down in scope of same frame
|
||||
MOUSE_STATE_LEVEL, // clicked again fast, or never released
|
||||
MOUSE_STATE_UP, // went up this frame
|
||||
MOUSE_STATE_SILENT // notified about 'up', do not notify again
|
||||
};
|
||||
bool scanMouse(EMouseClickType click, EMouseState state) const;
|
||||
bool scanMouse(const std::vector<LLMouseBinding> &binding,
|
||||
S32 binding_count,
|
||||
EMouseClickType mouse,
|
||||
MASK mask,
|
||||
EMouseState state) const;
|
||||
|
||||
S32 loadBindingMode(const LLViewerInput::KeyMode& keymode, S32 mode);
|
||||
BOOL bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name);
|
||||
BOOL bindMouse(const S32 mode, const EMouseClickType mouse, const MASK mask, const std::string& function_name);
|
||||
void resetBindings();
|
||||
|
||||
// Hold all the ugly stuff torn out to make LLKeyboard non-viewer-specific here
|
||||
|
||||
// TODO: at some point it is better to remake this, especially keyaboard part
|
||||
// would be much better to send to functions actual state of the button than
|
||||
// to send what we think function wants based on collection of bools (mKeyRepeated, mKeyLevel, mKeyDown)
|
||||
std::vector<LLKeyboardBinding> mKeyBindings[MODE_COUNT];
|
||||
std::vector<LLMouseBinding> mMouseBindings[MODE_COUNT];
|
||||
|
||||
typedef std::map<U32, U32> key_remap_t;
|
||||
key_remap_t mRemapKeys[MODE_COUNT];
|
||||
std::set<KEY> mKeysSkippedByUI;
|
||||
BOOL mKeyHandledByUI[KEY_COUNT]; // key processed successfully by UI
|
||||
|
||||
// This is indentical to what llkeyboard does (mKeyRepeated, mKeyLevel, mKeyDown e t c),
|
||||
// just instead of remembering individually as bools, we record state as enum
|
||||
EMouseState mMouseLevel[CLICK_COUNT]; // records of key state
|
||||
};
|
||||
|
||||
extern LLViewerInput gViewerInput;
|
||||
bool agent_push_forward(EKeystate s);//<FS:JL> Mouse movement by Singularity
|
||||
#endif // LL_LLVIEWERINPUT_H
|
||||
|
|
@ -1427,6 +1427,8 @@ bool LLViewerJoystick::isLikeSpaceNavigator() const
|
|||
#if LIB_NDOF
|
||||
return (isJoystickInitialized()
|
||||
&& (strncmp(mNdofDev->product, "SpaceNavigator", 14) == 0
|
||||
// <FS:Zi> FIRE-30846 - Add combined product string that is returned by some devices
|
||||
|| strncmp(mNdofDev->product, "3Dconnexion SpaceNavigator", 26) == 0
|
||||
|| strncmp(mNdofDev->product, "SpaceExplorer", 13) == 0
|
||||
|| strncmp(mNdofDev->product, "SpaceTraveler", 13) == 0
|
||||
|| strncmp(mNdofDev->product, "SpacePilot", 10) == 0));
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,118 +0,0 @@
|
|||
/**
|
||||
* @file llviewerkeyboard.h
|
||||
* @brief LLViewerKeyboard class header file
|
||||
*
|
||||
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifndef LL_LLVIEWERKEYBOARD_H
|
||||
#define LL_LLVIEWERKEYBOARD_H
|
||||
|
||||
#include "llkeyboard.h" // For EKeystate
|
||||
#include "llinitparam.h"
|
||||
|
||||
const S32 MAX_NAMED_FUNCTIONS = 100;
|
||||
const S32 MAX_KEY_BINDINGS = 128; // was 60
|
||||
|
||||
class LLNamedFunction
|
||||
{
|
||||
public:
|
||||
LLNamedFunction() : mFunction(NULL) { };
|
||||
~LLNamedFunction() { };
|
||||
|
||||
std::string mName;
|
||||
LLKeyFunc mFunction;
|
||||
};
|
||||
|
||||
typedef enum e_keyboard_mode
|
||||
{
|
||||
MODE_FIRST_PERSON,
|
||||
MODE_THIRD_PERSON,
|
||||
MODE_EDIT,
|
||||
MODE_EDIT_AVATAR,
|
||||
MODE_SITTING,
|
||||
MODE_COUNT
|
||||
} EKeyboardMode;
|
||||
|
||||
|
||||
void bind_keyboard_functions();
|
||||
|
||||
class LLViewerKeyboard
|
||||
{
|
||||
public:
|
||||
struct KeyBinding : public LLInitParam::Block<KeyBinding>
|
||||
{
|
||||
Mandatory<std::string> key,
|
||||
mask,
|
||||
command;
|
||||
|
||||
KeyBinding();
|
||||
};
|
||||
|
||||
struct KeyMode : public LLInitParam::Block<KeyMode>
|
||||
{
|
||||
Multiple<KeyBinding> bindings;
|
||||
EKeyboardMode mode;
|
||||
KeyMode(EKeyboardMode mode);
|
||||
};
|
||||
|
||||
struct Keys : public LLInitParam::Block<Keys>
|
||||
{
|
||||
Optional<KeyMode> first_person,
|
||||
third_person,
|
||||
edit,
|
||||
sitting,
|
||||
edit_avatar;
|
||||
|
||||
Keys();
|
||||
};
|
||||
|
||||
LLViewerKeyboard();
|
||||
|
||||
BOOL handleKey(KEY key, MASK mask, BOOL repeated);
|
||||
BOOL handleKeyUp(KEY key, MASK mask);
|
||||
|
||||
S32 loadBindings(const std::string& filename); // returns number bound, 0 on error
|
||||
S32 loadBindingsXML(const std::string& filename); // returns number bound, 0 on error
|
||||
EKeyboardMode getMode();
|
||||
|
||||
BOOL modeFromString(const std::string& string, S32 *mode); // False on failure
|
||||
|
||||
void scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level);
|
||||
|
||||
private:
|
||||
S32 loadBindingMode(const LLViewerKeyboard::KeyMode& keymode);
|
||||
BOOL bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name);
|
||||
|
||||
// Hold all the ugly stuff torn out to make LLKeyboard non-viewer-specific here
|
||||
S32 mBindingCount[MODE_COUNT];
|
||||
LLKeyBinding mBindings[MODE_COUNT][MAX_KEY_BINDINGS];
|
||||
|
||||
typedef std::map<U32, U32> key_remap_t;
|
||||
key_remap_t mRemapKeys[MODE_COUNT];
|
||||
std::set<KEY> mKeysSkippedByUI;
|
||||
BOOL mKeyHandledByUI[KEY_COUNT]; // key processed successfully by UI
|
||||
};
|
||||
|
||||
extern LLViewerKeyboard gViewerKeyboard;
|
||||
void agent_push_forward(EKeystate s);//<FS:JL> Mouse movement by Singularity
|
||||
#endif // LL_LLVIEWERKEYBOARD_H
|
||||
|
|
@ -5822,6 +5822,20 @@ void handle_take_copy()
|
|||
derez_objects(DRD_ACQUIRE_TO_AGENT_INVENTORY, category_id);
|
||||
}
|
||||
|
||||
void handle_link_objects()
|
||||
{
|
||||
// <FS:Ansariel> We don't use a shortcut for two completely different functions based on context
|
||||
//if (LLSelectMgr::getInstance()->getSelection()->isEmpty())
|
||||
//{
|
||||
// LLFloaterReg::toggleInstanceOrBringToFront("places");
|
||||
//}
|
||||
//else
|
||||
// </FS:Ansariel>
|
||||
{
|
||||
LLSelectMgr::getInstance()->linkObjects();
|
||||
}
|
||||
}
|
||||
|
||||
// You can return an object to its owner if it is on your land.
|
||||
class LLObjectReturn : public view_listener_t
|
||||
{
|
||||
|
|
@ -9475,6 +9489,20 @@ class LLAdvancedToggleDoubleClickTeleport: public view_listener_t
|
|||
}
|
||||
};
|
||||
|
||||
// <FS:Beq> Add telemetry controls to the viewer menus
|
||||
class FSTelemetryToggleActive : public view_listener_t
|
||||
{
|
||||
protected:
|
||||
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
{
|
||||
BOOL checked = gSavedSettings.getBOOL( "FSTelemetryActive" );
|
||||
gSavedSettings.setBOOL( "FSTelemetryActive", !checked );
|
||||
FSTelemetry::active = !checked;
|
||||
return true;
|
||||
}
|
||||
};
|
||||
// </FS:Beq>
|
||||
void menu_toggle_attached_lights(void* user_data)
|
||||
{
|
||||
LLPipeline::sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights");
|
||||
|
|
@ -10266,7 +10294,6 @@ BOOL LLViewerMenuHolderGL::hideMenus()
|
|||
|
||||
if (LLMenuHolderGL::hideMenus())
|
||||
{
|
||||
LLToolPie::instance().blockClickToWalk();
|
||||
handled = TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -11616,7 +11643,7 @@ void initialize_menus()
|
|||
view_listener_t::addMenu(new LLToolsSnapObjectXY(), "Tools.SnapObjectXY");
|
||||
view_listener_t::addMenu(new LLToolsUseSelectionForGrid(), "Tools.UseSelectionForGrid");
|
||||
view_listener_t::addMenu(new LLToolsSelectNextPartFace(), "Tools.SelectNextPart");
|
||||
commit.add("Tools.Link", boost::bind(&LLSelectMgr::linkObjects, LLSelectMgr::getInstance()));
|
||||
commit.add("Tools.Link", boost::bind(&handle_link_objects));
|
||||
commit.add("Tools.Unlink", boost::bind(&LLSelectMgr::unlinkObjects, LLSelectMgr::getInstance()));
|
||||
view_listener_t::addMenu(new LLToolsStopAllAnimations(), "Tools.StopAllAnimations");
|
||||
view_listener_t::addMenu(new LLToolsReleaseKeys(), "Tools.ReleaseKeys");
|
||||
|
|
@ -11831,6 +11858,9 @@ void initialize_menus()
|
|||
//Develop (clear cache immediately)
|
||||
commit.add("Develop.ClearCache", boost::bind(&handle_cache_clear_immediately) );
|
||||
|
||||
// <FS:Beq/> Add telemetry controls to the viewer Develop menu (Toggle profiling)
|
||||
view_listener_t::addMenu(new FSTelemetryToggleActive(), "Develop.ToggleTelemetry");
|
||||
|
||||
// Admin >Object
|
||||
view_listener_t::addMenu(new LLAdminForceTakeCopy(), "Admin.ForceTakeCopy");
|
||||
view_listener_t::addMenu(new LLAdminHandleObjectOwnerSelf(), "Admin.HandleObjectOwnerSelf");
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue