Ansariel 2021-04-02 20:58:03 +02:00
commit c890dd2b1e
205 changed files with 8919 additions and 3050 deletions

2
.gitignore vendored
View File

@ -107,4 +107,4 @@ my_autobuild.xml
compile_commands.json
# ignore tracy for now
indra/tracy
indra/tracy

View File

@ -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>

View File

@ -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)

View File

@ -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 )

View File

@ -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 "")

View File

@ -86,6 +86,7 @@ set(cmake_SOURCE_FILES
PulseAudio.cmake
Python.cmake
TemplateCheck.cmake
Tracy.cmake
Tut.cmake
UI.cmake
UnixInstall.cmake

View File

@ -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}
)

16
indra/cmake/Tracy.cmake Normal file
View File

@ -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)

View File

@ -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;

View File

@ -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

View File

@ -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};
}

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -60,7 +60,6 @@ namespace LLTrace
//////////////////////////////////////////////////////////////////////////////
// statics
bool BlockTimer::sLog = false;
std::string BlockTimer::sLogName = "";
bool BlockTimer::sMetricLog = false;

View File

@ -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
{

View File

@ -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();
}

106
indra/llcommon/llkeybind.h Normal file
View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -32,7 +32,7 @@
//
// KDU core header files
//
#ifndef LL_WINDOWS
#ifdef LL_DARWIN
#define KDU_NO_THREADS
#endif

View File

@ -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

View File

@ -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}

View File

@ -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

View File

@ -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.

View File

@ -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;
}

View File

@ -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
{

View File

@ -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);

View File

@ -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";

View File

@ -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

View File

@ -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_

View File

@ -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

View File

@ -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;
};

View File

@ -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);
}
}

View File

@ -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

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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();

View File

@ -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;

View File

@ -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] == '+'))

View File

@ -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; }

View File

@ -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)

View File

@ -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;

View File

@ -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

View File

@ -1 +1 @@
6.4.17
6.4.18

View File

@ -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>

View File

@ -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>

View File

@ -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.

View File

@ -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

View File

@ -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.

View File

@ -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"

View File

@ -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>

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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>
}
}

View File

@ -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/"

View File

@ -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)
{

View File

@ -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();

View File

@ -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);
}
}
}

View File

@ -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;

View File

@ -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())
{

View File

@ -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);

View File

@ -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"

View File

@ -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;

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)
{

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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

View File

@ -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)

View File

@ -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);
};

View File

@ -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);

View File

@ -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"];

View File

@ -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;
}

View File

@ -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);

View File

@ -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"

View File

@ -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())
{

View File

@ -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;

View File

@ -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));

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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