master
Brad Payne (Vir Linden) 2011-10-11 13:38:19 -04:00
commit f1e907ecbe
139 changed files with 4456 additions and 2588 deletions

View File

@ -195,3 +195,6 @@ b95ddac176ac944efdc85cbee94ac2e1eab44c79 3.0.3-start
0496d2f74043cf4e6058e76ac3db03d44cff42ce DRTVWR-84_3.0.3-release
0496d2f74043cf4e6058e76ac3db03d44cff42ce 3.0.3-release
92a3aa04775438226399b19deee12ac3b5a62838 3.0.5-start
c7282e59f374ee904bd793c3c444455e3399b0c5 3.1.0-start
2657fa785bbfac115852c41bd0adaff74c2ad5da DRTVWR-93_3.1.0-beta1
2657fa785bbfac115852c41bd0adaff74c2ad5da 3.1.0-beta1

View File

@ -43,11 +43,13 @@ snowstorm_viewer-development.login_channel = "Second Life Development"
snowstorm_viewer-development.build_viewer_update_version_manager = false
snowstorm_viewer-development.email = viewer-development-builds@lists.secondlife.com
snowstorm_viewer-development.build_enforce_coding_policy = true
snowstorm_viewer-development.codeticket_add_context = true
Snowstorm_viewer-project-review.build_debug_release_separately = true
Snowstorm_viewer-project-review.codeticket_add_context = true
Snowstorm_viewer-project-review.viewer_channel = "Project Viewer - Snowstorm Team"
Snowstorm_viewer-project-review.login_channel = "Project Viewer - Snowstorm Team"
Snowstorm_viewer-project-review.codeticket_add_context = true
# ========================================
# Viewer Beta

View File

@ -1206,9 +1206,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>9cd66e879908f047d9af665b92946ecc</string>
<string>1b92a69f5eba7cd8b017180659076db5</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/239803/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20110830.tar.bz2</string>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/roxie_3p-llqtwebkit/rev/242182/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20111003.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@ -1230,9 +1230,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>ab9393795515cbbe9526bde33b41bf2a</string>
<string>1e7f24b69b0fc751c7e86efe7c621882</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/239670/arch/CYGWIN/installer/llqtwebkit-4.7.1-windows-20110829.tar.bz2</string>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/roxie_3p-llqtwebkit/rev/242182/arch/CYGWIN/installer/llqtwebkit-4.7.1-windows-20111003.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>

View File

@ -66,6 +66,7 @@ Alejandro Rosenthal
VWR-1184
Aleric Inglewood
SNOW-84
OPEN-38
SNOW-240
SNOW-477
SNOW-522
@ -622,6 +623,7 @@ Latif Khalifa
VWR-5370
leliel Mirihi
STORM-1100
STORM-1602
len Starship
Lisa Lowe
CT-218
@ -1032,6 +1034,9 @@ Synystyr Texan
Takeda Terrawyng
TankMaster Finesmith
STORM-1100
STORM-1602
STORM-1258
VWR-26622
Talamasca
Tali Rosca
Tayra Dagostino

30
indra/cmake/FindGLH.cmake Normal file
View File

@ -0,0 +1,30 @@
# -*- cmake -*-
# - Find GLH
# Find the Graphic Library Helper includes.
# This module defines
# GLH_INCLUDE_DIR, where to find glh/glh_linear.h.
# GLH_FOUND, If false, do not try to use GLH.
find_path(GLH_INCLUDE_DIR glh/glh_linear.h
NO_SYSTEM_ENVIRONMENT_PATH
)
if (GLH_INCLUDE_DIR)
set(GLH_FOUND "YES")
else (GLH_INCLUDE_DIR)
set(GLH_FOUND "NO")
endif (GLH_INCLUDE_DIR)
if (GLH_FOUND)
if (NOT GLH_FIND_QUIETLY)
message(STATUS "Found GLH: ${GLH_INCLUDE_DIR}")
set(GLH_FIND_QUIETLY TRUE) # Only alert us the first time
endif (NOT GLH_FIND_QUIETLY)
else (GLH_FOUND)
if (GLH_FIND_REQUIRED)
message(FATAL_ERROR "Could not find GLH")
endif (GLH_FIND_REQUIRED)
endif (GLH_FOUND)
mark_as_advanced(GLH_INCLUDE_DIR)

11
indra/cmake/GLH.cmake Normal file
View File

@ -0,0 +1,11 @@
# -*- cmake -*-
include(Prebuilt)
set(GLH_FIND_REQUIRED TRUE)
set(GLH_FIND_QUIETLY TRUE)
if (STANDALONE)
include(FindGLH)
else (STANDALONE)
use_prebuilt_binary(glh_linear)
endif (STANDALONE)

View File

@ -1,9 +1,11 @@
# -*- cmake -*-
include(FreeType)
include(GLH)
set(LLRENDER_INCLUDE_DIRS
${LIBS_OPEN_DIR}/llrender
${GLH_INCLUDE_DIR}
)
if (SERVER AND LINUX)

View File

@ -38,18 +38,17 @@ endmacro(ll_deploy_sharedlibs_command)
# ll_stage_sharedlib
# Performs config and adds a copy command for a sharedlib target.
macro(ll_stage_sharedlib DSO_TARGET)
if(SHARED_LIB_STAGING_DIR)
# target gets written to the DLL staging directory.
# Also this directory is shared with RunBuildTest.cmake, y'know, for the tests.
set_target_properties(${DSO_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SHARED_LIB_STAGING_DIR})
if(NOT WINDOWS)
get_target_property(DSO_PATH ${DSO_TARGET} LOCATION)
get_filename_component(DSO_FILE ${DSO_PATH} NAME)
if(DARWIN)
set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources)
else(DARWIN)
set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
endif(DARWIN)
# target gets written to the DLL staging directory.
# Also this directory is shared with RunBuildTest.cmake, y'know, for the tests.
set_target_properties(${DSO_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SHARED_LIB_STAGING_DIR})
if(NOT WINDOWS)
get_target_property(DSO_PATH ${DSO_TARGET} LOCATION)
get_filename_component(DSO_FILE ${DSO_PATH} NAME)
if(DARWIN)
set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources)
else(DARWIN)
set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
endif(DARWIN)
# *TODO - maybe make this a symbolic link? -brad
add_custom_command(
@ -63,7 +62,6 @@ macro(ll_stage_sharedlib DSO_TARGET)
COMMENT "Copying llcommon to the staging folder."
)
endif(NOT WINDOWS)
endif(SHARED_LIB_STAGING_DIR)
if (DARWIN)
set_target_properties(${DSO_TARGET} PROPERTIES

View File

@ -2,22 +2,19 @@
include(Variables)
if (NOT STANDALONE)
set(ARCH_PREBUILT_DIRS ${AUTOBUILD_INSTALL_DIR}/lib)
set(ARCH_PREBUILT_DIRS_RELEASE ${AUTOBUILD_INSTALL_DIR}/lib/release)
set(ARCH_PREBUILT_DIRS_DEBUG ${AUTOBUILD_INSTALL_DIR}/lib/debug)
if (WINDOWS)
set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs)
set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs)
elseif (LINUX)
set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/lib)
set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/bin)
elseif (DARWIN)
set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs)
set(EXE_STAGING_DIR "${CMAKE_BINARY_DIR}/sharedlibs/\$(CONFIGURATION)")
endif (WINDOWS)
endif (NOT STANDALONE)
set(ARCH_PREBUILT_DIRS ${AUTOBUILD_INSTALL_DIR}/lib)
set(ARCH_PREBUILT_DIRS_RELEASE ${AUTOBUILD_INSTALL_DIR}/lib/release)
set(ARCH_PREBUILT_DIRS_DEBUG ${AUTOBUILD_INSTALL_DIR}/lib/debug)
if (WINDOWS)
set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs)
set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs)
elseif (LINUX)
set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/lib)
set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/bin)
elseif (DARWIN)
set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs)
set(EXE_STAGING_DIR "${CMAKE_BINARY_DIR}/sharedlibs/\$(CONFIGURATION)")
endif (WINDOWS)
# Autobuild packages must provide 'release' versions of libraries, but may provide versions for
# specific build types. AUTOBUILD_LIBS_INSTALL_DIRS lists first the build type directory and then

View File

@ -11,7 +11,7 @@ else (STANDALONE)
if (WINDOWS)
set(OPENSSL_LIBRARIES ssleay32 libeay32)
else (WINDOWS)
set(OPENSSL_LIBRARIES ssl)
set(OPENSSL_LIBRARIES ssl crypto)
endif (WINDOWS)
set(OPENSSL_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
endif (STANDALONE)

View File

@ -3,6 +3,7 @@
project(linux_crash_logger)
include(00-Common)
include(GLH)
include(LLCommon)
include(LLCrashLogger)
include(LLMath)

View File

@ -34,6 +34,7 @@
// std headers
// external library headers
// other Linden headers
#include "llerror.h"
LLEventAPI::LLEventAPI(const std::string& name, const std::string& desc, const std::string& field):
lbase(name, field),
@ -45,3 +46,32 @@ LLEventAPI::LLEventAPI(const std::string& name, const std::string& desc, const s
LLEventAPI::~LLEventAPI()
{
}
LLEventAPI::Response::Response(const LLSD& seed, const LLSD& request, const LLSD::String& replyKey):
mResp(seed),
mReq(request),
mKey(replyKey)
{}
LLEventAPI::Response::~Response()
{
// When you instantiate a stack Response object, if the original
// request requested a reply, send it when we leave this block, no
// matter how.
sendReply(mResp, mReq, mKey);
}
void LLEventAPI::Response::warn(const std::string& warning)
{
LL_WARNS("LLEventAPI::Response") << warning << LL_ENDL;
mResp["warnings"].append(warning);
}
void LLEventAPI::Response::error(const std::string& error)
{
// Use LL_WARNS rather than LL_ERROR: we don't want the viewer to shut
// down altogether.
LL_WARNS("LLEventAPI::Response") << error << LL_ENDL;
mResp["error"] = error;
}

View File

@ -76,6 +76,89 @@ public:
LLEventDispatcher::add(name, desc, callable, required);
}
/**
* Instantiate a Response object in any LLEventAPI subclass method that
* wants to guarantee a reply (if requested) will be sent on exit from the
* method. The reply will be sent if request.has(@a replyKey), default
* "reply". If specified, the value of request[replyKey] is the name of
* the LLEventPump on which to send the reply. Conventionally you might
* code something like:
*
* @code
* void MyEventAPI::someMethod(const LLSD& request)
* {
* // Send a reply event as long as request.has("reply")
* Response response(LLSD(), request);
* // ...
* // will be sent in reply event
* response["somekey"] = some_data;
* }
* @endcode
*/
class LL_COMMON_API Response
{
public:
/**
* Instantiating a Response object in an LLEventAPI subclass method
* ensures that, if desired, a reply event will be sent.
*
* @a seed is the initial reply LLSD that will be further decorated before
* being sent as the reply
*
* @a request is the incoming request LLSD; we particularly care about
* [replyKey] and ["reqid"]
*
* @a replyKey [default "reply"] is the string name of the LLEventPump
* on which the caller wants a reply. If <tt>(!
* request.has(replyKey))</tt>, no reply will be sent.
*/
Response(const LLSD& seed, const LLSD& request, const LLSD::String& replyKey="reply");
~Response();
/**
* @code
* if (some condition)
* {
* response.warn("warnings are logged and collected in [\"warnings\"]");
* }
* @endcode
*/
void warn(const std::string& warning);
/**
* @code
* if (some condition isn't met)
* {
* // In a function returning void, you can validly 'return
* // expression' if the expression is itself of type void. But
* // returning is up to you; response.error() has no effect on
* // flow of control.
* return response.error("error message, logged and also sent as [\"error\"]");
* }
* @endcode
*/
void error(const std::string& error);
/**
* set other keys...
*
* @code
* // set any attributes you want to be sent in the reply
* response["info"] = some_value;
* // ...
* response["ok"] = went_well;
* @endcode
*/
LLSD& operator[](const LLSD::String& key) { return mResp[key]; }
/**
* set the response to the given data
*/
void setResponse(LLSD const & response){ mResp = response; }
LLSD mResp, mReq;
LLSD::String mKey;
};
private:
std::string mDesc;
};

View File

@ -591,6 +591,17 @@ void LLReqID::stamp(LLSD& response) const
bool sendReply(const LLSD& reply, const LLSD& request, const std::string& replyKey)
{
// If the original request has no value for replyKey, it's pointless to
// construct or send a reply event: on which LLEventPump should we send
// it? Allow that to be optional: if the caller wants to require replyKey,
// it can so specify when registering the operation method.
if (! request.has(replyKey))
{
return false;
}
// Here the request definitely contains replyKey; reasonable to proceed.
// Copy 'reply' to modify it.
LLSD newreply(reply);
// Get the ["reqid"] element from request

View File

@ -165,33 +165,60 @@ void LLMemory::logMemoryInfo(BOOL update)
llinfos << "Current allocated page size (KB): " << sAllocatedPageSizeInKB << llendl ;
llinfos << "Current availabe physical memory(KB): " << sAvailPhysicalMemInKB << llendl ;
llinfos << "Current max usable memory(KB): " << sMaxPhysicalMemInKB << llendl ;
llinfos << "--- private pool information -- " << llendl ;
llinfos << "Total reserved (KB): " << LLPrivateMemoryPoolManager::getInstance()->mTotalReservedSize / 1024 << llendl ;
llinfos << "Total allocated (KB): " << LLPrivateMemoryPoolManager::getInstance()->mTotalAllocatedSize / 1024 << llendl ;
}
//return 0: everything is normal;
//return 1: the memory pool is low, but not in danger;
//return -1: the memory pool is in danger, is about to crash.
//static
S32 LLMemory::isMemoryPoolLow()
bool LLMemory::isMemoryPoolLow()
{
static const U32 LOW_MEMEOY_POOL_THRESHOLD_KB = 64 * 1024 ; //64 MB for emergency use
const static U32 MAX_SIZE_CHECKED_MEMORY_BLOCK = 64 * 1024 * 1024 ; //64 MB
static void* last_reserved_address = NULL ;
if(!sEnableMemoryFailurePrevention)
{
return 0 ; //no memory failure prevention.
return false ; //no memory failure prevention.
}
if(sAvailPhysicalMemInKB < (LOW_MEMEOY_POOL_THRESHOLD_KB >> 2)) //out of physical memory
{
return -1 ;
return true ;
}
if(sAllocatedPageSizeInKB + (LOW_MEMEOY_POOL_THRESHOLD_KB >> 2) > sMaxHeapSizeInKB) //out of virtual address space.
{
return -1 ;
return true ;
}
return (S32)(sAvailPhysicalMemInKB < LOW_MEMEOY_POOL_THRESHOLD_KB ||
bool is_low = (S32)(sAvailPhysicalMemInKB < LOW_MEMEOY_POOL_THRESHOLD_KB ||
sAllocatedPageSizeInKB + LOW_MEMEOY_POOL_THRESHOLD_KB > sMaxHeapSizeInKB) ;
//check the virtual address space fragmentation
if(!is_low)
{
if(!last_reserved_address)
{
last_reserved_address = LLMemory::tryToAlloc(last_reserved_address, MAX_SIZE_CHECKED_MEMORY_BLOCK) ;
}
else
{
last_reserved_address = LLMemory::tryToAlloc(last_reserved_address, MAX_SIZE_CHECKED_MEMORY_BLOCK) ;
if(!last_reserved_address) //failed, try once more
{
last_reserved_address = LLMemory::tryToAlloc(last_reserved_address, MAX_SIZE_CHECKED_MEMORY_BLOCK) ;
}
}
is_low = !last_reserved_address ; //allocation failed
}
return is_low ;
}
//static
@ -1289,15 +1316,13 @@ U16 LLPrivateMemoryPool::LLMemoryChunk::getPageLevel(U32 size)
//--------------------------------------------------------------------
const U32 CHUNK_SIZE = 4 << 20 ; //4 MB
const U32 LARGE_CHUNK_SIZE = 4 * CHUNK_SIZE ; //16 MB
LLPrivateMemoryPool::LLPrivateMemoryPool(S32 type) :
LLPrivateMemoryPool::LLPrivateMemoryPool(S32 type, U32 max_pool_size) :
mMutexp(NULL),
mReservedPoolSize(0),
mHashFactor(1),
mType(type)
mType(type),
mMaxPoolSize(max_pool_size)
{
const U32 MAX_POOL_SIZE = 256 * 1024 * 1024 ; //256 MB
mMaxPoolSize = MAX_POOL_SIZE ;
if(type == STATIC_THREADED || type == VOLATILE_THREADED)
{
mMutexp = new LLMutex ;
@ -1362,16 +1387,31 @@ char* LLPrivateMemoryPool::allocate(U32 size)
chunk = chunk->mNext ;
}
}
chunk = addChunk(chunk_idx) ;
if(chunk)
else
{
p = chunk->allocate(size) ;
chunk = addChunk(chunk_idx) ;
if(chunk)
{
p = chunk->allocate(size) ;
}
}
}
unlock() ;
if(!p) //to get memory from the private pool failed, try the heap directly
{
static bool to_log = true ;
if(to_log)
{
llwarns << "The memory pool overflows, now using heap directly!" << llendl ;
to_log = false ;
}
return (char*)malloc(size) ;
}
return p ;
}
@ -1472,7 +1512,7 @@ void LLPrivateMemoryPool::destroyPool()
unlock() ;
}
void LLPrivateMemoryPool::checkSize(U32 asked_size)
bool LLPrivateMemoryPool::checkSize(U32 asked_size)
{
if(mReservedPoolSize + asked_size > mMaxPoolSize)
{
@ -1480,8 +1520,12 @@ void LLPrivateMemoryPool::checkSize(U32 asked_size)
llinfos << "Total reserved size: " << mReservedPoolSize + asked_size << llendl ;
llinfos << "Total_allocated Size: " << getTotalAllocatedSize() << llendl ;
llerrs << "The pool is overflowing..." << llendl ;
//llerrs << "The pool is overflowing..." << llendl ;
return false ;
}
return true ;
}
LLPrivateMemoryPool::LLMemoryChunk* LLPrivateMemoryPool::addChunk(S32 chunk_index)
@ -1501,7 +1545,11 @@ LLPrivateMemoryPool::LLMemoryChunk* LLPrivateMemoryPool::addChunk(S32 chunk_inde
MAX_SLOT_SIZES[chunk_index], MIN_BLOCK_SIZES[chunk_index], MAX_BLOCK_SIZES[chunk_index]) ;
}
checkSize(preferred_size + overhead) ;
if(!checkSize(preferred_size + overhead))
{
return NULL ;
}
mReservedPoolSize += preferred_size + overhead ;
char* buffer = (char*)malloc(preferred_size + overhead) ;
@ -1593,7 +1641,7 @@ LLPrivateMemoryPool::LLMemoryChunk* LLPrivateMemoryPool::findChunk(const char* a
void LLPrivateMemoryPool::addToHashTable(LLMemoryChunk* chunk)
{
static const U16 HASH_FACTORS[] = {41, 83, 193, 317, 419, 523, 0xFFFF};
static const U16 HASH_FACTORS[] = {41, 83, 193, 317, 419, 523, 719, 997, 1523, 0xFFFF};
U16 i ;
if(mChunkHashList.empty())
@ -1774,7 +1822,7 @@ void LLPrivateMemoryPool::LLChunkHashElement::remove(LLPrivateMemoryPool::LLMemo
//--------------------------------------------------------------------
LLPrivateMemoryPoolManager* LLPrivateMemoryPoolManager::sInstance = NULL ;
LLPrivateMemoryPoolManager::LLPrivateMemoryPoolManager(BOOL enabled)
LLPrivateMemoryPoolManager::LLPrivateMemoryPoolManager(BOOL enabled, U32 max_pool_size)
{
mPoolList.resize(LLPrivateMemoryPool::MAX_TYPES) ;
@ -1784,6 +1832,9 @@ LLPrivateMemoryPoolManager::LLPrivateMemoryPoolManager(BOOL enabled)
}
mPrivatePoolEnabled = enabled ;
const U32 MAX_POOL_SIZE = 256 * 1024 * 1024 ; //256 MB
mMaxPrivatePoolSize = llmax(max_pool_size, MAX_POOL_SIZE) ;
}
LLPrivateMemoryPoolManager::~LLPrivateMemoryPoolManager()
@ -1826,11 +1877,11 @@ LLPrivateMemoryPoolManager::~LLPrivateMemoryPoolManager()
}
//static
void LLPrivateMemoryPoolManager::initClass(BOOL enabled)
void LLPrivateMemoryPoolManager::initClass(BOOL enabled, U32 max_pool_size)
{
llassert_always(!sInstance) ;
sInstance = new LLPrivateMemoryPoolManager(enabled) ;
sInstance = new LLPrivateMemoryPoolManager(enabled, max_pool_size) ;
}
//static
@ -1862,7 +1913,7 @@ LLPrivateMemoryPool* LLPrivateMemoryPoolManager::newPool(S32 type)
if(!mPoolList[type])
{
mPoolList[type] = new LLPrivateMemoryPool(type) ;
mPoolList[type] = new LLPrivateMemoryPool(type, mMaxPrivatePoolSize) ;
}
return mPoolList[type] ;

View File

@ -122,7 +122,7 @@ public:
static void initMaxHeapSizeGB(F32 max_heap_size_gb, BOOL prevent_heap_failure);
static void updateMemoryInfo() ;
static void logMemoryInfo(BOOL update = FALSE);
static S32 isMemoryPoolLow();
static bool isMemoryPoolLow();
static U32 getAvailableMemKB() ;
static U32 getMaxMemKB() ;
@ -303,7 +303,7 @@ public:
} ;
private:
LLPrivateMemoryPool(S32 type) ;
LLPrivateMemoryPool(S32 type, U32 max_pool_size) ;
~LLPrivateMemoryPool() ;
char *allocate(U32 size) ;
@ -320,7 +320,7 @@ private:
void unlock() ;
S32 getChunkIndex(U32 size) ;
LLMemoryChunk* addChunk(S32 chunk_index) ;
void checkSize(U32 asked_size) ;
bool checkSize(U32 asked_size) ;
void removeChunk(LLMemoryChunk* chunk) ;
U16 findHashKey(const char* addr);
void addToHashTable(LLMemoryChunk* chunk) ;
@ -383,12 +383,12 @@ private:
class LL_COMMON_API LLPrivateMemoryPoolManager
{
private:
LLPrivateMemoryPoolManager(BOOL enabled) ;
LLPrivateMemoryPoolManager(BOOL enabled, U32 max_pool_size) ;
~LLPrivateMemoryPoolManager() ;
public:
static LLPrivateMemoryPoolManager* getInstance() ;
static void initClass(BOOL enabled) ;
static void initClass(BOOL enabled, U32 pool_size) ;
static void destroyClass() ;
LLPrivateMemoryPool* newPool(S32 type) ;
@ -398,6 +398,7 @@ private:
static LLPrivateMemoryPoolManager* sInstance ;
std::vector<LLPrivateMemoryPool*> mPoolList ;
BOOL mPrivatePoolEnabled;
U32 mMaxPrivatePoolSize;
public:
//debug and statistics info.

View File

@ -28,8 +28,8 @@
#define LL_LLVERSIONVIEWER_H
const S32 LL_VERSION_MAJOR = 3;
const S32 LL_VERSION_MINOR = 0;
const S32 LL_VERSION_PATCH = 6;
const S32 LL_VERSION_MINOR = 1;
const S32 LL_VERSION_PATCH = 1;
const S32 LL_VERSION_BUILD = 0;
const char * const LL_CHANNEL = "Second Life Developer";

View File

@ -538,7 +538,7 @@ std::string LLMaterialTable::getName(U8 mcode)
}
}
return NULL;
return std::string();
}

View File

@ -112,6 +112,7 @@ set(llui_SOURCE_FILES
llurlmatch.cpp
llurlregistry.cpp
llviewborder.cpp
llviewinject.cpp
llviewmodel.cpp
llview.cpp
llviewquery.cpp
@ -216,6 +217,7 @@ set(llui_HEADER_FILES
llurlmatch.h
llurlregistry.h
llviewborder.h
llviewinject.h
llviewmodel.h
llview.h
llviewquery.h

View File

@ -198,6 +198,7 @@ LLLineEditor::~LLLineEditor()
void LLLineEditor::onFocusReceived()
{
gEditMenuHandler = this;
LLUICtrl::onFocusReceived();
updateAllowingLanguageInput();
}

View File

@ -88,10 +88,10 @@ struct LLNotificationTemplate
{
private:
// this idiom allows
// <notification unique="true">
// <notification> <unique/> </notification>
// as well as
// <notification> <unique> <context></context> </unique>...
Optional<bool> dummy_val;
Flag dummy_val;
public:
Multiple<UniquenessContext> contexts;

View File

@ -223,6 +223,15 @@ BOOL LLScrollContainer::handleKeyHere(KEY key, MASK mask)
return FALSE;
}
BOOL LLScrollContainer::handleUnicodeCharHere(llwchar uni_char)
{
if (mScrolledView && mScrolledView->handleUnicodeCharHere(uni_char))
{
return TRUE;
}
return FALSE;
}
BOOL LLScrollContainer::handleScrollWheel( S32 x, S32 y, S32 clicks )
{
// Give event to my child views - they may have scroll bars

View File

@ -103,6 +103,7 @@ public:
// LLView functionality
virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
virtual BOOL handleKeyHere(KEY key, MASK mask);
virtual BOOL handleUnicodeCharHere(llwchar uni_char);
virtual BOOL handleScrollWheel( S32 x, S32 y, S32 clicks );
virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,

View File

@ -1045,3 +1045,9 @@ boost::signals2::connection LLUICtrl::setDoubleClickCallback( const mouse_signal
if (!mDoubleClickSignal) mDoubleClickSignal = new mouse_signal_t();
return mDoubleClickSignal->connect(cb);
}
void LLUICtrl::addInfo(LLSD & info)
{
LLView::addInfo(info);
info["value"] = getValue();
}

View File

@ -301,7 +301,9 @@ protected:
static F32 sActiveControlTransparency;
static F32 sInactiveControlTransparency;
virtual void addInfo(LLSD & info);
private:
BOOL mIsChrome;

View File

@ -125,12 +125,12 @@ private:
// base case for recursion, there are NO base classes of LLInitParam::BaseBlock
template<int DUMMY>
class ParamDefaults<LLInitParam::BaseBlock, DUMMY> : public LLSingleton<ParamDefaults<LLInitParam::BaseBlock, DUMMY> >
class ParamDefaults<LLInitParam::BaseBlockWithFlags, DUMMY> : public LLSingleton<ParamDefaults<LLInitParam::BaseBlockWithFlags, DUMMY> >
{
public:
const LLInitParam::BaseBlock& get() { return mBaseBlock; }
const LLInitParam::BaseBlockWithFlags& get() { return mBaseBlock; }
private:
LLInitParam::BaseBlock mBaseBlock;
LLInitParam::BaseBlockWithFlags mBaseBlock;
};
public:

View File

@ -31,7 +31,10 @@
#include "llview.h"
#include <cassert>
#include <sstream>
#include <boost/tokenizer.hpp>
#include <boost/foreach.hpp>
#include <boost/bind.hpp>
#include "llrender.h"
#include "llevent.h"
@ -44,6 +47,7 @@
#include "v3color.h"
#include "lluictrlfactory.h"
#include "lltooltip.h"
#include "llsdutil.h"
// for ui edit hack
#include "llbutton.h"
@ -66,6 +70,8 @@ S32 LLView::sLastLeftXML = S32_MIN;
S32 LLView::sLastBottomXML = S32_MIN;
std::vector<LLViewDrawContext*> LLViewDrawContext::sDrawContextStack;
LLView::DrilldownFunc LLView::sDrilldown =
boost::bind(&LLView::pointInView, _1, _2, _3, HIT_TEST_USE_BOUNDING_RECT);
//#if LL_DEBUG
BOOL LLView::sIsDrawing = FALSE;
@ -346,13 +352,11 @@ void LLView::removeChild(LLView* child)
LLView::ctrl_list_t LLView::getCtrlList() const
{
ctrl_list_t controls;
for(child_list_const_iter_t iter = mChildList.begin();
iter != mChildList.end();
iter++)
BOOST_FOREACH(LLView* viewp, mChildList)
{
if((*iter)->isCtrl())
if(viewp->isCtrl())
{
controls.push_back(static_cast<LLUICtrl*>(*iter));
controls.push_back(static_cast<LLUICtrl*>(viewp));
}
}
return controls;
@ -428,6 +432,36 @@ BOOL LLView::isInEnabledChain() const
return enabled;
}
static void buildPathname(std::ostream& out, const LLView* view)
{
if (! (view && view->getParent()))
{
return; // Don't include root in the path.
}
buildPathname(out, view->getParent());
// Build pathname into ostream on the way back from recursion.
out << '/' << view->getName();
}
std::string LLView::getPathname() const
{
std::ostringstream out;
buildPathname(out, this);
return out.str();
}
//static
std::string LLView::getPathname(const LLView* view)
{
if (! view)
{
return "NULL";
}
return view->getPathname();
}
// virtual
BOOL LLView::canFocusChildren() const
{
@ -574,9 +608,8 @@ void LLView::deleteAllChildren()
void LLView::setAllChildrenEnabled(BOOL b)
{
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
BOOST_FOREACH(LLView* viewp, mChildList)
{
LLView* viewp = *child_it;
viewp->setEnabled(b);
}
}
@ -602,9 +635,8 @@ void LLView::setVisible(BOOL visible)
// virtual
void LLView::handleVisibilityChange ( BOOL new_visibility )
{
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
BOOST_FOREACH(LLView* viewp, mChildList)
{
LLView* viewp = *child_it;
// only views that are themselves visible will have their overall visibility affected by their ancestors
if (viewp->getVisible())
{
@ -646,56 +678,178 @@ void LLView::onMouseLeave(S32 x, S32 y, MASK mask)
//llinfos << "Mouse left " << getName() << llendl;
}
bool LLView::visibleAndContains(S32 local_x, S32 local_y)
{
return sDrilldown(this, local_x, local_y)
&& getVisible();
}
bool LLView::visibleEnabledAndContains(S32 local_x, S32 local_y)
{
return visibleAndContains(local_x, local_y)
&& getEnabled();
}
void LLView::logMouseEvent()
{
if (sDebugMouseHandling)
{
sMouseHandlerMessage = std::string("/") + mName + sMouseHandlerMessage;
}
}
template <typename METHOD, typename CHARTYPE>
LLView* LLView::childrenHandleCharEvent(const std::string& desc, const METHOD& method,
CHARTYPE c, MASK mask)
{
if ( getVisible() && getEnabled() )
{
BOOST_FOREACH(LLView* viewp, mChildList)
{
if ((viewp->*method)(c, mask, TRUE))
{
if (LLView::sDebugKeys)
{
llinfos << desc << " handled by " << viewp->getName() << llendl;
}
return viewp;
}
}
}
return NULL;
}
// XDATA might be MASK, or S32 clicks
template <typename METHOD, typename XDATA>
LLView* LLView::childrenHandleMouseEvent(const METHOD& method, S32 x, S32 y, XDATA extra)
{
BOOST_FOREACH(LLView* viewp, mChildList)
{
S32 local_x = x - viewp->getRect().mLeft;
S32 local_y = y - viewp->getRect().mBottom;
if (!viewp->visibleEnabledAndContains(local_x, local_y))
{
continue;
}
if ((viewp->*method)( local_x, local_y, extra )
|| viewp->blockMouseEvent( local_x, local_y ))
{
viewp->logMouseEvent();
return viewp;
}
}
return NULL;
}
LLView* LLView::childrenHandleToolTip(S32 x, S32 y, MASK mask)
{
LLView* handled_view = NULL;
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
BOOST_FOREACH(LLView* viewp, mChildList)
{
LLView* viewp = *child_it;
S32 local_x = x - viewp->getRect().mLeft;
S32 local_y = y - viewp->getRect().mBottom;
if(!viewp->pointInView(local_x, local_y)
|| !viewp->getVisible())
// Differs from childrenHandleMouseEvent() in that we want to offer
// tooltips even for disabled widgets.
if(!viewp->visibleAndContains(local_x, local_y))
{
continue;
}
if (viewp->handleToolTip(local_x, local_y, mask) )
if (viewp->handleToolTip(local_x, local_y, mask)
|| viewp->blockMouseEvent(local_x, local_y))
{
if (sDebugMouseHandling)
{
sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
}
handled_view = viewp;
break;
}
if (viewp->blockMouseEvent(local_x, local_y))
{
handled_view = viewp;
break;
viewp->logMouseEvent();
return viewp;
}
}
return handled_view;
return NULL;
}
LLView* LLView::childFromPoint(S32 x, S32 y)
LLView* LLView::childrenHandleDragAndDrop(S32 x, S32 y, MASK mask,
BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg)
{
if (!getVisible() )
return false;
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
// default to not accepting drag and drop, will be overridden by handler
*accept = ACCEPT_NO;
BOOST_FOREACH(LLView* viewp, mChildList)
{
LLView* viewp = *child_it;
S32 local_x = x - viewp->getRect().mLeft;
S32 local_y = y - viewp->getRect().mBottom;
if (!viewp->pointInView(local_x, local_y)
|| !viewp->getVisible() )
if( !viewp->visibleEnabledAndContains(local_x, local_y))
{
continue;
}
// Differs from childrenHandleMouseEvent() simply in that this virtual
// method call diverges pretty radically from the usual (x, y, int).
if (viewp->handleDragAndDrop(local_x, local_y, mask, drop,
cargo_type,
cargo_data,
accept,
tooltip_msg)
|| viewp->blockMouseEvent(local_x, local_y))
{
return viewp;
}
}
return NULL;
}
LLView* LLView::childrenHandleHover(S32 x, S32 y, MASK mask)
{
BOOST_FOREACH(LLView* viewp, mChildList)
{
S32 local_x = x - viewp->getRect().mLeft;
S32 local_y = y - viewp->getRect().mBottom;
if(!viewp->visibleEnabledAndContains(local_x, local_y))
{
continue;
}
// This call differentiates this method from childrenHandleMouseEvent().
LLUI::sWindow->setCursor(viewp->getHoverCursor());
if (viewp->handleHover(local_x, local_y, mask)
|| viewp->blockMouseEvent(local_x, local_y))
{
viewp->logMouseEvent();
return viewp;
}
}
return NULL;
}
LLView* LLView::childFromPoint(S32 x, S32 y, bool recur)
{
if (!getVisible())
return false;
BOOST_FOREACH(LLView* viewp, mChildList)
{
S32 local_x = x - viewp->getRect().mLeft;
S32 local_y = y - viewp->getRect().mBottom;
if (!viewp->visibleAndContains(local_x, local_y))
{
continue;
}
// Here we've found the first (frontmost) visible child at this level
// containing the specified point. Is the caller asking us to drill
// down and return the innermost leaf child at this point, or just the
// top-level child?
if (recur)
{
LLView* leaf(viewp->childFromPoint(local_x, local_y, recur));
// Maybe viewp is already a leaf LLView, or maybe it has children
// but this particular (x, y) point falls between them. If the
// recursive call returns non-NULL, great, use that; else just use
// viewp.
return leaf? leaf : viewp;
}
return viewp;
}
@ -815,45 +969,6 @@ BOOL LLView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
return childrenHandleDragAndDrop( x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg) != NULL;
}
LLView* LLView::childrenHandleDragAndDrop(S32 x, S32 y, MASK mask,
BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg)
{
LLView* handled_view = NULL;
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
LLView* viewp = *child_it;
S32 local_x = x - viewp->getRect().mLeft;
S32 local_y = y - viewp->getRect().mBottom;
if( !viewp->pointInView(local_x, local_y) ||
!viewp->getVisible() ||
!viewp->getEnabled())
{
continue;
}
if (viewp->handleDragAndDrop(local_x, local_y, mask, drop,
cargo_type,
cargo_data,
accept,
tooltip_msg))
{
handled_view = viewp;
break;
}
if (viewp->blockMouseEvent(x, y))
{
*accept = ACCEPT_NO;
handled_view = viewp;
break;
}
}
return handled_view;
}
void LLView::onMouseCaptureLost()
{
}
@ -903,391 +1018,57 @@ BOOL LLView::handleMiddleMouseUp(S32 x, S32 y, MASK mask)
return childrenHandleMiddleMouseUp( x, y, mask ) != NULL;
}
LLView* LLView::childrenHandleScrollWheel(S32 x, S32 y, S32 clicks)
{
LLView* handled_view = NULL;
if (getVisible() && getEnabled() )
{
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
LLView* viewp = *child_it;
S32 local_x = x - viewp->getRect().mLeft;
S32 local_y = y - viewp->getRect().mBottom;
if (!viewp->pointInView(local_x, local_y)
|| !viewp->getVisible()
|| !viewp->getEnabled())
{
continue;
}
if (viewp->handleScrollWheel( local_x, local_y, clicks ))
{
if (sDebugMouseHandling)
{
sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
}
handled_view = viewp;
break;
}
}
}
return handled_view;
}
LLView* LLView::childrenHandleHover(S32 x, S32 y, MASK mask)
{
LLView* handled_view = NULL;
if (getVisible() && getEnabled() )
{
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
LLView* viewp = *child_it;
S32 local_x = x - viewp->getRect().mLeft;
S32 local_y = y - viewp->getRect().mBottom;
if(!viewp->pointInView(local_x, local_y)
|| !viewp->getVisible()
|| !viewp->getEnabled())
{
continue;
}
if (viewp->handleHover(local_x, local_y, mask) )
{
if (sDebugMouseHandling)
{
sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
}
handled_view = viewp;
break;
}
if (viewp->blockMouseEvent(local_x, local_y))
{
LLUI::sWindow->setCursor(viewp->getHoverCursor());
handled_view = viewp;
break;
}
}
}
return handled_view;
return childrenHandleMouseEvent(&LLView::handleScrollWheel, x, y, clicks);
}
// Called during downward traversal
LLView* LLView::childrenHandleKey(KEY key, MASK mask)
{
LLView* handled_view = NULL;
if ( getVisible() && getEnabled() )
{
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
LLView* viewp = *child_it;
if (viewp->handleKey(key, mask, TRUE))
{
if (LLView::sDebugKeys)
{
llinfos << "Key handled by " << viewp->getName() << llendl;
}
handled_view = viewp;
break;
}
}
}
return handled_view;
return childrenHandleCharEvent("Key", &LLView::handleKey, key, mask);
}
// Called during downward traversal
LLView* LLView::childrenHandleUnicodeChar(llwchar uni_char)
{
LLView* handled_view = NULL;
if ( getVisible() && getEnabled() )
{
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
LLView* viewp = *child_it;
if (viewp->handleUnicodeChar(uni_char, TRUE))
{
if (LLView::sDebugKeys)
{
llinfos << "Unicode character handled by " << viewp->getName() << llendl;
}
handled_view = viewp;
break;
}
}
}
return handled_view;
return childrenHandleCharEvent("Unicode character", &LLView::handleUnicodeCharWithDummyMask,
uni_char, MASK_NONE);
}
LLView* LLView::childrenHandleMouseDown(S32 x, S32 y, MASK mask)
{
LLView* handled_view = NULL;
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
LLView* viewp = *child_it;
S32 local_x = x - viewp->getRect().mLeft;
S32 local_y = y - viewp->getRect().mBottom;
if (!viewp->pointInView(local_x, local_y)
|| !viewp->getVisible()
|| !viewp->getEnabled())
{
continue;
}
if(viewp->handleMouseDown( local_x, local_y, mask ))
{
if (sDebugMouseHandling)
{
sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
}
handled_view = viewp;
break;
}
if(viewp->blockMouseEvent(local_x, local_y))
{
handled_view = viewp;
break;
}
}
return handled_view;
return childrenHandleMouseEvent(&LLView::handleMouseDown, x, y, mask);
}
LLView* LLView::childrenHandleRightMouseDown(S32 x, S32 y, MASK mask)
{
LLView* handled_view = NULL;
if (getVisible() && getEnabled() )
{
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
LLView* viewp = *child_it;
S32 local_x = x - viewp->getRect().mLeft;
S32 local_y = y - viewp->getRect().mBottom;
if (!viewp->pointInView(local_x, local_y)
|| !viewp->getVisible()
|| !viewp->getEnabled())
{
continue;
}
if (viewp->handleRightMouseDown( local_x, local_y, mask ))
{
if (sDebugMouseHandling)
{
sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
}
handled_view = viewp;
break;
}
if (viewp->blockMouseEvent(local_x, local_y))
{
handled_view = viewp;
break;
}
}
}
return handled_view;
return childrenHandleMouseEvent(&LLView::handleRightMouseDown, x, y, mask);
}
LLView* LLView::childrenHandleMiddleMouseDown(S32 x, S32 y, MASK mask)
{
LLView* handled_view = NULL;
if (getVisible() && getEnabled() )
{
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
LLView* viewp = *child_it;
S32 local_x = x - viewp->getRect().mLeft;
S32 local_y = y - viewp->getRect().mBottom;
if (!viewp->pointInView(local_x, local_y)
|| !viewp->getVisible()
|| !viewp->getEnabled())
{
continue;
}
if(viewp->handleMiddleMouseDown( local_x, local_y, mask ))
{
if (sDebugMouseHandling)
{
sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
}
handled_view = viewp;
break;
}
if (viewp->blockMouseEvent(local_x, local_y))
{
handled_view = viewp;
break;
}
}
}
return handled_view;
return childrenHandleMouseEvent(&LLView::handleMiddleMouseDown, x, y, mask);
}
LLView* LLView::childrenHandleDoubleClick(S32 x, S32 y, MASK mask)
{
LLView* handled_view = NULL;
if (getVisible() && getEnabled() )
{
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
LLView* viewp = *child_it;
S32 local_x = x - viewp->getRect().mLeft;
S32 local_y = y - viewp->getRect().mBottom;
if (!viewp->pointInView(local_x, local_y)
|| !viewp->getVisible()
|| !viewp->getEnabled())
{
continue;
}
if (viewp->handleDoubleClick( local_x, local_y, mask ))
{
if (sDebugMouseHandling)
{
sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
}
handled_view = viewp;
break;
}
if (viewp->blockMouseEvent(local_x, local_y))
{
handled_view = viewp;
break;
}
}
}
return handled_view;
return childrenHandleMouseEvent(&LLView::handleDoubleClick, x, y, mask);
}
LLView* LLView::childrenHandleMouseUp(S32 x, S32 y, MASK mask)
{
LLView* handled_view = NULL;
if( getVisible() && getEnabled() )
{
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
LLView* viewp = *child_it;
S32 local_x = x - viewp->getRect().mLeft;
S32 local_y = y - viewp->getRect().mBottom;
if (!viewp->pointInView(local_x, local_y)
|| !viewp->getVisible()
|| !viewp->getEnabled())
{
continue;
}
if (viewp->handleMouseUp( local_x, local_y, mask ))
{
if (sDebugMouseHandling)
{
sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
}
handled_view = viewp;
break;
}
if (viewp->blockMouseEvent(local_x, local_y))
{
handled_view = viewp;
break;
}
}
}
return handled_view;
return childrenHandleMouseEvent(&LLView::handleMouseUp, x, y, mask);
}
LLView* LLView::childrenHandleRightMouseUp(S32 x, S32 y, MASK mask)
{
LLView* handled_view = NULL;
if( getVisible() && getEnabled() )
{
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
LLView* viewp = *child_it;
S32 local_x = x - viewp->getRect().mLeft;
S32 local_y = y - viewp->getRect().mBottom;
if (!viewp->pointInView(local_x, local_y)
|| !viewp->getVisible()
|| !viewp->getEnabled() )
{
continue;
}
if(viewp->handleRightMouseUp( local_x, local_y, mask ))
{
if (sDebugMouseHandling)
{
sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
}
handled_view = viewp;
break;
}
if(viewp->blockMouseEvent(local_x, local_y))
{
handled_view = viewp;
break;
}
}
}
return handled_view;
return childrenHandleMouseEvent(&LLView::handleRightMouseUp, x, y, mask);
}
LLView* LLView::childrenHandleMiddleMouseUp(S32 x, S32 y, MASK mask)
{
LLView* handled_view = NULL;
if( getVisible() && getEnabled() )
{
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
LLView* viewp = *child_it;
S32 local_x = x - viewp->getRect().mLeft;
S32 local_y = y - viewp->getRect().mBottom;
if (!viewp->pointInView(local_x, local_y)
|| !viewp->getVisible()
|| !viewp->getEnabled())
{
continue;
}
if(viewp->handleMiddleMouseUp( local_x, local_y, mask ))
{
if (sDebugMouseHandling)
{
sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
}
handled_view = viewp;
break;
}
if (viewp->blockMouseEvent(local_x, local_y))
{
handled_view = viewp;
break;
}
}
}
return handled_view;
return childrenHandleMouseEvent(&LLView::handleMiddleMouseUp, x, y, mask);
}
void LLView::draw()
@ -1460,9 +1241,8 @@ void LLView::reshape(S32 width, S32 height, BOOL called_from_parent)
mRect.mTop = getRect().mBottom + height;
// move child views according to reshape flags
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
BOOST_FOREACH(LLView* viewp, mChildList)
{
LLView* viewp = *child_it;
LLRect child_rect( viewp->mRect );
if (viewp->followsRight() && viewp->followsLeft())
@ -1525,10 +1305,8 @@ LLRect LLView::calcBoundingRect()
{
LLRect local_bounding_rect = LLRect::null;
child_list_const_iter_t child_it;
for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
BOOST_FOREACH(LLView* childp, mChildList)
{
LLView* childp = *child_it;
// ignore invisible and "top" children when calculating bounding rect
// such as combobox popups
if (!childp->getVisible() || childp == gFocusMgr.getTopCtrl())
@ -1693,11 +1471,9 @@ LLView* LLView::findChildView(const std::string& name, BOOL recurse) const
//richard: should we allow empty names?
//if(name.empty())
// return NULL;
child_list_const_iter_t child_it;
// Look for direct children *first*
for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
BOOST_FOREACH(LLView* childp, mChildList)
{
LLView* childp = *child_it;
llassert(childp);
if (childp->getName() == name)
{
@ -1707,9 +1483,8 @@ LLView* LLView::findChildView(const std::string& name, BOOL recurse) const
if (recurse)
{
// Look inside each child as well.
for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
BOOST_FOREACH(LLView* childp, mChildList)
{
LLView* childp = *child_it;
llassert(childp);
LLView* viewp = childp->findChildView(name, recurse);
if ( viewp )
@ -2850,9 +2625,9 @@ S32 LLView::notifyParent(const LLSD& info)
bool LLView::notifyChildren(const LLSD& info)
{
bool ret = false;
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
BOOST_FOREACH(LLView* childp, mChildList)
{
ret |= (*child_it)->notifyChildren(info);
ret = ret || childp->notifyChildren(info);
}
return ret;
}
@ -2872,3 +2647,24 @@ const LLViewDrawContext& LLViewDrawContext::getCurrentContext()
return *sDrawContextStack.back();
}
LLSD LLView::getInfo(void)
{
LLSD info;
addInfo(info);
return info;
}
void LLView::addInfo(LLSD & info)
{
info["path"] = getPathname();
info["class"] = typeid(*this).name();
info["visible"] = getVisible();
info["visible_chain"] = isInVisibleChain();
info["enabled"] = getEnabled();
info["enabled_chain"] = isInEnabledChain();
info["available"] = isAvailable();
LLRect rect(calcScreenRect());
info["rect"] = LLSDMap("left", rect.mLeft)("top", rect.mTop)
("right", rect.mRight)("bottom", rect.mBottom);
}

View File

@ -50,6 +50,8 @@
#include "llfocusmgr.h"
#include <list>
#include <boost/function.hpp>
#include <boost/noncopyable.hpp>
class LLSD;
@ -437,12 +439,15 @@ public:
/*virtual*/ void screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const;
/*virtual*/ void localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const;
virtual LLView* childFromPoint(S32 x, S32 y);
virtual LLView* childFromPoint(S32 x, S32 y, bool recur=false);
// view-specific handlers
virtual void onMouseEnter(S32 x, S32 y, MASK mask);
virtual void onMouseLeave(S32 x, S32 y, MASK mask);
std::string getPathname() const;
// static method handles NULL pointer too
static std::string getPathname(const LLView*);
template <class T> T* findChild(const std::string& name, BOOL recurse = TRUE) const
{
@ -511,11 +516,17 @@ public:
virtual S32 notify(const LLSD& info) { return 0;};
static const LLViewDrawContext& getDrawContext();
// Returns useful information about this ui widget.
LLSD getInfo(void);
protected:
void drawDebugRect();
void drawChild(LLView* childp, S32 x_offset = 0, S32 y_offset = 0, BOOL force_draw = FALSE);
void drawChildren();
bool visibleAndContains(S32 local_x, S32 local_Y);
bool visibleEnabledAndContains(S32 local_x, S32 local_y);
void logMouseEvent();
LLView* childrenHandleKey(KEY key, MASK mask);
LLView* childrenHandleUnicodeChar(llwchar uni_char);
@ -538,9 +549,24 @@ protected:
LLView* childrenHandleToolTip(S32 x, S32 y, MASK mask);
ECursorType mHoverCursor;
virtual void addInfo(LLSD & info);
private:
template <typename METHOD, typename XDATA>
LLView* childrenHandleMouseEvent(const METHOD& method, S32 x, S32 y, XDATA extra);
template <typename METHOD, typename CHARTYPE>
LLView* childrenHandleCharEvent(const std::string& desc, const METHOD& method,
CHARTYPE c, MASK mask);
// adapter to blur distinction between handleKey() and handleUnicodeChar()
// for childrenHandleCharEvent()
BOOL handleUnicodeCharWithDummyMask(llwchar uni_char, MASK /* dummy */, BOOL from_parent)
{
return handleUnicodeChar(uni_char, from_parent);
}
LLView* mParentView;
child_list_t mChildList;
@ -582,7 +608,35 @@ private:
LLView& getDefaultWidgetContainer() const;
// This allows special mouse-event targeting logic for testing.
typedef boost::function<bool(const LLView*, S32 x, S32 y)> DrilldownFunc;
static DrilldownFunc sDrilldown;
public:
// This is the only public accessor to alter sDrilldown. This is not
// an accident. The intended usage pattern is like:
// {
// LLView::TemporaryDrilldownFunc scoped_func(myfunctor);
// // ... test with myfunctor ...
// } // exiting block restores original LLView::sDrilldown
class TemporaryDrilldownFunc: public boost::noncopyable
{
public:
TemporaryDrilldownFunc(const DrilldownFunc& func):
mOldDrilldown(sDrilldown)
{
sDrilldown = func;
}
~TemporaryDrilldownFunc()
{
sDrilldown = mOldDrilldown;
}
private:
DrilldownFunc mOldDrilldown;
};
// Depth in view hierarchy during rendering
static S32 sDepth;

View File

@ -0,0 +1,49 @@
/**
* @file llviewinject.cpp
* @author Nat Goodspeed
* @date 2011-08-16
* @brief Implementation for llviewinject.
*
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
* Copyright (c) 2011, Linden Research, Inc.
* $/LicenseInfo$
*/
// Precompiled header
#include "linden_common.h"
// associated header
#include "llviewinject.h"
// STL headers
// std headers
// external library headers
// other Linden headers
llview::TargetEvent::TargetEvent(LLView* view)
{
// Walk up the view tree from target LLView to the root (NULL). If
// passed NULL, iterate 0 times.
for (; view; view = view->getParent())
{
// At each level, operator() is going to ask: for a particular parent
// LLView*, which of its children should I select? So for this view's
// parent, select this view.
mChildMap[view->getParent()] = view;
}
}
bool llview::TargetEvent::operator()(const LLView* view, S32 /*x*/, S32 /*y*/) const
{
// We are being called to decide whether to direct an incoming mouse event
// to this child view. (Normal LLView processing is to check whether the
// incoming (x, y) is within the view.) Look up the parent to decide
// whether, for that parent, this is the previously-selected child.
ChildMap::const_iterator found(mChildMap.find(view->getParent()));
// If we're looking at a child whose parent isn't even in the map, never
// mind.
if (found == mChildMap.end())
{
return false;
}
// So, is this the predestined child for this parent?
return (view == found->second);
}

56
indra/llui/llviewinject.h Normal file
View File

@ -0,0 +1,56 @@
/**
* @file llviewinject.h
* @author Nat Goodspeed
* @date 2011-08-16
* @brief Supplemental LLView functionality used for simulating UI events.
*
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
* Copyright (c) 2011, Linden Research, Inc.
* $/LicenseInfo$
*/
#if ! defined(LL_LLVIEWINJECT_H)
#define LL_LLVIEWINJECT_H
#include "llview.h"
#include <map>
namespace llview
{
/**
* TargetEvent is a callable with state, specifically intended for use as
* an LLView::TemporaryDrilldownFunc. Instantiate it with the desired
* target LLView*; pass it to a TemporaryDrilldownFunc instance;
* TargetEvent::operator() will then attempt to direct subsequent mouse
* events to the desired target LLView*. (This is an "attempt" because
* LLView will still balk unless the target LLView and every parent are
* visible and enabled.)
*/
class TargetEvent
{
public:
/**
* Construct TargetEvent with the desired target LLView*. (See
* LLUI::resolvePath() to obtain an LLView* given a string pathname.)
* This sets up for operator().
*/
TargetEvent(LLView* view);
/**
* This signature must match LLView::DrilldownFunc. When you install
* this TargetEvent instance using LLView::TemporaryDrilldownFunc,
* LLView will call this method to decide whether to propagate an
* incoming mouse event to the passed child LLView*.
*/
bool operator()(const LLView*, S32 x, S32 y) const;
private:
// For a given parent LLView, identify which child to select.
typedef std::map<LLView*, LLView*> ChildMap;
ChildMap mChildMap;
};
} // llview namespace
#endif /* ! defined(LL_LLVIEWINJECT_H) */

View File

@ -38,7 +38,6 @@ set(llwindow_SOURCE_FILES
llkeyboardheadless.cpp
llwindowheadless.cpp
llwindowcallbacks.cpp
llwindowlistener.cpp
)
set(llwindow_HEADER_FILES
@ -48,7 +47,6 @@ set(llwindow_HEADER_FILES
llkeyboardheadless.h
llwindowheadless.h
llwindowcallbacks.h
llwindowlistener.h
)
set(viewer_SOURCE_FILES

View File

@ -41,8 +41,6 @@
#include "llkeyboard.h"
#include "linked_lists.h"
#include "llwindowcallbacks.h"
#include "llwindowlistener.h"
#include <boost/lambda/core.hpp>
//
@ -118,17 +116,10 @@ LLWindow::LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags)
mFlags(flags),
mHighSurrogate(0)
{
// gKeyboard is still NULL, so it doesn't do LLWindowListener any good to
// pass its value right now. Instead, pass it a nullary function that
// will, when we later need it, return the value of gKeyboard.
// boost::lambda::var() constructs such a functor on the fly.
mListener = new LLWindowListener(callbacks, boost::lambda::var(gKeyboard));
}
LLWindow::~LLWindow()
{
delete mListener;
mListener = NULL;
}
//virtual

View File

@ -36,7 +36,6 @@
class LLSplashScreen;
class LLPreeditor;
class LLWindowCallbacks;
class LLWindowListener;
// Refer to llwindow_test in test/common/llwindow for usage example
@ -189,7 +188,6 @@ protected:
BOOL mHideCursorPermanent;
U32 mFlags;
U16 mHighSurrogate;
LLWindowListener* mListener;
// Handle a UTF-16 encoding unit received from keyboard.
// Converting the series of UTF-16 encoding units to UTF-32 data,

View File

@ -1,307 +0,0 @@
/**
* @file llwindowlistener.cpp
* @brief EventAPI interface for injecting input into LLWindow
*
* $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$
*/
#include "linden_common.h"
#include "llwindowlistener.h"
#include "llcoord.h"
#include "llkeyboard.h"
#include "llwindowcallbacks.h"
#include <map>
LLWindowListener::LLWindowListener(LLWindowCallbacks *window, const KeyboardGetter& kbgetter)
: LLEventAPI("LLWindow", "Inject input events into the LLWindow instance"),
mWindow(window),
mKbGetter(kbgetter)
{
std::string keySomething =
"Given [\"keysym\"], [\"keycode\"] or [\"char\"], inject the specified ";
std::string keyExplain =
"(integer keycode values, or keysym \"XXXX\" from any KEY_XXXX, in\n"
"http://hg.secondlife.com/viewer-development/src/tip/indra/llcommon/indra_constants.h )";
std::string mask =
"Specify optional [\"mask\"] as an array containing any of \"CONTROL\", \"ALT\",\n"
"\"SHIFT\" or \"MAC_CONTROL\"; the corresponding modifier bits will be combined\n"
"to form the mask used with the event.";
std::string mouseSomething =
"Given [\"button\"], [\"x\"] and [\"y\"], inject the given mouse ";
std::string mouseExplain =
"(button values \"LEFT\", \"MIDDLE\", \"RIGHT\")";
add("keyDown",
keySomething + "keypress event.\n" + keyExplain + '\n' + mask,
&LLWindowListener::keyDown);
add("keyUp",
keySomething + "key release event.\n" + keyExplain + '\n' + mask,
&LLWindowListener::keyUp);
add("mouseDown",
mouseSomething + "click event.\n" + mouseExplain + '\n' + mask,
&LLWindowListener::mouseDown);
add("mouseUp",
mouseSomething + "release event.\n" + mouseExplain + '\n' + mask,
&LLWindowListener::mouseUp);
add("mouseMove",
std::string("Given [\"x\"] and [\"y\"], inject the given mouse movement event.\n") +
mask,
&LLWindowListener::mouseMove);
add("mouseScroll",
"Given an integer number of [\"clicks\"], inject the given mouse scroll event.\n"
"(positive clicks moves downward through typical content)",
&LLWindowListener::mouseScroll);
}
template <typename MAPPED>
class StringLookup
{
private:
std::string mDesc;
typedef std::map<std::string, MAPPED> Map;
Map mMap;
public:
StringLookup(const std::string& desc): mDesc(desc) {}
MAPPED lookup(const typename Map::key_type& key) const
{
typename Map::const_iterator found = mMap.find(key);
if (found == mMap.end())
{
LL_WARNS("LLWindowListener") << "Unknown " << mDesc << " '" << key << "'" << LL_ENDL;
return MAPPED();
}
return found->second;
}
protected:
void add(const typename Map::key_type& key, const typename Map::mapped_type& value)
{
mMap.insert(typename Map::value_type(key, value));
}
};
// for WhichKeysym. KeyProxy is like the typedef KEY, except that KeyProxy()
// (default-constructed) is guaranteed to have the value KEY_NONE.
class KeyProxy
{
public:
KeyProxy(KEY k): mKey(k) {}
KeyProxy(): mKey(KEY_NONE) {}
operator KEY() const { return mKey; }
private:
KEY mKey;
};
struct WhichKeysym: public StringLookup<KeyProxy>
{
WhichKeysym(): StringLookup<KeyProxy>("keysym")
{
add("RETURN", KEY_RETURN);
add("LEFT", KEY_LEFT);
add("RIGHT", KEY_RIGHT);
add("UP", KEY_UP);
add("DOWN", KEY_DOWN);
add("ESCAPE", KEY_ESCAPE);
add("BACKSPACE", KEY_BACKSPACE);
add("DELETE", KEY_DELETE);
add("SHIFT", KEY_SHIFT);
add("CONTROL", KEY_CONTROL);
add("ALT", KEY_ALT);
add("HOME", KEY_HOME);
add("END", KEY_END);
add("PAGE_UP", KEY_PAGE_UP);
add("PAGE_DOWN", KEY_PAGE_DOWN);
add("HYPHEN", KEY_HYPHEN);
add("EQUALS", KEY_EQUALS);
add("INSERT", KEY_INSERT);
add("CAPSLOCK", KEY_CAPSLOCK);
add("TAB", KEY_TAB);
add("ADD", KEY_ADD);
add("SUBTRACT", KEY_SUBTRACT);
add("MULTIPLY", KEY_MULTIPLY);
add("DIVIDE", KEY_DIVIDE);
add("F1", KEY_F1);
add("F2", KEY_F2);
add("F3", KEY_F3);
add("F4", KEY_F4);
add("F5", KEY_F5);
add("F6", KEY_F6);
add("F7", KEY_F7);
add("F8", KEY_F8);
add("F9", KEY_F9);
add("F10", KEY_F10);
add("F11", KEY_F11);
add("F12", KEY_F12);
add("PAD_UP", KEY_PAD_UP);
add("PAD_DOWN", KEY_PAD_DOWN);
add("PAD_LEFT", KEY_PAD_LEFT);
add("PAD_RIGHT", KEY_PAD_RIGHT);
add("PAD_HOME", KEY_PAD_HOME);
add("PAD_END", KEY_PAD_END);
add("PAD_PGUP", KEY_PAD_PGUP);
add("PAD_PGDN", KEY_PAD_PGDN);
add("PAD_CENTER", KEY_PAD_CENTER); // the 5 in the middle
add("PAD_INS", KEY_PAD_INS);
add("PAD_DEL", KEY_PAD_DEL);
add("PAD_RETURN", KEY_PAD_RETURN);
add("PAD_ADD", KEY_PAD_ADD); // not used
add("PAD_SUBTRACT", KEY_PAD_SUBTRACT); // not used
add("PAD_MULTIPLY", KEY_PAD_MULTIPLY); // not used
add("PAD_DIVIDE", KEY_PAD_DIVIDE); // not used
add("BUTTON0", KEY_BUTTON0);
add("BUTTON1", KEY_BUTTON1);
add("BUTTON2", KEY_BUTTON2);
add("BUTTON3", KEY_BUTTON3);
add("BUTTON4", KEY_BUTTON4);
add("BUTTON5", KEY_BUTTON5);
add("BUTTON6", KEY_BUTTON6);
add("BUTTON7", KEY_BUTTON7);
add("BUTTON8", KEY_BUTTON8);
add("BUTTON9", KEY_BUTTON9);
add("BUTTON10", KEY_BUTTON10);
add("BUTTON11", KEY_BUTTON11);
add("BUTTON12", KEY_BUTTON12);
add("BUTTON13", KEY_BUTTON13);
add("BUTTON14", KEY_BUTTON14);
add("BUTTON15", KEY_BUTTON15);
}
};
static WhichKeysym keysyms;
struct WhichMask: public StringLookup<MASK>
{
WhichMask(): StringLookup<MASK>("shift mask")
{
add("NONE", MASK_NONE);
add("CONTROL", MASK_CONTROL); // Mapped to cmd on Macs
add("ALT", MASK_ALT);
add("SHIFT", MASK_SHIFT);
add("MAC_CONTROL", MASK_MAC_CONTROL); // Un-mapped Ctrl key on Macs, not used on Windows
}
};
static WhichMask masks;
static MASK getMask(const LLSD& event)
{
MASK mask(MASK_NONE);
LLSD masknames(event["mask"]);
for (LLSD::array_const_iterator ai(masknames.beginArray()), aend(masknames.endArray());
ai != aend; ++ai)
{
mask |= masks.lookup(*ai);
}
return mask;
}
static KEY getKEY(const LLSD& event)
{
if (event.has("keysym"))
{
return keysyms.lookup(event["keysym"]);
}
else if (event.has("keycode"))
{
return KEY(event["keycode"].asInteger());
}
else
{
return KEY(event["char"].asString()[0]);
}
}
void LLWindowListener::keyDown(LLSD const & evt)
{
mKbGetter()->handleTranslatedKeyDown(getKEY(evt), getMask(evt));
}
void LLWindowListener::keyUp(LLSD const & evt)
{
mKbGetter()->handleTranslatedKeyUp(getKEY(evt), getMask(evt));
}
// for WhichButton
typedef BOOL (LLWindowCallbacks::*MouseFunc)(LLWindow *, LLCoordGL, MASK);
struct Actions
{
Actions(const MouseFunc& d, const MouseFunc& u): down(d), up(u), valid(true) {}
Actions(): valid(false) {}
MouseFunc down, up;
bool valid;
};
struct WhichButton: public StringLookup<Actions>
{
WhichButton(): StringLookup<Actions>("mouse button")
{
add("LEFT", Actions(&LLWindowCallbacks::handleMouseDown,
&LLWindowCallbacks::handleMouseUp));
add("RIGHT", Actions(&LLWindowCallbacks::handleRightMouseDown,
&LLWindowCallbacks::handleRightMouseUp));
add("MIDDLE", Actions(&LLWindowCallbacks::handleMiddleMouseDown,
&LLWindowCallbacks::handleMiddleMouseUp));
}
};
static WhichButton buttons;
static LLCoordGL getPos(const LLSD& event)
{
return LLCoordGL(event["x"].asInteger(), event["y"].asInteger());
}
void LLWindowListener::mouseDown(LLSD const & evt)
{
Actions actions(buttons.lookup(evt["button"]));
if (actions.valid)
{
(mWindow->*(actions.down))(NULL, getPos(evt), getMask(evt));
}
}
void LLWindowListener::mouseUp(LLSD const & evt)
{
Actions actions(buttons.lookup(evt["button"]));
if (actions.valid)
{
(mWindow->*(actions.up))(NULL, getPos(evt), getMask(evt));
}
}
void LLWindowListener::mouseMove(LLSD const & evt)
{
mWindow->handleMouseMove(NULL, getPos(evt), getMask(evt));
}
void LLWindowListener::mouseScroll(LLSD const & evt)
{
S32 clicks = evt["clicks"].asInteger();
mWindow->handleScrollWheel(NULL, clicks);
}

View File

@ -185,9 +185,10 @@ protected:
ctrl_name_table_t mNameTable;
std::string mTypeString[TYPE_COUNT];
public:
eControlType typeStringToEnum(const std::string& typestr);
std::string typeEnumToString(eControlType typeenum);
public:
LLControlGroup(const std::string& name);
~LLControlGroup();
void cleanup();

View File

@ -289,15 +289,15 @@ namespace LLInitParam
protected:
bool anyProvided() const { return mIsProvided; }
Param(class BaseBlock* enclosing_block);
Param(BaseBlock* enclosing_block);
// store pointer to enclosing block as offset to reduce space and allow for quick copying
class BaseBlock& enclosingBlock() const
BaseBlock& enclosingBlock() const
{
const U8* my_addr = reinterpret_cast<const U8*>(this);
// get address of enclosing BLOCK class using stored offset to enclosing BaseBlock class
return *const_cast<class BaseBlock*>
(reinterpret_cast<const class BaseBlock*>
return *const_cast<BaseBlock*>
(reinterpret_cast<const BaseBlock*>
(my_addr - (ptrdiff_t)(S32)mEnclosingBlockOffset));
}
@ -367,18 +367,16 @@ namespace LLInitParam
typedef boost::unordered_map<const std::string, ParamDescriptorPtr> param_map_t;
typedef std::vector<ParamDescriptorPtr> param_list_t;
typedef std::list<ParamDescriptorPtr> all_params_list_t;
typedef std::list<ParamDescriptorPtr> all_params_list_t;
typedef std::vector<std::pair<param_handle_t, ParamDescriptor::validation_func_t> > param_validation_list_t;
param_map_t mNamedParams; // parameters with associated names
param_list_t mUnnamedParams; // parameters with_out_ associated names
param_validation_list_t mValidationList; // parameters that must be validated
all_params_list_t mAllParams; // all parameters, owns descriptors
size_t mMaxParamOffset;
EInitializationState mInitializationState; // whether or not static block data has been initialized
class BaseBlock* mCurrentBlockPtr; // pointer to block currently being constructed
size_t mMaxParamOffset;
EInitializationState mInitializationState; // whether or not static block data has been initialized
BaseBlock* mCurrentBlockPtr; // pointer to block currently being constructed
};
class BaseBlock
@ -499,6 +497,92 @@ namespace LLInitParam
const std::string& getParamName(const BlockDescriptor& block_data, const Param* paramp) const;
};
class BaseBlockWithFlags : public BaseBlock
{
public:
class FlagBase : public Param
{
public:
typedef FlagBase self_t;
FlagBase(const char* name, BaseBlock* enclosing_block) : Param(enclosing_block)
{
if (LL_UNLIKELY(enclosing_block->mostDerivedBlockDescriptor().mInitializationState == BlockDescriptor::INITIALIZING))
{
ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
enclosing_block->getHandleFromParam(this),
&mergeWith,
&deserializeParam,
&serializeParam,
NULL,
&inspectParam,
0, 1));
BaseBlock::addParam(enclosing_block->mostDerivedBlockDescriptor(), param_descriptor, name);
}
}
bool isProvided() const { return anyProvided(); }
private:
static bool mergeWith(Param& dst, const Param& src, bool overwrite)
{
const self_t& src_typed_param = static_cast<const self_t&>(src);
self_t& dst_typed_param = static_cast<self_t&>(dst);
if (src_typed_param.isProvided()
&& (overwrite || !dst_typed_param.isProvided()))
{
dst.setProvided(true);
return true;
}
return false;
}
static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation)
{
self_t& typed_param = static_cast<self_t&>(param);
// no further names in stack, parse value now
if (name_stack.first == name_stack.second)
{
typed_param.setProvided(true);
typed_param.enclosingBlock().paramChanged(param, true);
return true;
}
return false;
}
static void serializeParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, const Param* diff_param)
{
const self_t& typed_param = static_cast<const self_t&>(param);
const self_t* typed_diff_param = static_cast<const self_t*>(diff_param);
if (!typed_param.isProvided()) return;
if (!name_stack.empty())
{
name_stack.back().second = parser.newParseGeneration();
}
// then try to serialize value directly
if (!typed_diff_param || !typed_diff_param->isProvided())
{
if (!parser.writeValue(NoParamValue(), name_stack))
{
return;
}
}
}
static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count)
{
// tell parser about our actual type
parser.inspectValue<NoParamValue>(name_stack, min_count, max_count, NULL);
}
};
};
// these templates allow us to distinguish between template parameters
// that derive from BaseBlock and those that don't
template<typename T, typename Void = void>
@ -1424,7 +1508,7 @@ namespace LLInitParam
}
};
template <typename DERIVED_BLOCK, typename BASE_BLOCK = BaseBlock>
template <typename DERIVED_BLOCK, typename BASE_BLOCK = BaseBlockWithFlags>
class Block
: public BASE_BLOCK
{
@ -1520,6 +1604,13 @@ namespace LLInitParam
};
class Flag : public BaseBlockWithFlags::FlagBase
{
public:
Flag(const char* name) : FlagBase(name, DERIVED_BLOCK::selfBlockDescriptor().mCurrentBlockPtr)
{}
};
template <typename T, typename RANGE = BaseBlock::AnyAmount, typename NAME_VALUE_LOOKUP = TypeValues<T> >
class Multiple : public TypedParam<T, NAME_VALUE_LOOKUP, true>
{

View File

@ -440,12 +440,11 @@ bool LLXUIParser::readXUIImpl(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block)
&& nodep->mAttributes.empty()
&& nodep->getSanitizedValue().empty())
{
// empty node, just parse as NoValue
// empty node, just parse as flag
mCurReadNode = DUMMY_NODE;
return block.submitValue(mNameStack, *this, silent);
}
// submit attributes for current node
values_parsed |= readAttributes(nodep, block);

View File

@ -603,6 +603,7 @@ set(viewer_SOURCE_FILES
llweb.cpp
llwebsharing.cpp
llwind.cpp
llwindowlistener.cpp
llwlanimator.cpp
llwldaycycle.cpp
llwlhandlers.cpp
@ -1161,6 +1162,7 @@ set(viewer_HEADER_FILES
llweb.h
llwebsharing.h
llwind.h
llwindowlistener.h
llwlanimator.h
llwldaycycle.h
llwlhandlers.h

View File

@ -5657,6 +5657,17 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>MemoryPrivatePoolSize</key>
<map>
<key>Comment</key>
<string>Size of the private memory pool in MB (min. value is 256)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>512</integer>
</map>
<key>MemProfiling</key>
<map>
<key>Comment</key>
@ -13564,7 +13575,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
<integer>1</integer>
</map>
<key>ShowOfferedInventory</key>
<map>

View File

@ -5,6 +5,10 @@
// against driver strings, a class number, and whether we claim
// to support them or not.
//
// Case is not significant in either the regular expressions or the
// driver strings; the recognizer code lowercases both before using
// them.
//
// If you modify this table, use the (perl) gpu_table_tester
// to compare the results of recognizing known cards (it is easy
// to mess this up by putting things in the wrong order):
@ -12,13 +16,13 @@
// perl ../../scripts/gpu_table_tester -g gpu_table.txt tests/gpus_seen.txt | diff - tests/gpus_results.txt
//
// Format:
// Fields are separated by one or more tab (not space) characters
// <recognizer name> <regular expression> <class> <supported>
// Fields are separated by one or more tab (not space) characters
// <recognizer name> <regular expression> <class> <supported>
//
// Class Numbers:
// 0 - Defaults to low graphics settings. No shaders on by default
// 1 - Defaults to mid graphics settings. Basic shaders on by default
// 2 - Defaults to high graphics settings. Atmospherics on by default.
// 0 - Defaults to low graphics settings. No shaders on by default
// 1 - Defaults to mid graphics settings. Basic shaders on by default
// 2 - Defaults to high graphics settings. Atmospherics on by default.
// 3 - Same as class 2 for now.
//
// Supported Number:
@ -39,7 +43,8 @@ ATI All-in-Wonder X800 .*ATI.*All-in-Wonder X8.* 2 1
ATI All-in-Wonder X1800 .*ATI.*All-in-Wonder X18.* 3 1
ATI All-in-Wonder X1900 .*ATI.*All-in-Wonder X19.* 3 1
ATI All-in-Wonder PCI-E .*ATI.*All-in-Wonder.*PCI-E.* 1 1
ATI All-in-Wonder Radeon .*ATI.*All-in-Wonder Radeon.* 0 1
ATI All-in-Wonder Radeon .*ATI.*All-in-Wonder Radeon.* 0 1
ATI ASUS ARES .*ATI.*ASUS.*ARES.* 3 1
ATI ASUS A9xxx .*ATI.*ASUS.*A9.* 1 1
ATI ASUS AH24xx .*ATI.*ASUS.*AH24.* 1 1
ATI ASUS AH26xx .*ATI.*ASUS.*AH26.* 3 1
@ -51,6 +56,7 @@ ATI ASUS AX5xx .*ATI.*ASUS.*AX5.* 1 1
ATI ASUS AX8xx .*ATI.*ASUS.*AX8.* 2 1
ATI ASUS EAH24xx .*ATI.*ASUS.*EAH24.* 2 1
ATI ASUS EAH26xx .*ATI.*ASUS.*EAH26.* 3 1
ATI ASUS EAH29xx .*ATI.*ASUS.*EAH29.* 3 1
ATI ASUS EAH34xx .*ATI.*ASUS.*EAH34.* 1 1
ATI ASUS EAH36xx .*ATI.*ASUS.*EAH36.* 3 1
ATI ASUS EAH38xx .*ATI.*ASUS.*EAH38.* 3 1
@ -59,12 +65,17 @@ ATI ASUS EAH45xx .*ATI.*ASUS.*EAH45.* 1 1
ATI ASUS EAH48xx .*ATI.*ASUS.*EAH48.* 3 1
ATI ASUS EAH57xx .*ATI.*ASUS.*EAH57.* 3 1
ATI ASUS EAH58xx .*ATI.*ASUS.*EAH58.* 3 1
ATI ASUS EAH6xxx .*ATI.*ASUS.*EAH6.* 3 1
ATI ASUS Radeon X1xxx .*ATI.*ASUS.*X1.* 3 1
ATI Radeon X7xx .*ATI.*ASUS.*X7.* 1 1
ATI Radeon X1xxx .*ATI.*X1.* 0 1
ATI Radeon X13xx .*ATI.*Diamond X13.* 1 1
ATI Radeon X16xx .*ATI.*Diamond X16.* 1 1
ATI Radeon X19xx .*ATI.*Diamond X19.* 1 1
ATI Radeon X19xx .*ATI.*(Radeon|Diamond) X19.* ?.* 3 1
ATI Radeon X18xx .*ATI.*(Radeon|Diamond) X18.* ?.* 3 1
ATI Radeon X17xx .*ATI.*(Radeon|Diamond) X17.* ?.* 2 1
ATI Radeon X16xx .*ATI.*(Radeon|Diamond) X16.* ?.* 2 1
ATI Radeon X15xx .*ATI.*(Radeon|Diamond) X15.* ?.* 2 1
ATI Radeon X13xx .*ATI.*(Radeon|Diamond) X13.* ?.* 1 1
ATI Radeon X1xxx .*ATI.*(Radeon|Diamond) X1.. ?.* 1 1
ATI Radeon X2xxx .*ATI.*(Radeon|Diamond) X2.. ?.* 1 1
ATI Display Adapter .*ATI.*display adapter.* 0 1
ATI FireGL 5200 .*ATI.*FireGL V52.* 0 1
ATI FireGL 5xxx .*ATI.*FireGL V5.* 1 1
@ -74,8 +85,9 @@ ATI FirePro M5800 .*ATI.*FirePro.*M58.* 3 1
ATI FirePro M7740 .*ATI.*FirePro.*M77.* 3 1
ATI FirePro M7820 .*ATI.*FirePro.*M78.* 3 1
ATI FireMV .*ATI.*FireMV.* 0 1
ATI Geforce 9500 GT .*ATI.*Geforce 9500 *GT 2 1
ATI Geforce 9800 GT .*ATI.*Geforce 9800 *GT 2 1
ATI Geforce 9500 GT .*ATI.*Geforce 9500 *GT.* 2 1
ATI Geforce 9600 GT .*ATI.*Geforce 9600 *GT.* 2 1
ATI Geforce 9800 GT .*ATI.*Geforce 9800 *GT.* 2 1
ATI Generic .*ATI.*Generic.* 0 0
ATI Hercules 9800 .*ATI.*Hercules.*9800.* 1 1
ATI IGP 340M .*ATI.*IGP.*340M.* 0 0
@ -85,168 +97,156 @@ ATI M56 .*ATI.*M56.* 1 1
ATI M71 .*ATI.*M71.* 1 1
ATI M72 .*ATI.*M72.* 1 1
ATI M76 .*ATI.*M76.* 3 1
ATI Mobility Radeon 4100 .*ATI.*(Mobility|MOBILITY).*41.* 0 1
ATI Mobility Radeon 7xxx .*ATI.*(Mobility|MOBILITY).*Radeon 7.* 0 1
ATI Mobility Radeon 8xxx .*ATI.*(Mobility|MOBILITY).*Radeon 8.* 0 1
ATI Mobility Radeon 9800 .*ATI.*(Mobility|MOBILITY).*98.* 1 1
ATI Mobility Radeon 9700 .*ATI.*(Mobility|MOBILITY).*97.* 1 1
ATI Mobility Radeon 9600 .*ATI.*(Mobility|MOBILITY).*96.* 0 1
ATI Mobility Radeon HD 530v .*ATI.*(Mobility|MOBILITY).*HD *530v.* 1 1
ATI Mobility Radeon HD 540v .*ATI.*(Mobility|MOBILITY).*HD *540v.* 2 1
ATI Mobility Radeon HD 545v .*ATI.*(Mobility|MOBILITY).*HD *545v.* 2 1
ATI Mobility Radeon HD 550v .*ATI.*(Mobility|MOBILITY).*HD *550v.* 2 1
ATI Mobility Radeon HD 560v .*ATI.*(Mobility|MOBILITY).*HD *560v.* 2 1
ATI Mobility Radeon HD 565v .*ATI.*(Mobility|MOBILITY).*HD *565v.* 2 1
ATI Mobility Radeon HD 2300 .*ATI.*(Mobility|MOBILITY).*HD *23.* 1 1
ATI Mobility Radeon HD 2400 .*ATI.*(Mobility|MOBILITY).*HD *24.* 1 1
ATI Mobility Radeon HD 2600 .*ATI.*(Mobility|MOBILITY).*HD *26.* 3 1
ATI Mobility Radeon HD 2700 .*ATI.*(Mobility|MOBILITY).*HD *27.* 3 1
ATI Mobility Radeon HD 3100 .*ATI.*(Mobility|MOBILITY).*HD *31.* 0 1
ATI Mobility Radeon HD 3200 .*ATI.*(Mobility|MOBILITY).*HD *32.* 0 1
ATI Mobility Radeon HD 3400 .*ATI.*(Mobility|MOBILITY).*HD *34.* 2 1
ATI Mobility Radeon HD 3600 .*ATI.*(Mobility|MOBILITY).*HD *36.* 3 1
ATI Mobility Radeon HD 3800 .*ATI.*(Mobility|MOBILITY).*HD *38.* 3 1
ATI Mobility Radeon HD 4200 .*ATI.*(Mobility|MOBILITY).*HD *42.* 2 1
ATI Mobility Radeon HD 4300 .*ATI.*(Mobility|MOBILITY).*HD *43.* 2 1
ATI Mobility Radeon HD 4500 .*ATI.*(Mobility|MOBILITY).*HD *45.* 3 1
ATI Mobility Radeon HD 4600 .*ATI.*(Mobility|MOBILITY).*HD *46.* 3 1
ATI Mobility Radeon HD 4800 .*ATI.*(Mobility|MOBILITY).*HD *48.* 3 1
ATI Mobility Radeon HD 5100 .*ATI.*(Mobility|MOBILITY).*HD *51.* 2 1
ATI Mobility Radeon HD 5300 .*ATI.*(Mobility|MOBILITY).*HD *53.* 2 1
ATI Mobility Radeon HD 5400 .*ATI.*(Mobility|MOBILITY).*HD *54.* 2 1
ATI Mobility Radeon HD 5500 .*ATI.*(Mobility|MOBILITY).*HD *55.* 2 1
ATI Mobility Radeon HD 5600 .*ATI.*(Mobility|MOBILITY).*HD *56.* 2 1
ATI Mobility Radeon HD 5700 .*ATI.*(Mobility|MOBILITY).*HD *57.* 3 1
ATI Mobility Radeon HD 6200 .*ATI.*(Mobility|MOBILITY).*HD *62.* 2 1
ATI Mobility Radeon HD 6300 .*ATI.*(Mobility|MOBILITY).*HD *63.* 2 1
ATI Mobility Radeon HD 6400M .*ATI.*(Mobility|MOBILITY).*HD *64.* 3 1
ATI Mobility Radeon HD 6500M .*ATI.*(Mobility|MOBILITY).*HD *65.* 3 1
ATI Mobility Radeon HD 6600M .*ATI.*(Mobility|MOBILITY).*HD *66.* 3 1
ATI Mobility Radeon HD 6700M .*ATI.*(Mobility|MOBILITY).*HD *67.* 3 1
ATI Mobility Radeon HD 6800M .*ATI.*(Mobility|MOBILITY).*HD *68.* 3 1
ATI Mobility Radeon HD 6900M .*ATI.*(Mobility|MOBILITY).*HD *69.* 3 1
ATI Mobility Radeon X1xxx .*ATI.*(Mobility|MOBILITY).*X1.* 0 1
ATI Mobility Radeon X2xxx .*ATI.*(Mobility|MOBILITY).*X2.* 0 1
ATI Mobility Radeon X3xx .*ATI.*(Mobility|MOBILITY).*X3.* 1 1
ATI Mobility Radeon X6xx .*ATI.*(Mobility|MOBILITY).*X6.* 1 1
ATI Mobility Radeon X7xx .*ATI.*(Mobility|MOBILITY).*X7.* 1 1
ATI Mobility Radeon Xxxx .*ATI.*(Mobility|MOBILITY).*X.* 0 1
ATI Mobility Radeon .*ATI.*(Mobility|MOBILITY).* 0 1
ATI Radeon HD 2300 .*ATI.*(Radeon|RADEON) HD *23.* 0 1
ATI Radeon HD 2400 .*ATI.*(Radeon|RADEON) HD *24.* 1 1
ATI Radeon HD 2600 .*ATI.*(Radeon|RADEON) HD *26.* 2 1
ATI Radeon HD 2900 .*ATI.*(Radeon|RADEON) HD *29.* 3 1
ATI Radeon HD 3000 .*ATI.*(Radeon|RADEON) HD *30.* 0 1
ATI Radeon HD 3100 .*ATI.*(Radeon|RADEON) HD *31.* 1 1
ATI Radeon HD 3200 .*ATI.*(Radeon|RADEON) HD *32.* 0 1
ATI Radeon HD 3300 .*ATI.*(Radeon|RADEON) HD *33.* 1 1
ATI Radeon HD 3400 .*ATI.*(Radeon|RADEON) HD *34.* 1 1
ATI Radeon HD 3500 .*ATI.*(Radeon|RADEON) HD *35.* 1 1
ATI Radeon HD 3600 .*ATI.*(Radeon|RADEON) HD *36.* 3 1
ATI Radeon HD 3700 .*ATI.*(Radeon|RADEON) HD *37.* 3 1
ATI Radeon HD 3800 .*ATI.*(Radeon|RADEON) HD *38.* 3 1
ATI Radeon HD 4200 .*ATI.*(Radeon|RADEON) HD *42.* 1 1
ATI Radeon HD 4300 .*ATI.*(Radeon|RADEON) HD *43.* 1 1
ATI Radeon HD 4400 .*ATI.*(Radeon|RADEON) HD *44.* 1 1
ATI Radeon HD 4500 .*ATI.*(Radeon|RADEON) HD *45.* 3 1
ATI Radeon HD 4600 .*ATI.*(Radeon|RADEON) HD *46.* 3 1
ATI Radeon HD 4700 .*ATI.*(Radeon|RADEON) HD *47.* 3 1
ATI Radeon HD 4800 .*ATI.*(Radeon|RADEON) HD *48.* 3 1
ATI Radeon HD 5400 .*ATI.*(Radeon|RADEON) HD *54.* 3 1
ATI Radeon HD 5500 .*ATI.*(Radeon|RADEON) HD *55.* 3 1
ATI Radeon HD 5600 .*ATI.*(Radeon|RADEON) HD *56.* 3 1
ATI Radeon HD 5700 .*ATI.*(Radeon|RADEON) HD *57.* 3 1
ATI Radeon HD 5800 .*ATI.*(Radeon|RADEON) HD *58.* 3 1
ATI Radeon HD 5900 .*ATI.*(Radeon|RADEON) HD *59.* 3 1
ATI Radeon HD 6200 .*ATI.*(Radeon|RADEON) HD *62.* 2 1
ATI Radeon HD 6300 .*ATI.*(Radeon|RADEON) HD *63.* 2 1
ATI Radeon HD 6400 .*ATI.*(Radeon|RADEON) HD *64.* 3 1
ATI Radeon HD 6500 .*ATI.*(Radeon|RADEON) HD *65.* 3 1
ATI Radeon HD 66xx .*ATI.*(Radeon|RADEON) HD *66.* 3 1
ATI Radeon HD 6700 .*ATI.*(Radeon|RADEON) HD *67.* 3 1
ATI Radeon HD 6800 .*ATI.*(Radeon|RADEON) HD *68.* 3 1
ATI Radeon HD 6900 .*ATI.*(Radeon|RADEON) HD *69.* 3 1
ATI Radeon OpenGL .*ATI.*(Radeon|RADEON) OpenGL.* 0 0
ATI Radeon 2100 .*ATI.*(Radeon|RADEON) 21.* 0 1
ATI Radeon 3000 .*ATI.*(Radeon|RADEON) 30.* 0 1
ATI Radeon 3100 .*ATI.*(Radeon|RADEON) 31.* 1 1
ATI Radeon 5xxx .*ATI.*(Radeon|RADEON) 5.* 3 1
ATI Radeon 7xxx .*ATI.*(Radeon|RADEON) 7.* 0 1
ATI Radeon 8xxx .*ATI.*(Radeon|RADEON) 8.* 0 1
ATI Radeon 9000 .*ATI.*(Radeon|RADEON) 90.* 0 1
ATI Radeon 9100 .*ATI.*(Radeon|RADEON) 91.* 0 1
ATI Radeon 9200 .*ATI.*(Radeon|RADEON) 92.* 0 1
ATI Radeon 9500 .*ATI.*(Radeon|RADEON) 95.* 0 1
ATI Radeon 9600 .*ATI.*(Radeon|RADEON) 96.* 0 1
ATI Radeon 9700 .*ATI.*(Radeon|RADEON) 97.* 1 1
ATI Radeon 9800 .*ATI.*(Radeon|RADEON) 98.* 1 1
ATI Radeon HD 64xx .*ATI.*AMD Radeon.* HD [67]4..[MG] 3 1
ATI Radeon HD 65xx .*ATI.*AMD Radeon.* HD [67]5..[MG] 3 1
ATI Radeon HD 66xx .*ATI.*AMD Radeon.* HD [67]6..[MG] 3 1
ATI Mobility Radeon 4100 .*ATI.*Mobility.*41.. 1 1
ATI Mobility Radeon 7xxx .*ATI.*Mobility.*Radeon 7.* 0 1
ATI Mobility Radeon 8xxx .*ATI.*Mobility.*Radeon 8.* 0 1
ATI Mobility Radeon 9800 .*ATI.*Mobility.*98.* 1 1
ATI Mobility Radeon 9700 .*ATI.*Mobility.*97.* 1 1
ATI Mobility Radeon 9600 .*ATI.*Mobility.*96.* 0 1
ATI Mobility Radeon HD 530v .*ATI.*Mobility.*HD *530v.* 1 1
ATI Mobility Radeon HD 540v .*ATI.*Mobility.*HD *540v.* 2 1
ATI Mobility Radeon HD 545v .*ATI.*Mobility.*HD *545v.* 2 1
ATI Mobility Radeon HD 550v .*ATI.*Mobility.*HD *550v.* 2 1
ATI Mobility Radeon HD 560v .*ATI.*Mobility.*HD *560v.* 2 1
ATI Mobility Radeon HD 565v .*ATI.*Mobility.*HD *565v.* 2 1
ATI Mobility Radeon HD 2300 .*ATI.*Mobility.*HD *23.* 1 1
ATI Mobility Radeon HD 2400 .*ATI.*Mobility.*HD *24.* 1 1
ATI Mobility Radeon HD 2600 .*ATI.*Mobility.*HD *26.* 3 1
ATI Mobility Radeon HD 2700 .*ATI.*Mobility.*HD *27.* 3 1
ATI Mobility Radeon HD 3100 .*ATI.*Mobility.*HD *31.* 0 1
ATI Mobility Radeon HD 3200 .*ATI.*Mobility.*HD *32.* 0 1
ATI Mobility Radeon HD 3400 .*ATI.*Mobility.*HD *34.* 2 1
ATI Mobility Radeon HD 3600 .*ATI.*Mobility.*HD *36.* 3 1
ATI Mobility Radeon HD 3800 .*ATI.*Mobility.*HD *38.* 3 1
ATI Mobility Radeon HD 4200 .*ATI.*Mobility.*HD *42.* 2 1
ATI Mobility Radeon HD 4300 .*ATI.*Mobility.*HD *43.* 2 1
ATI Mobility Radeon HD 4500 .*ATI.*Mobility.*HD *45.* 3 1
ATI Mobility Radeon HD 4600 .*ATI.*Mobility.*HD *46.* 3 1
ATI Mobility Radeon HD 4800 .*ATI.*Mobility.*HD *48.* 3 1
ATI Mobility Radeon HD 5100 .*ATI.*Mobility.*HD *51.* 3 1
ATI Mobility Radeon HD 5300 .*ATI.*Mobility.*HD *53.* 3 1
ATI Mobility Radeon HD 5400 .*ATI.*Mobility.*HD *54.* 3 1
ATI Mobility Radeon HD 5500 .*ATI.*Mobility.*HD *55.* 3 1
ATI Mobility Radeon HD 5600 .*ATI.*Mobility.*HD *56.* 3 1
ATI Mobility Radeon HD 5700 .*ATI.*Mobility.*HD *57.* 3 1
ATI Mobility Radeon HD 6200 .*ATI.*Mobility.*HD *62.* 3 1
ATI Mobility Radeon HD 6300 .*ATI.*Mobility.*HD *63.* 3 1
ATI Mobility Radeon HD 6400M .*ATI.*Mobility.*HD *64.* 3 1
ATI Mobility Radeon HD 6500M .*ATI.*Mobility.*HD *65.* 3 1
ATI Mobility Radeon HD 6600M .*ATI.*Mobility.*HD *66.* 3 1
ATI Mobility Radeon HD 6700M .*ATI.*Mobility.*HD *67.* 3 1
ATI Mobility Radeon HD 6800M .*ATI.*Mobility.*HD *68.* 3 1
ATI Mobility Radeon HD 6900M .*ATI.*Mobility.*HD *69.* 3 1
ATI Radeon HD 2300 .*ATI.*Radeon HD *23.. 0 1
ATI Radeon HD 2400 .*ATI.*Radeon HD *24.. 1 1
ATI Radeon HD 2600 .*ATI.*Radeon HD *26.. 2 1
ATI Radeon HD 2900 .*ATI.*Radeon HD *29.. 3 1
ATI Radeon HD 3000 .*ATI.*Radeon HD *30.. 0 1
ATI Radeon HD 3100 .*ATI.*Radeon HD *31.. 1 1
ATI Radeon HD 3200 .*ATI.*Radeon HD *32.. 1 1
ATI Radeon HD 3300 .*ATI.*Radeon HD *33.. 1 1
ATI Radeon HD 3400 .*ATI.*Radeon HD *34.. 1 1
ATI Radeon HD 3500 .*ATI.*Radeon HD *35.. 1 1
ATI Radeon HD 3600 .*ATI.*Radeon HD *36.. 3 1
ATI Radeon HD 3700 .*ATI.*Radeon HD *37.. 3 1
ATI Radeon HD 3800 .*ATI.*Radeon HD *38.. 3 1
ATI Radeon HD 4100 .*ATI.*Radeon HD *41.. 1 1
ATI Radeon HD 4200 .*ATI.*Radeon HD *42.. 1 1
ATI Radeon HD 4300 .*ATI.*Radeon HD *43.. 1 1
ATI Radeon HD 4400 .*ATI.*Radeon HD *44.. 1 1
ATI Radeon HD 4500 .*ATI.*Radeon HD *45.. 3 1
ATI Radeon HD 4600 .*ATI.*Radeon HD *46.. 3 1
ATI Radeon HD 4700 .*ATI.*Radeon HD *47.. 3 1
ATI Radeon HD 4800 .*ATI.*Radeon HD *48.. 3 1
ATI Radeon HD 5400 .*ATI.*Radeon HD *54.. 3 1
ATI Radeon HD 5500 .*ATI.*Radeon HD *55.. 3 1
ATI Radeon HD 5600 .*ATI.*Radeon HD *56.. 3 1
ATI Radeon HD 5700 .*ATI.*Radeon HD *57.. 3 1
ATI Radeon HD 5800 .*ATI.*Radeon HD *58.. 3 1
ATI Radeon HD 5900 .*ATI.*Radeon HD *59.. 3 1
ATI Radeon HD 6200 .*ATI.*Radeon HD *62.. 3 1
ATI Radeon HD 6300 .*ATI.*Radeon HD *63.. 3 1
ATI Radeon HD 6400 .*ATI.*Radeon HD *64.. 3 1
ATI Radeon HD 6500 .*ATI.*Radeon HD *65.. 3 1
ATI Radeon HD 6600 .*ATI.*Radeon HD *66.. 3 1
ATI Radeon HD 6700 .*ATI.*Radeon HD *67.. 3 1
ATI Radeon HD 6800 .*ATI.*Radeon HD *68.. 3 1
ATI Radeon HD 6900 .*ATI.*Radeon HD *69.. 3 1
ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0
ATI Radeon 2100 .*ATI.*Radeon 21.. 0 1
ATI Radeon 3000 .*ATI.*Radeon 30.. 0 1
ATI Radeon 3100 .*ATI.*Radeon 31.. 1 1
ATI Radeon 5xxx .*ATI.*Radeon 5... 3 1
ATI Radeon 7xxx .*ATI.*Radeon 7... 0 1
ATI Radeon 8xxx .*ATI.*Radeon 8... 0 1
ATI Radeon 9000 .*ATI.*Radeon 90.. 0 1
ATI Radeon 9100 .*ATI.*Radeon 91.. 0 1
ATI Radeon 9200 .*ATI.*Radeon 92.. 0 1
ATI Radeon 9500 .*ATI.*Radeon 95.. 0 1
ATI Radeon 9600 .*ATI.*Radeon 96.. 0 1
ATI Radeon 9700 .*ATI.*Radeon 97.. 1 1
ATI Radeon 9800 .*ATI.*Radeon 98.. 1 1
ATI Radeon RV250 .*ATI.*RV250.* 0 1
ATI Radeon RV600 .*ATI.*RV6.* 1 1
ATI Radeon RX700 .*ATI.*RX70.* 1 1
ATI Radeon RX800 .*ATI.*(Radeon|RADEON) *RX80.* 2 1
ATI Radeon RX800 .*ATI.*Radeon *RX80.* 2 1
ATI RS880M .*ATI.*RS880M 1 1
ATI Radeon RX9550 .*ATI.*RX9550.* 1 1
ATI Radeon VE .*ATI.*(Radeon|RADEON).*VE.* 0 0
ATI Radeon X1000 .*ATI.*(Radeon|RADEON) *X10.* 0 1
ATI Radeon X1200 .*ATI.*(Radeon|RADEON) *X12.* 0 1
ATI Radeon X1300 .*ATI.*(Radeon|RADEON) *X13.* 1 1
ATI Radeon X1400 .*ATI.*(Radeon|RADEON) *X14.* 1 1
ATI Radeon X1500 .*ATI.*(Radeon|RADEON) *X15.* 1 1
ATI Radeon X1600 .*ATI.*(Radeon|RADEON) *X16.* 1 1
ATI Radeon X1700 .*ATI.*(Radeon|RADEON) *X17.* 1 1
ATI Radeon X1800 .*ATI.*(Radeon|RADEON) *X18.* 3 1
ATI Radeon X1900 .*ATI.*(Radeon|RADEON) *X19.* 3 1
ATI Radeon X300 .*ATI.*(Radeon|RADEON) *X3.* 0 1
ATI Radeon X400 .*ATI.*(Radeon|RADEON) X4.* 0 1
ATI Radeon X500 .*ATI.*(Radeon|RADEON) X5.* 0 1
ATI Radeon X600 .*ATI.*(Radeon|RADEON) X6.* 1 1
ATI Radeon X700 .*ATI.*(Radeon|RADEON) X7.* 1 1
ATI Radeon X800 .*ATI.*(Radeon|RADEON) X8.* 2 1
ATI Radeon X900 .*ATI.*(Radeon|RADEON) X9.* 2 1
ATI Radeon Xpress .*ATI.*(Radeon|RADEON) (Xpress|XPRESS).* 0 1
ATI Radeon VE .*ATI.*Radeon.*VE.* 0 0
ATI Radeon X300 .*ATI.*Radeon *X3.* 0 1
ATI Radeon X400 .*ATI.*Radeon ?X4.* 0 1
ATI Radeon X500 .*ATI.*Radeon ?X5.* 0 1
ATI Radeon X600 .*ATI.*Radeon ?X6.* 1 1
ATI Radeon X700 .*ATI.*Radeon ?X7.* 1 1
ATI Radeon X800 .*ATI.*Radeon ?X8.* 2 1
ATI Radeon X900 .*ATI.*Radeon ?X9.* 2 1
ATI Radeon Xpress .*ATI.*Radeon Xpress.* 0 1
ATI Rage 128 .*ATI.*Rage 128.* 0 1
ATI R350 (9800) .*(ATI)?.*R350.* 1 1
ATI R580 (X1900) .*(ATI)?.*R580.* 3 1
ATI RC410 (Xpress 200) .*(ATI)?.*RC410.* 0 0
ATI RS48x (Xpress 200x) .*(ATI)?.*RS48.* 0 0
ATI RS600 (Xpress 3200) .*(ATI)?.*RS600.* 0 0
ATI RV350 (9600) .*(ATI)?.*RV350.* 0 1
ATI RV370 (X300) .*(ATI)?.*RV370.* 0 1
ATI RV410 (X700) .*(ATI)?.*RV410.* 1 1
ATI RV515 .*(ATI)?.*RV515.* 1 1
ATI RV570 (X1900 GT/PRO) .*(ATI)?.*RV570.* 3 1
ATI RV380 .*(ATI)?.*RV380.* 0 1
ATI RV530 .*(ATI)?.*RV530.* 1 1
ATI RX480 (Xpress 200P) .*(ATI)?.*RX480.* 0 1
ATI RX700 .*(ATI)?.*RX700.* 1 1
AMD ANTILLES (HD 6990) .*(AMD|ATI).*(Antilles|ANTILLES).* 3 1
AMD BARTS (HD 6800) .*(AMD|ATI).*(Barts|BARTS).* 3 1
AMD CAICOS (HD 6400) .*(AMD|ATI).*(Caicos|CAICOS).* 3 1
ATI R350 (9800) .*R350.* 1 1
ATI R580 (X1900) .*R580.* 3 1
ATI RC410 (Xpress 200) .*RC410.* 0 0
ATI RS48x (Xpress 200x) .*RS48.* 0 0
ATI RS600 (Xpress 3200) .*RS600.* 0 0
ATI RV350 (9600) .*RV350.* 0 1
ATI RV370 (X300) .*RV370.* 0 1
ATI RV410 (X700) .*RV410.* 1 1
ATI RV515 .*RV515.* 1 1
ATI RV570 (X1900 GT/PRO) .*RV570.* 3 1
ATI RV380 .*RV380.* 0 1
ATI RV530 .*RV530.* 1 1
ATI RX480 (Xpress 200P) .*RX480.* 0 1
ATI RX700 .*RX700.* 1 1
AMD ANTILLES (HD 6990) .*(AMD|ATI).*Antilles.* 3 1
AMD BARTS (HD 6800) .*(AMD|ATI).*Barts.* 3 1
AMD CAICOS (HD 6400) .*(AMD|ATI).*Caicos.* 3 1
AMD CAYMAN (HD 6900) .*(AMD|ATI).*(Cayman|CAYMAM).* 3 1
AMD CEDAR (HD 5450) .*(AMD|ATI).*(Cedar|CEDAR).* 2 1
AMD CYPRESS (HD 5800) .*(AMD|ATI).*(Cypress|CYPRESS).* 3 1
AMD HEMLOCK (HD 5970) .*(AMD|ATI).*(Hemlock|HEMLOCK).* 3 1
AMD JUNIPER (HD 5700) .*(AMD|ATI).*(Juniper|JUNIPER).* 3 1
AMD PARK .*(AMD|ATI).*(Park|PARK).* 3 1
AMD REDWOOD (HD 5500/5600) .*(AMD|ATI).*(Redwood|REDWOOD).* 3 1
AMD TURKS (HD 6500/6600) .*(AMD|ATI).*(Turks|TURKS).* 3 1
AMD RS780 (HD 3200) .*(AMD|ATI)?.*RS780.* 0 1
AMD RS880 (HD 4200) .*(AMD|ATI)?.*RS880.* 1 1
AMD RV610 (HD 2400) .*(AMD|ATI)?.*RV610.* 1 1
AMD RV620 (HD 3400) .*(AMD|ATI)?.*RV620.* 1 1
AMD RV630 (HD 2600) .*(AMD|ATI)?.*RV630.* 2 1
AMD RV635 (HD 3600) .*(AMD|ATI)?.*RV635.* 3 1
AMD RV670 (HD 3800) .*(AMD|ATI)?.*RV670.* 3 1
AMD R680 (HD 3870 X2) .*(AMD|ATI)?.*R680.* 3 1
AMD R700 (HD 4800 X2) .*(AMD|ATI)?.*R700.* 3 1
AMD RV710 (HD 4300) .*(AMD|ATI)?.*RV710.* 1 1
AMD RV730 (HD 4600) .*(AMD|ATI)?.*RV730.* 3 1
AMD RV740 (HD 4700) .*(AMD|ATI)?.*RV740.* 3 1
AMD RV770 (HD 4800) .*(AMD|ATI)?.*RV770.* 3 1
AMD RV790 (HD 4800) .*(AMD|ATI)?.*RV790.* 3 1
AMD CEDAR (HD 5450) .*(AMD|ATI).*Cedar.* 2 1
AMD CYPRESS (HD 5800) .*(AMD|ATI).*Cypress.* 3 1
AMD HEMLOCK (HD 5970) .*(AMD|ATI).*Hemlock.* 3 1
AMD JUNIPER (HD 5700) .*(AMD|ATI).*Juniper.* 3 1
AMD PARK .*(AMD|ATI).*Park.* 3 1
AMD REDWOOD (HD 5500/5600) .*(AMD|ATI).*Redwood.* 3 1
AMD TURKS (HD 6500/6600) .*(AMD|ATI).*Turks.* 3 1
AMD RS780 (HD 3200) .*RS780.* 0 1
AMD RS880 (HD 4200) .*RS880.* 1 1
AMD RV610 (HD 2400) .*RV610.* 1 1
AMD RV620 (HD 3400) .*RV620.* 1 1
AMD RV630 (HD 2600) .*RV630.* 2 1
AMD RV635 (HD 3600) .*RV635.* 3 1
AMD RV670 (HD 3800) .*RV670.* 3 1
AMD R680 (HD 3870 X2) .*R680.* 3 1
AMD R700 (HD 4800 X2) .*R700.* 3 1
AMD RV710 (HD 4300) .*RV710.* 1 1
AMD RV730 (HD 4600) .*RV730.* 3 1
AMD RV740 (HD 4700) .*RV740.* 3 1
AMD RV770 (HD 4800) .*RV770.* 3 1
AMD RV790 (HD 4800) .*RV790.* 3 1
ATI 760G/Radeon 3000 .*ATI.*AMD 760G.* 1 1
ATI 780L/Radeon 3000 .*ATI.*AMD 780L.* 1 1
ATI Radeon DDR .*ATI.*(Radeon|RADEON) ?DDR.* 0 1
ATI Radeon DDR .*ATI.*Radeon ?DDR.* 0 1
ATI FirePro 2000 .*ATI.*FirePro 2.* 1 1
ATI FirePro 3000 .*ATI.*FirePro V3.* 1 1
ATI FirePro 4000 .*ATI.*FirePro V4.* 2 1
@ -255,8 +255,8 @@ ATI FirePro 7000 .*ATI.*FirePro V7.* 3 1
ATI FirePro M .*ATI.*FirePro M.* 3 1
ATI Technologies .*ATI *Technologies.* 0 1
// This entry is last to work around the "R300" driver problem.
ATI R300 (9700) .*(ATI)?.*R300.* 1 1
ATI Radeon .*ATI.*Radeon.* 0 1
ATI R300 (9700) .*R300.* 1 1
ATI Radeon .*ATI.*(Diamond|Radeon).* 0 1
Intel X3100 .*Intel.*X3100.* 0 1
Intel 830M .*Intel.*830M 0 0
Intel 845G .*Intel.*845G 0 0
@ -273,13 +273,13 @@ Intel G33 .*Intel.*G33.* 0 0
Intel G41 .*Intel.*G41.* 0 1
Intel G45 .*Intel.*G45.* 0 1
Intel Bear Lake .*Intel.*Bear Lake.* 0 0
Intel Broadwater .*Intel.*Broadwater.* 0 0
Intel Broadwater .*Intel.*Broadwater.* 0 0
Intel Brookdale .*Intel.*Brookdale.* 0 0
Intel Cantiga .*Intel.*Cantiga.* 0 0
Intel Eaglelake .*Intel.*Eaglelake.* 0 1
Intel Graphics Media HD .*Intel.*Graphics Media.*HD.* 0 1
Intel HD Graphics .*Intel.*HD Graphics.* 2 1
Intel Mobile 4 Series .*Intel.*Mobile *4 Series.* 0 1
Intel Mobile 4 Series .*Intel.*Mobile.* 4 Series.* 0 1
Intel Media Graphics HD .*Intel.*Media Graphics HD.* 0 1
Intel Montara .*Intel.*Montara.* 0 0
Intel Pineview .*Intel.*Pineview.* 0 1
@ -288,204 +288,219 @@ Intel HD Graphics 2000 .*Intel.*HD2000.* 1 1
Intel HD Graphics 3000 .*Intel.*HD3000.* 2 1
Matrox .*Matrox.* 0 0
Mesa .*Mesa.* 0 0
NVIDIA 205 .*NVIDIA.*GeForce 205.* 2 1
NVIDIA 210 .*NVIDIA.*GeForce 210.* 2 1
NVIDIA 310M .*NVIDIA.*GeForce 310M.* 1 1
NVIDIA 310 .*NVIDIA.*GeForce 310.* 3 1
NVIDIA 315M .*NVIDIA.*GeForce 315M.* 2 1
NVIDIA 315 .*NVIDIA.*GeForce 315.* 3 1
NVIDIA 320M .*NVIDIA.*GeForce 320M.* 2 1
NVIDIA G100M .*NVIDIA *(GeForce)? *(G)? ?100M.* 0 1
NVIDIA G100 .*NVIDIA *(GeForce)? *(G)? ?100.* 0 1
NVIDIA G102M .*NVIDIA *(GeForce)? *(G)? ?102M.* 0 1
NVIDIA G103M .*NVIDIA *(GeForce)? *(G)? ?103M.* 0 1
NVIDIA G105M .*NVIDIA *(GeForce)? *(G)? ?105M.* 0 1
NVIDIA G 110M .*NVIDIA *(GeForce)? *(G)? ?110M.* 0 1
NVIDIA G 120M .*NVIDIA *(GeForce)? *(G)? ?120M.* 1 1
NVIDIA G 200 .*NVIDIA *(GeForce)? *(G)? ?200(M)?.* 0 1
NVIDIA G 205M .*NVIDIA *(GeForce)? *(G)? ?205(M)?.* 0 1
NVIDIA G 210 .*NVIDIA *(GeForce)? *(G)? ?210(M)?.* 1 1
NVIDIA 305M .*NVIDIA *(GeForce)? *(G)? ?305(M)?.* 1 1
NVIDIA G 310M .*NVIDIA *(GeForce)? *(G)? ?310(M)?.* 2 1
NVIDIA G 315 .*NVIDIA *(GeForce)? *(G)? ?315(M)?.* 2 1
NVIDIA G 320M .*NVIDIA *(GeForce)? *(G)? ?320(M)?.* 2 1
NVIDIA G 405 .*NVIDIA *(GeForce)? *(G)? ?405(M)?.* 1 1
NVIDIA G 410M .*NVIDIA *(GeForce)? *(G)? ?410(M)?.* 1 1
NVIDIA GT 120M .*NVIDIA.*(GeForce)? *GT *120(M)?.* 2 1
NVIDIA GT 120 .*NVIDIA.*GT.*120 2 1
NVIDIA GT 130M .*NVIDIA.*(GeForce)? *GT *130(M)?.* 2 1
NVIDIA GT 140M .*NVIDIA.*(GeForce)? *GT *140(M)?.* 2 1
NVIDIA GT 150M .*NVIDIA.*(GeForce)? *GT(S)? *150(M)?.* 2 1
NVIDIA GT 160M .*NVIDIA.*(GeForce)? *GT *160(M)?.* 2 1
NVIDIA GT 220M .*NVIDIA.*(GeForce)? *GT *220(M)?.* 2 1
NVIDIA GT 230M .*NVIDIA.*(GeForce)? *GT *230(M)?.* 2 1
NVIDIA GT 240M .*NVIDIA.*(GeForce)? *GT *240(M)?.* 2 1
NVIDIA GT 250M .*NVIDIA.*(GeForce)? *GT *250(M)?.* 2 1
NVIDIA GT 260M .*NVIDIA.*(GeForce)? *GT *260(M)?.* 2 1
NVIDIA GT 320M .*NVIDIA.*(GeForce)? *GT *320(M)?.* 2 1
NVIDIA GT 325M .*NVIDIA.*(GeForce)? *GT *325(M)?.* 0 1
NVIDIA GT 330M .*NVIDIA.*(GeForce)? *GT *330(M)?.* 3 1
NVIDIA GT 335M .*NVIDIA.*(GeForce)? *GT *335(M)?.* 1 1
NVIDIA GT 340M .*NVIDIA.*(GeForce)? *GT *340(M)?.* 2 1
NVIDIA GT 415M .*NVIDIA.*(GeForce)? *GT *415(M)?.* 2 1
NVIDIA GT 420M .*NVIDIA.*(GeForce)? *GT *420(M)?.* 2 1
NVIDIA GT 425M .*NVIDIA.*(GeForce)? *GT *425(M)?.* 3 1
NVIDIA GT 430M .*NVIDIA.*(GeForce)? *GT *430(M)?.* 3 1
NVIDIA GT 435M .*NVIDIA.*(GeForce)? *GT *435(M)?.* 3 1
NVIDIA GT 440M .*NVIDIA.*(GeForce)? *GT *440(M)?.* 3 1
NVIDIA GT 445M .*NVIDIA.*(GeForce)? *GT *445(M)?.* 3 1
NVIDIA GT 450M .*NVIDIA.*(GeForce)? *GT *450(M)?.* 3 1
NVIDIA GT 520M .*NVIDIA.*(GeForce)? *GT *520(M)?.* 3 1
NVIDIA GT 525M .*NVIDIA.*(GeForce)? *GT *525(M)?.* 3 1
NVIDIA GT 540M .*NVIDIA.*(GeForce)? *GT *540(M)?.* 3 1
NVIDIA GT 550M .*NVIDIA.*(GeForce)? *GT *550(M)?.* 3 1
NVIDIA GT 555M .*NVIDIA.*(GeForce)? *GT *555(M)?.* 3 1
NVIDIA GTS 160M .*NVIDIA.*(GeForce)? *GT(S)? *160(M)?.* 2 1
NVIDIA GTS 240 .*NVIDIA.*(GeForce)? *GTS *24.* 3 1
NVIDIA GTS 250 .*NVIDIA.*(GeForce)? *GTS *25.* 3 1
NVIDIA GTS 350M .*NVIDIA.*(GeForce)? *GTS *350M.* 3 1
NVIDIA GTS 360M .*NVIDIA.*(GeForce)? *GTS *360M.* 3 1
NVIDIA GTS 360 .*NVIDIA.*(GeForce)? *GTS *360.* 3 1
NVIDIA GTS 450 .*NVIDIA.*(GeForce)? *GTS *45.* 3 1
NVIDIA GTX 260 .*NVIDIA.*(GeForce)? *GTX *26.* 3 1
NVIDIA GTX 275 .*NVIDIA.*(GeForce)? *GTX *275.* 3 1
NVIDIA GTX 270 .*NVIDIA.*(GeForce)? *GTX *27.* 3 1
NVIDIA GTX 285 .*NVIDIA.*(GeForce)? *GTX *285.* 3 1
NVIDIA GTX 280 .*NVIDIA.*(GeForce)? *GTX *280.* 3 1
NVIDIA GTX 290 .*NVIDIA.*(GeForce)? *GTX *290.* 3 1
NVIDIA GTX 295 .*NVIDIA.*(GeForce)? *GTX *295.* 3 1
NVIDIA GTX 460M .*NVIDIA.*(GeForce)? *GTX *460M.* 3 1
NVIDIA GTX 465 .*NVIDIA.*(GeForce)? *GTX *465.* 3 1
NVIDIA GTX 460 .*NVIDIA.*(GeForce)? *GTX *46.* 3 1
NVIDIA GTX 470M .*NVIDIA.*(GeForce)? *GTX *470M.* 3 1
NVIDIA GTX 470 .*NVIDIA.*(GeForce)? *GTX *47.* 3 1
NVIDIA GTX 480M .*NVIDIA.*(GeForce)? *GTX *480M.* 3 1
NVIDIA GTX 485M .*NVIDIA.*(GeForce)? *GTX *485M.* 3 1
NVIDIA GTX 480 .*NVIDIA.*(GeForce)? *GTX *48.* 3 1
NVIDIA GTX 530 .*NVIDIA.*(GeForce)? *GTX *53.* 3 1
NVIDIA GTX 550 .*NVIDIA.*(GeForce)? *GTX *55.* 3 1
NVIDIA GTX 560 .*NVIDIA.*(GeForce)? *GTX *56.* 3 1
NVIDIA GTX 570 .*NVIDIA.*(GeForce)? *GTX *57.* 3 1
NVIDIA GTX 580M .*NVIDIA.*(GeForce)? *GTX *580M.* 3 1
NVIDIA GTX 580 .*NVIDIA.*(GeForce)? *GTX *58.* 3 1
NVIDIA GTX 590 .*NVIDIA.*(GeForce)? *GTX *59.* 3 1
NVIDIA C51 .*NVIDIA.*(GeForce)? *C51.* 0 1
NVIDIA G72 .*NVIDIA.*(GeForce)? *G72.* 1 1
NVIDIA G73 .*NVIDIA.*(GeForce)? *G73.* 1 1
NVIDIA G84 .*NVIDIA.*(GeForce)? *G84.* 2 1
NVIDIA G86 .*NVIDIA.*(GeForce)? *G86.* 3 1
NVIDIA G92 .*NVIDIA.*(GeForce)? *G92.* 3 1
NVIDIA 205 .*NVIDIA .*GeForce 205.* 2 1
NVIDIA 210 .*NVIDIA .*GeForce 210.* 2 1
NVIDIA 310M .*NVIDIA .*GeForce 310M.* 1 1
NVIDIA 310 .*NVIDIA .*GeForce 310.* 3 1
NVIDIA 315M .*NVIDIA .*GeForce 315M.* 2 1
NVIDIA 315 .*NVIDIA .*GeForce 315.* 3 1
NVIDIA 320M .*NVIDIA .*GeForce 320M.* 2 1
NVIDIA G100M .*NVIDIA .*100M.* 0 1
NVIDIA G100 .*NVIDIA .*100.* 0 1
NVIDIA G102M .*NVIDIA .*102M.* 0 1
NVIDIA G103M .*NVIDIA .*103M.* 0 1
NVIDIA G105M .*NVIDIA .*105M.* 0 1
NVIDIA G 110M .*NVIDIA .*110M.* 0 1
NVIDIA G 120M .*NVIDIA .*120M.* 1 1
NVIDIA G 200 .*NVIDIA .*200(M)?.* 0 1
NVIDIA G 205M .*NVIDIA .*205(M)?.* 0 1
NVIDIA G 210 .*NVIDIA .*210(M)?.* 1 1
NVIDIA 305M .*NVIDIA .*305(M)?.* 1 1
NVIDIA G 310M .*NVIDIA .*310(M)?.* 2 1
NVIDIA G 315 .*NVIDIA .*315(M)?.* 2 1
NVIDIA G 320M .*NVIDIA .*320(M)?.* 2 1
NVIDIA G 405 .*NVIDIA .*405(M)?.* 1 1
NVIDIA G 410M .*NVIDIA .*410(M)?.* 1 1
NVIDIA GT 120M .*NVIDIA .*GT *120(M)?.* 2 1
NVIDIA GT 120 .*NVIDIA .*GT.*120 2 1
NVIDIA GT 130M .*NVIDIA .*GT *130(M)?.* 2 1
NVIDIA GT 140M .*NVIDIA .*GT *140(M)?.* 2 1
NVIDIA GT 150M .*NVIDIA .*GT(S)? *150(M)?.* 2 1
NVIDIA GT 160M .*NVIDIA .*GT *160(M)?.* 2 1
NVIDIA GT 220M .*NVIDIA .*GT *220(M)?.* 2 1
NVIDIA GT 230M .*NVIDIA .*GT *230(M)?.* 2 1
NVIDIA GT 240M .*NVIDIA .*GT *240(M)?.* 2 1
NVIDIA GT 250M .*NVIDIA .*GT *250(M)?.* 2 1
NVIDIA GT 260M .*NVIDIA .*GT *260(M)?.* 2 1
NVIDIA GT 320M .*NVIDIA .*GT *320(M)?.* 2 1
NVIDIA GT 325M .*NVIDIA .*GT *325(M)?.* 0 1
NVIDIA GT 330M .*NVIDIA .*GT *330(M)?.* 3 1
NVIDIA GT 335M .*NVIDIA .*GT *335(M)?.* 1 1
NVIDIA GT 340M .*NVIDIA .*GT *340(M)?.* 2 1
NVIDIA GT 415M .*NVIDIA .*GT *415(M)?.* 2 1
NVIDIA GT 420M .*NVIDIA .*GT *420(M)?.* 2 1
NVIDIA GT 425M .*NVIDIA .*GT *425(M)?.* 3 1
NVIDIA GT 430M .*NVIDIA .*GT *430(M)?.* 3 1
NVIDIA GT 435M .*NVIDIA .*GT *435(M)?.* 3 1
NVIDIA GT 440M .*NVIDIA .*GT *440(M)?.* 3 1
NVIDIA GT 445M .*NVIDIA .*GT *445(M)?.* 3 1
NVIDIA GT 450M .*NVIDIA .*GT *450(M)?.* 3 1
NVIDIA GT 520M .*NVIDIA .*GT *52.(M)?.* 3 1
NVIDIA GT 530M .*NVIDIA .*GT *530(M)?.* 3 1
NVIDIA GT 540M .*NVIDIA .*GT *54.(M)?.* 3 1
NVIDIA GT 550M .*NVIDIA .*GT *550(M)?.* 3 1
NVIDIA GT 555M .*NVIDIA .*GT *555(M)?.* 3 1
NVIDIA GTS 160M .*NVIDIA .*GT(S)? *160(M)?.* 2 1
NVIDIA GTS 240 .*NVIDIA .*GTS *24.* 3 1
NVIDIA GTS 250 .*NVIDIA .*GTS *25.* 3 1
NVIDIA GTS 350M .*NVIDIA .*GTS *350M.* 3 1
NVIDIA GTS 360M .*NVIDIA .*GTS *360M.* 3 1
NVIDIA GTS 360 .*NVIDIA .*GTS *360.* 3 1
NVIDIA GTS 450 .*NVIDIA .*GTS *45.* 3 1
NVIDIA GTX 260 .*NVIDIA .*GTX *26.* 3 1
NVIDIA GTX 275 .*NVIDIA .*GTX *275.* 3 1
NVIDIA GTX 270 .*NVIDIA .*GTX *27.* 3 1
NVIDIA GTX 285 .*NVIDIA .*GTX *285.* 3 1
NVIDIA GTX 280 .*NVIDIA .*GTX *280.* 3 1
NVIDIA GTX 290 .*NVIDIA .*GTX *290.* 3 1
NVIDIA GTX 295 .*NVIDIA .*GTX *295.* 3 1
NVIDIA GTX 460M .*NVIDIA .*GTX *460M.* 3 1
NVIDIA GTX 465 .*NVIDIA .*GTX *465.* 3 1
NVIDIA GTX 460 .*NVIDIA .*GTX *46.* 3 1
NVIDIA GTX 470M .*NVIDIA .*GTX *470M.* 3 1
NVIDIA GTX 470 .*NVIDIA .*GTX *47.* 3 1
NVIDIA GTX 480M .*NVIDIA .*GTX *480M.* 3 1
NVIDIA GTX 485M .*NVIDIA .*GTX *485M.* 3 1
NVIDIA GTX 480 .*NVIDIA .*GTX *48.* 3 1
NVIDIA GTX 530 .*NVIDIA .*GTX *53.* 3 1
NVIDIA GTX 550 .*NVIDIA .*GTX *55.* 3 1
NVIDIA GTX 560 .*NVIDIA .*GTX *56.* 3 1
NVIDIA GTX 570 .*NVIDIA .*GTX *57.* 3 1
NVIDIA GTX 580M .*NVIDIA .*GTX *580M.* 3 1
NVIDIA GTX 580 .*NVIDIA .*GTX *58.* 3 1
NVIDIA GTX 590 .*NVIDIA .*GTX *59.* 3 1
NVIDIA C51 .*NVIDIA .*C51.* 0 1
NVIDIA G72 .*NVIDIA .*G72.* 1 1
NVIDIA G73 .*NVIDIA .*G73.* 1 1
NVIDIA G84 .*NVIDIA .*G84.* 2 1
NVIDIA G86 .*NVIDIA .*G86.* 3 1
NVIDIA G92 .*NVIDIA .*G92.* 3 1
NVIDIA GeForce .*GeForce 256.* 0 0
NVIDIA GeForce 2 .*GeForce ?2 ?.* 0 1
NVIDIA GeForce 3 .*GeForce ?3 ?.* 0 1
NVIDIA GeForce 3 Ti .*GeForce ?3 Ti.* 0 1
NVIDIA GeForce 4 .*NVIDIA.*GeForce ?4.* 0 1
NVIDIA GeForce 4 Go .*NVIDIA.*GeForce ?4.*Go.* 0 1
NVIDIA GeForce 4 MX .*NVIDIA.*GeForce ?4 MX.* 0 1
NVIDIA GeForce 4 PCX .*NVIDIA.*GeForce ?4 PCX.* 0 1
NVIDIA GeForce 4 Ti .*NVIDIA.*GeForce ?4 Ti.* 0 1
NVIDIA GeForce 6100 .*NVIDIA.*GeForce 61.* 0 1
NVIDIA GeForce 6200 .*NVIDIA.*GeForce 62.* 0 1
NVIDIA GeForce 6500 .*NVIDIA.*GeForce 65.* 0 1
NVIDIA GeForce 6600 .*NVIDIA.*GeForce 66.* 1 1
NVIDIA GeForce 6700 .*NVIDIA.*GeForce 67.* 2 1
NVIDIA GeForce 6800 .*NVIDIA.*GeForce 68.* 2 1
NVIDIA GeForce 7000 .*NVIDIA.*GeForce 70.* 0 1
NVIDIA GeForce 7100 .*NVIDIA.*GeForce 71.* 0 1
NVIDIA GeForce 7200 .*NVIDIA.*GeForce 72.* 1 1
NVIDIA GeForce 7300 .*NVIDIA.*GeForce 73.* 1 1
NVIDIA GeForce 7500 .*NVIDIA.*GeForce 75.* 1 1
NVIDIA GeForce 7600 .*NVIDIA.*GeForce 76.* 2 1
NVIDIA GeForce 7800 .*NVIDIA.*GeForce 78.* 2 1
NVIDIA GeForce 7900 .*NVIDIA.*GeForce 79.* 2 1
NVIDIA GeForce 8100 .*NVIDIA.*GeForce 81.* 1 1
NVIDIA GeForce 8200M .*NVIDIA.*GeForce 8200M.* 1 1
NVIDIA GeForce 8200 .*NVIDIA.*GeForce 82.* 1 1
NVIDIA GeForce 8300 .*NVIDIA.*GeForce 83.* 1 1
NVIDIA GeForce 8400M .*NVIDIA.*GeForce 8400M.* 1 1
NVIDIA GeForce 8400 .*NVIDIA.*GeForce 84.* 1 1
NVIDIA GeForce 8500 .*NVIDIA.*GeForce 85.* 3 1
NVIDIA GeForce 8600M .*NVIDIA.*GeForce 8600M.* 1 1
NVIDIA GeForce 8600 .*NVIDIA.*GeForce 86.* 3 1
NVIDIA GeForce 8700M .*NVIDIA.*GeForce 8700M.* 3 1
NVIDIA GeForce 8700 .*NVIDIA.*GeForce 87.* 3 1
NVIDIA GeForce 8800M .*NVIDIA.*GeForce 8800M.* 3 1
NVIDIA GeForce 8800 .*NVIDIA.*GeForce 88.* 3 1
NVIDIA GeForce 9100M .*NVIDIA.*GeForce 9100M.* 0 1
NVIDIA GeForce 9100 .*NVIDIA.*GeForce 91.* 0 1
NVIDIA GeForce 9200M .*NVIDIA.*GeForce 9200M.* 1 1
NVIDIA GeForce 9200 .*NVIDIA.*GeForce 92.* 1 1
NVIDIA GeForce 9300M .*NVIDIA.*GeForce 9300M.* 1 1
NVIDIA GeForce 9300 .*NVIDIA.*GeForce 93.* 1 1
NVIDIA GeForce 9400M .*NVIDIA.*GeForce 9400M.* 1 1
NVIDIA GeForce 9400 .*NVIDIA.*GeForce 94.* 1 1
NVIDIA GeForce 9500M .*NVIDIA.*GeForce 9500M.* 2 1
NVIDIA GeForce 9500 .*NVIDIA.*GeForce 95.* 2 1
NVIDIA GeForce 9600M .*NVIDIA.*GeForce 9600M.* 3 1
NVIDIA GeForce 9600 .*NVIDIA.*GeForce 96.* 2 1
NVIDIA GeForce 9700M .*NVIDIA.*GeForce 9700M.* 2 1
NVIDIA GeForce 9800M .*NVIDIA.*GeForce 9800M.* 3 1
NVIDIA GeForce 9800 .*NVIDIA.*GeForce 98.* 3 1
NVIDIA GeForce FX 5100 .*NVIDIA.*GeForce FX 51.* 0 1
NVIDIA GeForce FX 5200 .*NVIDIA.*GeForce FX 52.* 0 1
NVIDIA GeForce FX 5300 .*NVIDIA.*GeForce FX 53.* 0 1
NVIDIA GeForce FX 5500 .*NVIDIA.*GeForce FX 55.* 0 1
NVIDIA GeForce FX 5600 .*NVIDIA.*GeForce FX 56.* 0 1
NVIDIA GeForce FX 5700 .*NVIDIA.*GeForce FX 57.* 1 1
NVIDIA GeForce FX 5800 .*NVIDIA.*GeForce FX 58.* 1 1
NVIDIA GeForce FX 5900 .*NVIDIA.*GeForce FX 59.* 1 1
NVIDIA GeForce FX Go5100 .*NVIDIA.*GeForce FX Go51.* 0 1
NVIDIA GeForce FX Go5200 .*NVIDIA.*GeForce FX Go52.* 0 1
NVIDIA GeForce FX Go5300 .*NVIDIA.*GeForce FX Go53.* 0 1
NVIDIA GeForce FX Go5500 .*NVIDIA.*GeForce FX Go55.* 0 1
NVIDIA GeForce FX Go5600 .*NVIDIA.*GeForce FX Go56.* 0 1
NVIDIA GeForce FX Go5700 .*NVIDIA.*GeForce FX Go57.* 1 1
NVIDIA GeForce FX Go5800 .*NVIDIA.*GeForce FX Go58.* 1 1
NVIDIA GeForce FX Go5900 .*NVIDIA.*GeForce FX Go59.* 1 1
NVIDIA GeForce FX Go5xxx .*NVIDIA.*GeForce FX Go.* 0 1
NVIDIA GeForce Go 6100 .*NVIDIA.*GeForce Go 61.* 0 1
NVIDIA GeForce Go 6200 .*NVIDIA.*GeForce Go 62.* 0 1
NVIDIA GeForce Go 6400 .*NVIDIA.*GeForce Go 64.* 1 1
NVIDIA GeForce Go 6500 .*NVIDIA.*GeForce Go 65.* 1 1
NVIDIA GeForce Go 6600 .*NVIDIA.*GeForce Go 66.* 1 1
NVIDIA GeForce Go 6700 .*NVIDIA.*GeForce Go 67.* 1 1
NVIDIA GeForce Go 6800 .*NVIDIA.*GeForce Go 68.* 1 1
NVIDIA GeForce Go 7200 .*NVIDIA.*GeForce Go 72.* 1 1
NVIDIA GeForce Go 7300 LE .*NVIDIA.*GeForce Go 73.*LE.* 0 1
NVIDIA GeForce Go 7300 .*NVIDIA.*GeForce Go 73.* 1 1
NVIDIA GeForce Go 7400 .*NVIDIA.*GeForce Go 74.* 1 1
NVIDIA GeForce Go 7600 .*NVIDIA.*GeForce Go 76.* 2 1
NVIDIA GeForce Go 7700 .*NVIDIA.*GeForce Go 77.* 2 1
NVIDIA GeForce Go 7800 .*NVIDIA.*GeForce Go 78.* 2 1
NVIDIA GeForce Go 7900 .*NVIDIA.*GeForce Go 79.* 2 1
NVIDIA D9M .*NVIDIA.*D9M.* 1 1
NVIDIA G94 .*NVIDIA.*G94.* 3 1
NVIDIA GeForce 4 .*NVIDIA .*GeForce ?4.* 0 1
NVIDIA GeForce 4 Go .*NVIDIA .*GeForce ?4.*Go.* 0 1
NVIDIA GeForce 4 MX .*NVIDIA .*GeForce ?4 MX.* 0 1
NVIDIA GeForce 4 PCX .*NVIDIA .*GeForce ?4 PCX.* 0 1
NVIDIA GeForce 4 Ti .*NVIDIA .*GeForce ?4 Ti.* 0 1
NVIDIA GeForce 6100 .*NVIDIA .*GeForce 61.* 0 1
NVIDIA GeForce 6200 .*NVIDIA .*GeForce 62.* 0 1
NVIDIA GeForce 6500 .*NVIDIA .*GeForce 65.* 0 1
NVIDIA GeForce 6600 .*NVIDIA .*GeForce 66.* 1 1
NVIDIA GeForce 6700 .*NVIDIA .*GeForce 67.* 2 1
NVIDIA GeForce 6800 .*NVIDIA .*GeForce 68.* 2 1
NVIDIA GeForce 7000 .*NVIDIA .*GeForce 70.* 0 1
NVIDIA GeForce 7100 .*NVIDIA .*GeForce 71.* 0 1
NVIDIA GeForce 7200 .*NVIDIA .*GeForce 72.* 1 1
NVIDIA GeForce 7300 .*NVIDIA .*GeForce 73.* 1 1
NVIDIA GeForce 7500 .*NVIDIA .*GeForce 75.* 1 1
NVIDIA GeForce 7600 .*NVIDIA .*GeForce 76.* 2 1
NVIDIA GeForce 7800 .*NVIDIA .*GeForce 78.* 2 1
NVIDIA GeForce 7900 .*NVIDIA .*GeForce 79.* 2 1
NVIDIA GeForce 8100 .*NVIDIA .*GeForce 81.* 1 1
NVIDIA GeForce 8200M .*NVIDIA .*GeForce 8200M.* 1 1
NVIDIA GeForce 8200 .*NVIDIA .*GeForce 82.* 1 1
NVIDIA GeForce 8300 .*NVIDIA .*GeForce 83.* 1 1
NVIDIA GeForce 8400M .*NVIDIA .*GeForce 8400M.* 1 1
NVIDIA GeForce 8400 .*NVIDIA .*GeForce 84.* 1 1
NVIDIA GeForce 8500 .*NVIDIA .*GeForce 85.* 3 1
NVIDIA GeForce 8600M .*NVIDIA .*GeForce 8600M.* 1 1
NVIDIA GeForce 8600 .*NVIDIA .*GeForce 86.* 3 1
NVIDIA GeForce 8700M .*NVIDIA .*GeForce 8700M.* 3 1
NVIDIA GeForce 8700 .*NVIDIA .*GeForce 87.* 3 1
NVIDIA GeForce 8800M .*NVIDIA .*GeForce 8800M.* 3 1
NVIDIA GeForce 8800 .*NVIDIA .*GeForce 88.* 3 1
NVIDIA GeForce 9100M .*NVIDIA .*GeForce 9100M.* 0 1
NVIDIA GeForce 9100 .*NVIDIA .*GeForce 91.* 0 1
NVIDIA GeForce 9200M .*NVIDIA .*GeForce 9200M.* 1 1
NVIDIA GeForce 9200 .*NVIDIA .*GeForce 92.* 1 1
NVIDIA GeForce 9300M .*NVIDIA .*GeForce 9300M.* 1 1
NVIDIA GeForce 9300 .*NVIDIA .*GeForce 93.* 1 1
NVIDIA GeForce 9400M .*NVIDIA .*GeForce 9400M.* 1 1
NVIDIA GeForce 9400 .*NVIDIA .*GeForce 94.* 1 1
NVIDIA GeForce 9500M .*NVIDIA .*GeForce 9500M.* 2 1
NVIDIA GeForce 9500 .*NVIDIA .*GeForce 95.* 2 1
NVIDIA GeForce 9600M .*NVIDIA .*GeForce 9600M.* 3 1
NVIDIA GeForce 9600 .*NVIDIA .*GeForce 96.* 2 1
NVIDIA GeForce 9700M .*NVIDIA .*GeForce 9700M.* 2 1
NVIDIA GeForce 9800M .*NVIDIA .*GeForce 9800M.* 3 1
NVIDIA GeForce 9800 .*NVIDIA .*GeForce 98.* 3 1
NVIDIA GeForce FX 5100 .*NVIDIA .*GeForce FX 51.* 0 1
NVIDIA GeForce FX 5200 .*NVIDIA .*GeForce FX 52.* 0 1
NVIDIA GeForce FX 5300 .*NVIDIA .*GeForce FX 53.* 0 1
NVIDIA GeForce FX 5500 .*NVIDIA .*GeForce FX 55.* 0 1
NVIDIA GeForce FX 5600 .*NVIDIA .*GeForce FX 56.* 0 1
NVIDIA GeForce FX 5700 .*NVIDIA .*GeForce FX 57.* 1 1
NVIDIA GeForce FX 5800 .*NVIDIA .*GeForce FX 58.* 1 1
NVIDIA GeForce FX 5900 .*NVIDIA .*GeForce FX 59.* 1 1
NVIDIA GeForce FX Go5100 .*NVIDIA .*GeForce FX Go51.* 0 1
NVIDIA GeForce FX Go5200 .*NVIDIA .*GeForce FX Go52.* 0 1
NVIDIA GeForce FX Go5300 .*NVIDIA .*GeForce FX Go53.* 0 1
NVIDIA GeForce FX Go5500 .*NVIDIA .*GeForce FX Go55.* 0 1
NVIDIA GeForce FX Go5600 .*NVIDIA .*GeForce FX Go56.* 0 1
NVIDIA GeForce FX Go5700 .*NVIDIA .*GeForce FX Go57.* 1 1
NVIDIA GeForce FX Go5800 .*NVIDIA .*GeForce FX Go58.* 1 1
NVIDIA GeForce FX Go5900 .*NVIDIA .*GeForce FX Go59.* 1 1
NVIDIA GeForce FX Go5xxx .*NVIDIA .*GeForce FX Go.* 0 1
NVIDIA GeForce Go 6100 .*NVIDIA .*GeForce Go 61.* 0 1
NVIDIA GeForce Go 6200 .*NVIDIA .*GeForce Go 62.* 0 1
NVIDIA GeForce Go 6400 .*NVIDIA .*GeForce Go 64.* 1 1
NVIDIA GeForce Go 6500 .*NVIDIA .*GeForce Go 65.* 1 1
NVIDIA GeForce Go 6600 .*NVIDIA .*GeForce Go 66.* 1 1
NVIDIA GeForce Go 6700 .*NVIDIA .*GeForce Go 67.* 1 1
NVIDIA GeForce Go 6800 .*NVIDIA .*GeForce Go 68.* 1 1
NVIDIA GeForce Go 7200 .*NVIDIA .*GeForce Go 72.* 1 1
NVIDIA GeForce Go 7300 LE .*NVIDIA .*GeForce Go 73.*LE.* 0 1
NVIDIA GeForce Go 7300 .*NVIDIA .*GeForce Go 73.* 1 1
NVIDIA GeForce Go 7400 .*NVIDIA .*GeForce Go 74.* 1 1
NVIDIA GeForce Go 7600 .*NVIDIA .*GeForce Go 76.* 2 1
NVIDIA GeForce Go 7700 .*NVIDIA .*GeForce Go 77.* 2 1
NVIDIA GeForce Go 7800 .*NVIDIA .*GeForce Go 78.* 2 1
NVIDIA GeForce Go 7900 .*NVIDIA .*GeForce Go 79.* 2 1
NVIDIA D9M .*NVIDIA .*D9M.* 1 1
NVIDIA G94 .*NVIDIA .*G94.* 3 1
NVIDIA GeForce Go 6 .*GeForce Go 6.* 1 1
NVIDIA ION 2 .*NVIDIA ION 2.* 2 1
NVIDIA ION .*NVIDIA ION.* 2 1
NVIDIA NB9M .*GeForce NB9M.* 1 1
NVIDIA NB9P .*GeForce NB9P.* 1 1
NVIDIA ION 2 .*NVIDIA .*ION 2.* 2 1
NVIDIA ION .*NVIDIA .*ION.* 2 1
NVIDIA NB8M .*NVIDIA .*NB8M.* 1 1
NVIDIA NB8P .*NVIDIA .*NB8P.* 2 1
NVIDIA NB9E .*NVIDIA .*NB9E.* 3 1
NVIDIA NB9M .*NVIDIA .*NB9M.* 1 1
NVIDIA NB9P .*NVIDIA .*NB9P.* 2 1
NVIDIA N10 .*NVIDIA .*N10.* 1 1
NVIDIA GeForce PCX .*GeForce PCX.* 0 1
NVIDIA Generic .*NVIDIA.*Unknown.* 0 0
NVIDIA NV17 .*GeForce NV17.* 0 1
NVIDIA NV34 .*NVIDIA.*NV34.* 0 1
NVIDIA NV35 .*NVIDIA.*NV35.* 0 1
NVIDIA NV36 .*GeForce NV36.* 1 1
NVIDIA NV43 .*NVIDIA *NV43.* 1 1
NVIDIA NV44 .*NVIDIA *NV44.* 1 1
NVIDIA nForce .*NVIDIA *nForce.* 0 0
NVIDIA MCP78 .*NVIDIA *MCP78.* 1 1
NVIDIA Generic .*NVIDIA .*Unknown.* 0 0
NVIDIA NV17 .*NVIDIA .*NV17.* 0 1
NVIDIA NV34 .*NVIDIA .*NV34.* 0 1
NVIDIA NV35 .*NVIDIA .*NV35.* 0 1
NVIDIA NV36 .*NVIDIA .*NV36.* 1 1
NVIDIA NV41 .*NVIDIA .*NV41.* 1 1
NVIDIA NV43 .*NVIDIA .*NV43.* 1 1
NVIDIA NV44 .*NVIDIA .*NV44.* 1 1
NVIDIA nForce .*NVIDIA .*nForce.* 0 0
NVIDIA MCP51 .*NVIDIA .*MCP51.* 1 1
NVIDIA MCP61 .*NVIDIA .*MCP61.* 1 1
NVIDIA MCP67 .*NVIDIA .*MCP67.* 1 1
NVIDIA MCP68 .*NVIDIA .*MCP68.* 1 1
NVIDIA MCP73 .*NVIDIA .*MCP73.* 1 1
NVIDIA MCP77 .*NVIDIA .*MCP77.* 1 1
NVIDIA MCP78 .*NVIDIA .*MCP78.* 1 1
NVIDIA MCP79 .*NVIDIA .*MCP79.* 1 1
NVIDIA MCP7A .*NVIDIA .*MCP7A.* 1 1
NVIDIA Quadro2 .*Quadro2.* 0 1
NVIDIA Quadro 1000M .*Quadro.*1000M.* 2 1
NVIDIA Quadro 2000 M/D .*Quadro.*2000(M|D)?.* 3 1
NVIDIA Quadro 2000 M/D .*Quadro.*2000.* 3 1
NVIDIA Quadro 3000M .*Quadro.*3000M.* 3 1
NVIDIA Quadro 4000M .*Quadro.*4000M.* 3 1
NVIDIA Quadro 4000 .*Quadro *4000.* 3 1
NVIDIA Quadro 50x0 M .*Quadro.*50.0(M)?.* 3 1
NVIDIA Quadro 50x0 M .*Quadro.*50.0.* 3 1
NVIDIA Quadro 6000 .*Quadro.*6000.* 3 1
NVIDIA Quadro 400 .*Quadro.*400.* 2 1
NVIDIA Quadro 600 .*Quadro.*600.* 2 1
NVIDIA Quadro4 .*Quadro4.* 0 1
NVIDIA Quadro DCC .*Quadro DCC.* 0 1
NVIDIA Quadro CX .*Quadro.*CX.* 3 1
NVIDIA Quadro FX 770M .*Quadro.*FX *770M.* 2 1
NVIDIA Quadro FX 1500M .*Quadro.*FX *1500M.* 1 1
NVIDIA Quadro FX 1600M .*Quadro.*FX *1600M.* 2 1
@ -498,16 +513,16 @@ NVIDIA Quadro FX 3700 .*Quadro.*FX *3700.* 3 1
NVIDIA Quadro FX 3800 .*Quadro.*FX *3800.* 3 1
NVIDIA Quadro FX 4500 .*Quadro.*FX *45.* 3 1
NVIDIA Quadro FX 880M .*Quadro.*FX *880M.* 3 1
NVIDIA Quadro FX 4800 .*NVIDIA.*Quadro *FX *4800.* 3 1
NVIDIA Quadro FX 4800 .*NVIDIA .*Quadro *FX *4800.* 3 1
NVIDIA Quadro FX .*Quadro FX.* 1 1
NVIDIA Quadro NVS 1xxM .*Quadro NVS *1.[05]M.* 0 1
NVIDIA Quadro NVS 300M .*NVIDIA.*NVS *300M.* 2 1
NVIDIA Quadro NVS 320M .*NVIDIA.*NVS *320M.* 2 1
NVIDIA Quadro NVS 2100M .*NVIDIA.*NVS *2100M.* 2 1
NVIDIA Quadro NVS 3100M .*NVIDIA.*NVS *3100M.* 2 1
NVIDIA Quadro NVS 4200M .*NVIDIA.*NVS *4200M.* 2 1
NVIDIA Quadro NVS 5100M .*NVIDIA.*NVS *5100M.* 2 1
NVIDIA Quadro NVS .*NVIDIA.*NVS 0 1
NVIDIA Quadro NVS 300M .*NVIDIA .*NVS *300M.* 2 1
NVIDIA Quadro NVS 320M .*NVIDIA .*NVS *320M.* 2 1
NVIDIA Quadro NVS 2100M .*NVIDIA .*NVS *2100M.* 2 1
NVIDIA Quadro NVS 3100M .*NVIDIA .*NVS *3100M.* 2 1
NVIDIA Quadro NVS 4200M .*NVIDIA .*NVS *4200M.* 2 1
NVIDIA Quadro NVS 5100M .*NVIDIA .*NVS *5100M.* 2 1
NVIDIA Quadro NVS .*NVIDIA .*NVS 0 1
NVIDIA RIVA TNT .*RIVA TNT.* 0 0
S3 .*S3 Graphics.* 0 0
SiS SiS.* 0 0
@ -517,3 +532,4 @@ XGI XGI.* 0 0
VIA VIA.* 0 0
Apple Generic Apple.*Generic.* 0 0
Apple Software Renderer Apple.*Software Renderer.* 0 0
Humper Humper.* 0 1

View File

@ -724,7 +724,7 @@ bool LLAppViewer::init()
//set the max heap size.
initMaxHeapSize() ;
LLPrivateMemoryPoolManager::initClass((BOOL)gSavedSettings.getBOOL("MemoryPrivatePoolEnabled")) ;
LLPrivateMemoryPoolManager::initClass((BOOL)gSavedSettings.getBOOL("MemoryPrivatePoolEnabled"), (U32)gSavedSettings.getU32("MemoryPrivatePoolSize")) ;
// write Google Breakpad minidump files to our log directory
std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "");
@ -1124,9 +1124,12 @@ void LLAppViewer::checkMemory()
{
const static F32 MEMORY_CHECK_INTERVAL = 1.0f ; //second
//const static F32 MAX_QUIT_WAIT_TIME = 30.0f ; //seconds
const static U32 MAX_SIZE_CHECKED_MEMORY_BLOCK = 64 * 1024 * 1024 ; //64 MB
//static F32 force_quit_timer = MAX_QUIT_WAIT_TIME + MEMORY_CHECK_INTERVAL ;
static void* last_reserved_address = NULL ;
//static F32 force_quit_timer = MAX_QUIT_WAIT_TIME + MEMORY_CHECK_INTERVAL ;
if(!gGLManager.mDebugGPU)
{
return ;
}
if(MEMORY_CHECK_INTERVAL > mMemCheckTimer.getElapsedTimeF32())
{
@ -1134,53 +1137,12 @@ void LLAppViewer::checkMemory()
}
mMemCheckTimer.reset() ;
if(gGLManager.mDebugGPU)
{
//update the availability of memory
LLMemory::updateMemoryInfo() ;
}
//update the availability of memory
LLMemory::updateMemoryInfo() ;
//check the virtual address space fragmentation
if(!last_reserved_address)
{
last_reserved_address = LLMemory::tryToAlloc(last_reserved_address, MAX_SIZE_CHECKED_MEMORY_BLOCK) ;
}
else
{
last_reserved_address = LLMemory::tryToAlloc(last_reserved_address, MAX_SIZE_CHECKED_MEMORY_BLOCK) ;
if(!last_reserved_address) //failed, try once more
{
last_reserved_address = LLMemory::tryToAlloc(last_reserved_address, MAX_SIZE_CHECKED_MEMORY_BLOCK) ;
}
}
bool is_low = LLMemory::isMemoryPoolLow() ;
S32 is_low = !last_reserved_address || LLMemory::isMemoryPoolLow() ;
//if(is_low < 0) //to force quit
//{
// if(force_quit_timer > MAX_QUIT_WAIT_TIME) //just hit the limit for the first time
// {
// //send out the notification to tell the viewer is about to quit in 30 seconds.
// LLNotification::Params params("ForceQuitDueToLowMemory");
// LLNotifications::instance().add(params);
// force_quit_timer = MAX_QUIT_WAIT_TIME - MEMORY_CHECK_INTERVAL ;
// }
// else
// {
// force_quit_timer -= MEMORY_CHECK_INTERVAL ;
// if(force_quit_timer < 0.f)
// {
// forceQuit() ; //quit
// }
// }
//}
//else
//{
// force_quit_timer = MAX_QUIT_WAIT_TIME + MEMORY_CHECK_INTERVAL ;
//}
LLPipeline::throttleNewMemoryAllocation(!is_low ? FALSE : TRUE) ;
LLPipeline::throttleNewMemoryAllocation(is_low) ;
if(is_low)
{
@ -2326,7 +2288,7 @@ bool LLAppViewer::initConfiguration()
if (gSavedSettings.getBOOL("FirstRunThisInstall"))
{
gSavedSettings.setString("SessionSettingsFile", "settings.xml");
// Note that the "FirstRunThisInstall" settings is currently unused.
gSavedSettings.setBOOL("FirstRunThisInstall", FALSE);
}

View File

@ -70,6 +70,22 @@ extern U32 gPacketsIn;
static std::string get_viewer_release_notes_url();
///----------------------------------------------------------------------------
/// Class LLServerReleaseNotesURLFetcher
///----------------------------------------------------------------------------
class LLServerReleaseNotesURLFetcher : public LLHTTPClient::Responder
{
LOG_CLASS(LLServerReleaseNotesURLFetcher);
public:
static void startFetch();
/*virtual*/ void completedHeader(U32 status, const std::string& reason, const LLSD& content);
/*virtual*/ void completedRaw(
U32 status,
const std::string& reason,
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer);
};
///----------------------------------------------------------------------------
/// Class LLFloaterAbout
@ -89,6 +105,11 @@ public:
/// separated so that we can programmatically access the same info.
static LLSD getInfo();
void onClickCopyToClipboard();
void updateServerReleaseNotesURL(const std::string& url);
private:
void setSupportText(const std::string& server_release_notes_url);
};
@ -122,76 +143,17 @@ BOOL LLFloaterAbout::postBuild()
getChild<LLUICtrl>("copy_btn")->setCommitCallback(
boost::bind(&LLFloaterAbout::onClickCopyToClipboard, this));
#if LL_WINDOWS
getWindow()->incBusyCount();
getWindow()->setCursor(UI_CURSOR_ARROW);
#endif
LLSD info(getInfo());
#if LL_WINDOWS
getWindow()->decBusyCount();
getWindow()->setCursor(UI_CURSOR_ARROW);
#endif
std::ostringstream support;
// Render the LLSD from getInfo() as a format_map_t
LLStringUtil::format_map_t args;
// allow the "Release Notes" URL label to be localized
args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes");
for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap());
ii != iend; ++ii)
if (gAgent.getRegion())
{
if (! ii->second.isArray())
{
// Scalar value
if (ii->second.isUndefined())
{
args[ii->first] = getString("none");
}
else
{
// don't forget to render value asString()
args[ii->first] = ii->second.asString();
}
}
else
{
// array value: build KEY_0, KEY_1 etc. entries
for (LLSD::Integer n(0), size(ii->second.size()); n < size; ++n)
{
args[STRINGIZE(ii->first << '_' << n)] = ii->second[n].asString();
}
}
// start fetching server release notes URL
setSupportText(LLTrans::getString("RetrievingData"));
LLServerReleaseNotesURLFetcher::startFetch();
}
else // not logged in
{
setSupportText(LLStringUtil::null);
}
// Now build the various pieces
support << getString("AboutHeader", args);
if (info.has("REGION"))
{
support << "\n\n" << getString("AboutPosition", args);
}
support << "\n\n" << getString("AboutSystem", args);
support << "\n";
if (info.has("GRAPHICS_DRIVER_VERSION"))
{
support << "\n" << getString("AboutDriver", args);
}
support << "\n" << getString("AboutLibs", args);
if (info.has("COMPILER"))
{
support << "\n" << getString("AboutCompiler", args);
}
if (info.has("PACKETS_IN"))
{
support << '\n' << getString("AboutTraffic", args);
}
support_widget->appendText(support.str(),
FALSE,
LLStyle::Params()
.color(LLUIColorTable::instance().getColor("TextFgReadOnlyColor")));
support_widget->blockUndo();
// Fix views
@ -294,7 +256,6 @@ LLSD LLFloaterAbout::getInfo()
info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName();
info["HOSTIP"] = gAgent.getRegion()->getHost().getString();
info["SERVER_VERSION"] = gLastVersionChannel;
info["SERVER_RELEASE_NOTES_URL"] = LLWeb::escapeURL(region->getCapability("ServerReleaseNotes"));
}
// CPU
@ -389,6 +350,95 @@ void LLFloaterAbout::onClickCopyToClipboard()
support_widget->deselect();
}
void LLFloaterAbout::updateServerReleaseNotesURL(const std::string& url)
{
setSupportText(url);
}
void LLFloaterAbout::setSupportText(const std::string& server_release_notes_url)
{
#if LL_WINDOWS
getWindow()->incBusyCount();
getWindow()->setCursor(UI_CURSOR_ARROW);
#endif
LLSD info(getInfo());
#if LL_WINDOWS
getWindow()->decBusyCount();
getWindow()->setCursor(UI_CURSOR_ARROW);
#endif
if (LLStringUtil::startsWith(server_release_notes_url, "http")) // it's an URL
{
info["SERVER_RELEASE_NOTES_URL"] = "[" + LLWeb::escapeURL(server_release_notes_url) + " " + LLTrans::getString("ReleaseNotes") + "]";
}
else
{
info["SERVER_RELEASE_NOTES_URL"] = server_release_notes_url;
}
LLViewerTextEditor *support_widget =
getChild<LLViewerTextEditor>("support_editor", true);
std::ostringstream support;
// Render the LLSD from getInfo() as a format_map_t
LLStringUtil::format_map_t args;
for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap());
ii != iend; ++ii)
{
if (! ii->second.isArray())
{
// Scalar value
if (ii->second.isUndefined())
{
args[ii->first] = getString("none");
}
else
{
// don't forget to render value asString()
args[ii->first] = ii->second.asString();
}
}
else
{
// array value: build KEY_0, KEY_1 etc. entries
for (LLSD::Integer n(0), size(ii->second.size()); n < size; ++n)
{
args[STRINGIZE(ii->first << '_' << n)] = ii->second[n].asString();
}
}
}
// Now build the various pieces
support << getString("AboutHeader", args);
if (info.has("REGION"))
{
support << "\n\n" << getString("AboutPosition", args);
}
support << "\n\n" << getString("AboutSystem", args);
support << "\n";
if (info.has("GRAPHICS_DRIVER_VERSION"))
{
support << "\n" << getString("AboutDriver", args);
}
support << "\n" << getString("AboutLibs", args);
if (info.has("COMPILER"))
{
support << "\n" << getString("AboutCompiler", args);
}
if (info.has("PACKETS_IN"))
{
support << '\n' << getString("AboutTraffic", args);
}
support_widget->clear();
support_widget->appendText(support.str(),
FALSE,
LLStyle::Params()
.color(LLUIColorTable::instance().getColor("TextFgReadOnlyColor")));
}
///----------------------------------------------------------------------------
/// LLFloaterAboutUtil
///----------------------------------------------------------------------------
@ -398,3 +448,52 @@ void LLFloaterAboutUtil::registerFloater()
&LLFloaterReg::build<LLFloaterAbout>);
}
///----------------------------------------------------------------------------
/// Class LLServerReleaseNotesURLFetcher implementation
///----------------------------------------------------------------------------
// static
void LLServerReleaseNotesURLFetcher::startFetch()
{
LLViewerRegion* region = gAgent.getRegion();
if (!region) return;
// We cannot display the URL returned by the ServerReleaseNotes capability
// because opening it in an external browser will trigger a warning about untrusted
// SSL certificate.
// So we query the URL ourselves, expecting to find
// an URL suitable for external browsers in the "Location:" HTTP header.
std::string cap_url = region->getCapability("ServerReleaseNotes");
LLHTTPClient::get(cap_url, new LLServerReleaseNotesURLFetcher);
}
// virtual
void LLServerReleaseNotesURLFetcher::completedHeader(U32 status, const std::string& reason, const LLSD& content)
{
lldebugs << "Status: " << status << llendl;
lldebugs << "Reason: " << reason << llendl;
lldebugs << "Headers: " << content << llendl;
LLFloaterAbout* floater_about = LLFloaterReg::getTypedInstance<LLFloaterAbout>("sl_about");
if (floater_about)
{
std::string location = content["location"].asString();
if (location.empty())
{
location = floater_about->getString("ErrorFetchingServerReleaseNotesURL");
}
floater_about->updateServerReleaseNotesURL(location);
}
}
// virtual
void LLServerReleaseNotesURLFetcher::completedRaw(
U32 status,
const std::string& reason,
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer)
{
// Do nothing.
// We're overriding just because the base implementation tries to
// deserialize LLSD which triggers warnings.
}

View File

@ -304,7 +304,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mOriginalIMViaEmail(false),
mLanguageChanged(false),
mAvatarDataInitialized(false),
mDoubleClickActionDirty(false)
mClickActionDirty(false)
{
//Build Floater is now Called from LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
@ -348,8 +348,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
sSkin = gSavedSettings.getString("SkinCurrent");
mCommitCallbackRegistrar.add("Pref.CommitDoubleClickChekbox", boost::bind(&LLFloaterPreference::onDoubleClickCheckBox, this, _1));
mCommitCallbackRegistrar.add("Pref.CommitRadioDoubleClick", boost::bind(&LLFloaterPreference::onDoubleClickRadio, this));
mCommitCallbackRegistrar.add("Pref.ClickActionChange", boost::bind(&LLFloaterPreference::onClickActionChange, this));
gSavedSettings.getControl("NameTagShowUsernames")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2));
gSavedSettings.getControl("NameTagShowFriends")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2));
@ -439,8 +438,6 @@ BOOL LLFloaterPreference::postBuild()
if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
tabcontainer->selectFirstTab();
updateDoubleClickControls();
getChild<LLUICtrl>("cache_location")->setEnabled(FALSE); // make it read-only but selectable (STORM-227)
std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");
setCacheLocation(cache_location);
@ -581,10 +578,10 @@ void LLFloaterPreference::apply()
saveAvatarProperties();
if (mDoubleClickActionDirty)
if (mClickActionDirty)
{
updateDoubleClickSettings();
mDoubleClickActionDirty = false;
updateClickActionSettings();
mClickActionDirty = false;
}
}
@ -613,11 +610,12 @@ void LLFloaterPreference::cancel()
// reverts any changes to current skin
gSavedSettings.setString("SkinCurrent", sSkin);
if (mDoubleClickActionDirty)
if (mClickActionDirty)
{
updateDoubleClickControls();
mDoubleClickActionDirty = false;
updateClickActionControls();
mClickActionDirty = false;
}
LLFloaterPreferenceProxy * advanced_proxy_settings = LLFloaterReg::findTypedInstance<LLFloaterPreferenceProxy>("prefs_proxy");
if (advanced_proxy_settings)
{
@ -681,6 +679,9 @@ void LLFloaterPreference::onOpen(const LLSD& key)
// Display selected maturity icons.
onChangeMaturity();
// Load (double-)click to walk/teleport settings.
updateClickActionControls();
// Enabled/disabled popups, might have been changed by user actions
// while preferences floater was closed.
@ -1503,72 +1504,34 @@ void LLFloaterPreference::onClickBlockList()
}
}
void LLFloaterPreference::onDoubleClickCheckBox(LLUICtrl* ctrl)
{
if (!ctrl) return;
mDoubleClickActionDirty = true;
LLRadioGroup* radio_double_click_action = getChild<LLRadioGroup>("double_click_action");
if (!radio_double_click_action) return;
// select default value("teleport") in radio-group.
radio_double_click_action->setSelectedIndex(0);
// set radio-group enabled depending on state of checkbox
radio_double_click_action->setEnabled(ctrl->getValue());
}
void LLFloaterPreference::onDoubleClickRadio()
{
mDoubleClickActionDirty = true;
}
void LLFloaterPreference::updateDoubleClickSettings()
{
LLCheckBoxCtrl* double_click_action_cb = getChild<LLCheckBoxCtrl>("double_click_chkbox");
if (!double_click_action_cb) return;
bool enable = double_click_action_cb->getValue().asBoolean();
LLRadioGroup* radio_double_click_action = getChild<LLRadioGroup>("double_click_action");
if (!radio_double_click_action) return;
// enable double click radio-group depending on state of checkbox
radio_double_click_action->setEnabled(enable);
if (!enable)
{
// set double click action settings values to false if checkbox was unchecked
gSavedSettings.setBOOL("DoubleClickAutoPilot", false);
gSavedSettings.setBOOL("DoubleClickTeleport", false);
}
else
{
std::string selected = radio_double_click_action->getValue().asString();
bool teleport_selected = selected == "radio_teleport";
// set double click action settings values depending on chosen radio-button
gSavedSettings.setBOOL( "DoubleClickTeleport", teleport_selected );
gSavedSettings.setBOOL( "DoubleClickAutoPilot", !teleport_selected );
}
}
void LLFloaterPreference::onClickProxySettings()
{
LLFloaterReg::showInstance("prefs_proxy");
}
void LLFloaterPreference::updateDoubleClickControls()
void LLFloaterPreference::onClickActionChange()
{
// check is one of double-click actions settings enabled
bool double_click_action_enabled = gSavedSettings.getBOOL("DoubleClickAutoPilot") || gSavedSettings.getBOOL("DoubleClickTeleport");
LLCheckBoxCtrl* double_click_action_cb = getChild<LLCheckBoxCtrl>("double_click_chkbox");
if (double_click_action_cb)
{
// check checkbox if one of double-click actions settings enabled, uncheck otherwise
double_click_action_cb->setValue(double_click_action_enabled);
}
LLRadioGroup* double_click_action_radio = getChild<LLRadioGroup>("double_click_action");
if (!double_click_action_radio) return;
// set radio-group enabled if one of double-click actions settings enabled
double_click_action_radio->setEnabled(double_click_action_enabled);
// select button in radio-group depending on setting
double_click_action_radio->setSelectedIndex(gSavedSettings.getBOOL("DoubleClickAutoPilot"));
mClickActionDirty = true;
}
void LLFloaterPreference::updateClickActionSettings()
{
const int single_clk_action = getChild<LLComboBox>("single_click_action_combo")->getValue().asInteger();
const int double_clk_action = getChild<LLComboBox>("double_click_action_combo")->getValue().asInteger();
gSavedSettings.setBOOL("ClickToWalk", single_clk_action == 1);
gSavedSettings.setBOOL("DoubleClickAutoPilot", double_clk_action == 1);
gSavedSettings.setBOOL("DoubleClickTeleport", double_clk_action == 2);
}
void LLFloaterPreference::updateClickActionControls()
{
const bool click_to_walk = gSavedSettings.getBOOL("ClickToWalk");
const bool dbl_click_to_walk = gSavedSettings.getBOOL("DoubleClickAutoPilot");
const bool dbl_click_to_teleport = gSavedSettings.getBOOL("DoubleClickTeleport");
getChild<LLComboBox>("single_click_action_combo")->setValue((int)click_to_walk);
getChild<LLComboBox>("double_click_action_combo")->setValue(dbl_click_to_teleport ? 2 : (int)dbl_click_to_walk);
}
void LLFloaterPreference::applyUIColor(LLUICtrl* ctrl, const LLSD& param)

View File

@ -104,14 +104,13 @@ protected:
void setHardwareDefaults();
// callback for when client turns on shaders
void onVertexShaderEnable();
// callback for changing double click action checkbox
void onDoubleClickCheckBox(LLUICtrl* ctrl);
// callback for selecting double click action radio-button
void onDoubleClickRadio();
// updates double-click action settings depending on controls from preferences
void updateDoubleClickSettings();
// updates double-click action controls depending on values from settings.xml
void updateDoubleClickControls();
// 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
void updateClickActionControls();
// This function squirrels away the current values of the controls so that
// cancel() can restore them.
@ -164,9 +163,7 @@ public:
static void refreshSkin(void* data);
private:
static std::string sSkin;
// set true if state of double-click action checkbox or radio-group was changed by user
// (reset back to false on apply or cancel)
bool mDoubleClickActionDirty;
bool mClickActionDirty; ///< Set to true when the click/double-click options get changed by user.
bool mGotPersonalInfo;
bool mOriginalIMViaEmail;
bool mLanguageChanged;

View File

@ -1723,7 +1723,7 @@ BOOL LLFolderView::handleUnicodeCharHere(llwchar uni_char)
}
BOOL handled = FALSE;
if (gFocusMgr.childHasKeyboardFocus(getRoot()))
if (mParentPanel->hasFocus())
{
// SL-51858: Key presses are not being passed to the Popup menu.
// A proper fix is non-trivial so instead just close the menu.

View File

@ -1376,16 +1376,17 @@ std::string LLItemBridge::getLabelSuffix() const
LLInventoryItem* item = getItem();
if(item)
{
// it's a bit confusing to put nocopy/nomod/etc on calling cards.
// Any type can have the link suffix...
BOOL broken_link = LLAssetType::lookupIsLinkType(item->getType());
if (broken_link) return BROKEN_LINK;
BOOL link = item->getIsLinkType();
if (link) return LINK;
// ...but it's a bit confusing to put nocopy/nomod/etc suffixes on calling cards.
if(LLAssetType::AT_CALLINGCARD != item->getType()
&& item->getPermissions().getOwner() == gAgent.getID())
{
BOOL broken_link = LLAssetType::lookupIsLinkType(item->getType());
if (broken_link) return BROKEN_LINK;
BOOL link = item->getIsLinkType();
if (link) return LINK;
BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID());
if (!copy)
{

View File

@ -196,15 +196,12 @@ void LLInboxFolderViewFolder::computeFreshness()
if (last_expansion_utc > 0)
{
const U32 time_offset_for_pdt = 7 * 60 * 60;
const U32 last_expansion = last_expansion_utc - time_offset_for_pdt;
mFresh = (mCreationDate > last_expansion);
mFresh = (mCreationDate > last_expansion_utc);
#if DEBUGGING_FRESHNESS
if (mFresh)
{
llinfos << "Item is fresh! -- creation " << mCreationDate << ", saved_freshness_date " << last_expansion << llendl;
llinfos << "Item is fresh! -- creation " << mCreationDate << ", saved_freshness_date " << last_expansion_utc << llendl;
}
#endif
}

View File

@ -35,7 +35,6 @@
#include "llagent.h"
#include "llagentcamera.h"
#include "llavatarnamecache.h"
#include "llviewercontrol.h"
#include "llfocusmgr.h"
#include "llfirstuse.h"
#include "llfloaterland.h"
@ -57,6 +56,7 @@
#include "lltrans.h"
#include "llviewercamera.h"
#include "llviewerparcelmedia.h"
#include "llviewercontrol.h"
#include "llviewermenu.h"
#include "llviewerobjectlist.h"
#include "llviewerobject.h"
@ -76,7 +76,6 @@ static void handle_click_action_play();
static void handle_click_action_open_media(LLPointer<LLViewerObject> objectp);
static ECursorType cursor_from_parcel_media(U8 click_action);
LLToolPie::LLToolPie()
: LLTool(std::string("Pie")),
mMouseButtonDown( false ),
@ -479,6 +478,18 @@ void LLToolPie::resetSelection()
mClickAction = 0;
}
void 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);
handle_go_to();
}
// When we get object properties after left-clicking on an object
// with left-click = buy, if it's the same object, do the buy.
@ -662,18 +673,9 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
mPick.mPosGlobal = gAgent.getPositionGlobal() + LLVector3d(LLViewerCamera::instance().getAtAxis()) * SELF_CLICK_WALK_DISTANCE;
}
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);
handle_go_to();
walkToClickedLocation();
LLFirstUse::notMoving(false);
mBlockClickToWalk = false;
return TRUE;
}
gViewerWindow->setCursor(UI_CURSOR_ARROW);
@ -708,16 +710,10 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
if (gSavedSettings.getBOOL("DoubleClickAutoPilot"))
{
if (mPick.mPickType == LLPickInfo::PICK_LAND
&& !mPick.mPosGlobal.isExactlyZero())
if ((mPick.mPickType == LLPickInfo::PICK_LAND && !mPick.mPosGlobal.isExactlyZero()) ||
(mPick.mObjectID.notNull() && !mPick.mPosGlobal.isExactlyZero()))
{
handle_go_to();
return TRUE;
}
else if (mPick.mObjectID.notNull()
&& !mPick.mPosGlobal.isExactlyZero())
{
handle_go_to();
walkToClickedLocation();
return TRUE;
}
}

View File

@ -66,6 +66,7 @@ public:
LLViewerObject* getClickActionObject() { return mClickActionObject; }
LLObjectSelection* getLeftClickSelection() { return (LLObjectSelection*)mLeftClickSelection; }
void resetSelection();
void walkToClickedLocation();
void blockClickToWalk() { mBlockClickToWalk = true; }
void stopClickToWalk();

View File

@ -31,99 +31,196 @@
#include "llviewercontrollistener.h"
#include "llviewercontrol.h"
#include "llcontrol.h"
#include "llerror.h"
#include "llsdutil.h"
#include "stringize.h"
#include <sstream>
LLViewerControlListener gSavedSettingsListener;
namespace {
LLViewerControlListener sSavedSettingsListener;
} // unnamed namespace
LLViewerControlListener::LLViewerControlListener()
: LLEventAPI("LLViewerControl",
"LLViewerControl listener: set, toggle or set default for various controls",
"group")
"LLViewerControl listener: set, toggle or set default for various controls")
{
add("Global",
"Set gSavedSettings control [\"key\"] to value [\"value\"]",
boost::bind(&LLViewerControlListener::set, &gSavedSettings, _1));
add("PerAccount",
"Set gSavedPerAccountSettings control [\"key\"] to value [\"value\"]",
boost::bind(&LLViewerControlListener::set, &gSavedPerAccountSettings, _1));
add("Warning",
"Set gWarningSettings control [\"key\"] to value [\"value\"]",
boost::bind(&LLViewerControlListener::set, &gWarningSettings, _1));
add("Crash",
"Set gCrashSettings control [\"key\"] to value [\"value\"]",
boost::bind(&LLViewerControlListener::set, &gCrashSettings, _1));
std::ostringstream groupnames;
groupnames << "[\"group\"] is one of ";
const char* delim = "";
for (LLControlGroup::key_iter cgki(LLControlGroup::beginKeys()),
cgkend(LLControlGroup::endKeys());
cgki != cgkend; ++cgki)
{
groupnames << delim << '"' << *cgki << '"';
delim = ", ";
}
groupnames << '\n';
std::string grouphelp(groupnames.str());
std::string replyhelp("If [\"reply\"] requested, send new [\"value\"] on specified LLEventPump\n");
#if 0
add(/*"toggleControl",*/ "Global", boost::bind(&LLViewerControlListener::toggleControl, &gSavedSettings, _1));
add(/*"toggleControl",*/ "PerAccount", boost::bind(&LLViewerControlListener::toggleControl, &gSavedPerAccountSettings, _1));
add(/*"toggleControl",*/ "Warning", boost::bind(&LLViewerControlListener::toggleControl, &gWarningSettings, _1));
add(/*"toggleControl",*/ "Crash", boost::bind(&LLViewerControlListener::toggleControl, &gCrashSettings, _1));
add(/*"setDefault",*/ "Global", boost::bind(&LLViewerControlListener::setDefault, &gSavedSettings, _1));
add(/*"setDefault",*/ "PerAccount", boost::bind(&LLViewerControlListener::setDefault, &gSavedPerAccountSettings, _1));
add(/*"setDefault",*/ "Warning", boost::bind(&LLViewerControlListener::setDefault, &gWarningSettings, _1));
add(/*"setDefault",*/ "Crash", boost::bind(&LLViewerControlListener::setDefault, &gCrashSettings, _1));
#endif // 0
add("set",
std::string("Set [\"group\"] control [\"key\"] to optional value [\"value\"]\n"
"If [\"value\"] omitted, set to control's defined default value\n") +
grouphelp + replyhelp,
&LLViewerControlListener::set,
LLSDMap("group", LLSD())("key", LLSD()));
add("toggle",
std::string("Toggle [\"group\"] control [\"key\"], if boolean\n") + grouphelp + replyhelp,
&LLViewerControlListener::toggle,
LLSDMap("group", LLSD())("key", LLSD()));
add("get",
std::string("Query [\"group\"] control [\"key\"], replying on LLEventPump [\"reply\"]\n") +
grouphelp,
&LLViewerControlListener::get,
LLSDMap("group", LLSD())("key", LLSD())("reply", LLSD()));
add("groups",
"Send on LLEventPump [\"reply\"] an array [\"groups\"] of valid group names",
&LLViewerControlListener::groups,
LLSDMap("reply", LLSD()));
add("vars",
std::string("For [\"group\"], send on LLEventPump [\"reply\"] an array [\"vars\"],\n"
"each of whose entries looks like:\n"
" [\"name\"], [\"type\"], [\"value\"], [\"comment\"]\n") + grouphelp,
&LLViewerControlListener::vars,
LLSDMap("group", LLSD())("reply", LLSD()));
}
//static
void LLViewerControlListener::set(LLControlGroup * controls, LLSD const & event_data)
struct Info
{
if(event_data.has("key"))
Info(const LLSD& request):
response(LLSD(), request),
groupname(request["group"]),
group(LLControlGroup::getInstance(groupname)),
key(request["key"]),
control(NULL)
{
std::string key(event_data["key"]);
if (! group)
{
response.error(STRINGIZE("Unrecognized group '" << groupname << "'"));
return;
}
if(controls->controlExists(key))
control = group->getControl(key);
if (! control)
{
controls->setUntypedValue(key, event_data["value"]);
response.error(STRINGIZE("In group '" << groupname
<< "', unrecognized control key '" << key << "'"));
}
else
}
~Info()
{
// If in fact the request passed to our constructor names a valid
// group and key, grab the final value of the indicated control and
// stuff it in our response. Since this outer destructor runs before
// the contained Response destructor, this data will go into the
// response we send.
if (control)
{
llwarns << "requested unknown control: \"" << key << '\"' << llendl;
response["name"] = control->getName();
response["type"] = group->typeEnumToString(control->type());
response["value"] = control->get();
response["comment"] = control->getComment();
}
}
LLEventAPI::Response response;
std::string groupname;
LLControlGroup* group;
std::string key;
LLControlVariable* control;
};
//static
void LLViewerControlListener::set(LLSD const & request)
{
Info info(request);
if (! info.control)
return;
if (request.has("value"))
{
info.control->setValue(request["value"]);
}
else
{
info.control->resetToDefault();
}
}
//static
void LLViewerControlListener::toggleControl(LLControlGroup * controls, LLSD const & event_data)
void LLViewerControlListener::toggle(LLSD const & request)
{
if(event_data.has("key"))
{
std::string key(event_data["key"]);
Info info(request);
if (! info.control)
return;
if(controls->controlExists(key))
{
LLControlVariable * control = controls->getControl(key);
if(control->isType(TYPE_BOOLEAN))
{
control->set(!control->get().asBoolean());
}
else
{
llwarns << "requested toggle of non-boolean control: \"" << key << "\", type is " << control->type() << llendl;
}
}
else
{
llwarns << "requested unknown control: \"" << key << '\"' << llendl;
}
if (info.control->isType(TYPE_BOOLEAN))
{
info.control->set(! info.control->get().asBoolean());
}
else
{
info.response.error(STRINGIZE("toggle of non-boolean '" << info.groupname
<< "' control '" << info.key
<< "', type is "
<< info.group->typeEnumToString(info.control->type())));
}
}
//static
void LLViewerControlListener::setDefault(LLControlGroup * controls, LLSD const & event_data)
void LLViewerControlListener::get(LLSD const & request)
{
if(event_data.has("key"))
{
std::string key(event_data["key"]);
// The Info constructor and destructor actually do all the work here.
Info info(request);
}
if(controls->controlExists(key))
{
LLControlVariable * control = controls->getControl(key);
control->resetToDefault();
}
else
{
llwarns << "requested unknown control: \"" << key << '\"' << llendl;
}
void LLViewerControlListener::groups(LLSD const & request)
{
// No Info, we're not looking up either a group or a control name.
Response response(LLSD(), request);
for (LLControlGroup::key_iter cgki(LLControlGroup::beginKeys()),
cgkend(LLControlGroup::endKeys());
cgki != cgkend; ++cgki)
{
response["groups"].append(*cgki);
}
}
struct CollectVars: public LLControlGroup::ApplyFunctor
{
CollectVars(LLControlGroup* g):
mGroup(g)
{}
virtual void apply(const std::string& name, LLControlVariable* control)
{
vars.append(LLSDMap
("name", name)
("type", mGroup->typeEnumToString(control->type()))
("value", control->get())
("comment", control->getComment()));
}
LLControlGroup* mGroup;
LLSD vars;
};
void LLViewerControlListener::vars(LLSD const & request)
{
// This method doesn't use Info, because we're not looking up a specific
// control name.
Response response(LLSD(), request);
std::string groupname(request["group"]);
LLControlGroup* group(LLControlGroup::getInstance(groupname));
if (! group)
{
return response.error(STRINGIZE("Unrecognized group '" << groupname << "'"));
}
CollectVars collector(group);
group->applyToAll(&collector);
response["vars"] = collector.vars;
}

View File

@ -40,11 +40,11 @@ public:
LLViewerControlListener();
private:
static void set(LLControlGroup *controls, LLSD const & event_data);
static void toggleControl(LLControlGroup *controls, LLSD const & event_data);
static void setDefault(LLControlGroup *controls, LLSD const & event_data);
static void set(LLSD const & event_data);
static void toggle(LLSD const & event_data);
static void get(LLSD const & event_data);
static void groups(LLSD const & event_data);
static void vars(LLSD const & event_data);
};
extern LLViewerControlListener gSavedSettingsListener;
#endif // LL_LLVIEWERCONTROLLISTENER_H

View File

@ -202,7 +202,7 @@ void display_stats()
gMemoryAllocated = LLMemory::getCurrentRSS();
U32 memory = (U32)(gMemoryAllocated / (1024*1024));
llinfos << llformat("MEMORY: %d MB", memory) << llendl;
LLMemory::logMemoryInfo() ;
LLMemory::logMemoryInfo(TRUE) ;
gRecentMemoryTime.reset();
}
}

View File

@ -141,7 +141,7 @@ public:
mInventoryItemsDict["Female - Wow"] = LLTrans::getString("Female - Wow");
//common
mInventoryItemsDict["/bow1"] = LLTrans::getString("/bow1");
mInventoryItemsDict["/bow"] = LLTrans::getString("/bow");
mInventoryItemsDict["/clap"] = LLTrans::getString("/clap");
mInventoryItemsDict["/count"] = LLTrans::getString("/count");
mInventoryItemsDict["/extinguish"] = LLTrans::getString("/extinguish");

View File

@ -2836,8 +2836,8 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
else
{
LLVector3 pos, look_at;
U64 region_handle;
U8 region_access;
U64 region_handle(0);
U8 region_access(0);
std::string region_info = ll_safe_string((char*)binary_bucket, binary_bucket_size);
std::string region_access_str = LLStringUtil::null;
std::string region_access_icn = LLStringUtil::null;

View File

@ -36,6 +36,7 @@
#include <iostream>
#include <fstream>
#include <algorithm>
#include <boost/lambda/core.hpp>
#include "llagent.h"
#include "llagentcamera.h"
@ -198,6 +199,7 @@
#include "llfloaternotificationsconsole.h"
#include "llnearbychat.h"
#include "llwindowlistener.h"
#include "llviewerwindowlistener.h"
#include "llpaneltopinfobar.h"
@ -1547,7 +1549,12 @@ LLViewerWindow::LLViewerWindow(
mResDirty(false),
mStatesDirty(false),
mCurrResolutionIndex(0),
mViewerWindowListener(new LLViewerWindowListener(this)),
// gKeyboard is still NULL, so it doesn't do LLWindowListener any good to
// pass its value right now. Instead, pass it a nullary function that
// will, when we later need it, return the value of gKeyboard.
// boost::lambda::var() constructs such a functor on the fly.
mWindowListener(new LLWindowListener(this, boost::lambda::var(gKeyboard))),
mViewerWindowListener(new LLViewerWindowListener(this)),
mProgressView(NULL)
{
LLNotificationChannel::buildChannel("VW_alerts", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alert"));

View File

@ -62,6 +62,7 @@ class LLImageFormatted;
class LLHUDIcon;
class LLWindow;
class LLRootView;
class LLWindowListener;
class LLViewerWindowListener;
class LLPopupView;
@ -456,7 +457,8 @@ protected:
bool mStatesDirty;
U32 mCurrResolutionIndex;
boost::scoped_ptr<LLViewerWindowListener> mViewerWindowListener;
boost::scoped_ptr<LLWindowListener> mWindowListener;
boost::scoped_ptr<LLViewerWindowListener> mViewerWindowListener;
protected:
static std::string sSnapshotBaseName;

View File

@ -0,0 +1,505 @@
/**
* @file llwindowlistener.cpp
* @brief EventAPI interface for injecting input into LLWindow
*
* $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$
*/
#include "llviewerprecompiledheaders.h"
#include "linden_common.h"
#include "llwindowlistener.h"
#include "llcoord.h"
#include "llfocusmgr.h"
#include "llkeyboard.h"
#include "llwindowcallbacks.h"
#include "llui.h"
#include "llview.h"
#include "llviewinject.h"
#include "llviewerwindow.h"
#include "llviewerkeyboard.h"
#include "llrootview.h"
#include "llsdutil.h"
#include "stringize.h"
#include <typeinfo>
#include <map>
#include <boost/scoped_ptr.hpp>
#include <boost/lambda/core.hpp>
#include <boost/lambda/bind.hpp>
namespace bll = boost::lambda;
LLWindowListener::LLWindowListener(LLViewerWindow *window, const KeyboardGetter& kbgetter)
: LLEventAPI("LLWindow", "Inject input events into the LLWindow instance"),
mWindow(window),
mKbGetter(kbgetter)
{
std::string keySomething =
"Given [\"keysym\"], [\"keycode\"] or [\"char\"], inject the specified ";
std::string keyExplain =
"(integer keycode values, or keysym string from any addKeyName() call in\n"
"http://hg.secondlife.com/viewer-development/src/tip/indra/llwindow/llkeyboard.cpp )\n";
std::string mask =
"Specify optional [\"mask\"] as an array containing any of \"CTL\", \"ALT\",\n"
"\"SHIFT\" or \"MAC_CONTROL\"; the corresponding modifier bits will be combined\n"
"to form the mask used with the event.";
std::string given = "Given ";
std::string mouseParams =
"optional [\"path\"], optional [\"x\"] and [\"y\"], inject the requested mouse ";
std::string buttonParams =
std::string("[\"button\"], ") + mouseParams;
std::string buttonExplain =
"(button values \"LEFT\", \"MIDDLE\", \"RIGHT\")\n";
std::string paramsExplain =
"[\"path\"] is as for LLUI::resolvePath(), described in\n"
"http://hg.secondlife.com/viewer-development/src/tip/indra/llui/llui.h\n"
"If you omit [\"path\"], you must specify both [\"x\"] and [\"y\"].\n"
"If you specify [\"path\"] without both [\"x\"] and [\"y\"], will synthesize (x, y)\n"
"in the center of the LLView selected by [\"path\"].\n"
"You may specify [\"path\"] with both [\"x\"] and [\"y\"], will use your (x, y).\n"
"This may cause the LLView selected by [\"path\"] to reject the event.\n"
"Optional [\"reply\"] requests a reply event on the named LLEventPump.\n"
"reply[\"error\"] isUndefined (None) on success, else an explanatory message.\n";
add("getInfo",
"Get information about the ui element specified by [\"path\"]",
&LLWindowListener::getInfo,
LLSDMap("reply", LLSD()));
add("getPaths",
"Send on [\"reply\"] an event in which [\"paths\"] is an array of valid LLView\n"
"pathnames. Optional [\"under\"] pathname specifies the base node under which\n"
"to list; all nodes from root if no [\"under\"].",
&LLWindowListener::getPaths,
LLSDMap("reply", LLSD()));
add("keyDown",
keySomething + "keypress event.\n" + keyExplain + mask,
&LLWindowListener::keyDown);
add("keyUp",
keySomething + "key release event.\n" + keyExplain + mask,
&LLWindowListener::keyUp);
add("mouseDown",
given + buttonParams + "click event.\n" + buttonExplain + paramsExplain + mask,
&LLWindowListener::mouseDown);
add("mouseUp",
given + buttonParams + "release event.\n" + buttonExplain + paramsExplain + mask,
&LLWindowListener::mouseUp);
add("mouseMove",
given + mouseParams + "movement event.\n" + paramsExplain + mask,
&LLWindowListener::mouseMove);
add("mouseScroll",
"Given an integer number of [\"clicks\"], inject the requested mouse scroll event.\n"
"(positive clicks moves downward through typical content)",
&LLWindowListener::mouseScroll);
}
template <typename MAPPED>
class StringLookup
{
private:
std::string mDesc;
typedef std::map<std::string, MAPPED> Map;
Map mMap;
public:
StringLookup(const std::string& desc): mDesc(desc) {}
MAPPED lookup(const typename Map::key_type& key) const
{
typename Map::const_iterator found = mMap.find(key);
if (found == mMap.end())
{
LL_WARNS("LLWindowListener") << "Unknown " << mDesc << " '" << key << "'" << LL_ENDL;
return MAPPED();
}
return found->second;
}
protected:
void add(const typename Map::key_type& key, const typename Map::mapped_type& value)
{
mMap.insert(typename Map::value_type(key, value));
}
};
namespace {
// helper for getMask()
MASK lookupMask_(const std::string& maskname)
{
// It's unclear to me whether MASK_MAC_CONTROL is important, but it's not
// supported by maskFromString(). Handle that specially.
if (maskname == "MAC_CONTROL")
{
return MASK_MAC_CONTROL;
}
else
{
// In case of lookup failure, return MASK_NONE, which won't affect our
// caller's OR.
MASK mask(MASK_NONE);
LLKeyboard::maskFromString(maskname, &mask);
return mask;
}
}
MASK getMask(const LLSD& event)
{
LLSD masknames(event["mask"]);
if (! masknames.isArray())
{
// If event["mask"] is a single string, perform normal lookup on it.
return lookupMask_(masknames);
}
// Here event["mask"] is an array of mask-name strings. OR together their
// corresponding bits.
MASK mask(MASK_NONE);
for (LLSD::array_const_iterator ai(masknames.beginArray()), aend(masknames.endArray());
ai != aend; ++ai)
{
mask |= lookupMask_(*ai);
}
return mask;
}
KEY getKEY(const LLSD& event)
{
if (event.has("keysym"))
{
// Initialize to KEY_NONE; that way we can ignore the bool return from
// keyFromString() and, in the lookup-fail case, simply return KEY_NONE.
KEY key(KEY_NONE);
LLKeyboard::keyFromString(event["keysym"], &key);
return key;
}
else if (event.has("keycode"))
{
return KEY(event["keycode"].asInteger());
}
else
{
return KEY(event["char"].asString()[0]);
}
}
} // namespace
void LLWindowListener::getInfo(LLSD const & evt)
{
Response response(LLSD(), evt);
if (evt.has("path"))
{
std::string path(evt["path"]);
LLView * target_view = LLUI::resolvePath(LLUI::getRootView(), path);
if (target_view != 0)
{
response.setResponse(target_view->getInfo());
}
else
{
response.error(STRINGIZE(evt["op"].asString() << " request "
"specified invalid \"path\": '" << path << "'"));
}
}
else
{
response.error(
STRINGIZE(evt["op"].asString() << "request did not provide a path" ));
}
}
void LLWindowListener::getPaths(LLSD const & request)
{
Response response(LLSD(), request);
LLView *root(LLUI::getRootView()), *base(NULL);
// Capturing request["under"] as string means we conflate the case in
// which there is no ["under"] key with the case in which its value is the
// empty string. That seems to make sense to me.
std::string under(request["under"]);
// Deal with optional "under" parameter
if (under.empty())
{
base = root;
}
else
{
base = LLUI::resolvePath(root, under);
if (! base)
{
return response.error(STRINGIZE(request["op"].asString() << " request "
"specified invalid \"under\" path: '" << under << "'"));
}
}
// Traverse the entire subtree under 'base', collecting pathnames
for (LLView::tree_iterator_t ti(base->beginTreeDFS()), tend(base->endTreeDFS());
ti != tend; ++ti)
{
response["paths"].append((*ti)->getPathname());
}
}
void LLWindowListener::keyDown(LLSD const & evt)
{
Response response(LLSD(), evt);
if (evt.has("path"))
{
std::string path(evt["path"]);
LLView * target_view = LLUI::resolvePath(LLUI::getRootView(), path);
if (target_view == 0)
{
response.error(STRINGIZE(evt["op"].asString() << " request "
"specified invalid \"path\": '" << path << "'"));
}
else if(target_view->isAvailable())
{
response.setResponse(target_view->getInfo());
gFocusMgr.setKeyboardFocus(target_view);
KEY key = getKEY(evt);
MASK mask = getMask(evt);
gViewerKeyboard.handleKey(key, mask, false);
if(key < 0x80) mWindow->handleUnicodeChar(key, mask);
}
else
{
response.error(STRINGIZE(evt["op"].asString() << " request "
"element specified by \"path\": '" << path << "'"
<< " is not visible"));
}
}
else
{
mKbGetter()->handleTranslatedKeyDown(getKEY(evt), getMask(evt));
}
}
void LLWindowListener::keyUp(LLSD const & evt)
{
Response response(LLSD(), evt);
if (evt.has("path"))
{
std::string path(evt["path"]);
LLView * target_view = LLUI::resolvePath(LLUI::getRootView(), path);
if (target_view == 0 )
{
response.error(STRINGIZE(evt["op"].asString() << " request "
"specified invalid \"path\": '" << path << "'"));
}
else if (target_view->isAvailable())
{
response.setResponse(target_view->getInfo());
gFocusMgr.setKeyboardFocus(target_view);
mKbGetter()->handleTranslatedKeyUp(getKEY(evt), getMask(evt));
}
else
{
response.error(STRINGIZE(evt["op"].asString() << " request "
"element specified byt \"path\": '" << path << "'"
<< " is not visible"));
}
}
else
{
mKbGetter()->handleTranslatedKeyUp(getKEY(evt), getMask(evt));
}
}
// for WhichButton
typedef BOOL (LLWindowCallbacks::*MouseMethod)(LLWindow *, LLCoordGL, MASK);
struct Actions
{
Actions(const MouseMethod& d, const MouseMethod& u): down(d), up(u), valid(true) {}
Actions(): valid(false) {}
MouseMethod down, up;
bool valid;
};
struct WhichButton: public StringLookup<Actions>
{
WhichButton(): StringLookup<Actions>("mouse button")
{
add("LEFT", Actions(&LLWindowCallbacks::handleMouseDown,
&LLWindowCallbacks::handleMouseUp));
add("RIGHT", Actions(&LLWindowCallbacks::handleRightMouseDown,
&LLWindowCallbacks::handleRightMouseUp));
add("MIDDLE", Actions(&LLWindowCallbacks::handleMiddleMouseDown,
&LLWindowCallbacks::handleMiddleMouseUp));
}
};
static WhichButton buttons;
typedef boost::function<bool(LLCoordGL, MASK)> MouseFunc;
static void mouseEvent(const MouseFunc& func, const LLSD& request)
{
// Ensure we send response
LLEventAPI::Response response(LLSD(), request);
// We haven't yet established whether the incoming request has "x" and "y",
// but capture this anyway, with 0 for omitted values.
LLCoordGL pos(request["x"].asInteger(), request["y"].asInteger());
bool has_pos(request.has("x") && request.has("y"));
boost::scoped_ptr<LLView::TemporaryDrilldownFunc> tempfunc;
// Documentation for mouseDown(), mouseUp() and mouseMove() claims you
// must either specify ["path"], or both of ["x"] and ["y"]. You MAY
// specify all. Let's say that passing "path" as an empty string is
// equivalent to not passing it at all.
std::string path(request["path"]);
if (path.empty())
{
// Without "path", you must specify both "x" and "y".
if (! has_pos)
{
return response.error(STRINGIZE(request["op"].asString() << " request "
"without \"path\" must specify both \"x\" and \"y\": "
<< request));
}
}
else // ! path.empty()
{
LLView* root = LLUI::getRootView();
LLView* target = LLUI::resolvePath(root, path);
if (! target)
{
return response.error(STRINGIZE(request["op"].asString() << " request "
"specified invalid \"path\": '" << path << "'"));
}
response.setResponse(target->getInfo());
// The intent of this test is to prevent trying to drill down to a
// widget in a hidden floater, or on a tab that's not current, etc.
if (! target->isInVisibleChain())
{
return response.error(STRINGIZE(request["op"].asString() << " request "
"specified \"path\" not currently visible: '"
<< path << "'"));
}
// This test isn't folded in with the above error case since you can
// (e.g.) pop up a tooltip even for a disabled widget.
if (! target->isInEnabledChain())
{
response.warn(STRINGIZE(request["op"].asString() << " request "
"specified \"path\" not currently enabled: '"
<< path << "'"));
}
if (! has_pos)
{
LLRect rect(target->calcScreenRect());
pos.set(rect.getCenterX(), rect.getCenterY());
// nonstandard warning tactic: probably usual case; we want event
// sender to know synthesized (x, y), but maybe don't need to log?
response["warnings"].append(STRINGIZE("using center point ("
<< pos.mX << ", " << pos.mY << ")"));
}
/*==========================================================================*|
// NEVER MIND: the LLView tree defines priority handler layers in
// front of the normal widget set, so this has never yet produced
// anything but spam warnings. (sigh)
// recursive childFromPoint() should give us the frontmost, leafmost
// widget at the specified (x, y).
LLView* frontmost = root->childFromPoint(pos.mX, pos.mY, true);
if (frontmost != target)
{
response.warn(STRINGIZE(request["op"].asString() << " request "
"specified \"path\" = '" << path
<< "', but frontmost LLView at (" << pos.mX << ", " << pos.mY
<< ") is '" << LLView::getPathname(frontmost) << "'"));
}
|*==========================================================================*/
// Instantiate a TemporaryDrilldownFunc to route incoming mouse events
// to the target LLView*. But put it on the heap since "path" is
// optional. Nonetheless, manage it with a boost::scoped_ptr so it
// will be destroyed when we leave.
tempfunc.reset(new LLView::TemporaryDrilldownFunc(llview::TargetEvent(target)));
}
// The question of whether the requested LLView actually handled the
// specified event is important enough, and its handling unclear enough,
// to warrant a separate response attribute. Instead of deciding here to
// make it a warning, or an error, let caller decide.
response["handled"] = func(pos, getMask(request));
// On exiting this scope, response will send, tempfunc will restore the
// normal pointInView(x, y) containment logic, etc.
}
void LLWindowListener::mouseDown(LLSD const & request)
{
Actions actions(buttons.lookup(request["button"]));
if (actions.valid)
{
// Normally you can pass NULL to an LLWindow* without compiler
// complaint, but going through boost::lambda::bind() evidently
// bypasses that special case: it only knows you're trying to pass an
// int to a pointer. Explicitly cast NULL to the desired pointer type.
mouseEvent(bll::bind(actions.down, mWindow,
static_cast<LLWindow*>(NULL), bll::_1, bll::_2),
request);
}
}
void LLWindowListener::mouseUp(LLSD const & request)
{
Actions actions(buttons.lookup(request["button"]));
if (actions.valid)
{
mouseEvent(bll::bind(actions.up, mWindow,
static_cast<LLWindow*>(NULL), bll::_1, bll::_2),
request);
}
}
void LLWindowListener::mouseMove(LLSD const & request)
{
// We want to call the same central mouseEvent() routine for
// handleMouseMove() as for button clicks. But handleMouseMove() returns
// void, whereas mouseEvent() accepts a function returning bool -- and
// uses that bool return. Use (void-lambda-expression, true) to construct
// a callable that returns bool anyway. Pass 'true' because we expect that
// our caller will usually treat 'false' as a problem.
mouseEvent((bll::bind(&LLWindowCallbacks::handleMouseMove, mWindow,
static_cast<LLWindow*>(NULL), bll::_1, bll::_2),
true),
request);
}
void LLWindowListener::mouseScroll(LLSD const & request)
{
S32 clicks = request["clicks"].asInteger();
mWindow->handleScrollWheel(NULL, clicks);
}

View File

@ -31,14 +31,16 @@
#include <boost/function.hpp>
class LLKeyboard;
class LLWindowCallbacks;
class LLViewerWindow;
class LLWindowListener : public LLEventAPI
{
public:
typedef boost::function<LLKeyboard*()> KeyboardGetter;
LLWindowListener(LLWindowCallbacks * window, const KeyboardGetter& kbgetter);
LLWindowListener(LLViewerWindow * window, const KeyboardGetter& kbgetter);
void getInfo(LLSD const & evt);
void getPaths(LLSD const & evt);
void keyDown(LLSD const & evt);
void keyUp(LLSD const & evt);
void mouseDown(LLSD const & evt);
@ -47,7 +49,7 @@ public:
void mouseScroll(LLSD const & evt);
private:
LLWindowCallbacks * mWindow;
LLViewerWindow * mWindow;
KeyboardGetter mKbGetter;
};

View File

@ -123,7 +123,7 @@ with the same filename but different name
<texture name="Checkbox_On" file_name="widgets/Checkbox_On.png" preload="true" />
<texture name="Checkbox_On_Press" file_name="widgets/Checkbox_On_Press.png" preload="true" />
<texture name="Checkbox_Press" file_name="widgets/Checkbox_Press.png" preload="true" />
<texture name="Check_Mark" file_name="icons/check_mark" preload="true" />
<texture name="Check_Mark" file_name="icons/check_mark.png" preload="true" />
<texture name="ComboButton_Disabled" file_name="widgets/ComboButton_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_Selected" file_name="widgets/ComboButton_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />

View File

@ -23,7 +23,7 @@ Built with [COMPILER] version [COMPILER_VERSION]
name="AboutPosition">
You are at [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] located at &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
[SERVER_RELEASE_NOTES_URL]
</floater.string>
<!-- *NOTE: Do not translate text like GPU, Graphics Card, etc -
@ -58,6 +58,10 @@ Voice Server Version: [VOICE_VERSION]
<floater.string
name="AboutTraffic">
Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</floater.string>
<floater.string
name="ErrorFetchingServerReleaseNotesURL">
Error fetching server release notes URL.
</floater.string>
<tab_container
follows="all"

View File

@ -36,7 +36,7 @@ Remember, Classified fees are non-refundable.
left="15"
value="50"
min_val="50"
max_val="99999"
max_val="999999"
name="price_for_listing"
top_pad="10"
tool_tip="Price for listing."

View File

@ -10,7 +10,7 @@
save_rect="true"
save_visibility="true"
title="STATISTICS"
width="250">
width="260">
<scroll_container
follows="top|left|bottom|right"
height="380"
@ -19,15 +19,16 @@
name="statistics_scroll"
reserve_scroll_corner="true"
top="20"
width="250">
<container_view
follows="top|left|bottom|right"
height="378"
layout="topleft"
left="2"
name="statistics_view"
top="20"
width="230" >
width="260">
<container_view
follows="top|left|bottom|right"
height="378"
layout="topleft"
left="2"
name="statistics_view"
top="20"
width="245" >
<!--Basic Section-->
<stat_view
name="basic"
label="Basic"
@ -39,9 +40,9 @@
unit_label="fps"
stat="fpsstat"
bar_min="0"
bar_max="45"
tick_spacing="7.5"
label_spacing="15.0"
bar_max="60"
tick_spacing="6"
label_spacing="12"
precision="1"
show_bar="true"
show_history="true">
@ -52,9 +53,10 @@
unit_label="kbps"
stat="kbitstat"
bar_min="0"
bar_max="900"
tick_spacing="100"
label_spacing="300"
bar_max="5000"
tick_spacing="500"
label_spacing="1000"
precision="0"
show_bar="true"
show_history="false">
</stat_bar>
@ -65,9 +67,9 @@
stat="packetslostpercentstat"
bar_min="0"
bar_max="5"
tick_spacing="1"
tick_spacing="0.5"
label_spacing="1"
precision="1"
precision="3"
show_per_sec="false"
show_bar="false"
show_mean="true">
@ -78,15 +80,17 @@
unit_label="msec"
stat="simpingstat"
bar_min="0"
bar_max="1000"
tick_spacing="100"
label_spacing="200"
bar_max="5000"
tick_spacing="500"
label_spacing="1000"
precision="0"
show_bar="false"
show_per_sec="false"
show_mean="false">
</stat_bar>
</stat_view>
<stat_view
<!--Advanced Section-->
<stat_view
name="advanced"
label="Advanced"
show_label="true"
@ -98,37 +102,39 @@
setting="OpenDebugStatRender">
<stat_bar
name="ktrisframe"
label="KTris Drawn"
label="KTris Drawn per Frame"
unit_label="/fr"
stat="trianglesdrawnstat"
bar_min="0"
bar_max="500"
tick_spacing="100"
label_spacing="500"
precision="1"
show_per_sec="false">
</stat_bar>
bar_max="10000"
tick_spacing="1000"
label_spacing="2000"
precision="0"
show_per_sec="false"
show_bar="false">
</stat_bar>
<stat_bar
name="ktrissec"
label="KTris Drawn"
label="KTris Drawn per Sec"
unit_label="/sec"
stat="trianglesdrawnstat"
bar_min="0"
bar_max="3000"
tick_spacing="250"
label_spacing="1000"
precision="1">
</stat_bar>
bar_max="200000"
tick_spacing="25000"
label_spacing="50000"
precision="0"
show_bar="false">
</stat_bar>
<stat_bar
name="objs"
label="Total Objects"
unit_label=""
stat="numobjectsstat"
bar_min="0"
bar_max="3000"
tick_spacing="250"
label_spacing="1000"
precision="1"
bar_max="50000"
tick_spacing="5000"
label_spacing="10000"
precision="0"
show_per_sec="false"
show_bar="false">
</stat_bar>
@ -138,13 +144,14 @@
unit_label="/sec"
stat="numnewobjectsstat"
bar_min="0"
bar_max="1000"
tick_spacing="100"
label_spacing="500"
bar_max="2000"
tick_spacing="200"
label_spacing="400"
show_per_sec="true"
show_bar="false">
</stat_bar>
</stat_view>
<!--Texture Stats-->
<stat_view
name="texture"
label="Texture"
@ -182,8 +189,9 @@
tick_spacing="100.f"
label_spacing="200.f"
precision="1"
show_per_sec="false" >
</stat_bar>
show_per_sec="false"
show_bar="false">
</stat_bar>
<stat_bar
name="formattedmemstat"
@ -194,8 +202,9 @@
tick_spacing="100.f"
label_spacing="200.f"
precision="1"
show_per_sec="false" >
</stat_bar>
show_per_sec="false"
show_bar="false">
</stat_bar>
<stat_bar
name="rawmemstat"
@ -206,8 +215,9 @@
tick_spacing="100.f"
label_spacing="200.f"
precision="1"
show_per_sec="false" >
</stat_bar>
show_per_sec="false"
show_bar="false">
</stat_bar>
<stat_bar
name="glboundmemstat"
@ -218,10 +228,11 @@
tick_spacing="100.f"
label_spacing="200.f"
precision="1"
show_per_sec="false" >
</stat_bar>
show_per_sec="false"
show_bar="false">
</stat_bar>
</stat_view>
<!--Network Stats-->
<stat_view
name="network"
label="Network"
@ -232,6 +243,11 @@
label="Packets In"
stat="packetsinstat"
unit_label="/sec"
bar_min="0.f"
bar_max="1024.f"
tick_spacing="128.f"
label_spacing="256.f"
precision="1"
show_bar="false">
</stat_bar>
@ -239,7 +255,12 @@
name="packetsoutstat"
label="Packets Out"
stat="packetsoutstat"
unit_label="/sec"
unit_label="/sec"
bar_min="0.f"
bar_max="1024.f"
tick_spacing="128.f"
label_spacing="256.f"
precision="1"
show_bar="false" >
</stat_bar>
@ -247,7 +268,12 @@
name="objectkbitstat"
label="Objects"
stat="objectkbitstat"
unit_label="kbps"
unit_label="kbps"
bar_min="0.f"
bar_max="1024.f"
tick_spacing="128.f"
label_spacing="256.f"
precision="1"
show_bar="false" >
</stat_bar>
@ -255,7 +281,12 @@
name="texturekbitstat"
label="Texture"
stat="texturekbitstat"
unit_label="kbps"
unit_label="kbps"
bar_min="0.f"
bar_max="1024.f"
tick_spacing="128.f"
label_spacing="256.f"
precision="1"
show_bar="false" >
</stat_bar>
@ -263,7 +294,12 @@
name="assetkbitstat"
label="Asset"
stat="assetkbitstat"
unit_label="kbps"
unit_label="kbps"
bar_min="0.f"
bar_max="1024.f"
tick_spacing="128.f"
label_spacing="256.f"
precision="1"
show_bar="false" >
</stat_bar>
@ -271,7 +307,12 @@
name="layerskbitstat"
label="Layers"
stat="layerskbitstat"
unit_label="kbps"
unit_label="kbps"
bar_min="0.f"
bar_max="1024.f"
tick_spacing="128.f"
label_spacing="256.f"
precision="1"
show_bar="false" >
</stat_bar>
@ -279,12 +320,13 @@
name="actualinkbitstat"
label="Actual In"
stat="actualinkbitstat"
unit_label="kbps"
bar_min="0.f"
bar_max="1024.f"
tick_spacing="128.f"
label_spacing="256.f"
show_bar="true"
unit_label="kbps"
bar_min="0.f"
bar_max="1024.f"
tick_spacing="128.f"
label_spacing="256.f"
precision="1"
show_bar="false"
show_history="false" >
</stat_bar>
@ -292,26 +334,27 @@
name="actualoutkbitstat"
label="Actual Out"
stat="actualoutkbitstat"
unit_label="kbps"
bar_min="0.f"
bar_max="512.f"
tick_spacing="128.f"
label_spacing="256.f"
show_bar="true"
unit_label="kbps"
bar_min="0.f"
bar_max="1024.f"
tick_spacing="128.f"
label_spacing="256.f"
precision="1"
show_bar="false"
show_history="false">
</stat_bar>
<stat_bar
name="vfspendingoperations"
label="VFS Pending Ops"
label="VFS Pending Operations"
stat="vfspendingoperations"
unit_label=" "
unit_label=" Ops."
show_per_sec="false"
show_bar="false" >
</stat_bar>
</stat_view>
</stat_view>
<!--Sim Stats-->
<stat_view
name="sim"
label="Simulator"
@ -321,11 +364,11 @@
name="simtimedilation"
label="Time Dilation"
stat="simtimedilation"
precision="2"
precision="3"
bar_min="0.f"
bar_max="1.f"
tick_spacing="0.25f"
label_spacing="0.5f"
tick_spacing="0.16666f"
label_spacing="0.33333f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@ -335,10 +378,11 @@
name="simfps"
label="Sim FPS"
stat="simfps"
precision="1"
bar_min="0.f"
bar_max="200.f"
tick_spacing="20.f"
label_spacing="100.f"
bar_max="45.f"
tick_spacing="7.5f"
label_spacing="15.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@ -350,9 +394,9 @@
stat="simphysicsfps"
precision="1"
bar_min="0.f"
bar_max="66.f"
tick_spacing="33.f"
label_spacing="33.f"
bar_max="45.f"
tick_spacing="7.5.f"
label_spacing="15.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@ -369,8 +413,8 @@
precision="0"
bar_min="0.f"
bar_max="500.f"
tick_spacing="10.f"
label_spacing="40.f"
tick_spacing="50.f"
label_spacing="100.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@ -383,8 +427,8 @@
precision="0"
bar_min="0.f"
bar_max="500.f"
tick_spacing="10.f"
label_spacing="40.f"
tick_spacing="50.f"
label_spacing="100.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@ -395,7 +439,7 @@
label="Memory Allocated"
stat="physicsmemoryallocated"
unit_label="MB"
precision="0"
precision="1"
bar_min="0.f"
bar_max="1024.f"
tick_spacing="128.f"
@ -468,9 +512,9 @@
stat="simactiveobjects"
precision="0"
bar_min="0.f"
bar_max="800.f"
tick_spacing="100.f"
label_spacing="200.f"
bar_max="5000.f"
tick_spacing="750.f"
label_spacing="1250.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@ -482,9 +526,9 @@
stat="simactivescripts"
precision="0"
bar_min="0.f"
bar_max="800.f"
tick_spacing="100.f"
label_spacing="200.f"
bar_max="15000.f"
tick_spacing="1875.f"
label_spacing="3750.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@ -497,9 +541,9 @@
unit_label="eps"
precision="0"
bar_min="0.f"
bar_max="20000.f"
tick_spacing="2500.f"
label_spacing="5000.f"
bar_max="5000.f"
tick_spacing="750.f"
label_spacing="1250.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@ -568,7 +612,7 @@
label="Total Unacked Bytes"
stat="simtotalunackedbytes"
unit_label="kb"
precision="0"
precision="1"
bar_min="0.f"
bar_max="100000.f"
tick_spacing="25000.f"
@ -587,7 +631,7 @@
label="Total Frame Time"
stat="simframemsec"
unit_label="ms"
precision="1"
precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@ -602,7 +646,7 @@
label="Net Time"
stat="simnetmsec"
unit_label="ms"
precision="1"
precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@ -617,7 +661,7 @@
label="Physics Time"
stat="simsimphysicsmsec"
unit_label="ms"
precision="1"
precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@ -632,7 +676,7 @@
label="Simulation Time"
stat="simsimothermsec"
unit_label="ms"
precision="1"
precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@ -647,7 +691,7 @@
label="Agent Time"
stat="simagentmsec"
unit_label="ms"
precision="1"
precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@ -662,7 +706,7 @@
label="Images Time"
stat="simimagesmsec"
unit_label="ms"
precision="1"
precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@ -677,7 +721,7 @@
label="Script Time"
stat="simscriptmsec"
unit_label="ms"
precision="1"
precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@ -686,6 +730,97 @@
show_bar="false"
show_mean="false" >
</stat_bar>
<stat_bar
name="simsparemsec"
label="Spare Time"
stat="simsparemsec"
unit_label="ms"
precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
label_spacing="20.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
</stat_bar>
<!--2nd level time blocks under 'Details' second-->
<stat_view
name="timedetails"
label="Time Details (ms)"
show_label="true">
<stat_bar
name="simsimphysicsstepmsec"
label=" Physics Step"
stat="simsimphysicsstepmsec"
unit_label="ms"
precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
label_spacing="20.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
</stat_bar>
<stat_bar
name="simsimphysicsshapeupdatemsec"
label=" Update Phys Shapes"
stat="simsimphysicsshapeupdatemsec"
unit_label="ms"
precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
label_spacing="20.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
</stat_bar>
<stat_bar
name="simsimphysicsothermsec"
label=" Physics Other"
stat="simsimphysicsothermsec"
unit_label="ms"
precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
label_spacing="20.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
</stat_bar>
<stat_bar
name="simsleepmsec"
label=" Sleep Time"
stat="simsleepmsec"
unit_label="ms"
precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
label_spacing="20.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
</stat_bar>
<stat_bar
name="simpumpiomsec"
label=" Pump IO"
stat="simpumpiomsec"
unit_label="ms"
precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
label_spacing="20.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
</stat_bar>
</stat_view>
</stat_view>
</stat_view>
</container_view>

View File

@ -2297,8 +2297,8 @@ Would you be my friend?
icon="alertmodal.tga"
label="Save Outfit"
name="SaveOutfitAs"
type="alertmodal"
unique="true">
type="alertmodal">
<unique/>
Save what I'm wearing as a new Outfit:
<tag>confirm</tag>
<form name="form">
@ -4611,8 +4611,8 @@ Go to your [http://secondlife.com/account/ Dashboard] to see your account histor
<notification
icon="alertmodal.tga"
name="ConfirmQuit"
type="alertmodal"
unique="true">
type="alertmodal">
<unique/>
Are you sure you want to quit?
<tag>confirm</tag>
<usetemplate
@ -4625,8 +4625,8 @@ Are you sure you want to quit?
<notification
icon="alertmodal.tga"
name="DeleteItems"
type="alertmodal"
unique="true">
type="alertmodal">
<unique/>
[QUESTION]
<tag>confirm</tag>
<usetemplate
@ -4639,8 +4639,9 @@ Are you sure you want to quit?
<notification
icon="alertmodal.tga"
name="HelpReportAbuseEmailLL"
type="alert"
unique="true">
type="alert">
<unique/>
Use this tool to report violations of the [http://secondlife.com/corporate/tos.php Terms of Service] and [http://secondlife.com/corporate/cs.php Community Standards].
All reported abuses are investigated and resolved.
@ -5615,8 +5616,8 @@ Message from [NAME]:
icon="notify.tga"
name="NotSafe"
persist="true"
type="notify"
unique="true">
type="notify">
<unique/>
This land has damage enabled.
You can be hurt here. If you die, you will be teleported to your home location.
</notification>
@ -5625,8 +5626,8 @@ You can be hurt here. If you die, you will be teleported to your home location.
icon="notify.tga"
name="NoFly"
persist="true"
type="notify"
unique="true">
type="notify">
<unique/>
<tag>fail</tag>
This area has flying disabled.
You can&apos;t fly here.
@ -5636,8 +5637,8 @@ You can&apos;t fly here.
icon="notify.tga"
name="PushRestricted"
persist="true"
type="notify"
unique="true">
type="notify">
<unique/>
This area does not allow pushing. You can&apos;t push others here unless you own the land.
</notification>
@ -5645,8 +5646,8 @@ This area does not allow pushing. You can&apos;t push others here unless you own
icon="notify.tga"
name="NoVoice"
persist="true"
type="notify"
unique="true">
type="notify">
<unique/>
This area has voice chat disabled. You won&apos;t be able to hear anyone talking.
<tag>voice</tag>
</notification>
@ -5655,8 +5656,8 @@ This area has voice chat disabled. You won&apos;t be able to hear anyone talking
icon="notify.tga"
name="NoBuild"
persist="true"
type="notify"
unique="true">
type="notify">
<unique/>
This area has building disabled. You can&apos;t build or rez objects here.
</notification>
@ -5664,8 +5665,8 @@ This area has building disabled. You can&apos;t build or rez objects here.
icon="notify.tga"
name="SeeAvatars"
persist="true"
type="notify"
unique="true">
type="notify">
<unique/>
This parcel hides avatars and text chat from another parcel. You can&apos;t see other residents outside the parcel, and those outside are not able to see you. Regular text chat on channel 0 is also blocked.
</notification>
@ -6553,8 +6554,8 @@ The voice call you are trying to join, [VOICE_CHANNEL_NAME], has reached maximum
<notification
icon="notifytip.tga"
name="ProximalVoiceChannelFull"
type="notifytip"
unique="true">
type="notifytip">
<unique/>
We&apos;re sorry. This area has reached maximum capacity for voice conversations. Please try to use voice in another area.
<tag>fail</tag>
<tag>voice</tag>
@ -6622,8 +6623,8 @@ Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now
duration="10"
icon="notifytip.tga"
name="VoiceLoginRetry"
type="notifytip"
unique="true">
type="notifytip">
<unique/>
We are creating a voice channel for you. This may take up to one minute.
<tag>status</tag>
<tag>voice</tag>
@ -6634,8 +6635,8 @@ We are creating a voice channel for you. This may take up to one minute.
name="VoiceEffectsExpired"
sound="UISndAlert"
persist="true"
type="notify"
unique="true">
type="notify">
<unique/>
One or more of your subscribed Voice Morphs has expired.
[[URL] Click here] to renew your subscription.
<tag>fail</tag>
@ -6647,8 +6648,8 @@ One or more of your subscribed Voice Morphs has expired.
name="VoiceEffectsExpiredInUse"
sound="UISndAlert"
persist="true"
type="notify"
unique="true">
type="notify">
<unique/>
The active Voice Morph has expired, your normal voice settings have been applied.
[[URL] Click here] to renew your subscription.
<tag>fail</tag>
@ -6660,8 +6661,8 @@ The active Voice Morph has expired, your normal voice settings have been applied
name="VoiceEffectsWillExpire"
sound="UISndAlert"
persist="true"
type="notify"
unique="true">
type="notify">
<unique/>
One or more of your Voice Morphs will expire in less than [INTERVAL] days.
[[URL] Click here] to renew your subscription.
<tag>fail</tag>
@ -6673,8 +6674,8 @@ One or more of your Voice Morphs will expire in less than [INTERVAL] days.
name="VoiceEffectsNew"
sound="UISndAlert"
persist="true"
type="notify"
unique="true">
type="notify">
<unique/>
New Voice Morphs are available!
<tag>voice</tag>
</notification>
@ -7075,8 +7076,9 @@ Are you sure you want to leave this call?
ignoretext="Confirm before I leave call"
name="okcancelignore"
notext="No"
yestext="Yes"
unique="true"/>
yestext="Yes">
<unique/>
</usetemplate>
</notification>
<notification
@ -7095,31 +7097,31 @@ Mute everyone?
ignoretext="Confirm before I mute all participants in a group call"
name="okcancelignore"
yestext="Ok"
notext="Cancel"
unique="true"/>
notext="Cancel">
<unique/>
</usetemplate>
</notification>
<notification
name="HintChat"
label="Chat"
type="hint"
unique="true">
type="hint">
<unique/>
To join the conversation, type into the chat field below.
</notification>
<notification
name="HintSit"
label="Stand"
type="hint"
unique="true">
type="hint">
<unique/>
To stand up and exit the sitting position, click the Stand button.
</notification>
<notification
name="HintSpeak"
label="Speak"
type="hint"
unique="true">
type="hint">
<unique/>
Click the Speak button to turn your microphone on and off.
Click on the up arrow to see the voice control panel.
@ -7130,32 +7132,32 @@ Hiding the Speak button will disable the voice feature.
<notification
name="HintDestinationGuide"
label="Explore the World"
type="hint"
unique="true">
type="hint">
<unique/>
The Destination Guide contains thousands of new places to discover. Select a location and choose Teleport to start exploring.
</notification>
<notification
name="HintSidePanel"
label="Side Panel"
type="hint"
unique="true">
type="hint">
<unique/>
Get quick access to your inventory, outfits, profiles and more in the side panel.
</notification>
<notification
name="HintMove"
label="Move"
type="hint"
unique="true">
type="hint">
<unique/>
To walk or run, open the Move Panel and use the directional arrows to navigate. You can also use the directional keys on your keyboard.
</notification>
<notification
name="HintMoveClick"
label=""
type="hint"
unique="true">
type="hint">
<unique/>
1. Click to Walk
Click anywhere on the ground to walk to that spot.
@ -7167,8 +7169,8 @@ Click and drag anywhere on the world to rotate your view
<notification
name="HintDisplayName"
label="Display Name"
type="hint"
unique="true">
type="hint">
<unique/>
Set your customizable display name here. This is in addition to your unique username, which can't be changed. You can change how you see other people's names in your preferences.
</notification>
@ -7176,8 +7178,8 @@ Click and drag anywhere on the world to rotate your view
<notification
name="HintView"
label="View"
type="hint"
unique="true">
type="hint">
<unique/>
To change your camera view, use the Orbit and Pan controls. Reset your view by pressing Escape or walking.
<tag>custom_skin</tag>
</notification>
@ -7185,16 +7187,16 @@ Click and drag anywhere on the world to rotate your view
<notification
name="HintInventory"
label="Inventory"
type="hint"
unique="true">
type="hint">
<unique/>
Check your inventory to find items. Newest items can be easily found in the Recent tab.
</notification>
<notification
name="HintLindenDollar"
label="You've got Linden Dollars!"
type="hint"
unique="true">
type="hint">
<unique/>
Here's your current balance of L$. Click Buy L$ to purchase more Linden Dollars.
<tag>funds</tag>
</notification>
@ -7383,8 +7385,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="ModeChange"
label=""
type="alertmodal"
unique="true">
type="alertmodal">
<unique/>
Changing modes requires you to quit and restart.
<tag>confirm</tag>
<usetemplate
@ -7396,8 +7398,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoClassifieds"
label=""
type="alertmodal"
unique="true">
type="alertmodal">
<unique/>
<tag>fail</tag>
<tag>confirm</tag>
Creation and editing of Classifieds is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
@ -7410,8 +7412,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoGroupInfo"
label=""
type="alertmodal"
unique="true">
type="alertmodal">
<unique/>
<tag>fail</tag>
<tag>confirm</tag>
Creation and editing of Groups is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
@ -7424,8 +7426,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoPlaceInfo"
label=""
type="alertmodal"
unique="true">
type="alertmodal">
<unique/>
<tag>fail</tag>
<tag>confirm</tag>
Viewing place profile is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
@ -7438,8 +7440,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoPicks"
label=""
type="alertmodal"
unique="true">
type="alertmodal">
<unique/>
<tag>fail</tag>
<tag>confirm</tag>
Creation and editing of Picks is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
@ -7452,8 +7454,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoWorldMap"
label=""
type="alertmodal"
unique="true">
type="alertmodal">
<unique/>
<tag>fail</tag>
<tag>confirm</tag>
Viewing of the world map is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
@ -7466,8 +7468,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoVoiceCall"
label=""
type="alertmodal"
unique="true">
type="alertmodal">
<unique/>
<tag>fail</tag>
<tag>confirm</tag>
Voice calls are only available in Advanced mode. Would you like to logout and change modes?
@ -7480,8 +7482,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoAvatarShare"
label=""
type="alertmodal"
unique="true">
type="alertmodal">
<unique/>
<tag>fail</tag>
<tag>confirm</tag>
Sharing is only available in Advanced mode. Would you like to logout and change modes?
@ -7494,8 +7496,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoAvatarPay"
label=""
type="alertmodal"
unique="true">
type="alertmodal">
<unique/>
<tag>fail</tag>
<tag>confirm</tag>
Paying other residents is only available in Advanced mode. Would you like to logout and change modes?
@ -7508,8 +7510,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoInventory"
label=""
type="alertmodal"
unique="true">
type="alertmodal">
<unique/>
<tag>fail</tag>
<tag>confirm</tag>
Viewing inventory is only available in Advanced mode. Would you like to logout and change modes?
@ -7522,8 +7524,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoAppearance"
label=""
type="alertmodal"
unique="true">
type="alertmodal">
<unique/>
<tag>fail</tag>
<tag>confirm</tag>
The appearance editor is only available in Advanced mode. Would you like to logout and change modes?
@ -7536,8 +7538,8 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
<notification
name="NoSearch"
label=""
type="alertmodal"
unique="true">
type="alertmodal">
<unique/>
<tag>fail</tag>
<tag>confirm</tag>
Search is only available in Advanced mode. Would you like to logout and change modes?

View File

@ -105,16 +105,61 @@
mouse_opaque="false"
visible="true"
width="18"
top_pad="2"
top_pad="10"
left="30" />
<text
follows="left|top"
type="string"
length="1"
height="10"
layout="topleft"
left="78"
name="keyboard_lbl"
width="270"
top_delta="2">
Keyboard:
</text>
<check_box
control_name="ArrowKeysAlwaysMove"
follows="left|top"
height="20"
label="Arrow keys always move me"
layout="topleft"
left_delta="5"
name="arrow_keys_move_avatar_check"
width="237"
top_pad="5"/>
<check_box
control_name="AllowTapTapHoldRun"
follows="left|top"
height="20"
label="Tap-tap-hold to run"
layout="topleft"
left_delta="0"
name="tap_tap_hold_to_run"
width="237"
top_pad="0"/>
<text
follows="left|top"
type="string"
length="1"
height="10"
layout="topleft"
left="78"
name="mouse_lbl"
width="270"
top_pad="15">
Mouse:
</text>
<check_box
control_name="FirstPersonAvatarVisible"
follows="left|top"
height="20"
label="Show me in Mouselook"
layout="topleft"
left_pad="30"
left_delta="5"
name="first_person_avatar_visible"
top_pad="5"
width="256" />
<text
type="string"
@ -136,7 +181,7 @@
initial_value="2"
layout="topleft"
show_text="false"
left_pad="5"
left_pad="0"
max_val="15"
name="mouse_sensitivity"
top_delta="-1"
@ -150,63 +195,70 @@
name="invert_mouse"
top_delta="0"
width="128" />
<check_box
control_name="ArrowKeysAlwaysMove"
<text
follows="left|top"
height="20"
label="Arrow keys always move me"
type="string"
length="1"
height="10"
layout="topleft"
left="78"
name="arrow_keys_move_avatar_check"
width="237"
top_pad="10"/>
<check_box
control_name="AllowTapTapHoldRun"
left="86"
name="single_click_action_lbl"
width="150"
top_pad="20">
Single click on land:
</text>
<combo_box
height="23"
layout="topleft"
left_pad="10"
top_delta="-6"
name="single_click_action_combo"
width="200">
<combo_box.item
label="No action"
name="0"
value="0"/>
<combo_box.item
label="Move to clicked point"
name="1"
value="1"/>
<combo_box.commit_callback
function="Pref.ClickActionChange"/>
</combo_box>
<text
follows="left|top"
height="20"
label="Tap-tap-hold to run"
type="string"
length="1"
height="10"
layout="topleft"
left_delta="0"
name="tap_tap_hold_to_run"
width="237"
top_pad="0"/>
<check_box
follows="left|top"
height="20"
label="Double-Click to:"
left="86"
name="double_click_action_lbl"
width="150"
top_pad="12">
Double click on land:
</text>
<combo_box
height="23"
layout="topleft"
left_delta="0"
name="double_click_chkbox"
width="237"
top_pad="0">
<check_box.commit_callback
function="Pref.CommitDoubleClickChekbox"/>
</check_box>
<radio_group
height="20"
layout="topleft"
left_delta="17"
top_pad="2"
name="double_click_action">
<radio_item
height="16"
label="Teleport"
layout="topleft"
left="0"
name="radio_teleport"
top_delta="20"
width="110" />
<radio_item
height="16"
label="Auto-pilot"
left_pad="0"
layout="topleft"
name="radio_autopilot"
top_delta="0"
width="75" />
<radio_group.commit_callback
function="Pref.CommitRadioDoubleClick"/>
</radio_group>
left_pad="10"
top_delta="-6"
name="double_click_action_combo"
width="200">
<combo_box.item
label="No action"
name="0"
value="0"/>
<combo_box.item
label="Move to clicked point"
name="1"
value="1"/>
<combo_box.item
label="Teleport to clicked point"
name="2"
value="2"/>
<combo_box.commit_callback
function="Pref.ClickActionChange"/>
</combo_box>
<button
height="23"
label="Other Devices"

View File

@ -55,7 +55,7 @@
Mixed Sale
</panel.string>
<button
follows="top|right"
follows="top|left"
height="24"
image_hover_unselected="BackButton_Over"
image_pressed="BackButton_Press"

View File

@ -3439,7 +3439,7 @@ Abuse Report</string>
<string name="Female - Stick tougue out">Female - Stick tougue out</string>
<string name="Female - Wow">Female - Wow</string>
<string name="/bow1">/bow1</string>
<string name="/bow">/bow</string>
<string name="/clap">/clap</string>
<string name="/count">/count</string>
<string name="/extinguish">/extinguish</string>

View File

@ -8,7 +8,7 @@
<radio_item label="Moyenne" name="radio2" value="1"/>
<radio_item label="Grande" name="radio3" value="2"/>
</radio_group>
<check_box initial_value="true" label="Jouer l&apos;animation clavier quand vous écrivez" name="play_typing_animation"/>
<check_box initial_value="true" label="Exécuter l&apos;animation clavier quand vous écrivez" name="play_typing_animation"/>
<check_box label="M&apos;envoyer les IM par e-mail une fois déconnecté" name="send_im_to_email"/>
<check_box label="Activer l&apos;historique des chats et des IM en texte brut" name="plain_text_chat_history"/>
<check_box label="Bulles de chat" name="bubble_text_chat"/>

View File

@ -51,7 +51,7 @@
<combo_box.item label="Tous les objets et avatars" name="3"/>
<combo_box.item label="Tout" name="4"/>
</combo_box>
<slider label="Propriétés physiques de l&apos;avatar :" name="AvatarPhysicsDetail"/>
<slider label="Prop. physiques avatar :" name="AvatarPhysicsDetail"/>
<text name="AvatarPhysicsDetailText">
Faible
</text>
@ -102,8 +102,8 @@
Rendu du terrain :
</text>
<radio_group name="TerrainDetailRadio">
<radio_item label="Bas" name="0"/>
<radio_item label="Haut" name="2"/>
<radio_item label="Faible" name="0"/>
<radio_item label="Élevé" name="2"/>
</radio_group>
--&gt;
</panel>

View File

@ -3,9 +3,9 @@
<panel.string name="log_in_to_change">
se connecter pour changer
</panel.string>
<button label="Vider le cache" name="clear_cache" tool_tip="Effacer l&apos;image de connexion, le dernier lieu, l&apos;historique des téléportations et la texture du cache."/>
<button label="Vider l'historique" name="clear_cache" tool_tip="Effacer le cache de l&apos;image de connexion, du dernier lieu, de l&apos;historique des téléportations, Web et de texture."/>
<text name="cache_size_label_l">
(Endroits, images, web, historique des recherches)
(endroits, images, web, historique des recherches)
</text>
<check_box label="M&apos;afficher dans les résultats de recherche" name="online_searchresults"/>
<check_box label="Seuls mes amis et groupes voient quand je suis en ligne" name="online_visibility"/>

View File

@ -2510,7 +2510,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Effet max.
</string>
<string name="Breast Physics InOut Spring">
Vibration
Élasticité
</string>
<string name="Breast Physics InOut Gain">
Amplification
@ -2522,7 +2522,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Effet max.
</string>
<string name="Breast Physics UpDown Spring">
Vibration
Élasticité
</string>
<string name="Breast Physics UpDown Gain">
Amplification
@ -2534,7 +2534,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Effet max.
</string>
<string name="Breast Physics LeftRight Spring">
Vibration
Élasticité
</string>
<string name="Breast Physics LeftRight Gain">
Amplification
@ -2558,7 +2558,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Effet max.
</string>
<string name="Belly Physics UpDown Spring">
Vibration
Élasticité
</string>
<string name="Belly Physics UpDown Gain">
Amplification
@ -2582,7 +2582,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Effet max.
</string>
<string name="Butt Physics UpDown Spring">
Vibration
Élasticité
</string>
<string name="Butt Physics UpDown Gain">
Amplification
@ -2594,7 +2594,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Effet max.
</string>
<string name="Butt Physics LeftRight Spring">
Vibration
Élasticité
</string>
<string name="Butt Physics LeftRight Gain">
Amplification

View File

@ -90,19 +90,19 @@
群組:
</text>
<button label="設定" name="Set..."/>
<check_box label="Allow Deed to Group" name="check deed" tool_tip="A group officer can deed this land to the group, so it will be supported by the group&apos;s land allocation."/>
<button label="Deed" name="Deed..." tool_tip="You may only deed land if you are an officer in the selected group."/>
<check_box label="允許讓渡給群組" name="check deed" tool_tip="A group officer can deed this land to the group, so it will be supported by the group&apos;s land allocation."/>
<button label="讓渡" name="Deed..." tool_tip="You may only deed land if you are an officer in the selected group."/>
<check_box label="Owner Makes Contribution With Deed" name="check contrib" tool_tip="When the land is deeded to the group, the former owner contributes enough land allocation to support it."/>
<text name="For Sale:">
出售:
</text>
<text name="Not for sale.">
Not for sale
不出售
</text>
<text name="For Sale: Price L$[PRICE].">
Price: L$[PRICE] (L$[PRICE_PER_SQM]/m²)
</text>
<button label="Sell Land" name="Sell Land..."/>
<button label="出售土地" name="Sell Land..."/>
<text name="For sale to">
出售給:[BUYER]
</text>
@ -134,7 +134,7 @@
<button label="購買土地" name="Buy Land..."/>
<button label="腳本資訊" name="Scripts..."/>
<button label="為群組購買" name="Buy For Group..."/>
<button label="購買通行權" name="Buy Pass..." tool_tip="A pass gives you temporary access to this land."/>
<button label="購買通行權" name="Buy Pass..." tool_tip="通行權允許你暫時可出入這塊土地。"/>
<button label="放棄土地" name="Abandon Land..."/>
<button label="Reclaim Land" name="Reclaim Land..."/>
<button label="Linden Sale" name="Linden Sale..." tool_tip="Land must be owned, set content, and not already for auction."/>
@ -212,31 +212,31 @@
Region Object Bonus Factor: [BONUS]
</text>
<text name="Simulator primitive usage:">
Primitive usage:
幾何元件使用:
</text>
<text name="objects_available">
[COUNT] out of [MAX] ([AVAILABLE] available)
使用 [MAX] 中的 [COUNT] (剩餘 [AVAILABLE] 可用)
</text>
<text name="Primitives parcel supports:">
Prims parcel supports:
地段所提供的幾何元件數:
</text>
<text name="object_contrib_text">
[COUNT]
</text>
<text name="Primitives on parcel:">
Prims on parcel:
地段上的幾何元件數:
</text>
<text name="total_objects_text">
[COUNT]
</text>
<text name="Owned by parcel owner:">
Owned by parcel owner:
地段擁有者所擁有:
</text>
<text name="owner_objects_text">
[COUNT]
</text>
<button label="顯示" label_selected="顯示" name="ShowOwner"/>
<button label="退回" name="ReturnOwner..." tool_tip="Return objects to their owners."/>
<button label="退回" name="ReturnOwner..." tool_tip="退回物件給它們的擁有者。"/>
<text name="Set to group:">
設定群組:
</text>
@ -244,15 +244,15 @@
[COUNT]
</text>
<button label="顯示" label_selected="顯示" name="ShowGroup"/>
<button label="退回" name="ReturnGroup..." tool_tip="Return objects to their owners."/>
<button label="退回" name="ReturnGroup..." tool_tip="退回物件給它們的擁有者。"/>
<text name="Owned by others:">
Owned by others:
其他人所擁有:
</text>
<text name="other_objects_text">
[COUNT]
</text>
<button label="顯示" label_selected="顯示" name="ShowOther"/>
<button label="退回" name="ReturnOther..." tool_tip="Return objects to their owners."/>
<button label="退回" name="ReturnOther..." tool_tip="退回物件給它們的擁有者。"/>
<text name="Selected / sat upon:">
Selected / sat upon:
</text>
@ -263,9 +263,9 @@
Auto return other Residents&apos; objects (minutes, 0 for off):
</text>
<text name="Object Owners:">
Object Owners:
物件擁有者:
</text>
<button name="Refresh List" tool_tip="Refresh Object List"/>
<button name="Refresh List" tool_tip="刷新物件清單"/>
<button label="退回物件" name="Return objects..."/>
<name_list name="owner list">
<name_list.columns label="Type" name="type"/>
@ -276,14 +276,14 @@
</panel>
<panel label="選項" name="land_options_panel">
<panel.string name="search_enabled_tooltip">
Let people see this parcel in search results
讓其他人可以在搜尋結果中看到這塊地段
</panel.string>
<panel.string name="search_disabled_small_tooltip">
This option is disabled because this parcel&apos;s area is 128 m² or smaller.
Only large parcels can be listed in search.
</panel.string>
<panel.string name="search_disabled_permissions_tooltip">
This option is disabled because you cannot modify this parcel&apos;s options.
這個選項已關閉因為你不能修改這個地段的選項。
</panel.string>
<panel.string name="mature_check_mature">
適度成人內容
@ -331,35 +331,35 @@ Only large parcels can be listed in search.
</text>
<check_box label="安全(無傷害)" name="check safe" tool_tip="若勾選則設應土地為安全的,傷害性的戰鬥將被關閉。清除勾選後才能進行傷害性的戰鬥。"/>
<check_box label="禁止推撞" name="PushRestrictCheck" tool_tip="防止使用腳本推撞。勾選這個選項將可以有效防止你土地上的破壞行為。"/>
<check_box label="將地點刊登顯示在搜尋中L$30 / 每週)" name="ShowDirectoryCheck" tool_tip="Let people see this parcel in search results"/>
<check_box label="將地點刊登顯示在搜尋中L$30 / 每週)" name="ShowDirectoryCheck" tool_tip="讓其他人可以在搜尋結果中看到這塊地段"/>
<combo_box name="land category with adult">
<combo_box.item label="任何類別" name="item0"/>
<combo_box.item label="Linden Location" name="item1"/>
<combo_box.item label="完全成人" name="item2"/>
<combo_box.item label="Arts &amp; Culture" name="item3"/>
<combo_box.item label="Business" name="item4"/>
<combo_box.item label="Educational" name="item5"/>
<combo_box.item label="Gaming" name="item6"/>
<combo_box.item label="藝術與文化" name="item3"/>
<combo_box.item label="商業" name="item4"/>
<combo_box.item label="教育" name="item5"/>
<combo_box.item label="遊戲" name="item6"/>
<combo_box.item label="聚會所" name="item7"/>
<combo_box.item label="Newcomer Friendly" name="item8"/>
<combo_box.item label="Parks &amp; Nature" name="item9"/>
<combo_box.item label="Residential" name="item10"/>
<combo_box.item label="Shopping" name="item11"/>
<combo_box.item label="新手友善" name="item8"/>
<combo_box.item label="公園與自然" name="item9"/>
<combo_box.item label="住宅" name="item10"/>
<combo_box.item label="採購" name="item11"/>
<combo_box.item label="Rental" name="item13"/>
<combo_box.item label="Other" name="item12"/>
</combo_box>
<combo_box name="land category">
<combo_box.item label="任何類別" name="item0"/>
<combo_box.item label="Linden Location" name="item1"/>
<combo_box.item label="Arts &amp; Culture" name="item3"/>
<combo_box.item label="Business" name="item4"/>
<combo_box.item label="Educational" name="item5"/>
<combo_box.item label="Gaming" name="item6"/>
<combo_box.item label="藝術與文化" name="item3"/>
<combo_box.item label="商業" name="item4"/>
<combo_box.item label="教育" name="item5"/>
<combo_box.item label="遊戲" name="item6"/>
<combo_box.item label="聚會所" name="item7"/>
<combo_box.item label="Newcomer Friendly" name="item8"/>
<combo_box.item label="Parks &amp; Nature" name="item9"/>
<combo_box.item label="Residential" name="item10"/>
<combo_box.item label="Shopping" name="item11"/>
<combo_box.item label="新手友善" name="item8"/>
<combo_box.item label="公園與自然" name="item9"/>
<combo_box.item label="住宅" name="item10"/>
<combo_box.item label="採購" name="item11"/>
<combo_box.item label="Rental" name="item13"/>
<combo_box.item label="Other" name="item12"/>
</combo_box>
@ -367,7 +367,7 @@ Only large parcels can be listed in search.
<text name="Snapshot:">
快照:
</text>
<texture_picker name="snapshot_ctrl" tool_tip="點擊以挑選圖"/>
<texture_picker name="snapshot_ctrl" tool_tip="點擊以挑選圖"/>
<text name="landing_point">
登陸點:[LANDING]
</text>
@ -398,7 +398,7 @@ Only large parcels can be listed in search.
<text name="Media texture:">
取代材質:
</text>
<texture_picker name="media texture" tool_tip="點擊以挑選圖"/>
<texture_picker name="media texture" tool_tip="點擊以挑選圖"/>
<text name="replace_texture_help">
Objects using this texture will show the movie or web page after you click the play arrow. Select the thumbnail to choose a different texture.
</text>
@ -412,7 +412,7 @@ Only large parcels can be listed in search.
像素
</text>
<text name="Options:">
Options:
選項:
</text>
<check_box label="Loop" name="media_loop" tool_tip="Play media in a loop. When the media has finished playing, it will restart from the beginning."/>
</panel>
@ -442,14 +442,14 @@ Only large parcels can be listed in search.
One or more of these options is set at the estate level
</panel.string>
<text name="Limit access to this parcel to:">
Access To This Parcel
出入此地段
</text>
<text name="Only Allow">
Restrict Access to Residents verified by:
</text>
<check_box label="Payment Information on File [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Ban unidentified Residents."/>
<check_box label="年齡驗證 [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Ban Residents who have not verified their age. See the [SUPPORT_SITE] for more information."/>
<check_box label="允許出入的群組:[GROUP]" name="GroupCheck" tool_tip="Set group in the General tab."/>
<check_box label="允許出入的群組:[GROUP]" name="GroupCheck" tool_tip="設定群組於一般頁籤。"/>
<check_box label="出售通行權給:" name="PassCheck" tool_tip="允許暫時出入這個地段"/>
<combo_box name="pass_combo">
<combo_box.item label="Anyone" name="Anyone"/>

View File

@ -173,8 +173,8 @@ Maximum animation length is [MAX_LENGTH] seconds.
</combo_box>
<spinner label="淡入(秒)" name="ease_in_time" tool_tip="Amount of time (in seconds) over which animations blends in"/>
<spinner label="淡出(秒)" name="ease_out_time" tool_tip="Amount of time (in seconds) over which animations blends out"/>
<button name="play_btn" tool_tip="Play your animation"/>
<button name="pause_btn" tool_tip="Pause your animation"/>
<button name="play_btn" tool_tip="播放你的動作"/>
<button name="pause_btn" tool_tip="暫停你的動做"/>
<button name="stop_btn" tool_tip="Stop animation playback"/>
<text name="bad_animation_text">
Unable to read animation file.

View File

@ -4,7 +4,7 @@
<spinner label="Grid Extents (meters)" name="GridDrawSize"/>
<check_box label="貼齊至子單位" name="GridSubUnit"/>
<check_box label="View cross-sections" name="GridCrossSection"/>
<text name="grid_opacity_label" tool_tip="Grid opacity">
Opacity:
<text name="grid_opacity_label" tool_tip="格線不透明度">
不透明度:
</text>
</floater>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_bumps" title="BUMPS, PUSHES &amp; HITS">
<floater name="floater_bumps" title="碰撞、推擠與打擊">
<floater.string name="none_detected">
未偵測到
</floater.string>

View File

@ -55,7 +55,7 @@
Confirming this purchase only buys L$, not the object.
</text>
<text name="purchase_warning_notenough">
You aren&apos;t buying enough L$. Please increase the amount.
你並未購買足夠的林登幣,請先添加一些數量。
</text>
<button label="立即購買" name="buy_btn"/>
<button label="取消" name="cancel_btn"/>

View File

@ -26,10 +26,10 @@ Try selecting a smaller area.
You do not have permission to buy land for your active group.
</floater.string>
<floater.string name="parcel_not_for_sale">
The selected parcel is not for sale.
所選擇的地段不出售。.
</floater.string>
<floater.string name="group_already_owns">
The group already owns the parcel.
這個群組已擁有這個地段。
</floater.string>
<floater.string name="you_already_own">
你已經擁有這個地段。
@ -62,7 +62,7 @@ Try selecting a smaller area.
Cannot buy now:
</floater.string>
<floater.string name="not_for_sale">
Not for sale:
不出售:
</floater.string>
<floater.string name="none_needed">
none needed

View File

@ -2,7 +2,7 @@
<floater name="modal container">
<button label="繼續" label_selected="繼續" name="Continue"/>
<text name="tos_heading">
Please read the following message carefully.
請仔細閱讀下列的訊息。
</text>
<text_editor name="tos_text">
TOS_TEXT

View File

@ -85,7 +85,7 @@
<text name="DayCycleText3">
預覽:
</text>
<button label="Play" label_selected="Play" name="WLAnimSky"/>
<button label="播放" label_selected="播放" name="WLAnimSky"/>
<button label="停止!" label_selected="停止" name="WLStopAnimSky"/>
<button label="Use Estate Time" label_selected="Go to Estate Time" name="WLUseLindenTime"/>
<button label="Save Test Day" label_selected="Save Test Day" name="WLSaveDayCycle"/>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Display Name" title="CHANGE DISPLAY NAME">
<floater name="Display Name" title="變更顯示名稱">
<text name="info_text">
The name you give your avatar is called your Display Name. You can change it once a week.
</text>
@ -7,12 +7,12 @@
You cannot change your Display Name until: [TIME].
</text>
<text name="set_name_label">
New Display Name:
新顯示名稱:
</text>
<text name="name_confirm_label">
Type your new name again to confirm:
</text>
<button label="儲存" name="save_btn" tool_tip="Save your new Display Name"/>
<button label="儲存" name="save_btn" tool_tip="儲存你的新顯示名稱"/>
<button label="重設" name="reset_btn" tool_tip="Make Display Name the same as Username"/>
<button label="取消" name="cancel_btn"/>
</floater>

View File

@ -12,14 +12,14 @@
<combo_box label="服裝類型" name="clothing_type_combo">
<item label="圖像" name="Image" value="圖像"/>
<item label="頭髮" name="Hair" value="頭髮"/>
<item label="Female Head" name="FemaleHead" value="Female Head"/>
<item label="Female Upper Body" name="FemaleUpperBody" value="Female Upper Body"/>
<item label="Female Lower Body" name="FemaleLowerBody" value="Female Lower Body"/>
<item label="Male Head" name="MaleHead" value="Male Head"/>
<item label="Male Upper Body" name="MaleUpperBody" value="Male Upper Body"/>
<item label="Male Lower Body" name="MaleLowerBody" value="Male Lower Body"/>
<item label="女性頭部" name="FemaleHead" value="女性頭部"/>
<item label="女性上半身" name="FemaleUpperBody" value="女性上半身"/>
<item label="女性下半身" name="FemaleLowerBody" value="女性下半身"/>
<item label="男性頭部" name="MaleHead" value="男性頭部"/>
<item label="男性上半身" name="MaleUpperBody" value="男性上半身"/>
<item label="男性下半身" name="MaleLowerBody" value="男性下半身"/>
<item label="裙子" name="Skirt" value="裙子"/>
<item label="Sculpted Prim" name="SculptedPrim" value="Sculpted Prim"/>
<item label="雕刻的幾何元件" name="SculptedPrim" value="雕刻的幾何元件"/>
</combo_box>
<text name="bad_image_text">
無法讀取圖像。

View File

@ -13,10 +13,10 @@
通話中。
</floater.string>
<floater.string name="VoiceInviteAdHoc">
has joined a Voice Chat call with a conference chat.
已加訴入會議交談中的語音聊天。
</floater.string>
<floater.string name="VoiceInviteGroup">
just joined &apos;[GROUP]&apos; voice channel.
剛加入 &apos;[GROUP]&apos; 語音頻道。
</floater.string>
<floater.string name="VoiceInviteQuestionGroup">
Would you like to leave [CURRENT_CHAT] and join the call with &apos;[GROUP]&apos;?

View File

@ -5,9 +5,9 @@
</floater.string>
<scroll_list name="object_list" tool_tip="Select an object from this list to highlight it in-world">
<scroll_list.columns label="物件名稱" name="object_name"/>
<scroll_list.columns label="Owner Name" name="owner_name"/>
<scroll_list.columns label="Creator Name" name="creator_name"/>
<scroll_list.columns label="Creation Date" name="creation_date"/>
<scroll_list.columns label="擁有者名稱" name="owner_name"/>
<scroll_list.columns label="創造者名稱" name="creator_name"/>
<scroll_list.columns label="創造日期" name="creation_date"/>
</scroll_list>
<button label="察看擁有者檔案..." name="button owner" tool_tip="See profile of the highlighted object&apos;s owner"/>
<button label="察看創造者檔案..." name="button creator" tool_tip="See profile of the highlighted object&apos;s original creator"/>

View File

@ -5,7 +5,7 @@
<check_box label="服裝" name="check_clothing"/>
<check_box label="姿勢" name="check_gesture"/>
<check_box label="地標" name="check_landmark"/>
<check_box label="Notecards" name="check_notecard"/>
<check_box label="記事卡" name="check_notecard"/>
<check_box label="Objects" name="check_object"/>
<check_box label="腳本" name="check_script"/>
<check_box label="Sounds" name="check_sound"/>

View File

@ -4,10 +4,10 @@
5
</floater.string>
<floater.string name="localchat">
Nearby Voice Chat
附近的語音聊天
</floater.string>
<floater.string name="anonymous">
anonymous
匿名
</floater.string>
<floater.string name="VoiceInviteP2P">
通話中。
@ -22,7 +22,7 @@
Calling [CALLEE_NAME]
</text>
<text name="noanswer">
No Answer. Please try again later.
無應答,請稍候再試。
</text>
<text name="nearby">
You have been disconnected from [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]

View File

@ -6,6 +6,6 @@
<text name="desc txt">
描述:
</text>
<button label="Play Inworld" label_selected="停止" name="Anim play btn" tool_tip="Play this animation so that others can see it"/>
<button label="Play Locally" label_selected="停止" name="Anim audition btn" tool_tip="Play this animation so that only you can see it"/>
<button label="播放於虛擬世界" label_selected="停止" name="Anim play btn" tool_tip="Play this animation so that others can see it"/>
<button label="播放於本地" label_selected="停止" name="Anim audition btn" tool_tip="Play this animation so that only you can see it"/>
</floater>

View File

@ -6,6 +6,6 @@
<text name="desc txt">
描述:
</text>
<button label="Play Inworld" label_selected="Play Inworld" name="Sound play btn" tool_tip="Play this sound so that others can hear it"/>
<button label="Play Locally" label_selected="Play Locally" name="Sound audition btn" tool_tip="Play this sound so that only you can hear it"/>
<button label="播放於虛擬世界" label_selected="播放於虛擬世界" name="Sound play btn" tool_tip="Play this sound so that others can hear it"/>
<button label="播放於本地" label_selected="播放於本地" name="Sound audition btn" tool_tip="Play this sound so that only you can hear it"/>
</floater>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="texture picker" title="PICK: TEXTURE">
<floater.string name="choose_picture">
點擊以挑選圖
點擊以挑選圖
</floater.string>
<floater.string name="pick title">
Pick:

View File

@ -48,7 +48,7 @@
Drag to move, shift-drag to copy
</text>
<radio_group name="focus_radio_group">
<radio_item label="Zoom" name="radio zoom"/>
<radio_item label="縮放" name="radio zoom"/>
<radio_item label="環繞Ctrl" name="radio orbit"/>
<radio_item label="平移Ctrl+Shift" name="radio pan"/>
</radio_group>
@ -75,10 +75,10 @@
</text>
<check_box initial_value="true" label="伸展材質" name="checkbox stretch textures"/>
<check_box initial_value="true" label="貼齊格線" name="checkbox snap to grid"/>
<combo_box name="combobox grid mode" tool_tip="Choose the type of grid ruler for positioning the object">
<combo_box.item label="World grid" name="World"/>
<combo_box.item label="Local grid" name="Local"/>
<combo_box.item label="Reference grid" name="Reference"/>
<combo_box name="combobox grid mode" tool_tip="選擇物件定位參考的格線尺度類型">
<combo_box.item label="世界格線" name="World"/>
<combo_box.item label="地方格線" name="Local"/>
<combo_box.item label="參考格線" name="Reference"/>
</combo_box>
<button name="Options..." tool_tip="察看更多格線選項"/>
<button name="ToolCube" tool_tip="Cube"/>
@ -125,15 +125,15 @@
物件: [COUNT]
</text>
<text name="prim_count">
Prims: [COUNT]
幾何元件: [COUNT]
</text>
<tab_container name="Object Info Tabs">
<panel label="一般" name="General">
<panel.string name="text deed continued">
Deed
讓渡
</panel.string>
<panel.string name="text deed">
Deed
讓渡
</panel.string>
<panel.string name="text modify info 1">
你能修改這個物件
@ -183,7 +183,7 @@
<name_box initial_value="載入中..." name="Group Name Proxy"/>
<button name="button set group" tool_tip="選擇一個群組以分享這物件權限"/>
<check_box label="分享" name="checkbox share with group" tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."/>
<button label="Deed" label_selected="Deed" name="button deed" tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."/>
<button label="讓渡" label_selected="讓渡" name="button deed" tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."/>
<text name="label click action">
點擊以:
</text>
@ -272,7 +272,7 @@
<combo_box.item label="Sculpted" name="Sculpted"/>
</combo_box>
<combo_box name="material">
<combo_box.item label="Stone" name="Stone"/>
<combo_box.item label="石頭" name="Stone"/>
<combo_box.item label="金屬" name="Metal"/>
<combo_box.item label="玻璃" name="Glass"/>
<combo_box.item label="木頭" name="Wood"/>
@ -340,7 +340,7 @@
<text name="text revolutions">
Revolutions
</text>
<texture_picker label="Sculpt Texture" name="sculpt texture control" tool_tip="點擊以挑選圖"/>
<texture_picker label="Sculpt Texture" name="sculpt texture control" tool_tip="點擊以挑選圖"/>
<check_box label="Mirror" name="sculpt mirror control" tool_tip="Flips sculpted prim along the X axis"/>
<check_box label="Inside-out" name="sculpt invert control" tool_tip="Inverts the sculpted prims normals, making it appear inside-out"/>
<text name="label sculpt type">
@ -356,28 +356,28 @@
</panel>
<panel label="特性" name="Features">
<text name="select_single">
Select only one primitive to edit features.
只能選擇一個幾何元件去編輯細節。
</text>
<text name="edit_object">
編輯物件特性:
</text>
<check_box label="Flexible Path" name="Flexible1D Checkbox Ctrl" tool_tip="Allows object to flex about the Z axis (Client-side only)"/>
<spinner label="Softness" name="FlexNumSections"/>
<spinner label="Gravity" name="FlexGravity"/>
<spinner label="Drag" name="FlexFriction"/>
<spinner label="Wind" name="FlexWind"/>
<spinner label="Tension" name="FlexTension"/>
<spinner label="Force X" name="FlexForceX"/>
<spinner label="Force Y" name="FlexForceY"/>
<spinner label="Force Z" name="FlexForceZ"/>
<check_box label="Light" name="Light Checkbox Ctrl" tool_tip="Causes object to emit light"/>
<check_box label="彈性路徑" name="Flexible1D Checkbox Ctrl" tool_tip="Allows object to flex about the Z axis (Client-side only)"/>
<spinner label="柔軟" name="FlexNumSections"/>
<spinner label="重力" name="FlexGravity"/>
<spinner label="拖曳" name="FlexFriction"/>
<spinner label="風力" name="FlexWind"/>
<spinner label="張力" name="FlexTension"/>
<spinner label="強制 X 軸" name="FlexForceX"/>
<spinner label="強制 Y 軸" name="FlexForceY"/>
<spinner label="強制 Z 軸" name="FlexForceZ"/>
<check_box label="光源" name="Light Checkbox Ctrl" tool_tip="導致物件發光"/>
<color_swatch name="colorswatch" tool_tip="點擊以開啟顏色挑選器"/>
<texture_picker label="" name="light texture control" tool_tip="Click to choose a projection image (only has effect with deferred rendering enabled)"/>
<spinner label="Intensity" name="Light Intensity"/>
<spinner label="強度" name="Light Intensity"/>
<spinner label="FOV" name="Light FOV"/>
<spinner label="Radius" name="Light Radius"/>
<spinner label="半徑" name="Light Radius"/>
<spinner label="Focus" name="Light Focus"/>
<spinner label="Falloff" name="Light Falloff"/>
<spinner label="衰減" name="Light Falloff"/>
<spinner label="Ambiance" name="Light Ambiance"/>
</panel>
<panel label="材質" name="Texture">
@ -387,7 +387,7 @@
<panel.string name="string repeats per face">
每一面重覆次數
</panel.string>
<texture_picker label="材質" name="texture control" tool_tip="點擊以挑選圖"/>
<texture_picker label="材質" name="texture control" tool_tip="點擊以挑選圖"/>
<color_swatch label="顏色" name="colorswatch" tool_tip="點擊以開啟顏色挑選器"/>
<text name="color trans">
透明度 %

View File

@ -3,7 +3,7 @@
<text name="media_label">
媒體 URL
</text>
<button label="" name="ok_btn"/>
<button label="確定" name="ok_btn"/>
<button label="取消" name="cancel_btn"/>
<button label="清除" name="clear_btn"/>
<text name="loading_label">

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_voice_controls" title="Voice Controls">
<floater name="floater_voice_controls" title="語音控制">
<string name="title_nearby">
NEARBY VOICE
附近的語音
</string>
<string name="title_group">
與 [GROUP] 進行群組通話
@ -13,7 +13,7 @@
與 [NAME] 進行通話
</string>
<string name="no_one_near">
No one near has voice enabled
附近沒有一人開啟語音
</string>
<layout_stack name="my_call_stack">
<layout_panel name="my_panel">

View File

@ -2,17 +2,17 @@
<menu name="Popup">
<menu_item_call label="分享" name="Share"/>
<menu_item_call label="購買" name="Task Buy"/>
<menu_item_call label="Open" name="Task Open"/>
<menu_item_call label="Play" name="Task Play"/>
<menu_item_call label="Properties" name="Task Properties"/>
<menu_item_call label="開啟" name="Task Open"/>
<menu_item_call label="播放" name="Task Play"/>
<menu_item_call label="屬性" name="Task Properties"/>
<menu_item_call label="更名" name="Task Rename"/>
<menu_item_call label="刪除" name="Task Remove"/>
<menu_item_call label="清空垃圾筒" name="Empty Trash"/>
<menu_item_call label="Empty Lost And Found" name="Empty Lost And Found"/>
<menu_item_call label="清空 Lost And Found" name="Empty Lost And Found"/>
<menu_item_call label="新資料夾" name="New Folder"/>
<menu_item_call label="New Script" name="New Script"/>
<menu_item_call label="New Notecard" name="New Note"/>
<menu_item_call label="New Gesture" name="New Gesture"/>
<menu_item_call label="新腳本" name="New Script"/>
<menu_item_call label="新記事卡" name="New Note"/>
<menu_item_call label="新姿勢" name="New Gesture"/>
<menu label="新衣服" name="New Clothes">
<menu_item_call label="新襯衫" name="New Shirt"/>
<menu_item_call label="新褲子" name="New Pants"/>
@ -52,11 +52,11 @@
<menu_item_call label="添加到目前裝扮" name="Add To Outfit"/>
<menu_item_call label="由目前的裝扮移除" name="Remove From Outfit"/>
<menu_item_call label="尋找原件" name="Find Original"/>
<menu_item_call label="Purge Item" name="Purge Item"/>
<menu_item_call label="Restore Item" name="Restore Item"/>
<menu_item_call label="清空物品" name="Purge Item"/>
<menu_item_call label="恢復物品" name="Restore Item"/>
<menu_item_call label="開啟" name="Open"/>
<menu_item_call label="Open Original" name="Open Original"/>
<menu_item_call label="Properties" name="Properties"/>
<menu_item_call label="開啟原件" name="Open Original"/>
<menu_item_call label="屬性" name="Properties"/>
<menu_item_call label="更名" name="Rename"/>
<menu_item_call label="覆製資產 UUID" name="Copy Asset UUID"/>
<menu_item_call label="覆製" name="Copy"/>
@ -68,11 +68,11 @@
<menu_item_call label="Start Conference Chat" name="Conference Chat Folder"/>
<menu_item_call label="播放" name="Sound Play"/>
<menu_item_call label="添加地標" name="About Landmark"/>
<menu_item_call label="Play Inworld" name="Animation Play"/>
<menu_item_call label="Play Locally" name="Animation Audition"/>
<menu_item_call label="播放於虛擬世界" name="Animation Play"/>
<menu_item_call label="播放於本地" name="Animation Audition"/>
<menu_item_call label="送出即時訊息" name="Send Instant Message"/>
<menu_item_call label="發給瞬間傳送請求..." name="Offer Teleport..."/>
<menu_item_call label="Start Conference Chat" name="Conference Chat"/>
<menu_item_call label="開始會議交談" name="Conference Chat"/>
<menu_item_call label="Activate" name="Activate"/>
<menu_item_call label="Deactivate" name="Deactivate"/>
<menu_item_call label="另存" name="Save As"/>

View File

@ -6,7 +6,7 @@
<menu_item_check label="總是由名稱排序資料夾" name="sort_folders_by_name"/>
<menu_item_check label="系統資料夾排序到最上方" name="sort_system_folders_to_top"/>
<menu_item_call label="顯示過濾器" name="show_filters"/>
<menu_item_call label="Reset Filters" name="reset_filters"/>
<menu_item_call label="重設過濾器" name="reset_filters"/>
<menu_item_call label="關閉全部資料夾" name="close_folders"/>
<menu_item_call label="清空 Lost and Found" name="empty_lostnfound"/>
<menu_item_call label="儲存材質為" name="Save Texture As"/>

View File

@ -139,45 +139,46 @@
<menu_item_check label="Disable Camera Constraints" name="Disable Camera Distance"/>
<menu_item_check label="高解析度快照" name="HighResSnapshot"/>
<menu_item_check label="靜音拍攝快照到硬碟" name="QuietSnapshotsToDisk"/>
<menu_item_check label="壓縮快照存到硬碟" name="CompressSnapshotsToDisk"/>
<menu label="效能工具" name="Performance Tools">
<menu_item_call label="Lag Meter" name="Lag Meter"/>
<menu_item_check label="統計列" name="Statistics Bar"/>
<menu_item_check label="Show Avatar Rendering Cost" name="Avatar Rendering Cost"/>
</menu>
<menu label="Highlighting and Visibility" name="Highlighting and Visibility">
<menu label="高亮顯示與可見度" name="Highlighting and Visibility">
<menu_item_check label="Cheesy Beacon" name="Cheesy Beacon"/>
<menu_item_check label="Hide Particles" name="Hide Particles"/>
<menu_item_check label="Hide Selected" name="Hide Selected"/>
<menu_item_check label="隱藏粒子效果" name="Hide Particles"/>
<menu_item_check label="隱藏所選擇的" name="Hide Selected"/>
<menu_item_check label="高亮顯示透明物件" name="Highlight Transparent"/>
<menu_item_check label="顯示 HUD 附件" name="Show HUD Attachments"/>
<menu_item_check label="Show Mouselook Crosshairs" name="ShowCrosshairs"/>
<menu_item_check label="顯示第一人稱視角準星" name="ShowCrosshairs"/>
</menu>
<menu label="Rendering Types" name="Rendering Types">
<menu_item_check label="Simple" name="Simple"/>
<menu_item_check label="簡單" name="Simple"/>
<menu_item_check label="半透明" name="Alpha"/>
<menu_item_check label="Tree" name="Tree"/>
<menu_item_check label="Avatars" name="Character"/>
<menu_item_check label="SurfacePath" name="SurfacePath"/>
<menu_item_check label="Sky" name="Sky"/>
<menu_item_check label="Water" name="Water"/>
<menu_item_check label="Ground" name="Ground"/>
<menu_item_check label="Volume" name="Volume"/>
<menu_item_check label="Grass" name="Grass"/>
<menu_item_check label="Clouds" name="Clouds"/>
<menu_item_check label="Particles" name="Particles"/>
<menu_item_check label="Bump" name="Bump"/>
<menu_item_check label="樹木" name="Tree"/>
<menu_item_check label="化身" name="Character"/>
<menu_item_check label="地表" name="SurfacePath"/>
<menu_item_check label="天空" name="Sky"/>
<menu_item_check label="水文" name="Water"/>
<menu_item_check label="地面" name="Ground"/>
<menu_item_check label="體積" name="Volume"/>
<menu_item_check label="草地" name="Grass"/>
<menu_item_check label="雲彩" name="Clouds"/>
<menu_item_check label="粒子效果" name="Particles"/>
<menu_item_check label="碰撞" name="Bump"/>
</menu>
<menu label="Rendering Features" name="Rendering Features">
<menu_item_check label="UI" name="UI"/>
<menu_item_check label="Selected" name="Selected"/>
<menu_item_check label="Highlighted" name="Highlighted"/>
<menu_item_check label="Dynamic Textures" name="Dynamic Textures"/>
<menu_item_check label="Foot Shadows" name="Foot Shadows"/>
<menu_item_check label="Fog" name="Fog"/>
<menu_item_check label="腳步陰影" name="Foot Shadows"/>
<menu_item_check label="霧氣" name="Fog"/>
<menu_item_check label="Test FRInfo" name="Test FRInfo"/>
<menu_item_check label="Flexible Objects" name="Flexible Objects"/>
<menu_item_check label="彈性物件" name="Flexible Objects"/>
</menu>
<menu_item_check label="Use Plugin Read Thread" name="Use Plugin Read Thread"/>
<menu_item_check label="使用外卦讀取緒" name="Use Plugin Read Thread"/>
<menu_item_call label="清除群組快取資料" name="ClearGroupCache"/>
<menu_item_check label="滑鼠平滑移動" name="Mouse Smoothing"/>
<menu label="快速鍵" name="Shortcuts">
@ -213,13 +214,13 @@
<menu_item_check label="除錯控制台" name="Debug Console"/>
<menu_item_call label="通知控制台" name="Notifications"/>
<menu_item_check label="材質尺寸控制台" name="Texture Size"/>
<menu_item_check label="Texture Category Console" name="Texture Category"/>
<menu_item_check label="Fast Timers" name="Fast Timers"/>
<menu_item_check label="材質分類控制台" name="Texture Category"/>
<menu_item_check label="快速碼錶" name="Fast Timers"/>
<menu_item_check label="記憶體" name="Memory"/>
<menu_item_call label="Region Info to Debug Console" name="Region Info to Debug Console"/>
<menu_item_call label="地區資訊傳至除錯控制台" name="Region Info to Debug Console"/>
<menu_item_call label="群組資訊至除錯控制台" name="Group Info to Debug Console"/>
<menu_item_call label="Capabilities Info to Debug Console" name="Capabilities Info to Debug Console"/>
<menu_item_check label="Camera" name="Camera"/>
<menu_item_check label="攝影機" name="Camera"/>
<menu_item_check label="風力" name="Wind"/>
<menu_item_check label="FOV" name="FOV"/>
<menu_item_check label="Badge" name="Badge"/>
@ -244,7 +245,7 @@
<menu_item_call label="模擬記憶體不足" name="Memory Leaking Simulation"/>
</menu>
<menu label="Render Tests" name="Render Tests">
<menu_item_check label="Camera Offset" name="Camera Offset"/>
<menu_item_check label="攝影機位移" name="Camera Offset"/>
<menu_item_check label="Randomize Framerate" name="Randomize Framerate"/>
<menu_item_check label="Periodic Slow Frame" name="Periodic Slow Frame"/>
<menu_item_check label="Frame Test" name="Frame Test"/>
@ -275,12 +276,12 @@
<menu_item_check label="Shadows from Sun/Moon/Projectors" name="Shadows from Sun/Moon/Projectors"/>
<menu_item_check label="SSAO and Shadow Smoothing" name="SSAO and Shadow Smoothing"/>
<menu_item_check label="Global Illumination (experimental)" name="Global Illumination"/>
<menu_item_check label="Debug GL" name="Debug GL"/>
<menu_item_check label="Debug Pipeline" name="Debug Pipeline"/>
<menu_item_check label="GL 除錯" name="Debug GL"/>
<menu_item_check label="管線除錯" name="Debug Pipeline"/>
<menu_item_check label="自動半透明遮罩(遞延)" name="Automatic Alpha Masks (deferred)"/>
<menu_item_check label="自動半透明遮罩(非遞延)" name="Automatic Alpha Masks (non-deferred)"/>
<menu_item_check label="Animation Textures" name="Animation Textures"/>
<menu_item_check label="Disable Textures" name="Disable Textures"/>
<menu_item_check label="關閉材質" name="Disable Textures"/>
<menu_item_check label="Full Res Textures" name="Rull Res Textures"/>
<menu_item_check label="Audit Textures" name="Audit Textures"/>
<menu_item_check label="Texture Atlas (experimental)" name="Texture Atlas"/>
@ -297,30 +298,30 @@
<menu_item_call label="Drop a Packet" name="Drop a Packet"/>
</menu>
<menu_item_call label="Dump Scripted Camera" name="Dump Scripted Camera"/>
<menu_item_call label="Bumps, Pushes &amp; Hits" name="Bumps, Pushes &amp;amp; Hits"/>
<menu label="Recorder" name="Recorder">
<menu_item_call label="Start Playback" name="Start Playback"/>
<menu_item_call label="Stop Playback" name="Stop Playback"/>
<menu_item_check label="Loop Playback" name="Loop Playback"/>
<menu_item_call label="Start Record" name="Start Record"/>
<menu_item_call label="Stop Record" name="Stop Record"/>
<menu_item_call label="碰撞、推擠與打擊" name="Bumps, Pushes &amp;amp; Hits"/>
<menu label="錄製器" name="Recorder">
<menu_item_call label="開始播放" name="Start Playback"/>
<menu_item_call label="停止播放" name="Stop Playback"/>
<menu_item_check label="循環播放" name="Loop Playback"/>
<menu_item_call label="開始錄製" name="Start Record"/>
<menu_item_call label="停止錄製" name="Stop Record"/>
</menu>
<menu label="World" name="World">
<menu_item_check label="Sim Sun Override" name="Sim Sun Override"/>
<menu label="世界" name="World">
<menu_item_check label="模擬器太陽設定覆蓋" name="Sim Sun Override"/>
<menu_item_check label="Cheesy Beacon" name="Cheesy Beacon"/>
<menu_item_check label="Fixed Weather" name="Fixed Weather"/>
<menu_item_check label="固定天氣" name="Fixed Weather"/>
<menu_item_call label="傾印地區物件快取" name="Dump Region Object Cache"/>
</menu>
<menu label="UI" name="UI">
<menu_item_call label="Media Browser Test" name="Web Browser Test"/>
<menu_item_call label="Web Content Browser" name="Web Content Browser"/>
<menu_item_call label="測試媒體瀏覽器" name="Web Browser Test"/>
<menu_item_call label="網頁內容瀏覽器" name="Web Content Browser"/>
<menu_item_call label="Dump SelectMgr" name="Dump SelectMgr"/>
<menu_item_call label="傾印收納區" name="Dump Inventory"/>
<menu_item_call label="Dump Timers" name="Dump Timers"/>
<menu_item_call label="傾印碼錶" name="Dump Timers"/>
<menu_item_call label="Dump Focus Holder" name="Dump Focus Holder"/>
<menu_item_call label="Print Selected Object Info" name="Print Selected Object Info"/>
<menu_item_call label="Print Agent Info" name="Print Agent Info"/>
<menu_item_call label="Memory Stats" name="Memory Stats"/>
<menu_item_call label="計憶體狀態" name="Memory Stats"/>
<menu_item_check label="Region Debug Console" name="Region Debug Console"/>
<menu_item_check label="Debug SelectMgr" name="Debug SelectMgr"/>
<menu_item_check label="Debug Clicks" name="Debug Clicks"/>
@ -331,9 +332,9 @@
<menu_item_check label="Debug WindowProc" name="Debug WindowProc"/>
</menu>
<menu label="XUI" name="XUI">
<menu_item_call label="Reload Color Settings" name="Reload Color Settings"/>
<menu_item_call label="Show Font Test" name="Show Font Test"/>
<menu_item_check label="Show XUI Names" name="Show XUI Names"/>
<menu_item_call label="重新載入顏色設定" name="Reload Color Settings"/>
<menu_item_call label="顯示字型測試" name="Show Font Test"/>
<menu_item_check label="顯示 XUI 名稱" name="Show XUI Names"/>
<menu_item_call label="送出測試 IMs" name="Send Test IMs"/>
<menu_item_call label="沖洗名稱快取資料" name="Flush Names Caches"/>
</menu>
@ -348,12 +349,12 @@
<menu label="Character Tests" name="Character Tests">
<menu_item_call label="Appearance To XML" name="Appearance To XML"/>
<menu_item_call label="Toggle Character Geometry" name="Toggle Character Geometry"/>
<menu_item_call label="Test Male" name="Test Male"/>
<menu_item_call label="Test Female" name="Test Female"/>
<menu_item_call label="Toggle PG" name="Toggle PG"/>
<menu_item_check label="Allow Select Avatar" name="Allow Select Avatar"/>
<menu_item_call label="男性測試" name="Test Male"/>
<menu_item_call label="女性測試" name="Test Female"/>
<menu_item_call label="PG 切換" name="Toggle PG"/>
<menu_item_check label="允許選擇化身" name="Allow Select Avatar"/>
</menu>
<menu_item_call label="Force Params to Default" name="Force Params to Default"/>
<menu_item_call label="強制參數為預設值" name="Force Params to Default"/>
<menu_item_check label="動作資訊" name="Animation Info"/>
<menu_item_check label="慢動作" name="Slow Motion Animations"/>
<menu_item_check label="顯示注視在" name="Show Look At"/>

View File

@ -27,10 +27,10 @@
圖像
</label>
<tooltip name="image_tooltip">
There is an image at this location
有一個圖像在此位置
</tooltip>
<playtip name="image_playtip">
View this location&apos;s image
察看這個位置的圖像
</playtip>
</widgetset>
<widgetset name="audio">
@ -38,10 +38,10 @@
音頻
</label>
<tooltip name="audio_tooltip">
There is audio at this location
有一個音頻在此位置
</tooltip>
<playtip name="audio_playtip">
Play this location&apos;s audio
播放這個硾的音頻
</playtip>
</widgetset>
<scheme name="rtsp">

View File

@ -30,7 +30,7 @@
There is an image at this location
</tooltip>
<playtip name="image_playtip">
View this location&apos;s image
察看這個位置的圖像
</playtip>
</widgetset>
<widgetset name="audio">
@ -38,10 +38,10 @@
音頻
</label>
<tooltip name="audio_tooltip">
There is audio at this location
有一個音頻在此位置
</tooltip>
<playtip name="audio_playtip">
Play this location&apos;s audio
播放這個位置的音頻
</playtip>
</widgetset>
<scheme name="rtsp">
@ -66,7 +66,7 @@
</mimetype>
<mimetype name="video/*">
<label name="video2_label">
Video
影片
</label>
</mimetype>
<mimetype name="image/*">

View File

@ -27,10 +27,10 @@
圖像
</label>
<tooltip name="image_tooltip">
有一個像在此位置
有一個像在此位置
</tooltip>
<playtip name="image_playtip">
察看在此位置的
察看在此位置的
</playtip>
</widgetset>
<widgetset name="audio">

View File

@ -758,16 +758,16 @@ No parcel selected.
No region selected.
</notification>
<notification name="CannotReleaseLandNothingSelected">
Unable to abandon land:
No parcel selected.
無法放棄土地:
無地段被選擇。
</notification>
<notification name="CannotReleaseLandNoRegion">
無法放棄土地:
無法尋找地區。
</notification>
<notification name="CannotBuyLandNothingSelected">
Unable to buy land:
No parcel selected.
無法購買土地:
無地段被選擇。
</notification>
<notification name="CannotBuyLandNoRegion">
Unable to buy land:
@ -777,121 +777,121 @@ Cannot find the region this land is in.
You cannot close the Buy Land window until [APP_NAME] estimates the price of this transaction.
</notification>
<notification name="CannotDeedLandNothingSelected">
Unable to deed land:
無法讓渡土地:
無地段被選取。
</notification>
<notification name="CannotDeedLandNoGroup">
Unable to deed land:
無法讓渡土地:
無群組被選取。
</notification>
<notification name="CannotDeedLandNoRegion">
Unable to deed land:
Cannot find the region this land is in.
無法讓渡土地:
無法發現這塊土地所在的地區。
</notification>
<notification name="CannotDeedLandMultipleSelected">
Unable to deed land:
Multiple parcels selected.
無法讓渡土地:
複數地段被選取。
Try selecting a single parcel.
請試著選取單一地段。
</notification>
<notification name="CannotDeedLandWaitingForServer">
Unable to deed land:
Waiting for server to report ownership.
無法讓渡土地:
等候伺服器報告擁有權。
Please try again.
請再試一次。
</notification>
<notification name="CannotDeedLandNoTransfer">
Unable to deed land:
The region [REGION] does not allow transfer of land.
無法讓渡土地:
此 [REGION] 地區並不允許土地轉移。
</notification>
<notification name="CannotReleaseLandWatingForServer">
Unable to abandon land:
Waiting for server to update parcel information.
無法放棄土地:
等候伺服器更新地段資訊。
Try again in a few seconds.
請稍後幾秒再試一次。
</notification>
<notification name="CannotReleaseLandSelected">
Unable to abandon land:
You do not own all the parcels selected.
無法放棄土地:
你並位擁有所選擇的全部土地。
Please select a single parcel.
請選擇一個單一地段。
</notification>
<notification name="CannotReleaseLandDontOwn">
Unable to abandon land:
You don&apos;t have permission to release this parcel.
Parcels you own appear in green.
無法放棄土地:
你並沒有權限去釋出這個地段。
你所擁有的地段將呈現綠色。
</notification>
<notification name="CannotReleaseLandRegionNotFound">
Unable to abandon land:
Cannot find the region this land is in.
無法放棄土地:
無法發現這快土地所在的地區。
</notification>
<notification name="CannotReleaseLandNoTransfer">
Unable to abandon land:
The region [REGION] does not allow transfer of land.
無法放棄土地:
此 [REGION] 地區並不許土地轉移。
</notification>
<notification name="CannotReleaseLandPartialSelection">
Unable to abandon land:
You must select an entire parcel to release it.
無法放棄土地:
你必須選取一整個地段以釋出它。
Select an entire parcel, or divide your parcel first.
選取一整個地段,或先進行分割。
</notification>
<notification name="ReleaseLandWarning">
You are about to release [AREA] m² of land.
Releasing this parcel will remove it from your land holdings, but will not grant any L$.
你釋出約 [AREA] m² 面積土地。
釋出個地段將會由你所持有的土地中移除,但不會給予任何 L$。
Release this land?
你確定要釋出這塊土地?
<usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
</notification>
<notification name="CannotDivideLandNothingSelected">
Unable to divide land:
無法分割土地:
No parcels selected.
無地段被選取。
</notification>
<notification name="CannotDivideLandPartialSelection">
Unable to divide land:
無法分割土地:
You have an entire parcel selected.
Try selecting a part of the parcel.
你現在選取整個地段。
請試著選取其中部分地段。
</notification>
<notification name="LandDivideWarning">
Dividing this land will split this parcel into two and each parcel can have its own settings. Some settings will be reset to defaults after the operation.
分割土地會將佌地段一分為二,每一個地段將都各自有其設定。 在這個操作之後,一些設定值將會回復到預設值。
Divide land?
進行分割土地?
<usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
</notification>
<notification name="CannotDivideLandNoRegion">
Unable to divide land:
Cannot find the region this land is in.
無法分割土地:
無法發現這塊土地所在的地區。
</notification>
<notification name="CannotJoinLandNoRegion">
Unable to join land:
Cannot find the region this land is in.
無法合併土地:
無法發現這塊土地所在的地區。
</notification>
<notification name="CannotJoinLandNothingSelected">
Unable to join land:
No parcels selected.
無法合併土地:
無地段被選取。
</notification>
<notification name="CannotJoinLandEntireParcelSelected">
Unable to join land:
You only have one parcel selected.
無法合併土地:
你只有選取一個地段。
Select land across both parcels.
請跨越兩個地段選取土地。
</notification>
<notification name="CannotJoinLandSelection">
Unable to join land:
You must select more than one parcel.
無法合併土地:
你必須選取超過一個地段。
Select land across both parcels.
請跨越兩個地段選取土地。
</notification>
<notification name="JoinLandWarning">
Joining this land will create one large parcel out of all parcels intersecting the selected rectangle.
You will need to reset the name and options of the new parcel.
合併土地將會在選取的全部地段範圍裡產生一個巨大的地段。
你將會需要重設這個新地段的名稱與設定選項。
Join land?
進行土地合併?
<usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
</notification>
<notification name="ConfirmNotecardSave">
This notecard needs to be saved before the item can be copied or viewed. Save notecard?
在物品能被覆製或察看前,這記事卡必須先進行儲存。儲存記事卡?
<usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
</notification>
<notification name="ConfirmItemCopy">
@ -1377,7 +1377,7 @@ We must restart [APP_NAME] to install the update.
<notification name="DeedObjectToGroup">
Deeding this object will cause the group to:
* Receive L$ paid into the object
<usetemplate ignoretext="在我讓渡一個物件給群組前確認" name="okcancelignore" notext="取消" yestext="Deed"/>
<usetemplate ignoretext="在我讓渡一個物件給群組前確認" name="okcancelignore" notext="取消" yestext="讓渡"/>
</notification>
<notification name="WebLaunchExternalTarget">
你確定要開啟網頁瀏覽器去察看這個內容?
@ -1457,7 +1457,7 @@ Chat and instant messages will be hidden. Instant messages will get your Busy mo
<notification name="JoinedTooManyGroupsMember">
You have reached your maximum number of groups. Please leave another group before joining this one, or decline the offer.
[NAME] has invited you to join a group as a member.
<usetemplate name="okcancelbuttons" notext="Decline" yestext="加入"/>
<usetemplate name="okcancelbuttons" notext="謝絕" yestext="加入"/>
</notification>
<notification name="JoinedTooManyGroups">
You have reached your maximum number of groups. Please leave some group before joining or creating a new one.
@ -1509,12 +1509,12 @@ Chat and instant messages will be hidden. Instant messages will get your Busy mo
Just like in real life, it takes a while for everyone to learn about a new name. Please allow several days for [http://wiki.secondlife.com/wiki/Setting_your_display_name your name to update] in objects, scripts, search, etc.
</notification>
<notification name="SetDisplayNameBlocked">
Sorry, you cannot change your display name. If you feel this is in error, please contact support.
抱歉,你不可以變更你的顯示名稱。如果你覺得這是錯誤,請連繫支援廠商。
</notification>
<notification name="SetDisplayNameFailedLength">
Sorry, that name is too long. Display names can have a maximum of [LENGTH] characters.
抱歉,這名稱太長。顯示名稱最大長度為 [LENGTH] 字元。
Please try a shorter name.
請嘗試短一些的名稱。
</notification>
<notification name="SetDisplayNameFailedGeneric">
Sorry, we could not set your display name. Please try again later.
@ -1890,7 +1890,7 @@ Move the inventory item(s)?
</notification>
<notification name="ConfirmQuit">
你確定你要結束退出?
<usetemplate ignoretext="當我結束退出時進行確認" name="okcancelignore" notext="不結束退出" yestext="結束退出"/>
<usetemplate ignoretext="當我結束退出時進行確認" name="okcancelignore" notext="不結束退出" yestext="結束退出"/>
</notification>
<notification name="DeleteItems">
[QUESTION]
@ -1941,11 +1941,11 @@ Linden Lab
The following required components are missing from [FLOATER]:
[COMPONENTS]
</notification>
<notification label="Replace Existing Attachment" name="ReplaceAttachment">
<notification label="取代現有的附件" name="ReplaceAttachment">
There is already an object attached to this point on your body.
Do you want to replace it with the selected object?
<form name="form">
<ignore name="ignore" text="Replace an existing attachment with the selected item"/>
<ignore name="ignore" text="以所選擇的物品取代現有的附加物"/>
<button ignore="自動取代" name="Yes" text="確定"/>
<button ignore="絕不取代" name="No" text="取消"/>
</form>
@ -2109,10 +2109,10 @@ Link to this from a web page to give others easy access to this location, or try
Topic: [SUBJECT], Message: [MESSAGE]
</notification>
<notification name="FriendOnline">
[NAME] is Online
[NAME] 上線
</notification>
<notification name="FriendOffline">
[NAME] is Offline
[NAME] 離線
</notification>
<notification name="AddSelfFriend">
Although you&apos;re very nice, you can&apos;t add yourself as a friend.
@ -2208,7 +2208,7 @@ Please select a single object.
[NAME] 接收到你提供的收納區物品。
</notification>
<notification name="InventoryDeclined">
[NAME] 絕你提供的收納區物品。
[NAME] 絕你提供的收納區物品。
</notification>
<notification name="ObjectMessage">
[NAME]: [MESSAGE]
@ -2418,7 +2418,7 @@ Please try again in a few moments.
</notification>
<notification name="ObjectGiveItem">
An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLURL] has given you this [OBJECTTYPE]:
&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Keep"/>
<button name="Discard" text="Discard"/>
@ -2443,7 +2443,7 @@ Please try again in a few moments.
[MESSAGE]
<form name="form">
<button name="Join" text="加入"/>
<button name="Decline" text="Decline"/>
<button name="Decline" text="謝絕"/>
<button name="Info" text="資訊"/>
</form>
</notification>
@ -2475,7 +2475,7 @@ Please try again in a few moments.
(By default, you will be able to see each other&apos;s online status.)
<form name="form">
<button name="Accept" text="接受"/>
<button name="Decline" text="Decline"/>
<button name="Decline" text="謝絕"/>
</form>
</notification>
<notification name="FriendshipOffered">
@ -2487,27 +2487,27 @@ Please try again in a few moments.
(By default, you will be able to see each other&apos;s online status.)
<form name="form">
<button name="Accept" text="接受"/>
<button name="Decline" text="Decline"/>
<button name="Decline" text="謝絕"/>
</form>
</notification>
<notification name="FriendshipAccepted">
[NAME] accepted your friendship offer.
</notification>
<notification name="FriendshipDeclined">
[NAME] declined your friendship offer.
[NAME] 謝絕你的交友邀請。
</notification>
<notification name="FriendshipAcceptedByMe">
Friendship offer accepted.
交友邀請被接受。
</notification>
<notification name="FriendshipDeclinedByMe">
Friendship offer declined.
交友邀請被謝絕。
</notification>
<notification name="OfferCallingCard">
[NAME] is offering their calling card.
This will add a bookmark in your inventory so you can quickly IM this Resident.
<form name="form">
<button name="Accept" text="接受"/>
<button name="Decline" text="Decline"/>
<button name="Decline" text="謝絕"/>
</form>
</notification>
<notification name="RegionRestartMinutes">
@ -2559,7 +2559,7 @@ Grant this request?
<form name="form">
<button name="Grant" text="Grant"/>
<button name="Deny" text="Deny"/>
<button name="Details" text="Details..."/>
<button name="Details" text="細節..."/>
</form>
</notification>
<notification name="ScriptDialog">
@ -2602,7 +2602,7 @@ Things you build here will be deleted after you leave, so don&apos;t forget to r
Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller.
<form name="form">
<button name="Accept" text="接受"/>
<button name="Decline" text="Decline"/>
<button name="Decline" text="謝絕"/>
<button name="Mute" text="Block"/>
</form>
</notification>
@ -2620,7 +2620,7 @@ Click Accept to join the call or Decline to decline the invitation. Click Block
Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller.
<form name="form">
<button name="Accept" text="接受"/>
<button name="Decline" text="Decline"/>
<button name="Decline" text="謝絕"/>
<button name="Mute" text="Block"/>
</form>
</notification>
@ -2629,7 +2629,7 @@ Click Accept to join the call or Decline to decline the invitation. Click Block
Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller.
<form name="form">
<button name="Accept" text="接受"/>
<button name="Decline" text="Decline"/>
<button name="Decline" text="謝絕"/>
<button name="Mute" text="Block"/>
</form>
</notification>
@ -2638,7 +2638,7 @@ Click Accept to join the call or Decline to decline the invitation. Click Block
Click Accept to join the chat or Decline to decline the invitation. Click Block to block this caller.
<form name="form">
<button name="Accept" text="接受"/>
<button name="Decline" text="Decline"/>
<button name="Decline" text="謝絕"/>
<button name="Mute" text="Block"/>
</form>
</notification>
@ -2757,10 +2757,10 @@ With the following Residents:
<usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
</notification>
<notification name="ItemsShared">
Items successfully shared.
物品已成功分享。
</notification>
<notification name="DeedToGroupFail">
Deed to group failed.
讓渡給群組失敗。
</notification>
<notification name="AvatarRezNotification">
( [EXISTENCE] seconds alive )
@ -2822,7 +2822,7 @@ You uploaded a [RESOLUTION] baked texture for &apos;[BODYREGION]&apos; after [TI
You locally updated a [RESOLUTION] baked texture for &apos;[BODYREGION]&apos; after [TIME] seconds.
</notification>
<notification name="ConfirmLeaveCall">
Are you sure you want to leave this call?
你確定要離開這段通話?
<usetemplate ignoretext="我結束通話前進行確認" name="okcancelignore" notext="否" yestext="是"/>
</notification>
<notification name="ConfirmMuteAll">
@ -2846,7 +2846,7 @@ Click on the up arrow to see the voice control panel.
Hiding the Speak button will disable the voice feature.
</notification>
<notification label="Explore the World" name="HintDestinationGuide">
<notification label="探索世界" name="HintDestinationGuide">
The Destination Guide contains thousands of new places to discover. Select a location and choose Teleport to start exploring.
</notification>
<notification label="側邊欄" name="HintSidePanel">
@ -2862,7 +2862,7 @@ Click anywhere on the ground to walk to that spot.
2. Click and Drag to Rotate View
Click and drag anywhere on the world to rotate your view
</notification>
<notification label="Display Name" name="HintDisplayName">
<notification label="顯示名稱" name="HintDisplayName">
Set your customizable display name here. This is in addition to your unique username, which can&apos;t be changed. You can change how you see other people&apos;s names in your preferences.
</notification>
<notification label="View" name="HintView">
@ -2871,7 +2871,7 @@ Click and drag anywhere on the world to rotate your view
<notification label="收納區" name="HintInventory">
Check your inventory to find items. Newest items can be easily found in the Recent tab.
</notification>
<notification label="You&apos;ve got Linden Dollars!" name="HintLindenDollar">
<notification label="你得到林登幣!" name="HintLindenDollar">
Here&apos;s your current balance of L$. Click Buy L$ to purchase more Linden Dollars.
</notification>
<notification name="PopupAttempt">
@ -2892,38 +2892,38 @@ Click and drag anywhere on the world to rotate your view
</notification>
<notification label="" name="ModeChange">
改變劉覽器模式要求你必須結束退出並重新啟動。
<usetemplate name="okcancelbuttons" notext="不結束退出" yestext="結束退出"/>
<usetemplate name="okcancelbuttons" notext="不結束退出" yestext="結束退出"/>
</notification>
<notification label="" name="NoClassifieds">
Creation and editing of Classifieds is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
<usetemplate name="okcancelbuttons" notext="不結束退出" yestext="結束退出"/>
<usetemplate name="okcancelbuttons" notext="不結束退出" yestext="結束退出"/>
</notification>
<notification label="" name="NoGroupInfo">
Creation and editing of Groups is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
<usetemplate name="okcancelbuttons" notext="不結束退出" yestext="結束退出"/>
<usetemplate name="okcancelbuttons" notext="不結束退出" yestext="結束退出"/>
</notification>
<notification label="" name="NoPicks">
Creation and editing of Picks is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
<usetemplate name="okcancelbuttons" notext="不結束退出" yestext="結束退出"/>
<usetemplate name="okcancelbuttons" notext="不結束退出" yestext="結束退出"/>
</notification>
<notification label="" name="NoWorldMap">
Viewing of the world map is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
<usetemplate name="okcancelbuttons" notext="不結束退出" yestext="結束退出"/>
<usetemplate name="okcancelbuttons" notext="不結束退出" yestext="結束退出"/>
</notification>
<notification label="" name="NoVoiceCall">
Voice calls are only available in Advanced mode. Would you like to logout and change modes?
<usetemplate name="okcancelbuttons" notext="不結束退出" yestext="結束退出"/>
<usetemplate name="okcancelbuttons" notext="不結束退出" yestext="結束退出"/>
</notification>
<notification label="" name="NoAvatarShare">
Sharing is only available in Advanced mode. Would you like to logout and change modes?
<usetemplate name="okcancelbuttons" notext="不結束退出" yestext="結束退出"/>
<usetemplate name="okcancelbuttons" notext="不結束退出" yestext="結束退出"/>
</notification>
<notification label="" name="NoAvatarPay">
Paying other residents is only available in Advanced mode. Would you like to logout and change modes?
<usetemplate name="okcancelbuttons" notext="不結束退出" yestext="結束退出"/>
<usetemplate name="okcancelbuttons" notext="不結束退出" yestext="結束退出"/>
</notification>
<global name="UnsupportedCPU">
- Your CPU speed does not meet the minimum requirements.
- 你的 CPU 運算速度未達到系統最低配備要求。
</global>
<global name="UnsupportedGLRequirements">
You do not appear to have the proper hardware requirements for [APP_NAME]. [APP_NAME] requires an OpenGL graphics card that has multitexture support. If this is the case, you may want to make sure that you have the latest drivers for your graphics card, and service packs and patches for your operating system.
@ -2940,7 +2940,7 @@ If you continue to have problems, please visit the [SUPPORT_SITE].
- 你的顯示卡未達系統最低配備要求。
</global>
<global name="UnsupportedRAM">
- Your system memory does not meet the minimum requirements.
- 你的系統記憶體卡未達系統最低配備要求。
</global>
<global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
若你擁有一塊土地,你可以標記它成為你的家的位置。

View File

@ -16,7 +16,7 @@
<bottomtray_button label="移動" name="movement_btn" tool_tip="顯示 / 隱藏 移動控制"/>
</layout_panel>
<layout_panel name="cam_panel">
<bottomtray_button label="View" name="camera_btn" tool_tip="顯示 / 隱藏 攝影機控制"/>
<bottomtray_button label="視角" name="camera_btn" tool_tip="顯示 / 隱藏 攝影機控制"/>
</layout_panel>
<layout_panel name="snapshot_panel">
<bottomtray_button name="snapshots" tool_tip="拍攝快照"/>

View File

@ -2,11 +2,11 @@
<panel name="edit_alpha_panel">
<scroll_container name="avatar_alpha_color_panel_scroll">
<panel name="avatar_alpha_color_panel">
<texture_picker label="下半身半透明" name="Lower Alpha" tool_tip="點擊以挑選圖"/>
<texture_picker label="上半身半透明" name="Upper Alpha" tool_tip="點擊以挑選圖"/>
<texture_picker label="頭部半透明" name="Head Alpha" tool_tip="點擊以挑選圖"/>
<texture_picker label="眼睛半透明" name="Eye Alpha" tool_tip="點擊以挑選圖"/>
<texture_picker label="頭髮半透明" name="Hair Alpha" tool_tip="點擊以挑選圖"/>
<texture_picker label="下半身半透明" name="Lower Alpha" tool_tip="點擊以挑選圖"/>
<texture_picker label="上半身半透明" name="Upper Alpha" tool_tip="點擊以挑選圖"/>
<texture_picker label="頭部半透明" name="Head Alpha" tool_tip="點擊以挑選圖"/>
<texture_picker label="眼睛半透明" name="Eye Alpha" tool_tip="點擊以挑選圖"/>
<texture_picker label="頭髮半透明" name="Hair Alpha" tool_tip="點擊以挑選圖"/>
</panel>
</scroll_container>
</panel>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_eyes_panel">
<panel name="avatar_eye_color_panel">
<texture_picker label="Iris" name="Iris" tool_tip="點擊以挑選圖"/>
<texture_picker label="Iris" name="Iris" tool_tip="點擊以挑選圖"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">

Some files were not shown because too many files have changed in this diff Show More