QAR-758 1.20 Viewer RC 12, 13, 14, 15 -> Release
merge Branch_1-20-14-Viewer-merge -> release Includes Branch_1-20-Viewer-2 through 92456master
|
|
@ -200,6 +200,7 @@ Matthew Dowd
|
|||
VWR-1761
|
||||
McCabe Maxsted
|
||||
VWR-1318
|
||||
VWR-7893
|
||||
Michelle2 Zenovka
|
||||
VWR-2652
|
||||
VWR-2834
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@
|
|||
|
||||
const S32 LL_VERSION_MAJOR = 1;
|
||||
const S32 LL_VERSION_MINOR = 20;
|
||||
const S32 LL_VERSION_PATCH = 11;
|
||||
const S32 LL_VERSION_PATCH = 15;
|
||||
const S32 LL_VERSION_BUILD = 0;
|
||||
|
||||
const char * const LL_CHANNEL = "Second Life Release";
|
||||
|
|
|
|||
|
|
@ -145,7 +145,6 @@ U8* LLImageBase::allocateData(S32 size)
|
|||
mData = new U8[size];
|
||||
if (!mData)
|
||||
{
|
||||
//llerrs << "allocate image data: " << size << llendl;
|
||||
llwarns << "allocate image data: " << size << llendl;
|
||||
size = 0 ;
|
||||
mWidth = mHeight = 0 ;
|
||||
|
|
@ -243,8 +242,10 @@ LLImageRaw::LLImageRaw(U8 *data, U16 width, U16 height, S8 components)
|
|||
: LLImageBase()
|
||||
{
|
||||
mMemType = LLMemType::MTYPE_IMAGERAW;
|
||||
allocateDataSize(width, height, components);
|
||||
memcpy(getData(), data, width*height*components);
|
||||
if(allocateDataSize(width, height, components))
|
||||
{
|
||||
memcpy(getData(), data, width*height*components);
|
||||
}
|
||||
++sRawImageCount;
|
||||
}
|
||||
|
||||
|
|
@ -795,7 +796,7 @@ void LLImageRaw::copyScaled( LLImageRaw* src )
|
|||
}
|
||||
|
||||
|
||||
void LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
|
||||
BOOL LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
|
||||
{
|
||||
LLMemType mt1((LLMemType::EMemType)mMemType);
|
||||
llassert((1 == getComponents()) || (3 == getComponents()) || (4 == getComponents()) );
|
||||
|
|
@ -805,7 +806,7 @@ void LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
|
|||
|
||||
if( (old_width == new_width) && (old_height == new_height) )
|
||||
{
|
||||
return; // Nothing to do.
|
||||
return TRUE; // Nothing to do.
|
||||
}
|
||||
|
||||
// Reallocate the data buffer.
|
||||
|
|
@ -840,8 +841,10 @@ void LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
|
|||
U8* temp_buffer = new U8[ temp_data_size ];
|
||||
if (!temp_buffer)
|
||||
{
|
||||
llerrs << "Out of memory in LLImageRaw::scale: old (w, h, c) = (" << old_width << ", " << old_height << ", " << (S32)getComponents() <<
|
||||
llwarns << "Out of memory in LLImageRaw::scale: old (w, h, c) = (" << old_width << ", " << old_height << ", " << (S32)getComponents() <<
|
||||
") ; new (w, h, c) = (" << new_width << ", " << new_height << ", " << (S32)getComponents() << ")" << llendl;
|
||||
|
||||
return FALSE ;
|
||||
}
|
||||
memcpy(temp_buffer, getData(), temp_data_size); /* Flawfinder: ignore */
|
||||
|
||||
|
|
@ -869,6 +872,8 @@ void LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
|
|||
// Clean up
|
||||
delete[] temp_buffer;
|
||||
}
|
||||
|
||||
return TRUE ;
|
||||
}
|
||||
|
||||
void LLImageRaw::copyLineScaled( U8* in, U8* out, S32 in_pixel_len, S32 out_pixel_len, S32 in_pixel_step, S32 out_pixel_step )
|
||||
|
|
|
|||
|
|
@ -176,7 +176,7 @@ public:
|
|||
void expandToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, BOOL scale_image = TRUE);
|
||||
void contractToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, BOOL scale_image = TRUE);
|
||||
void biasedScaleToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE);
|
||||
void scale( S32 new_width, S32 new_height, BOOL scale_image = TRUE );
|
||||
BOOL scale( S32 new_width, S32 new_height, BOOL scale_image = TRUE );
|
||||
|
||||
// Fill the buffer with a constant color
|
||||
void fill( const LLColor4U& color );
|
||||
|
|
|
|||
|
|
@ -552,7 +552,10 @@ BOOL LLImageBMP::encode(const LLImageRaw* raw_image, F32 encode_time)
|
|||
int file_bytes = line_bytes*getHeight() + header_bytes;
|
||||
|
||||
// Allocate the new buffer for the data.
|
||||
allocateData(file_bytes);
|
||||
if(!allocateData(file_bytes)) //memory allocation failed
|
||||
{
|
||||
return FALSE ;
|
||||
}
|
||||
|
||||
magic[0] = 'B'; magic[1] = 'M';
|
||||
magic[2] = (U8) file_bytes;
|
||||
|
|
|
|||
|
|
@ -736,7 +736,7 @@ void LLXferManager::processFileRequest (LLMessageSystem *mesgsys, void ** /*user
|
|||
|
||||
U8 local_path_u8;
|
||||
mesgsys->getU8("XferID", "FilePath", local_path_u8);
|
||||
if( local_path_u8 < (U8)LL_PATH_COUNT )
|
||||
if( local_path_u8 < (U8)LL_PATH_LAST )
|
||||
{
|
||||
local_path = (ELLPath)local_path_u8;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -765,9 +765,17 @@ U8* LLVertexBuffer::mapBuffer(S32 access)
|
|||
{
|
||||
llerrs << "Mapped two VBOs at the same time!" << llendl;
|
||||
}
|
||||
sMapped = TRUE;*/
|
||||
sMapped = TRUE;*/
|
||||
if (!mMappedData)
|
||||
{
|
||||
//--------------------
|
||||
//print out more debug info before crash
|
||||
llinfos << "vertex buffer size: (num verts : num indices) = " << getNumVerts() << " : " << getNumIndices() << llendl ;
|
||||
GLint size ;
|
||||
glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_SIZE_ARB, &size) ;
|
||||
llinfos << "GL_ARRAY_BUFFER_ARB size is " << size << llendl ;
|
||||
//--------------------
|
||||
|
||||
GLint buff;
|
||||
glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff);
|
||||
if (buff != mGLBuffer)
|
||||
|
|
|
|||
|
|
@ -257,6 +257,10 @@ public:
|
|||
{
|
||||
mFontAlignment = (LLFontGL::HAlign)llclamp(sd.get("halign").asInteger(), (S32)LLFontGL::LEFT, (S32)LLFontGL::HCENTER);
|
||||
}
|
||||
else
|
||||
{
|
||||
mFontAlignment = LLFontGL::LEFT;
|
||||
}
|
||||
|
||||
mIndex = -1;
|
||||
mParentCtrl = NULL;
|
||||
|
|
|
|||
|
|
@ -1666,13 +1666,13 @@ std::string LLUI::locateSkin(const std::string& filename)
|
|||
localization = sConfigGroup->getString("SystemLanguage");
|
||||
}
|
||||
std::string local_skin = "xui" + slash + localization + slash + filename;
|
||||
found_file = gDirUtilp->getExpandedFilename(LL_PATH_SKINS, local_skin);
|
||||
found_file = gDirUtilp->findSkinnedFilename(local_skin);
|
||||
}
|
||||
}
|
||||
if (!gDirUtilp->fileExists(found_file))
|
||||
{
|
||||
std::string local_skin = "xui" + slash + "en-us" + slash + filename;
|
||||
found_file = gDirUtilp->getExpandedFilename(LL_PATH_SKINS, local_skin);
|
||||
found_file = gDirUtilp->findSkinnedFilename(local_skin);
|
||||
}
|
||||
if (!gDirUtilp->fileExists(found_file))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@ const S32 VPAD = 4;
|
|||
const S32 FLOATER_H_MARGIN = 15;
|
||||
const S32 MIN_WIDGET_HEIGHT = 10;
|
||||
|
||||
std::vector<std::string> LLUICtrlFactory::mXUIPaths;
|
||||
std::vector<std::string> LLUICtrlFactory::sXUIPaths;
|
||||
|
||||
// UI Ctrl class for padding
|
||||
class LLUICtrlLocate : public LLUICtrl
|
||||
|
|
@ -121,12 +121,11 @@ void LLUICtrlFactory::setupPaths()
|
|||
|
||||
LLXMLNodePtr root;
|
||||
BOOL success = LLXMLNode::parseFile(filename, root, NULL);
|
||||
mXUIPaths.clear();
|
||||
sXUIPaths.clear();
|
||||
|
||||
if (success)
|
||||
{
|
||||
LLXMLNodePtr path;
|
||||
std::string app_dir = gDirUtilp->getAppRODataDir();
|
||||
|
||||
for (path = root->getFirstChild(); path.notNull(); path = path->getNextSibling())
|
||||
{
|
||||
|
|
@ -140,21 +139,20 @@ void LLUICtrlFactory::setupPaths()
|
|||
language = LLUI::sConfigGroup->getString("SystemLanguage");
|
||||
}
|
||||
}
|
||||
path_val_ui.setArg("[Language]", language);
|
||||
std::string fullpath = app_dir + path_val_ui.getString();
|
||||
path_val_ui.setArg("[LANGUAGE]", language);
|
||||
|
||||
if (std::find(mXUIPaths.begin(), mXUIPaths.end(), fullpath) == mXUIPaths.end())
|
||||
if (std::find(sXUIPaths.begin(), sXUIPaths.end(), path_val_ui.getString()) == sXUIPaths.end())
|
||||
{
|
||||
mXUIPaths.push_back(app_dir + path_val_ui.getString());
|
||||
sXUIPaths.push_back(path_val_ui.getString());
|
||||
}
|
||||
}
|
||||
}
|
||||
else // parsing failed
|
||||
{
|
||||
std::string slash = gDirUtilp->getDirDelimiter();
|
||||
std::string dir = gDirUtilp->getAppRODataDir() + slash + "skins" + slash + "xui" + slash + "en-us" + slash;
|
||||
llwarns << "XUI::config file unable to open." << llendl;
|
||||
mXUIPaths.push_back(dir);
|
||||
std::string dir = "xui" + slash + "en-us";
|
||||
llwarns << "XUI::config file unable to open: " << filename << llendl;
|
||||
sXUIPaths.push_back(dir);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -163,14 +161,22 @@ void LLUICtrlFactory::setupPaths()
|
|||
//-----------------------------------------------------------------------------
|
||||
// getLayeredXMLNode()
|
||||
//-----------------------------------------------------------------------------
|
||||
bool LLUICtrlFactory::getLayeredXMLNode(const std::string &filename, LLXMLNodePtr& root)
|
||||
bool LLUICtrlFactory::getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr& root)
|
||||
{
|
||||
if (!LLXMLNode::parseFile(mXUIPaths.front() + filename, root, NULL))
|
||||
{
|
||||
if (!LLXMLNode::parseFile(filename, root, NULL))
|
||||
std::string full_filename = gDirUtilp->findSkinnedFilename(sXUIPaths.front(), xui_filename);
|
||||
if (full_filename.empty())
|
||||
{
|
||||
llwarns << "Couldn't find UI description file: " << sXUIPaths.front() + gDirUtilp->getDirDelimiter() + xui_filename << llendl;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!LLXMLNode::parseFile(full_filename, root, NULL))
|
||||
{
|
||||
// try filename as passed in since sometimes we load an xml file from a user-supplied path
|
||||
if (!LLXMLNode::parseFile(xui_filename, root, NULL))
|
||||
{
|
||||
llwarns << "Problem reading UI description file: " << mXUIPaths.front() + filename << llendl;
|
||||
return FALSE;
|
||||
llwarns << "Problem reading UI description file: " << xui_filename << llendl;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -178,13 +184,24 @@ bool LLUICtrlFactory::getLayeredXMLNode(const std::string &filename, LLXMLNodePt
|
|||
|
||||
std::vector<std::string>::const_iterator itor;
|
||||
|
||||
for (itor = mXUIPaths.begin(), ++itor; itor != mXUIPaths.end(); ++itor)
|
||||
for (itor = sXUIPaths.begin(), ++itor; itor != sXUIPaths.end(); ++itor)
|
||||
{
|
||||
std::string nodeName;
|
||||
std::string updateName;
|
||||
|
||||
LLXMLNode::parseFile((*itor) + filename, updateRoot, NULL);
|
||||
|
||||
std::string layer_filename = gDirUtilp->findSkinnedFilename((*itor), xui_filename);
|
||||
if(layer_filename.empty())
|
||||
{
|
||||
// no localized version of this file, that's ok, keep looking
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!LLXMLNode::parseFile(layer_filename, updateRoot, NULL))
|
||||
{
|
||||
llwarns << "Problem reading localized UI description file: " << (*itor) + gDirUtilp->getDirDelimiter() + xui_filename << llendl;
|
||||
return false;
|
||||
}
|
||||
|
||||
updateRoot->getAttributeString("name", updateName);
|
||||
root->getAttributeString("name", nodeName);
|
||||
|
||||
|
|
@ -194,7 +211,7 @@ bool LLUICtrlFactory::getLayeredXMLNode(const std::string &filename, LLXMLNodePt
|
|||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -87,8 +87,7 @@ private:
|
|||
|
||||
std::deque<const LLCallbackMap::map_t*> mFactoryStack;
|
||||
|
||||
|
||||
static std::vector<std::string> mXUIPaths;
|
||||
static std::vector<std::string> sXUIPaths;
|
||||
|
||||
LLPanel* mDummyPanel;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -59,18 +59,8 @@ LLDir_Linux gDirUtil;
|
|||
|
||||
LLDir *gDirUtilp = (LLDir *)&gDirUtil;
|
||||
|
||||
LLDir::LLDir()
|
||||
: mAppName(""),
|
||||
mExecutablePathAndName(""),
|
||||
mExecutableFilename(""),
|
||||
mExecutableDir(""),
|
||||
mAppRODataDir(""),
|
||||
mOSUserDir(""),
|
||||
mOSUserAppDir(""),
|
||||
mLindenUserDir(""),
|
||||
mCAFile(""),
|
||||
mTempDir(""),
|
||||
mDirDelimiter("")
|
||||
LLDir::LLDir()
|
||||
: mDirDelimiter("/") // fallback to forward slash if not overridden
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -125,7 +115,7 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask)
|
|||
const std::string LLDir::findFile(const std::string &filename,
|
||||
const std::string searchPath1,
|
||||
const std::string searchPath2,
|
||||
const std::string searchPath3)
|
||||
const std::string searchPath3) const
|
||||
{
|
||||
std::vector<std::string> search_paths;
|
||||
search_paths.push_back(searchPath1);
|
||||
|
|
@ -246,12 +236,37 @@ const std::string &LLDir::getSkinDir() const
|
|||
return mSkinDir;
|
||||
}
|
||||
|
||||
const std::string &LLDir::getUserSkinDir() const
|
||||
{
|
||||
return mUserSkinDir;
|
||||
}
|
||||
|
||||
const std::string& LLDir::getDefaultSkinDir() const
|
||||
{
|
||||
return mDefaultSkinDir;
|
||||
}
|
||||
|
||||
const std::string LLDir::getSkinBaseDir() const
|
||||
{
|
||||
std::string dir = getAppRODataDir();
|
||||
dir += mDirDelimiter;
|
||||
dir += "skins";
|
||||
|
||||
return dir;
|
||||
}
|
||||
|
||||
|
||||
std::string LLDir::getExpandedFilename(ELLPath location, const std::string& filename) const
|
||||
{
|
||||
return getExpandedFilename(location, "", filename);
|
||||
}
|
||||
|
||||
std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subdir, const std::string& in_filename) const
|
||||
std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subdir, const std::string& filename) const
|
||||
{
|
||||
return getExpandedFilename(location, "", subdir, filename);
|
||||
}
|
||||
|
||||
std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subdir1, const std::string& subdir2, const std::string& in_filename) const
|
||||
{
|
||||
std::string prefix;
|
||||
switch (location)
|
||||
|
|
@ -324,13 +339,11 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd
|
|||
prefix += "skins";
|
||||
break;
|
||||
|
||||
case LL_PATH_HTML:
|
||||
prefix = getAppRODataDir();
|
||||
prefix += mDirDelimiter;
|
||||
prefix += "skins";
|
||||
prefix += mDirDelimiter;
|
||||
prefix += "html";
|
||||
break;
|
||||
//case LL_PATH_HTML:
|
||||
// prefix = getSkinDir();
|
||||
// prefix += mDirDelimiter;
|
||||
// prefix += "html";
|
||||
// break;
|
||||
|
||||
case LL_PATH_MOZILLA_PROFILE:
|
||||
prefix = getOSUserAppDir();
|
||||
|
|
@ -343,15 +356,16 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd
|
|||
}
|
||||
|
||||
std::string filename = in_filename;
|
||||
if (!subdir.empty())
|
||||
if (!subdir2.empty())
|
||||
{
|
||||
filename = subdir + mDirDelimiter + in_filename;
|
||||
filename = subdir2 + mDirDelimiter + filename;
|
||||
}
|
||||
else
|
||||
|
||||
if (!subdir1.empty())
|
||||
{
|
||||
filename = in_filename;
|
||||
filename = subdir1 + mDirDelimiter + filename;
|
||||
}
|
||||
|
||||
|
||||
std::string expanded_filename;
|
||||
if (!filename.empty())
|
||||
{
|
||||
|
|
@ -415,6 +429,30 @@ std::string LLDir::getExtension(const std::string& filepath) const
|
|||
return exten;
|
||||
}
|
||||
|
||||
std::string LLDir::findSkinnedFilename(const std::string &filename) const
|
||||
{
|
||||
return findSkinnedFilename("", "", filename);
|
||||
}
|
||||
|
||||
std::string LLDir::findSkinnedFilename(const std::string &subdir, const std::string &filename) const
|
||||
{
|
||||
return findSkinnedFilename("", subdir, filename);
|
||||
}
|
||||
|
||||
std::string LLDir::findSkinnedFilename(const std::string &subdir1, const std::string &subdir2, const std::string &filename) const
|
||||
{
|
||||
// generate subdirectory path fragment, e.g. "/foo/bar", "/foo", ""
|
||||
std::string subdirs = ((subdir1.empty() ? "" : mDirDelimiter) + subdir1)
|
||||
+ ((subdir2.empty() ? "" : mDirDelimiter) + subdir2);
|
||||
|
||||
std::string found_file = findFile(filename,
|
||||
getUserSkinDir() + subdirs, // first look in user skin override
|
||||
getSkinDir() + subdirs, // then in current skin
|
||||
getDefaultSkinDir() + subdirs); // and last in default skin
|
||||
|
||||
return found_file;
|
||||
}
|
||||
|
||||
std::string LLDir::getTempFilename() const
|
||||
{
|
||||
LLUUID random_uuid;
|
||||
|
|
@ -498,6 +536,22 @@ void LLDir::setSkinFolder(const std::string &skin_folder)
|
|||
mSkinDir += "skins";
|
||||
mSkinDir += mDirDelimiter;
|
||||
mSkinDir += skin_folder;
|
||||
|
||||
// user modifications to current skin
|
||||
// e.g. c:\documents and settings\users\username\application data\second life\skins\dazzle
|
||||
mUserSkinDir = getOSUserAppDir();
|
||||
mUserSkinDir += mDirDelimiter;
|
||||
mUserSkinDir += "skins";
|
||||
mUserSkinDir += mDirDelimiter;
|
||||
mUserSkinDir += skin_folder;
|
||||
|
||||
// base skin which is used as fallback for all skinned files
|
||||
// e.g. c:\program files\secondlife\skins\default
|
||||
mDefaultSkinDir = getAppRODataDir();
|
||||
mDefaultSkinDir += mDirDelimiter;
|
||||
mDefaultSkinDir += "skins";
|
||||
mDefaultSkinDir += mDirDelimiter;
|
||||
mDefaultSkinDir += "default";
|
||||
}
|
||||
|
||||
bool LLDir::setCacheDir(const std::string &path)
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
#ifndef LL_LLDIR_H
|
||||
#define LL_LLDIR_H
|
||||
|
||||
// these numbers *may* get serialized, so we need to be explicit
|
||||
typedef enum ELLPath
|
||||
{
|
||||
LL_PATH_NONE = 0,
|
||||
|
|
@ -49,8 +50,8 @@ typedef enum ELLPath
|
|||
LL_PATH_CHAT_LOGS = 12,
|
||||
LL_PATH_PER_ACCOUNT_CHAT_LOGS = 13,
|
||||
LL_PATH_MOZILLA_PROFILE = 14,
|
||||
LL_PATH_HTML = 15,
|
||||
LL_PATH_COUNT = 16
|
||||
// LL_PATH_HTML = 15,
|
||||
LL_PATH_LAST = 16
|
||||
} ELLPath;
|
||||
|
||||
|
||||
|
|
@ -69,9 +70,9 @@ class LLDir
|
|||
virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) = 0;
|
||||
virtual void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) = 0;
|
||||
virtual std::string getCurPath() = 0;
|
||||
virtual BOOL fileExists(const std::string &filename) = 0;
|
||||
virtual BOOL fileExists(const std::string &filename) const = 0;
|
||||
|
||||
const std::string findFile(const std::string &filename, const std::string searchPath1 = "", const std::string searchPath2 = "", const std::string searchPath3 = "");
|
||||
const std::string findFile(const std::string &filename, const std::string searchPath1 = "", const std::string searchPath2 = "", const std::string searchPath3 = "") const;
|
||||
const std::string &getExecutablePathAndName() const; // Full pathname of the executable
|
||||
const std::string &getAppName() const; // install directory under progams/ ie "SecondLife"
|
||||
const std::string &getExecutableDir() const; // Directory where the executable is located
|
||||
|
|
@ -88,16 +89,26 @@ class LLDir
|
|||
const std::string &getCAFile() const; // File containing TLS certificate authorities
|
||||
const std::string &getDirDelimiter() const; // directory separator for platform (ie. '\' or '/' or ':')
|
||||
const std::string &getSkinDir() const; // User-specified skin folder.
|
||||
const std::string &getUserSkinDir() const; // User-specified skin folder with user modifications. e.g. c:\documents and settings\username\application data\second life\skins\curskin
|
||||
const std::string &getDefaultSkinDir() const; // folder for default skin. e.g. c:\program files\second life\skins\default
|
||||
const std::string getSkinBaseDir() const; // folder that contains all installed skins (not user modifications). e.g. c:\program files\second life\skins
|
||||
|
||||
// Expanded filename
|
||||
std::string getExpandedFilename(ELLPath location, const std::string &filename) const;
|
||||
std::string getExpandedFilename(ELLPath location, const std::string &subdir, const std::string &filename) const;
|
||||
std::string getExpandedFilename(ELLPath location, const std::string &subdir1, const std::string &subdir2, const std::string &filename) const;
|
||||
|
||||
// Base and Directory name extraction
|
||||
std::string getBaseFileName(const std::string& filepath, bool strip_exten = false) const;
|
||||
std::string getDirName(const std::string& filepath) const;
|
||||
std::string getExtension(const std::string& filepath) const; // Excludes '.', e.g getExtension("foo.wav") == "wav"
|
||||
|
||||
// these methods search the various skin paths for the specified file in the following order:
|
||||
// getUserSkinDir(), getSkinDir(), getDefaultSkinDir()
|
||||
std::string findSkinnedFilename(const std::string &filename) const;
|
||||
std::string findSkinnedFilename(const std::string &subdir, const std::string &filename) const;
|
||||
std::string findSkinnedFilename(const std::string &subdir1, const std::string &subdir2, const std::string &filename) const;
|
||||
|
||||
// random filename in common temporary directory
|
||||
std::string getTempFilename() const;
|
||||
|
||||
|
|
@ -125,7 +136,9 @@ protected:
|
|||
std::string mTempDir;
|
||||
std::string mCacheDir;
|
||||
std::string mDirDelimiter;
|
||||
std::string mSkinDir; // Location for u ser-specified skin info.
|
||||
std::string mSkinDir; // Location for current skin info.
|
||||
std::string mDefaultSkinDir; // Location for default skin info.
|
||||
std::string mUserSkinDir; // Location for user-modified skin info.
|
||||
};
|
||||
|
||||
void dir_exists_or_crash(const std::string &dir_name);
|
||||
|
|
|
|||
|
|
@ -353,7 +353,7 @@ std::string LLDir_Linux::getCurPath()
|
|||
}
|
||||
|
||||
|
||||
BOOL LLDir_Linux::fileExists(const std::string &filename)
|
||||
BOOL LLDir_Linux::fileExists(const std::string &filename) const
|
||||
{
|
||||
struct stat stat_data;
|
||||
// Check the age of the file
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ public:
|
|||
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);
|
||||
virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap);
|
||||
virtual void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
|
||||
/*virtual*/ BOOL fileExists(const std::string &filename);
|
||||
/*virtual*/ BOOL fileExists(const std::string &filename) const;
|
||||
|
||||
private:
|
||||
DIR *mDirp;
|
||||
|
|
|
|||
|
|
@ -361,7 +361,7 @@ std::string LLDir_Mac::getCurPath()
|
|||
|
||||
|
||||
|
||||
BOOL LLDir_Mac::fileExists(const std::string &filename)
|
||||
BOOL LLDir_Mac::fileExists(const std::string &filename) const
|
||||
{
|
||||
struct stat stat_data;
|
||||
// Check the age of the file
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ public:
|
|||
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);
|
||||
virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap);
|
||||
virtual void getRandomFileInDir(const std::string &dirname, const std::string &ask, std::string &fname);
|
||||
virtual BOOL fileExists(const std::string &filename);
|
||||
virtual BOOL fileExists(const std::string &filename) const;
|
||||
|
||||
private:
|
||||
int mCurrentDirIndex;
|
||||
|
|
|
|||
|
|
@ -344,7 +344,7 @@ std::string LLDir_Win32::getCurPath()
|
|||
}
|
||||
|
||||
|
||||
BOOL LLDir_Win32::fileExists(const std::string &filename)
|
||||
BOOL LLDir_Win32::fileExists(const std::string &filename) const
|
||||
{
|
||||
llstat stat_data;
|
||||
// Check the age of the file
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ public:
|
|||
/*virtual*/ U32 countFilesInDir(const std::string &dirname, const std::string &mask);
|
||||
/*virtual*/ BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap);
|
||||
/*virtual*/ void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
|
||||
/*virtual*/ BOOL fileExists(const std::string &filename);
|
||||
/*virtual*/ BOOL fileExists(const std::string &filename) const;
|
||||
|
||||
private:
|
||||
BOOL LLDir_Win32::getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname, BOOL wrap);
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ bool LLControlVariable::llsd_compare(const LLSD& a, const LLSD & b)
|
|||
|
||||
LLControlVariable::LLControlVariable(const std::string& name, eControlType type,
|
||||
LLSD initial, const std::string& comment,
|
||||
BOOL persist)
|
||||
bool persist)
|
||||
: mName(name),
|
||||
mComment(comment),
|
||||
mType(type),
|
||||
|
|
@ -121,7 +121,7 @@ LLControlVariable::~LLControlVariable()
|
|||
{
|
||||
}
|
||||
|
||||
void LLControlVariable::setValue(const LLSD& value, bool saved_value)
|
||||
LLSD LLControlVariable::getComparableValue(const LLSD& value)
|
||||
{
|
||||
// *FIX:MEP - The following is needed to make the LLSD::ImplString
|
||||
// work with boolean controls...
|
||||
|
|
@ -131,11 +131,11 @@ void LLControlVariable::setValue(const LLSD& value, bool saved_value)
|
|||
BOOL temp;
|
||||
if(LLStringUtil::convertToBOOL(value.asString(), temp))
|
||||
{
|
||||
storable_value = temp;
|
||||
storable_value = (bool)temp;
|
||||
}
|
||||
else
|
||||
{
|
||||
storable_value = FALSE;
|
||||
storable_value = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -143,6 +143,12 @@ void LLControlVariable::setValue(const LLSD& value, bool saved_value)
|
|||
storable_value = value;
|
||||
}
|
||||
|
||||
return storable_value;
|
||||
}
|
||||
|
||||
void LLControlVariable::setValue(const LLSD& value, bool saved_value)
|
||||
{
|
||||
LLSD storable_value = getComparableValue(value);
|
||||
bool value_changed = llsd_compare(getValue(), storable_value) == FALSE;
|
||||
if(saved_value)
|
||||
{
|
||||
|
|
@ -184,12 +190,46 @@ void LLControlVariable::setValue(const LLSD& value, bool saved_value)
|
|||
}
|
||||
}
|
||||
|
||||
void LLControlVariable::setDefaultValue(const LLSD& value)
|
||||
{
|
||||
// Set the control variables value and make it
|
||||
// the default value. If the active value is changed,
|
||||
// send the signal.
|
||||
// *NOTE: Default values are not saved, only read.
|
||||
|
||||
LLSD comparable_value = getComparableValue(value);
|
||||
bool value_changed = (llsd_compare(getValue(), comparable_value) == FALSE);
|
||||
resetToDefault(false);
|
||||
mValues[0] = comparable_value;
|
||||
if(value_changed)
|
||||
{
|
||||
firePropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
void LLControlVariable::setPersist(bool state)
|
||||
{
|
||||
mPersist = state;
|
||||
}
|
||||
|
||||
void LLControlVariable::setComment(const std::string& comment)
|
||||
{
|
||||
mComment = comment;
|
||||
}
|
||||
|
||||
void LLControlVariable::resetToDefault(bool fire_signal)
|
||||
{
|
||||
//The first setting is always the default
|
||||
//Pop to it and fire off the listener
|
||||
while(mValues.size() > 1) mValues.pop_back();
|
||||
if(fire_signal) firePropertyChanged();
|
||||
while(mValues.size() > 1)
|
||||
{
|
||||
mValues.pop_back();
|
||||
}
|
||||
|
||||
if(fire_signal)
|
||||
{
|
||||
firePropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
bool LLControlVariable::isSaveValueDefault()
|
||||
|
|
@ -206,10 +246,10 @@ LLSD LLControlVariable::getSaveValue() const
|
|||
return mValues[0];
|
||||
}
|
||||
|
||||
LLControlVariable* LLControlGroup::getControl(const std::string& name)
|
||||
LLPointer<LLControlVariable> LLControlGroup::getControl(const std::string& name)
|
||||
{
|
||||
ctrl_name_table_t::iterator iter = mNameTable.find(name);
|
||||
return iter == mNameTable.end() ? NULL : iter->second;
|
||||
return iter == mNameTable.end() ? LLPointer<LLControlVariable>() : iter->second;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -238,7 +278,6 @@ LLControlGroup::~LLControlGroup()
|
|||
|
||||
void LLControlGroup::cleanup()
|
||||
{
|
||||
for_each(mNameTable.begin(), mNameTable.end(), DeletePairedPointer());
|
||||
mNameTable.clear();
|
||||
}
|
||||
|
||||
|
|
@ -264,6 +303,7 @@ BOOL LLControlGroup::declareControl(const std::string& name, eControlType type,
|
|||
mNameTable[name]->setValue(initial_val);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// if not, create the control and add it to the name table
|
||||
LLControlVariable* control = new LLControlVariable(name, type, initial_val, comment, persist);
|
||||
mNameTable[name] = control;
|
||||
|
|
@ -979,7 +1019,7 @@ U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only
|
|||
return num_saved;
|
||||
}
|
||||
|
||||
U32 LLControlGroup::loadFromFile(const std::string& filename)
|
||||
U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_values)
|
||||
{
|
||||
std::string name;
|
||||
LLSD settings;
|
||||
|
|
@ -1002,7 +1042,7 @@ U32 LLControlGroup::loadFromFile(const std::string& filename)
|
|||
}
|
||||
|
||||
U32 validitems = 0;
|
||||
int persist = 1;
|
||||
bool persist = false;
|
||||
for(LLSD::map_const_iterator itr = settings.beginMap(); itr != settings.endMap(); ++itr)
|
||||
{
|
||||
name = (*itr).first;
|
||||
|
|
@ -1017,11 +1057,31 @@ U32 LLControlGroup::loadFromFile(const std::string& filename)
|
|||
LLControlVariable* existing_control = getControl(name);
|
||||
if(existing_control)
|
||||
{
|
||||
// Check persistence. If not persisted, we shouldn't be loading.
|
||||
if(existing_control->isPersisted())
|
||||
if(set_default_values)
|
||||
{
|
||||
// Override all previously set properties of this control.
|
||||
// ... except for type. The types must match.
|
||||
eControlType new_type = typeStringToEnum(control_map["Type"].asString());
|
||||
if(existing_control->isType(new_type))
|
||||
{
|
||||
existing_control->setDefaultValue(control_map["Value"]);
|
||||
existing_control->setPersist(persist);
|
||||
existing_control->setComment(control_map["Comment"].asString());
|
||||
}
|
||||
else
|
||||
{
|
||||
llerrs << "Mismatched type of control variable '"
|
||||
<< name << "' found while loading '"
|
||||
<< filename << "'." << llendl;
|
||||
}
|
||||
}
|
||||
else if(existing_control->isPersisted())
|
||||
{
|
||||
|
||||
existing_control->setValue(control_map["Value"]);
|
||||
}
|
||||
// *NOTE: If not persisted and not setting defaults,
|
||||
// the value should not get loaded.
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ typedef enum e_control_type
|
|||
TYPE_COUNT
|
||||
} eControlType;
|
||||
|
||||
class LLControlVariable
|
||||
class LLControlVariable : public LLRefCount
|
||||
{
|
||||
friend class LLControlGroup;
|
||||
typedef boost::signal<void(const LLSD&)> signal_t;
|
||||
|
|
@ -92,7 +92,7 @@ private:
|
|||
std::string mName;
|
||||
std::string mComment;
|
||||
eControlType mType;
|
||||
BOOL mPersist;
|
||||
bool mPersist;
|
||||
std::vector<LLSD> mValues;
|
||||
|
||||
signal_t mSignal;
|
||||
|
|
@ -100,7 +100,7 @@ private:
|
|||
public:
|
||||
LLControlVariable(const std::string& name, eControlType type,
|
||||
LLSD initial, const std::string& comment,
|
||||
BOOL persist = TRUE);
|
||||
bool persist = true);
|
||||
|
||||
virtual ~LLControlVariable();
|
||||
|
||||
|
|
@ -108,33 +108,41 @@ public:
|
|||
const std::string& getComment() const { return mComment; }
|
||||
|
||||
eControlType type() { return mType; }
|
||||
BOOL isType(eControlType tp) { return tp == mType; }
|
||||
bool isType(eControlType tp) { return tp == mType; }
|
||||
|
||||
void resetToDefault(bool fire_signal = TRUE);
|
||||
void resetToDefault(bool fire_signal = false);
|
||||
|
||||
signal_t* getSignal() { return &mSignal; }
|
||||
|
||||
bool isDefault() { return (mValues.size() == 1); }
|
||||
bool isSaveValueDefault();
|
||||
bool isPersisted() { return mPersist; }
|
||||
void set(const LLSD& val) { setValue(val); }
|
||||
LLSD get() const { return getValue(); }
|
||||
LLSD getDefault() const { return mValues.front(); }
|
||||
LLSD getValue() const { return mValues.back(); }
|
||||
LLSD getDefault() const { return mValues.front(); }
|
||||
LLSD getSaveValue() const;
|
||||
|
||||
void set(const LLSD& val) { setValue(val); }
|
||||
void setValue(const LLSD& value, bool saved_value = TRUE);
|
||||
void setDefaultValue(const LLSD& value);
|
||||
void setPersist(bool state);
|
||||
void setComment(const std::string& comment);
|
||||
|
||||
void firePropertyChanged()
|
||||
{
|
||||
mSignal(mValues.back());
|
||||
}
|
||||
bool llsd_compare(const LLSD& a, const LLSD& b);
|
||||
private:
|
||||
LLSD getComparableValue(const LLSD& value);
|
||||
bool llsd_compare(const LLSD& a, const LLSD & b);
|
||||
|
||||
};
|
||||
|
||||
//const U32 STRING_CACHE_SIZE = 10000;
|
||||
class LLControlGroup
|
||||
{
|
||||
protected:
|
||||
typedef std::map<std::string, LLControlVariable* > ctrl_name_table_t;
|
||||
typedef std::map<std::string, LLPointer<LLControlVariable> > ctrl_name_table_t;
|
||||
ctrl_name_table_t mNameTable;
|
||||
std::set<std::string> mWarnings;
|
||||
std::string mTypeString[TYPE_COUNT];
|
||||
|
|
@ -146,7 +154,7 @@ public:
|
|||
~LLControlGroup();
|
||||
void cleanup();
|
||||
|
||||
LLControlVariable* getControl(const std::string& name);
|
||||
LLPointer<LLControlVariable> getControl(const std::string& name);
|
||||
|
||||
struct ApplyFunctor
|
||||
{
|
||||
|
|
@ -213,7 +221,7 @@ public:
|
|||
// as the given type.
|
||||
U32 loadFromFileLegacy(const std::string& filename, BOOL require_declaration = TRUE, eControlType declare_as = TYPE_STRING);
|
||||
U32 saveToFile(const std::string& filename, BOOL nondefault_only);
|
||||
U32 loadFromFile(const std::string& filename);
|
||||
U32 loadFromFile(const std::string& filename, bool default_values = false);
|
||||
void resetToDefaults();
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -277,6 +277,7 @@ set(viewer_SOURCE_FILES
|
|||
llpanelpermissions.cpp
|
||||
llpanelpick.cpp
|
||||
llpanelplace.cpp
|
||||
llpanelskins.cpp
|
||||
llpanelvolume.cpp
|
||||
llpanelweb.cpp
|
||||
llparcelselection.cpp
|
||||
|
|
@ -665,6 +666,7 @@ set(viewer_HEADER_FILES
|
|||
llpanelpermissions.h
|
||||
llpanelpick.h
|
||||
llpanelplace.h
|
||||
llpanelskins.h
|
||||
llpanelvolume.h
|
||||
llpanelweb.h
|
||||
llparcelselection.h
|
||||
|
|
@ -1003,180 +1005,182 @@ endif (WINDOWS)
|
|||
# Add the xui files. This is handy for searching for xui elements
|
||||
# from within the IDE
|
||||
set(viewer_XUI_FILES
|
||||
skins/xui/en-us/alerts.xml
|
||||
skins/xui/en-us/floater_about_land.xml
|
||||
skins/xui/en-us/floater_about.xml
|
||||
skins/xui/en-us/floater_active_speakers.xml
|
||||
skins/xui/en-us/floater_animation_preview.xml
|
||||
skins/xui/en-us/floater_auction.xml
|
||||
skins/xui/en-us/floater_audio_volume.xml
|
||||
skins/xui/en-us/floater_avatar_picker.xml
|
||||
skins/xui/en-us/floater_avatar_textures.xml
|
||||
skins/xui/en-us/floater_build_options.xml
|
||||
skins/xui/en-us/floater_bumps.xml
|
||||
skins/xui/en-us/floater_buy_contents.xml
|
||||
skins/xui/en-us/floater_buy_currency.xml
|
||||
skins/xui/en-us/floater_buy_land.xml
|
||||
skins/xui/en-us/floater_buy_object.xml
|
||||
skins/xui/en-us/floater_camera.xml
|
||||
skins/xui/en-us/floater_chat_history.xml
|
||||
skins/xui/en-us/floater_chatterbox.xml
|
||||
skins/xui/en-us/floater_choose_group.xml
|
||||
skins/xui/en-us/floater_clothing.xml
|
||||
skins/xui/en-us/floater_color_picker.xml
|
||||
skins/xui/en-us/floater_critical.xml
|
||||
skins/xui/en-us/floater_customize.xml
|
||||
skins/xui/en-us/floater_day_cycle_options.xml
|
||||
skins/xui/en-us/floater_device_settings.xml
|
||||
skins/xui/en-us/floater_directory.xml
|
||||
skins/xui/en-us/floater_env_settings.xml
|
||||
skins/xui/en-us/floater_gesture.xml
|
||||
skins/xui/en-us/floater_god_tools.xml
|
||||
skins/xui/en-us/floater_group_info.xml
|
||||
skins/xui/en-us/floater_hardware_settings.xml
|
||||
skins/xui/en-us/floater_html.xml
|
||||
skins/xui/en-us/floater_hud.xml
|
||||
skins/xui/en-us/floater_image_preview.xml
|
||||
skins/xui/en-us/floater_import.xml
|
||||
skins/xui/en-us/floater_im.xml
|
||||
skins/xui/en-us/floater_inspect.xml
|
||||
skins/xui/en-us/floater_instant_message_ad_hoc.xml
|
||||
skins/xui/en-us/floater_instant_message_group.xml
|
||||
skins/xui/en-us/floater_instant_message.xml
|
||||
skins/xui/en-us/floater_inventory_item_properties.xml
|
||||
skins/xui/en-us/floater_inventory_view_finder.xml
|
||||
skins/xui/en-us/floater_inventory.xml
|
||||
skins/xui/en-us/floater_joystick.xml
|
||||
skins/xui/en-us/floater_lagmeter.xml
|
||||
skins/xui/en-us/floater_land_holdings.xml
|
||||
skins/xui/en-us/floater_landmark_ctrl.xml
|
||||
skins/xui/en-us/floater_live_lsleditor.xml
|
||||
skins/xui/en-us/floater_lsl_guide.xml
|
||||
skins/xui/en-us/floater_media_browser.xml
|
||||
skins/xui/en-us/floater_moveview.xml
|
||||
skins/xui/en-us/floater_mute_object.xml
|
||||
skins/xui/en-us/floater_mute.xml
|
||||
skins/xui/en-us/floater_my_friends.xml
|
||||
skins/xui/en-us/floater_name_description.xml
|
||||
skins/xui/en-us/floater_new_im.xml
|
||||
skins/xui/en-us/floater_new_outfit_dialog.xml
|
||||
skins/xui/en-us/floater_openobject.xml
|
||||
skins/xui/en-us/floater_pay_object.xml
|
||||
skins/xui/en-us/floater_pay.xml
|
||||
skins/xui/en-us/floater_postcard.xml
|
||||
skins/xui/en-us/floater_post_process.xml
|
||||
skins/xui/en-us/floater_preferences.xml
|
||||
skins/xui/en-us/floater_preview_animation.xml
|
||||
skins/xui/en-us/floater_preview_classified.xml
|
||||
skins/xui/en-us/floater_preview_embedded_texture.xml
|
||||
skins/xui/en-us/floater_preview_event.xml
|
||||
skins/xui/en-us/floater_preview_existing_landmark.xml
|
||||
skins/xui/en-us/floater_preview_gesture.xml
|
||||
skins/xui/en-us/floater_preview_notecard_keep_discard.xml
|
||||
skins/xui/en-us/floater_preview_notecard.xml
|
||||
skins/xui/en-us/floater_preview_sound.xml
|
||||
skins/xui/en-us/floater_preview_texture_keep_discard.xml
|
||||
skins/xui/en-us/floater_preview_texture.xml
|
||||
skins/xui/en-us/floater_preview_url.xml
|
||||
skins/xui/en-us/floater_price_for_listing.xml
|
||||
skins/xui/en-us/floater_profile.xml
|
||||
skins/xui/en-us/floater_region_info.xml
|
||||
skins/xui/en-us/floater_report_abuse.xml
|
||||
skins/xui/en-us/floater_report_bug.xml
|
||||
skins/xui/en-us/floater_script_debug.xml
|
||||
skins/xui/en-us/floater_script_ed_panel.xml
|
||||
skins/xui/en-us/floater_script_preview.xml
|
||||
skins/xui/en-us/floater_script_queue.xml
|
||||
skins/xui/en-us/floater_script_search.xml
|
||||
skins/xui/en-us/floater_select_key.xml
|
||||
skins/xui/en-us/floater_sell_land.xml
|
||||
skins/xui/en-us/floater_settings_debug.xml
|
||||
skins/xui/en-us/floater_sim_release_message.xml
|
||||
skins/xui/en-us/floater_snapshot.xml
|
||||
skins/xui/en-us/floater_sound_preview.xml
|
||||
skins/xui/en-us/floater_telehub.xml
|
||||
skins/xui/en-us/floater_test.xml
|
||||
skins/xui/en-us/floater_texture_ctrl.xml
|
||||
skins/xui/en-us/floater_tools.xml
|
||||
skins/xui/en-us/floater_top_objects.xml
|
||||
skins/xui/en-us/floater_tos.xml
|
||||
skins/xui/en-us/floater_url_entry.xml
|
||||
skins/xui/en-us/floater_voice_wizard.xml
|
||||
skins/xui/en-us/floater_water.xml
|
||||
skins/xui/en-us/floater_wearable_save_as.xml
|
||||
skins/xui/en-us/floater_windlight_options.xml
|
||||
skins/xui/en-us/floater_world_map.xml
|
||||
skins/xui/en-us/menu_inventory.xml
|
||||
skins/xui/en-us/menu_login.xml
|
||||
skins/xui/en-us/menu_pie_attachment.xml
|
||||
skins/xui/en-us/menu_pie_avatar.xml
|
||||
skins/xui/en-us/menu_pie_land.xml
|
||||
skins/xui/en-us/menu_pie_object.xml
|
||||
skins/xui/en-us/menu_pie_self.xml
|
||||
skins/xui/en-us/menu_slurl.xml
|
||||
skins/xui/en-us/menu_viewer.xml
|
||||
skins/xui/en-us/mime_types.xml
|
||||
skins/xui/en-us/notify.xml
|
||||
skins/xui/en-us/panel_audio_device.xml
|
||||
skins/xui/en-us/panel_audio.xml
|
||||
skins/xui/en-us/panel_avatar_classified.xml
|
||||
skins/xui/en-us/panel_avatar_pick.xml
|
||||
skins/xui/en-us/panel_avatar.xml
|
||||
skins/xui/en-us/panel_bars.xml
|
||||
skins/xui/en-us/panel_bg_tab.xml
|
||||
skins/xui/en-us/panel_bg_toolbar.xml
|
||||
skins/xui/en-us/panel_chat_bar.xml
|
||||
skins/xui/en-us/panel_classified.xml
|
||||
skins/xui/en-us/panel_event.xml
|
||||
skins/xui/en-us/panel_friends.xml
|
||||
skins/xui/en-us/panel_group_finder.xml
|
||||
skins/xui/en-us/panel_group_general.xml
|
||||
skins/xui/en-us/panel_group_invite.xml
|
||||
skins/xui/en-us/panel_group_land_money.xml
|
||||
skins/xui/en-us/panel_group_notices.xml
|
||||
skins/xui/en-us/panel_group_roles.xml
|
||||
skins/xui/en-us/panel_groups.xml
|
||||
skins/xui/en-us/panel_group_voting.xml
|
||||
skins/xui/en-us/panel_group.xml
|
||||
skins/xui/en-us/panel_land_covenant.xml
|
||||
skins/xui/en-us/panel_login.xml
|
||||
skins/xui/en-us/panel_master_volume.xml
|
||||
skins/xui/en-us/panel_media_controls.xml
|
||||
skins/xui/en-us/panel_media_remote_expanded.xml
|
||||
skins/xui/en-us/panel_media_remote.xml
|
||||
skins/xui/en-us/panel_overlaybar.xml
|
||||
skins/xui/en-us/panel_place_small.xml
|
||||
skins/xui/en-us/panel_place.xml
|
||||
skins/xui/en-us/panel_preferences_audio.xml
|
||||
skins/xui/en-us/panel_preferences_chat.xml
|
||||
skins/xui/en-us/panel_preferences_general.xml
|
||||
skins/xui/en-us/panel_preferences_graphics1.xml
|
||||
skins/xui/en-us/panel_preferences_im.xml
|
||||
skins/xui/en-us/panel_preferences_input.xml
|
||||
skins/xui/en-us/panel_preferences_network.xml
|
||||
skins/xui/en-us/panel_preferences_popups.xml
|
||||
skins/xui/en-us/panel_preferences_voice.xml
|
||||
skins/xui/en-us/panel_preferences_web.xml
|
||||
skins/xui/en-us/panel_region_covenant.xml
|
||||
skins/xui/en-us/panel_region_debug.xml
|
||||
skins/xui/en-us/panel_region_estate.xml
|
||||
skins/xui/en-us/panel_region_general.xml
|
||||
skins/xui/en-us/panel_region_terrain.xml
|
||||
skins/xui/en-us/panel_region_texture.xml
|
||||
skins/xui/en-us/panel_scrolling_param.xml
|
||||
skins/xui/en-us/panel_speaker_controls.xml
|
||||
skins/xui/en-us/panel_status_bar.xml
|
||||
skins/xui/en-us/panel_toolbar.xml
|
||||
skins/xui/en-us/panel_top_pick.xml
|
||||
skins/xui/en-us/panel_voice_controls.xml
|
||||
skins/xui/en-us/panel_voice_enable.xml
|
||||
skins/xui/en-us/panel_voice_options.xml
|
||||
skins/xui/en-us/panel_voice_remote_expanded.xml
|
||||
skins/xui/en-us/panel_voice_remote.xml
|
||||
skins/xui/en-us/role_actions.xml
|
||||
skins/xui/en-us/strings.xml
|
||||
skins/xui/en-us/teleport_strings.xml
|
||||
skins/xui/en-us/xui_version.xml
|
||||
skins/default/colors.xml
|
||||
skins/default/colors_base.xml
|
||||
skins/default/xui/en-us/alerts.xml
|
||||
skins/default/xui/en-us/floater_about_land.xml
|
||||
skins/default/xui/en-us/floater_about.xml
|
||||
skins/default/xui/en-us/floater_active_speakers.xml
|
||||
skins/default/xui/en-us/floater_animation_preview.xml
|
||||
skins/default/xui/en-us/floater_auction.xml
|
||||
skins/default/xui/en-us/floater_audio_volume.xml
|
||||
skins/default/xui/en-us/floater_avatar_picker.xml
|
||||
skins/default/xui/en-us/floater_avatar_textures.xml
|
||||
skins/default/xui/en-us/floater_build_options.xml
|
||||
skins/default/xui/en-us/floater_bumps.xml
|
||||
skins/default/xui/en-us/floater_buy_contents.xml
|
||||
skins/default/xui/en-us/floater_buy_currency.xml
|
||||
skins/default/xui/en-us/floater_buy_land.xml
|
||||
skins/default/xui/en-us/floater_buy_object.xml
|
||||
skins/default/xui/en-us/floater_camera.xml
|
||||
skins/default/xui/en-us/floater_chat_history.xml
|
||||
skins/default/xui/en-us/floater_chatterbox.xml
|
||||
skins/default/xui/en-us/floater_choose_group.xml
|
||||
skins/default/xui/en-us/floater_clothing.xml
|
||||
skins/default/xui/en-us/floater_color_picker.xml
|
||||
skins/default/xui/en-us/floater_critical.xml
|
||||
skins/default/xui/en-us/floater_customize.xml
|
||||
skins/default/xui/en-us/floater_day_cycle_options.xml
|
||||
skins/default/xui/en-us/floater_device_settings.xml
|
||||
skins/default/xui/en-us/floater_directory.xml
|
||||
skins/default/xui/en-us/floater_env_settings.xml
|
||||
skins/default/xui/en-us/floater_gesture.xml
|
||||
skins/default/xui/en-us/floater_god_tools.xml
|
||||
skins/default/xui/en-us/floater_group_info.xml
|
||||
skins/default/xui/en-us/floater_hardware_settings.xml
|
||||
skins/default/xui/en-us/floater_html.xml
|
||||
skins/default/xui/en-us/floater_hud.xml
|
||||
skins/default/xui/en-us/floater_image_preview.xml
|
||||
skins/default/xui/en-us/floater_import.xml
|
||||
skins/default/xui/en-us/floater_im.xml
|
||||
skins/default/xui/en-us/floater_inspect.xml
|
||||
skins/default/xui/en-us/floater_instant_message_ad_hoc.xml
|
||||
skins/default/xui/en-us/floater_instant_message_group.xml
|
||||
skins/default/xui/en-us/floater_instant_message.xml
|
||||
skins/default/xui/en-us/floater_inventory_item_properties.xml
|
||||
skins/default/xui/en-us/floater_inventory_view_finder.xml
|
||||
skins/default/xui/en-us/floater_inventory.xml
|
||||
skins/default/xui/en-us/floater_joystick.xml
|
||||
skins/default/xui/en-us/floater_lagmeter.xml
|
||||
skins/default/xui/en-us/floater_land_holdings.xml
|
||||
skins/default/xui/en-us/floater_landmark_ctrl.xml
|
||||
skins/default/xui/en-us/floater_live_lsleditor.xml
|
||||
skins/default/xui/en-us/floater_lsl_guide.xml
|
||||
skins/default/xui/en-us/floater_media_browser.xml
|
||||
skins/default/xui/en-us/floater_moveview.xml
|
||||
skins/default/xui/en-us/floater_mute_object.xml
|
||||
skins/default/xui/en-us/floater_mute.xml
|
||||
skins/default/xui/en-us/floater_my_friends.xml
|
||||
skins/default/xui/en-us/floater_name_description.xml
|
||||
skins/default/xui/en-us/floater_new_im.xml
|
||||
skins/default/xui/en-us/floater_new_outfit_dialog.xml
|
||||
skins/default/xui/en-us/floater_openobject.xml
|
||||
skins/default/xui/en-us/floater_pay_object.xml
|
||||
skins/default/xui/en-us/floater_pay.xml
|
||||
skins/default/xui/en-us/floater_postcard.xml
|
||||
skins/default/xui/en-us/floater_post_process.xml
|
||||
skins/default/xui/en-us/floater_preferences.xml
|
||||
skins/default/xui/en-us/floater_preview_animation.xml
|
||||
skins/default/xui/en-us/floater_preview_classified.xml
|
||||
skins/default/xui/en-us/floater_preview_embedded_texture.xml
|
||||
skins/default/xui/en-us/floater_preview_event.xml
|
||||
skins/default/xui/en-us/floater_preview_existing_landmark.xml
|
||||
skins/default/xui/en-us/floater_preview_gesture.xml
|
||||
skins/default/xui/en-us/floater_preview_notecard_keep_discard.xml
|
||||
skins/default/xui/en-us/floater_preview_notecard.xml
|
||||
skins/default/xui/en-us/floater_preview_sound.xml
|
||||
skins/default/xui/en-us/floater_preview_texture_keep_discard.xml
|
||||
skins/default/xui/en-us/floater_preview_texture.xml
|
||||
skins/default/xui/en-us/floater_preview_url.xml
|
||||
skins/default/xui/en-us/floater_price_for_listing.xml
|
||||
skins/default/xui/en-us/floater_profile.xml
|
||||
skins/default/xui/en-us/floater_region_info.xml
|
||||
skins/default/xui/en-us/floater_report_abuse.xml
|
||||
skins/default/xui/en-us/floater_report_bug.xml
|
||||
skins/default/xui/en-us/floater_script_debug.xml
|
||||
skins/default/xui/en-us/floater_script_ed_panel.xml
|
||||
skins/default/xui/en-us/floater_script_preview.xml
|
||||
skins/default/xui/en-us/floater_script_queue.xml
|
||||
skins/default/xui/en-us/floater_script_search.xml
|
||||
skins/default/xui/en-us/floater_select_key.xml
|
||||
skins/default/xui/en-us/floater_sell_land.xml
|
||||
skins/default/xui/en-us/floater_settings_debug.xml
|
||||
skins/default/xui/en-us/floater_sim_release_message.xml
|
||||
skins/default/xui/en-us/floater_snapshot.xml
|
||||
skins/default/xui/en-us/floater_sound_preview.xml
|
||||
skins/default/xui/en-us/floater_telehub.xml
|
||||
skins/default/xui/en-us/floater_test.xml
|
||||
skins/default/xui/en-us/floater_texture_ctrl.xml
|
||||
skins/default/xui/en-us/floater_tools.xml
|
||||
skins/default/xui/en-us/floater_top_objects.xml
|
||||
skins/default/xui/en-us/floater_tos.xml
|
||||
skins/default/xui/en-us/floater_url_entry.xml
|
||||
skins/default/xui/en-us/floater_voice_wizard.xml
|
||||
skins/default/xui/en-us/floater_water.xml
|
||||
skins/default/xui/en-us/floater_wearable_save_as.xml
|
||||
skins/default/xui/en-us/floater_windlight_options.xml
|
||||
skins/default/xui/en-us/floater_world_map.xml
|
||||
skins/default/xui/en-us/menu_inventory.xml
|
||||
skins/default/xui/en-us/menu_login.xml
|
||||
skins/default/xui/en-us/menu_pie_attachment.xml
|
||||
skins/default/xui/en-us/menu_pie_avatar.xml
|
||||
skins/default/xui/en-us/menu_pie_land.xml
|
||||
skins/default/xui/en-us/menu_pie_object.xml
|
||||
skins/default/xui/en-us/menu_pie_self.xml
|
||||
skins/default/xui/en-us/menu_slurl.xml
|
||||
skins/default/xui/en-us/menu_viewer.xml
|
||||
skins/default/xui/en-us/mime_types.xml
|
||||
skins/default/xui/en-us/notify.xml
|
||||
skins/default/xui/en-us/panel_audio_device.xml
|
||||
skins/default/xui/en-us/panel_audio.xml
|
||||
skins/default/xui/en-us/panel_avatar_classified.xml
|
||||
skins/default/xui/en-us/panel_avatar_pick.xml
|
||||
skins/default/xui/en-us/panel_avatar.xml
|
||||
skins/default/xui/en-us/panel_bars.xml
|
||||
skins/default/xui/en-us/panel_bg_tab.xml
|
||||
skins/default/xui/en-us/panel_bg_toolbar.xml
|
||||
skins/default/xui/en-us/panel_chat_bar.xml
|
||||
skins/default/xui/en-us/panel_classified.xml
|
||||
skins/default/xui/en-us/panel_event.xml
|
||||
skins/default/xui/en-us/panel_friends.xml
|
||||
skins/default/xui/en-us/panel_group_finder.xml
|
||||
skins/default/xui/en-us/panel_group_general.xml
|
||||
skins/default/xui/en-us/panel_group_invite.xml
|
||||
skins/default/xui/en-us/panel_group_land_money.xml
|
||||
skins/default/xui/en-us/panel_group_notices.xml
|
||||
skins/default/xui/en-us/panel_group_roles.xml
|
||||
skins/default/xui/en-us/panel_groups.xml
|
||||
skins/default/xui/en-us/panel_group_voting.xml
|
||||
skins/default/xui/en-us/panel_group.xml
|
||||
skins/default/xui/en-us/panel_land_covenant.xml
|
||||
skins/default/xui/en-us/panel_login.xml
|
||||
skins/default/xui/en-us/panel_master_volume.xml
|
||||
skins/default/xui/en-us/panel_media_controls.xml
|
||||
skins/default/xui/en-us/panel_media_remote_expanded.xml
|
||||
skins/default/xui/en-us/panel_media_remote.xml
|
||||
skins/default/xui/en-us/panel_overlaybar.xml
|
||||
skins/default/xui/en-us/panel_place_small.xml
|
||||
skins/default/xui/en-us/panel_place.xml
|
||||
skins/default/xui/en-us/panel_preferences_audio.xml
|
||||
skins/default/xui/en-us/panel_preferences_chat.xml
|
||||
skins/default/xui/en-us/panel_preferences_general.xml
|
||||
skins/default/xui/en-us/panel_preferences_graphics1.xml
|
||||
skins/default/xui/en-us/panel_preferences_im.xml
|
||||
skins/default/xui/en-us/panel_preferences_input.xml
|
||||
skins/default/xui/en-us/panel_preferences_network.xml
|
||||
skins/default/xui/en-us/panel_preferences_popups.xml
|
||||
skins/default/xui/en-us/panel_preferences_voice.xml
|
||||
skins/default/xui/en-us/panel_preferences_web.xml
|
||||
skins/default/xui/en-us/panel_region_covenant.xml
|
||||
skins/default/xui/en-us/panel_region_debug.xml
|
||||
skins/default/xui/en-us/panel_region_estate.xml
|
||||
skins/default/xui/en-us/panel_region_general.xml
|
||||
skins/default/xui/en-us/panel_region_terrain.xml
|
||||
skins/default/xui/en-us/panel_region_texture.xml
|
||||
skins/default/xui/en-us/panel_scrolling_param.xml
|
||||
skins/default/xui/en-us/panel_speaker_controls.xml
|
||||
skins/default/xui/en-us/panel_status_bar.xml
|
||||
skins/default/xui/en-us/panel_toolbar.xml
|
||||
skins/default/xui/en-us/panel_top_pick.xml
|
||||
skins/default/xui/en-us/panel_voice_controls.xml
|
||||
skins/default/xui/en-us/panel_voice_enable.xml
|
||||
skins/default/xui/en-us/panel_voice_options.xml
|
||||
skins/default/xui/en-us/panel_voice_remote_expanded.xml
|
||||
skins/default/xui/en-us/panel_voice_remote.xml
|
||||
skins/default/xui/en-us/role_actions.xml
|
||||
skins/default/xui/en-us/strings.xml
|
||||
skins/default/xui/en-us/teleport_strings.xml
|
||||
skins/default/xui/en-us/xui_version.xml
|
||||
)
|
||||
|
||||
source_group("XUI Files" FILES ${viewer_XUI_FILES})
|
||||
|
|
@ -1189,8 +1193,6 @@ list(APPEND viewer_SOURCE_FILES ${viewer_XUI_FILES})
|
|||
set(viewer_APPSETTINGS_FILES
|
||||
app_settings/anim.ini
|
||||
app_settings/cmd_line.xml
|
||||
app_settings/colors.xml
|
||||
app_settings/colors_base.xml
|
||||
app_settings/grass.xml
|
||||
app_settings/high_graphics.xml
|
||||
app_settings/keys.ini
|
||||
|
|
|
|||
|
|
@ -187,6 +187,8 @@
|
|||
</string>
|
||||
<key>count</key>
|
||||
<integer>2</integer>
|
||||
<key>compose</key>
|
||||
<boolean>true</boolean>
|
||||
<!-- Special case. Mapped to settings procedurally. -->
|
||||
</map>
|
||||
|
||||
|
|
|
|||
|
|
@ -2868,7 +2868,7 @@
|
|||
<integer>0</integer>
|
||||
</array>
|
||||
</map>
|
||||
<key>FloaterHUDRect</key>
|
||||
<key>FloaterHUDRect2</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Rectangle for HUD Floater window</string>
|
||||
|
|
@ -2877,10 +2877,13 @@
|
|||
<key>Type</key>
|
||||
<string>Rect</string>
|
||||
<key>Value</key>
|
||||
<!-- NOTE: Height and width must match values in settings.xml for
|
||||
FloaterHUDRect because this floater is resized to those values
|
||||
in LLViewerWindow initialization. JC -->
|
||||
<array>
|
||||
<integer>0</integer>
|
||||
<integer>282</integer>
|
||||
<integer>342</integer>
|
||||
<integer>292</integer>
|
||||
<integer>362</integer>
|
||||
<integer>0</integer>
|
||||
</array>
|
||||
</map>
|
||||
|
|
@ -7185,16 +7188,16 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>SkinFolder</key>
|
||||
<key>SkinCurrent</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>The skin folder to use.</string>
|
||||
<string>The currently selected skin.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string />
|
||||
<string>default</string>
|
||||
</map>
|
||||
<key>SkyAmbientScale</key>
|
||||
<map>
|
||||
|
|
@ -7766,6 +7769,17 @@
|
|||
<integer>4</integer>
|
||||
</array>
|
||||
</map>
|
||||
<key>TutorialURL</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>URL for tutorial menu item, set automatically during login</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string />
|
||||
</map>
|
||||
<key>TypeAheadTimeout</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -75,6 +75,7 @@ ATI Radeon HD 2900 .*ATI.*Radeon HD 29.* 3 1
|
|||
ATI Radeon HD 3400 .*ATI.*Radeon HD 34.* 1 1
|
||||
ATI Radeon HD 3600 .*ATI.*Radeon HD 36.* 3 1
|
||||
ATI Radeon HD 3800 .*ATI.*Radeon HD 38.* 3 1
|
||||
ATI Radeon HD 4800 .*ATI.*Radeon HD 48.* 3 1
|
||||
ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0
|
||||
ATI Radeon 7xxx .*ATI.*Radeon 7.* 0 1
|
||||
ATI Radeon 8xxx .*ATI.*Radeon 8.* 0 1
|
||||
|
|
|
|||
|
|
@ -110,6 +110,10 @@ Call RemoveNSIS ; Check for old NSIS install to remove
|
|||
;;; Need to clean out shader files from previous installs to fix DEV-5663
|
||||
Call RemoveOldShaders
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;; Need to clean out old XUI files that predate skinning
|
||||
Call RemoveOldXUI
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;; Files
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
|
@ -488,6 +492,22 @@ RMDir /r "$INSTDIR\app_settings\shaders\*"
|
|||
|
||||
FunctionEnd
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;; Delete the installed XUI files
|
||||
;;; We've changed the directory hierarchy for skins, putting all XUI and texture
|
||||
;;; files under a specific skin directory, i.e. skins/default/xui/en-us as opposed
|
||||
;;; to skins/xui/en-us. Need to clean up the old path when upgrading
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
Function RemoveOldXUI
|
||||
|
||||
;; remove old XUI and texture files
|
||||
RmDir /r "$INSTDIR\skins\html"
|
||||
RmDir /r "$INSTDIR\skins\xui"
|
||||
RmDir /r "$INSTDIR\skins\textures"
|
||||
Delete "$INSTDIR\skins\*.txt"
|
||||
|
||||
FunctionEnd
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Delete files in Documents and Settings\<user>\SecondLife
|
||||
; Delete files in Documents and Settings\All Users\SecondLife
|
||||
|
|
|
|||
|
|
@ -623,6 +623,9 @@ bool LLAppViewer::init()
|
|||
// Need to do this initialization before we do anything else, since anything
|
||||
// that touches files should really go through the lldir API
|
||||
gDirUtilp->initAppDirs("SecondLife");
|
||||
// set skin search path to default, will be overridden later
|
||||
// this allows simple skinned file lookups to work
|
||||
gDirUtilp->setSkinFolder("default");
|
||||
|
||||
initLogging();
|
||||
|
||||
|
|
@ -686,6 +689,8 @@ bool LLAppViewer::init()
|
|||
*/
|
||||
#endif
|
||||
|
||||
//test_cached_control();
|
||||
|
||||
// track number of times that app has run
|
||||
mNumSessions = gSavedSettings.getS32("NumSessions");
|
||||
mNumSessions++;
|
||||
|
|
@ -699,12 +704,12 @@ bool LLAppViewer::init()
|
|||
}
|
||||
|
||||
// Load art UUID information, don't require these strings to be declared in code.
|
||||
std::string colors_base_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors_base.xml");
|
||||
std::string colors_base_filename = gDirUtilp->findSkinnedFilename("colors_base.xml");
|
||||
LL_DEBUGS("InitInfo") << "Loading base colors from " << colors_base_filename << LL_ENDL;
|
||||
gColors.loadFromFileLegacy(colors_base_filename, FALSE, TYPE_COL4U);
|
||||
|
||||
// Load overrides from user colors file
|
||||
std::string user_colors_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors.xml");
|
||||
std::string user_colors_filename = gDirUtilp->findSkinnedFilename("colors.xml");
|
||||
LL_DEBUGS("InitInfo") << "Loading user colors from " << user_colors_filename << LL_ENDL;
|
||||
if (gColors.loadFromFileLegacy(user_colors_filename, FALSE, TYPE_COL4U) == 0)
|
||||
{
|
||||
|
|
@ -1475,7 +1480,7 @@ bool LLAppViewer::initLogging()
|
|||
return true;
|
||||
}
|
||||
|
||||
void LLAppViewer::loadSettingsFromDirectory(ELLPath path_index)
|
||||
void LLAppViewer::loadSettingsFromDirectory(ELLPath path_index, bool set_defaults)
|
||||
{
|
||||
for(LLSD::map_iterator itr = mSettingsFileList.beginMap(); itr != mSettingsFileList.endMap(); ++itr)
|
||||
{
|
||||
|
|
@ -1508,7 +1513,7 @@ void LLAppViewer::loadSettingsFromDirectory(ELLPath path_index)
|
|||
llwarns << "Cannot load " << settings_file << " - No matching settings group for name " << settings_name << llendl;
|
||||
continue;
|
||||
}
|
||||
if(!gSettings[settings_name]->loadFromFile(full_settings_path))
|
||||
if(!gSettings[settings_name]->loadFromFile(full_settings_path, set_defaults))
|
||||
{
|
||||
llwarns << "Cannot load " << full_settings_path << " - No settings found." << llendl;
|
||||
}
|
||||
|
|
@ -1557,7 +1562,8 @@ bool LLAppViewer::initConfiguration()
|
|||
// - load per account settings (happens in llstartup
|
||||
|
||||
// - load defaults
|
||||
loadSettingsFromDirectory(LL_PATH_APP_SETTINGS);
|
||||
bool set_defaults = true;
|
||||
loadSettingsFromDirectory(LL_PATH_APP_SETTINGS, set_defaults);
|
||||
|
||||
// - set procedural settings
|
||||
gSavedSettings.setString("ClientSettingsFile",
|
||||
|
|
@ -1821,7 +1827,7 @@ bool LLAppViewer::initConfiguration()
|
|||
}
|
||||
}
|
||||
|
||||
const LLControlVariable* skinfolder = gSavedSettings.getControl("SkinFolder");
|
||||
const LLControlVariable* skinfolder = gSavedSettings.getControl("SkinCurrent");
|
||||
if(skinfolder && LLStringUtil::null != skinfolder->getValue().asString())
|
||||
{
|
||||
gDirUtilp->setSkinFolder(skinfolder->getValue().asString());
|
||||
|
|
@ -1833,33 +1839,33 @@ bool LLAppViewer::initConfiguration()
|
|||
gSecondLife = "Second Life";
|
||||
|
||||
// Read skin/branding settings if specified.
|
||||
if (! gDirUtilp->getSkinDir().empty() )
|
||||
{
|
||||
std::string skin_def_file = gDirUtilp->getExpandedFilename(LL_PATH_TOP_SKIN, "skin.xml");
|
||||
LLXmlTree skin_def_tree;
|
||||
//if (! gDirUtilp->getSkinDir().empty() )
|
||||
//{
|
||||
// std::string skin_def_file = gDirUtilp->findSkinnedFilename("skin.xml");
|
||||
// LLXmlTree skin_def_tree;
|
||||
|
||||
if (!skin_def_tree.parseFile(skin_def_file))
|
||||
{
|
||||
llerrs << "Failed to parse skin definition." << llendl;
|
||||
}
|
||||
// if (!skin_def_tree.parseFile(skin_def_file))
|
||||
// {
|
||||
// llerrs << "Failed to parse skin definition." << llendl;
|
||||
// }
|
||||
|
||||
LLXmlTreeNode* rootp = skin_def_tree.getRoot();
|
||||
LLXmlTreeNode* disabled_message_node = rootp->getChildByName("disabled_message");
|
||||
if (disabled_message_node)
|
||||
{
|
||||
gDisabledMessage = disabled_message_node->getContents();
|
||||
}
|
||||
// LLXmlTreeNode* rootp = skin_def_tree.getRoot();
|
||||
// LLXmlTreeNode* disabled_message_node = rootp->getChildByName("disabled_message");
|
||||
// if (disabled_message_node)
|
||||
// {
|
||||
// gDisabledMessage = disabled_message_node->getContents();
|
||||
// }
|
||||
|
||||
static LLStdStringHandle hide_links_string = LLXmlTree::addAttributeString("hide_links");
|
||||
rootp->getFastAttributeBOOL(hide_links_string, gHideLinks);
|
||||
// static LLStdStringHandle hide_links_string = LLXmlTree::addAttributeString("hide_links");
|
||||
// rootp->getFastAttributeBOOL(hide_links_string, gHideLinks);
|
||||
|
||||
// Legacy string. This flag really meant we didn't want to expose references to "Second Life".
|
||||
// Just set gHideLinks instead.
|
||||
static LLStdStringHandle silent_string = LLXmlTree::addAttributeString("silent_update");
|
||||
BOOL silent_update;
|
||||
rootp->getFastAttributeBOOL(silent_string, silent_update);
|
||||
gHideLinks = (gHideLinks || silent_update);
|
||||
}
|
||||
// // Legacy string. This flag really meant we didn't want to expose references to "Second Life".
|
||||
// // Just set gHideLinks instead.
|
||||
// static LLStdStringHandle silent_string = LLXmlTree::addAttributeString("silent_update");
|
||||
// BOOL silent_update;
|
||||
// rootp->getFastAttributeBOOL(silent_string, silent_update);
|
||||
// gHideLinks = (gHideLinks || silent_update);
|
||||
//}
|
||||
|
||||
#if LL_DARWIN
|
||||
// Initialize apple menubar and various callbacks
|
||||
|
|
|
|||
|
|
@ -122,7 +122,7 @@ public:
|
|||
static const std::string sPerAccountSettingsName;
|
||||
static const std::string sCrashSettingsName;
|
||||
|
||||
void loadSettingsFromDirectory(ELLPath path_index);
|
||||
void loadSettingsFromDirectory(ELLPath path_index, bool set_defaults = false);
|
||||
|
||||
std::string getSettingsFileName(const std::string& file);
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@
|
|||
|
||||
// statics
|
||||
LLFloaterHUD* LLFloaterHUD::sInstance = 0;
|
||||
std::string LLFloaterHUD::sTutorialUrl = "";
|
||||
|
||||
///----------------------------------------------------------------------------
|
||||
/// Class LLFloaterHUD
|
||||
|
|
@ -44,7 +43,7 @@ LLFloaterHUD::LLFloaterHUD()
|
|||
setBackgroundOpaque(TRUE);
|
||||
|
||||
// Position floater based on saved location
|
||||
LLRect saved_position_rect = gSavedSettings.getRect("FloaterHUDRect");
|
||||
LLRect saved_position_rect = gSavedSettings.getRect("FloaterHUDRect2");
|
||||
reshape(saved_position_rect.getWidth(), saved_position_rect.getHeight(), FALSE);
|
||||
setRect(saved_position_rect);
|
||||
|
||||
|
|
@ -65,7 +64,9 @@ LLFloaterHUD::LLFloaterHUD()
|
|||
language = gSavedSettings.getString("SystemLanguage");
|
||||
}
|
||||
|
||||
std::string url = sTutorialUrl + language + "/";
|
||||
std::string base_url = gSavedSettings.getString("TutorialURL");
|
||||
|
||||
std::string url = base_url + language + "/";
|
||||
mWebBrowser->navigateTo(url);
|
||||
}
|
||||
|
||||
|
|
@ -87,7 +88,7 @@ LLFloaterHUD* LLFloaterHUD::getInstance()
|
|||
LLFloaterHUD::~LLFloaterHUD()
|
||||
{
|
||||
// Save floater position
|
||||
gSavedSettings.setRect("FloaterHUDRect", getRect() );
|
||||
gSavedSettings.setRect("FloaterHUDRect2", getRect() );
|
||||
|
||||
// Clear out the one instance if it's ours
|
||||
if (sInstance == this)
|
||||
|
|
@ -100,7 +101,7 @@ LLFloaterHUD::~LLFloaterHUD()
|
|||
void LLFloaterHUD::showHUD()
|
||||
{
|
||||
// do not build the floater if there the url is empty
|
||||
if (sTutorialUrl == "")
|
||||
if (gSavedSettings.getString("TutorialURL") == "")
|
||||
{
|
||||
LLAlertDialog::showXml("TutorialNotFound");
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -27,8 +27,6 @@ public:
|
|||
static LLFloaterHUD* getInstance(); ///< get instance creating if necessary
|
||||
virtual ~LLFloaterHUD(); ///< virtual destructor
|
||||
|
||||
static std::string sTutorialUrl;
|
||||
|
||||
static void showHUD(); ///< show the HUD
|
||||
static void closeHUD(); ///< close the HUD (destroys floater)
|
||||
|
||||
|
|
|
|||
|
|
@ -393,6 +393,8 @@ void LLFloaterPostcard::sendPostcard()
|
|||
gAssetStorage->storeAssetData(mTransactionID, LLAssetType::AT_IMAGE_JPEG, &uploadCallback, (void *)this, FALSE);
|
||||
}
|
||||
|
||||
// give user feedback of the event
|
||||
gViewerWindow->playSnapshotAnimAndSound();
|
||||
LLUploadDialog::modalUploadDialog("Uploading...\n\nPostcard");
|
||||
|
||||
// don't destroy the window until the upload is done
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@
|
|||
#include "llpanelLCD.h"
|
||||
#include "llpanelmsgs.h"
|
||||
#include "llpanelweb.h"
|
||||
#include "llpanelskins.h"
|
||||
#include "llprefschat.h"
|
||||
#include "llprefsvoice.h"
|
||||
#include "llprefsim.h"
|
||||
|
|
@ -128,6 +129,7 @@ LLPreferenceCore::LLPreferenceCore(LLTabContainer* tab_container, LLButton * def
|
|||
mDisplayPanel(NULL),
|
||||
mAudioPanel(NULL),
|
||||
mMsgPanel(NULL),
|
||||
mSkinsPanel(NULL),
|
||||
mLCDPanel(NULL)
|
||||
{
|
||||
mGeneralPanel = new LLPanelGeneral();
|
||||
|
|
@ -183,6 +185,10 @@ LLPreferenceCore::LLPreferenceCore(LLTabContainer* tab_container, LLButton * def
|
|||
mMsgPanel = new LLPanelMsgs();
|
||||
mTabContainer->addTabPanel(mMsgPanel, mMsgPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
|
||||
mMsgPanel->setDefaultBtn(default_btn);
|
||||
|
||||
mSkinsPanel = new LLPanelSkins();
|
||||
mTabContainer->addTabPanel(mSkinsPanel, mSkinsPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
|
||||
mSkinsPanel->setDefaultBtn(default_btn);
|
||||
|
||||
if (!mTabContainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
|
||||
{
|
||||
|
|
@ -238,6 +244,12 @@ LLPreferenceCore::~LLPreferenceCore()
|
|||
delete mWebPanel;
|
||||
mWebPanel = NULL;
|
||||
}
|
||||
if (mSkinsPanel)
|
||||
{
|
||||
delete mSkinsPanel;
|
||||
mSkinsPanel = NULL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -251,6 +263,7 @@ void LLPreferenceCore::apply()
|
|||
mPrefsVoice->apply();
|
||||
mPrefsIM->apply();
|
||||
mMsgPanel->apply();
|
||||
mSkinsPanel->apply();
|
||||
|
||||
// hardware menu apply
|
||||
LLFloaterHardwareSettings::instance()->apply();
|
||||
|
|
@ -278,6 +291,7 @@ void LLPreferenceCore::cancel()
|
|||
mPrefsVoice->cancel();
|
||||
mPrefsIM->cancel();
|
||||
mMsgPanel->cancel();
|
||||
mSkinsPanel->cancel();
|
||||
|
||||
// cancel hardware menu
|
||||
LLFloaterHardwareSettings::instance()->cancel();
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@ class LLPrefsChat;
|
|||
class LLPrefsVoice;
|
||||
class LLPrefsIM;
|
||||
class LLPanelMsgs;
|
||||
class LLPanelSkins;
|
||||
class LLScrollListCtrl;
|
||||
|
||||
class LLPreferenceCore
|
||||
|
|
@ -78,6 +79,7 @@ public:
|
|||
private:
|
||||
LLTabContainer *mTabContainer;
|
||||
LLPanelGeneral *mGeneralPanel;
|
||||
LLPanelSkins *mSkinsPanel;
|
||||
LLPanelInput *mInputPanel;
|
||||
LLPanelNetwork *mNetworkPanel;
|
||||
LLPanelDisplay *mDisplayPanel;
|
||||
|
|
|
|||
|
|
@ -155,7 +155,7 @@ public:
|
|||
|
||||
private:
|
||||
LLColor4 mColor;
|
||||
LLPointer<LLImageGL> mViewerImage[2];
|
||||
LLPointer<LLImageGL> mViewerImage[2]; //used to represent the scene when the frame is frozen.
|
||||
LLRect mImageRect[2];
|
||||
S32 mWidth[2];
|
||||
S32 mHeight[2];
|
||||
|
|
@ -190,7 +190,6 @@ private:
|
|||
LLQuaternion mCameraRot;
|
||||
BOOL mSnapshotActive;
|
||||
LLViewerWindow::ESnapshotType mSnapshotBufferType;
|
||||
bool mSnapshotSoundPlayed;
|
||||
|
||||
public:
|
||||
static std::set<LLSnapshotLivePreview*> sList;
|
||||
|
|
@ -217,8 +216,7 @@ LLSnapshotLivePreview::LLSnapshotLivePreview (const LLRect& rect) :
|
|||
mCameraPos(LLViewerCamera::getInstance()->getOrigin()),
|
||||
mCameraRot(LLViewerCamera::getInstance()->getQuaternion()),
|
||||
mSnapshotActive(FALSE),
|
||||
mSnapshotBufferType(LLViewerWindow::SNAPSHOT_TYPE_COLOR),
|
||||
mSnapshotSoundPlayed(false)
|
||||
mSnapshotBufferType(LLViewerWindow::SNAPSHOT_TYPE_COLOR)
|
||||
{
|
||||
setSnapshotQuality(gSavedSettings.getS32("SnapshotQuality"));
|
||||
mSnapshotDelayTimer.setTimerExpirySec(0.0f);
|
||||
|
|
@ -403,6 +401,7 @@ void LLSnapshotLivePreview::drawPreviewRect(S32 offset_x, S32 offset_y)
|
|||
}
|
||||
}
|
||||
|
||||
//called when the frame is frozen.
|
||||
void LLSnapshotLivePreview::draw()
|
||||
{
|
||||
if (mViewerImage[mCurImageIndex].notNull() &&
|
||||
|
|
@ -781,19 +780,6 @@ void LLSnapshotLivePreview::onIdle( void* snapshot_preview )
|
|||
previewp->mPreviewImage->getHeight(),
|
||||
previewp->mPreviewImage->getComponents());
|
||||
|
||||
if (!gSavedSettings.getBOOL("QuietSnapshotsToDisk"))
|
||||
{
|
||||
// Always play the sound once, on window open.
|
||||
// Don't keep playing if automatic
|
||||
// updates are enabled. It's too invasive. JC
|
||||
if (!previewp->mSnapshotSoundPlayed
|
||||
|| !gSavedSettings.getBOOL("AutoSnapshot") )
|
||||
{
|
||||
gViewerWindow->playSnapshotAnimAndSound();
|
||||
previewp->mSnapshotSoundPlayed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if(previewp->getSnapshotType() == SNAPSHOT_TEXTURE)
|
||||
{
|
||||
LLPointer<LLImageJ2C> formatted = new LLImageJ2C;
|
||||
|
|
@ -852,29 +838,32 @@ void LLSnapshotLivePreview::onIdle( void* snapshot_preview )
|
|||
previewp->mPreviewImageEncoded->getHeight(),
|
||||
previewp->mPreviewImageEncoded->getComponents());
|
||||
|
||||
// leave original image dimensions, just scale up texture buffer
|
||||
if (previewp->mPreviewImageEncoded->getWidth() > 1024 || previewp->mPreviewImageEncoded->getHeight() > 1024)
|
||||
if(!scaled->isBufferInvalid())
|
||||
{
|
||||
// go ahead and shrink image to appropriate power of 2 for display
|
||||
scaled->biasedScaleToPowerOfTwo(1024);
|
||||
previewp->mImageScaled[previewp->mCurImageIndex] = TRUE;
|
||||
// leave original image dimensions, just scale up texture buffer
|
||||
if (previewp->mPreviewImageEncoded->getWidth() > 1024 || previewp->mPreviewImageEncoded->getHeight() > 1024)
|
||||
{
|
||||
// go ahead and shrink image to appropriate power of 2 for display
|
||||
scaled->biasedScaleToPowerOfTwo(1024);
|
||||
previewp->mImageScaled[previewp->mCurImageIndex] = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
// expand image but keep original image data intact
|
||||
scaled->expandToPowerOfTwo(1024, FALSE);
|
||||
}
|
||||
|
||||
previewp->mViewerImage[previewp->mCurImageIndex] = new LLImageGL(scaled, FALSE);
|
||||
previewp->mViewerImage[previewp->mCurImageIndex]->setMipFilterNearest(previewp->getSnapshotType() != SNAPSHOT_TEXTURE);
|
||||
LLViewerImage::bindTexture(previewp->mViewerImage[previewp->mCurImageIndex]);
|
||||
previewp->mViewerImage[previewp->mCurImageIndex]->setClamp(TRUE, TRUE);
|
||||
|
||||
previewp->mSnapshotUpToDate = TRUE;
|
||||
previewp->generateThumbnailImage(TRUE) ;
|
||||
|
||||
previewp->mPosTakenGlobal = gAgent.getCameraPositionGlobal();
|
||||
previewp->mShineCountdown = 4; // wait a few frames to avoid animation glitch due to readback this frame
|
||||
}
|
||||
else
|
||||
{
|
||||
// expand image but keep original image data intact
|
||||
scaled->expandToPowerOfTwo(1024, FALSE);
|
||||
}
|
||||
|
||||
previewp->mViewerImage[previewp->mCurImageIndex] = new LLImageGL(scaled, FALSE);
|
||||
previewp->mViewerImage[previewp->mCurImageIndex]->setMipFilterNearest(previewp->getSnapshotType() != SNAPSHOT_TEXTURE);
|
||||
LLViewerImage::bindTexture(previewp->mViewerImage[previewp->mCurImageIndex]);
|
||||
previewp->mViewerImage[previewp->mCurImageIndex]->setClamp(TRUE, TRUE);
|
||||
|
||||
previewp->mSnapshotUpToDate = TRUE;
|
||||
previewp->generateThumbnailImage(TRUE) ;
|
||||
|
||||
previewp->mPosTakenGlobal = gAgent.getCameraPositionGlobal();
|
||||
previewp->mShineCountdown = 4; // wait a few frames to avoid animation glitch due to readback this frame
|
||||
}
|
||||
previewp->getWindow()->decBusyCount();
|
||||
// only show fullscreen preview when in freeze frame mode
|
||||
|
|
@ -955,6 +944,7 @@ void LLSnapshotLivePreview::saveTexture()
|
|||
LLInventoryType::IT_SNAPSHOT,
|
||||
PERM_ALL,
|
||||
"Snapshot : " + pos_string);
|
||||
gViewerWindow->playSnapshotAnimAndSound();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -967,7 +957,12 @@ void LLSnapshotLivePreview::saveTexture()
|
|||
|
||||
BOOL LLSnapshotLivePreview::saveLocal()
|
||||
{
|
||||
return gViewerWindow->saveImageNumbered(mFormattedImage);
|
||||
BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage);
|
||||
if(success)
|
||||
{
|
||||
gViewerWindow->playSnapshotAnimAndSound();
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
///----------------------------------------------------------------------------
|
||||
|
|
@ -1134,10 +1129,6 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
|
|||
}
|
||||
|
||||
bool use_freeze_frame = floaterp->childGetValue("freeze_frame_check").asBoolean();
|
||||
// For now, auto-snapshot only works in freeze frame mode.
|
||||
// This can be changed in the future by taking the FreezeTime check
|
||||
// out of the onIdle() camera movement detection. JC
|
||||
floaterp->childSetEnabled("auto_snapshot_check", use_freeze_frame);
|
||||
|
||||
if (use_freeze_frame)
|
||||
{
|
||||
|
|
@ -1174,9 +1165,6 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
|
|||
}
|
||||
else // turning off freeze frame mode
|
||||
{
|
||||
// Force off auto-snapshot, see comment above about onIdle. JC
|
||||
gSavedSettings.setBOOL("AutoSnapshot", FALSE);
|
||||
|
||||
floaterp->getParent()->setMouseOpaque(FALSE);
|
||||
floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getUIWinHeightLong() + delta_height);
|
||||
if (previewp)
|
||||
|
|
@ -1348,8 +1336,6 @@ void LLFloaterSnapshot::Impl::onClickKeep(void* data)
|
|||
|
||||
if (previewp)
|
||||
{
|
||||
BOOL succeeded = TRUE; // Only used for saveLocal for now
|
||||
|
||||
if (previewp->getSnapshotType() == LLSnapshotLivePreview::SNAPSHOT_POSTCARD)
|
||||
{
|
||||
LLFloaterPostcard* floater = previewp->savePostcard();
|
||||
|
|
@ -1368,7 +1354,7 @@ void LLFloaterSnapshot::Impl::onClickKeep(void* data)
|
|||
}
|
||||
else
|
||||
{
|
||||
succeeded = previewp->saveLocal();
|
||||
previewp->saveLocal();
|
||||
}
|
||||
|
||||
if (gSavedSettings.getBOOL("CloseSnapshotOnKeep"))
|
||||
|
|
@ -1535,13 +1521,16 @@ void LLFloaterSnapshot::Impl::onCommitFreezeFrame(LLUICtrl* ctrl, void* data)
|
|||
void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 index)
|
||||
{
|
||||
LLSnapshotLivePreview *previewp = getPreviewView(view) ;
|
||||
|
||||
|
||||
// Don't round texture sizes; textures are commonly stretched in world, profiles, etc and need to be "squashed" during upload, not cropped here
|
||||
#if 0
|
||||
if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == getTypeIndex(view))
|
||||
{
|
||||
previewp->mKeepAspectRatio = FALSE ;
|
||||
return ;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
if(!index) //current window size
|
||||
{
|
||||
sAspectRatioCheckOff = TRUE ;
|
||||
|
|
@ -1555,7 +1544,7 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde
|
|||
else if(-1 == index) //custom
|
||||
{
|
||||
sAspectRatioCheckOff = FALSE ;
|
||||
if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE != gSavedSettings.getS32("LastSnapshotType"))
|
||||
//if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE != gSavedSettings.getS32("LastSnapshotType"))
|
||||
{
|
||||
view->childSetEnabled("keep_aspect_check", TRUE) ;
|
||||
|
||||
|
|
@ -1708,6 +1697,7 @@ BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S3
|
|||
S32 h = height ;
|
||||
|
||||
//if texture, ignore aspect ratio setting, round image size to power of 2.
|
||||
#if 0 // Don't round texture sizes; textures are commonly stretched in world, profiles, etc and need to be "squashed" during upload, not cropped here
|
||||
if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == gSavedSettings.getS32("LastSnapshotType"))
|
||||
{
|
||||
if(width > max_value)
|
||||
|
|
@ -1735,7 +1725,9 @@ BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S3
|
|||
height = get_lower_power_two(height, MAX_TEXTURE_SIZE) ;
|
||||
}
|
||||
}
|
||||
else if(previewp && previewp->mKeepAspectRatio)
|
||||
else
|
||||
#endif
|
||||
if(previewp && previewp->mKeepAspectRatio)
|
||||
{
|
||||
if(gViewerWindow->getWindowDisplayWidth() < 1 || gViewerWindow->getWindowDisplayHeight() < 1)
|
||||
{
|
||||
|
|
@ -1815,6 +1807,7 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat
|
|||
{
|
||||
BOOL update_ = FALSE ;
|
||||
//if to upload a snapshot, process spinner input in a special way.
|
||||
#if 0 // Don't round texture sizes; textures are commonly stretched in world, profiles, etc and need to be "squashed" during upload, not cropped here
|
||||
if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == gSavedSettings.getS32("LastSnapshotType"))
|
||||
{
|
||||
S32 spinner_increment = (S32)((LLSpinCtrl*)ctrl)->getIncrement() ;
|
||||
|
|
@ -1834,7 +1827,7 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat
|
|||
update_ = TRUE ;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
previewp->setMaxImageSize((S32)((LLSpinCtrl *)ctrl)->getMaxValue()) ;
|
||||
|
||||
// Check image size changes the value of height and width
|
||||
|
|
|
|||
|
|
@ -1899,9 +1899,27 @@ void deliver_message(const std::string& utf8_text,
|
|||
im_session_id);
|
||||
gAgent.sendReliableMessage();
|
||||
|
||||
if (LLMuteList::getInstance())
|
||||
// If there is a mute list and this is not a group chat...
|
||||
if ( LLMuteList::getInstance() )
|
||||
{
|
||||
LLMuteList::getInstance()->autoRemove(other_participant_id, LLMuteList::AR_IM);
|
||||
// ... the target should not be in our mute list for some message types.
|
||||
// Auto-remove them if present.
|
||||
switch( dialog )
|
||||
{
|
||||
case IM_NOTHING_SPECIAL:
|
||||
case IM_GROUP_INVITATION:
|
||||
case IM_INVENTORY_OFFERED:
|
||||
case IM_SESSION_INVITE:
|
||||
case IM_SESSION_P2P_INVITE:
|
||||
case IM_SESSION_CONFERENCE_START:
|
||||
case IM_SESSION_SEND: // This one is marginal - erring on the side of hearing.
|
||||
case IM_LURE_USER:
|
||||
case IM_GODLIKE_LURE_USER:
|
||||
case IM_FRIENDSHIP_OFFERED:
|
||||
LLMuteList::getInstance()->autoRemove(other_participant_id, LLMuteList::AR_IM);
|
||||
break;
|
||||
default: ; // do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -69,9 +69,6 @@
|
|||
|
||||
#include "llfirstuse.h"
|
||||
|
||||
const EInstantMessage GROUP_DIALOG = IM_SESSION_GROUP_START;
|
||||
const EInstantMessage DEFAULT_DIALOG = IM_NOTHING_SPECIAL;
|
||||
|
||||
//
|
||||
// Globals
|
||||
//
|
||||
|
|
@ -158,11 +155,12 @@ LLFloaterIM::LLFloaterIM()
|
|||
|
||||
BOOL LLFloaterIM::postBuild()
|
||||
{
|
||||
// IM session initiation warnings
|
||||
sOnlyUserMessage = getString("only_user_message");
|
||||
sOfflineMessage = getUIString("offline_message");
|
||||
sMutedMessage = getUIString("muted_message");
|
||||
|
||||
sInviteMessage = getUIString("invite_message");
|
||||
sMutedMessage = childGetText("muted_message");
|
||||
|
||||
if ( sErrorStringsMap.find("generic") == sErrorStringsMap.end() )
|
||||
{
|
||||
|
|
@ -617,7 +615,12 @@ LLUUID LLIMMgr::addSession(
|
|||
|
||||
noteOfflineUsers(floater, ids);
|
||||
LLFloaterChatterBox::showInstance(session_id);
|
||||
noteMutedUsers(floater, ids);
|
||||
|
||||
// Only warn for regular IMs - not group IMs
|
||||
if( dialog == IM_NOTHING_SPECIAL )
|
||||
{
|
||||
noteMutedUsers(floater, ids);
|
||||
}
|
||||
LLFloaterChatterBox::getInstance(LLSD())->showFloater(floater);
|
||||
}
|
||||
else
|
||||
|
|
@ -663,7 +666,12 @@ LLUUID LLIMMgr::addSession(
|
|||
|
||||
noteOfflineUsers(floater, ids);
|
||||
LLFloaterChatterBox::showInstance(session_id);
|
||||
noteMutedUsers(floater, ids);
|
||||
|
||||
// Only warn for regular IMs - not group IMs
|
||||
if( dialog == IM_NOTHING_SPECIAL )
|
||||
{
|
||||
noteMutedUsers(floater, ids);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1240,22 +1248,23 @@ void LLIMMgr::noteOfflineUsers(
|
|||
void LLIMMgr::noteMutedUsers(LLFloaterIMPanel* floater,
|
||||
const LLDynamicArray<LLUUID>& ids)
|
||||
{
|
||||
// Don't do this if we don't have a mute list.
|
||||
LLMuteList *ml = LLMuteList::getInstance();
|
||||
if( !ml )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
S32 count = ids.count();
|
||||
if(count > 0)
|
||||
{
|
||||
const LLRelationship* info = NULL;
|
||||
LLAvatarTracker& at = LLAvatarTracker::instance();
|
||||
for(S32 i = 0; i < count; ++i)
|
||||
{
|
||||
info = at.getBuddyInfo(ids.get(i));
|
||||
std::string first, last;
|
||||
if(info && LLMuteList::getInstance() && LLMuteList::getInstance()->isMuted(ids.get(i))
|
||||
&& gCacheName->getName(ids.get(i), first, last))
|
||||
if( ml->isMuted(ids.get(i)) )
|
||||
{
|
||||
LLUIString muted = sMutedMessage;
|
||||
muted.setArg("[FIRST]", first);
|
||||
muted.setArg("[LAST]", last);
|
||||
floater->addHistoryLine(muted);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -111,6 +111,7 @@ const char* NEW_CATEGORY_NAMES[LLAssetType::AT_COUNT] =
|
|||
"Uncompressed Images", // AT_IMAGE_JPEG
|
||||
"Animations", // AT_ANIMATION
|
||||
"Gestures", // AT_GESTURE
|
||||
"New Folder" // AT_SIMSTATE
|
||||
};
|
||||
|
||||
struct InventoryIDPtrLess
|
||||
|
|
@ -352,6 +353,12 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,
|
|||
return id;
|
||||
}
|
||||
|
||||
if(preferred_type == LLAssetType::AT_SIMSTATE)
|
||||
{
|
||||
lldebugs << "Attempt to create simstate category." << llendl;
|
||||
return id;
|
||||
}
|
||||
|
||||
id.generate();
|
||||
std::string name = pname;
|
||||
if(!pname.empty())
|
||||
|
|
@ -359,7 +366,7 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,
|
|||
name.assign(pname);
|
||||
}
|
||||
else if((preferred_type >= LLAssetType::AT_TEXTURE) &&
|
||||
(preferred_type < LLAssetType::AT_COUNT))
|
||||
(preferred_type < LLAssetType::AT_SIMSTATE))
|
||||
{
|
||||
name.assign(NEW_CATEGORY_NAMES[preferred_type]);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -406,7 +406,9 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
|
|||
|
||||
combo->setCommitCallback( &LLPanelGeneral::set_start_location );
|
||||
|
||||
childSetCommitCallback("server_combo", onSelectServer, this);
|
||||
LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");
|
||||
server_choice_combo->setCommitCallback(onSelectServer);
|
||||
server_choice_combo->setFocusLostCallback(onServerComboLostFocus);
|
||||
|
||||
childSetAction("connect_btn", onClickConnect, this);
|
||||
|
||||
|
|
@ -1141,6 +1143,10 @@ void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
|
|||
// static
|
||||
void LLPanelLogin::onSelectServer(LLUICtrl*, void*)
|
||||
{
|
||||
// *NOTE: The paramters for this method are ignored.
|
||||
// LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe, void*)
|
||||
// calls this method.
|
||||
|
||||
// The user twiddled with the grid choice ui.
|
||||
// apply the selection to the grid setting.
|
||||
std::string grid_label;
|
||||
|
|
@ -1183,3 +1189,12 @@ void LLPanelLogin::onSelectServer(LLUICtrl*, void*)
|
|||
// grid changed so show new splash screen (possibly)
|
||||
loadLoginPage();
|
||||
}
|
||||
|
||||
void LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe, void*)
|
||||
{
|
||||
LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
|
||||
if(fe == combo)
|
||||
{
|
||||
onSelectServer(combo, NULL);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -114,6 +114,7 @@ private:
|
|||
static void onClickForgotPassword(void*);
|
||||
static void onPassKey(LLLineEditor* caller, void* user_data);
|
||||
static void onSelectServer(LLUICtrl*, void*);
|
||||
static void onServerComboLostFocus(LLFocusableElement*, void*);
|
||||
|
||||
private:
|
||||
LLPointer<LLUIImage> mLogoImage;
|
||||
|
|
|
|||
|
|
@ -1940,7 +1940,8 @@ BOOL idle_startup()
|
|||
option_it = (*it).find("tutorial_url");
|
||||
if(option_it != (*it).end())
|
||||
{
|
||||
LLFloaterHUD::sTutorialUrl = option_it->second;
|
||||
// Tutorial floater will append language code
|
||||
gSavedSettings.setString("TutorialURL", option_it->second);
|
||||
}
|
||||
option_it = (*it).find("use_tutorial");
|
||||
if(option_it != (*it).end())
|
||||
|
|
|
|||
|
|
@ -927,12 +927,13 @@ S32 LLTextureCache::update(U32 max_time_ms)
|
|||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// search for local copy of UUID-based image file
|
||||
std::string LLTextureCache::getLocalFileName(const LLUUID& id)
|
||||
{
|
||||
// Does not include extension
|
||||
std::string idstr = id.asString();
|
||||
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_SKINS, "textures", idstr);
|
||||
// TODO: should we be storing cached textures in skin directory?
|
||||
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_SKINS, "default", "textures", idstr);
|
||||
return filename;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -566,3 +566,125 @@ void settings_setup_listeners()
|
|||
gSavedSettings.getControl("LipSyncEnabled")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1));
|
||||
}
|
||||
|
||||
template <> eControlType get_control_type<U32>(const U32& in, LLSD& out)
|
||||
{
|
||||
out = (LLSD::Integer)in;
|
||||
return TYPE_U32;
|
||||
}
|
||||
|
||||
template <> eControlType get_control_type<S32>(const S32& in, LLSD& out)
|
||||
{
|
||||
out = in;
|
||||
return TYPE_S32;
|
||||
}
|
||||
|
||||
template <> eControlType get_control_type<F32>(const F32& in, LLSD& out)
|
||||
{
|
||||
out = in;
|
||||
return TYPE_F32;
|
||||
}
|
||||
|
||||
template <> eControlType get_control_type<bool> (const bool& in, LLSD& out)
|
||||
{
|
||||
out = in;
|
||||
return TYPE_BOOLEAN;
|
||||
}
|
||||
/*
|
||||
// Yay BOOL, its really an S32.
|
||||
template <> eControlType get_control_type<BOOL> (const BOOL& in, LLSD& out)
|
||||
{
|
||||
out = in;
|
||||
return TYPE_BOOLEAN;
|
||||
}
|
||||
*/
|
||||
template <> eControlType get_control_type<std::string>(const std::string& in, LLSD& out)
|
||||
{
|
||||
out = in;
|
||||
return TYPE_STRING;
|
||||
}
|
||||
|
||||
template <> eControlType get_control_type<LLVector3>(const LLVector3& in, LLSD& out)
|
||||
{
|
||||
out = in.getValue();
|
||||
return TYPE_VEC3;
|
||||
}
|
||||
|
||||
template <> eControlType get_control_type<LLVector3d>(const LLVector3d& in, LLSD& out)
|
||||
{
|
||||
out = in.getValue();
|
||||
return TYPE_VEC3D;
|
||||
}
|
||||
|
||||
template <> eControlType get_control_type<LLRect>(const LLRect& in, LLSD& out)
|
||||
{
|
||||
out = in.getValue();
|
||||
return TYPE_RECT;
|
||||
}
|
||||
|
||||
template <> eControlType get_control_type<LLColor4>(const LLColor4& in, LLSD& out)
|
||||
{
|
||||
out = in.getValue();
|
||||
return TYPE_COL4;
|
||||
}
|
||||
|
||||
template <> eControlType get_control_type<LLColor3>(const LLColor3& in, LLSD& out)
|
||||
{
|
||||
out = in.getValue();
|
||||
return TYPE_COL3;
|
||||
}
|
||||
|
||||
template <> eControlType get_control_type<LLColor4U>(const LLColor4U& in, LLSD& out)
|
||||
{
|
||||
out = in.getValue();
|
||||
return TYPE_COL4U;
|
||||
}
|
||||
|
||||
template <> eControlType get_control_type<LLSD>(const LLSD& in, LLSD& out)
|
||||
{
|
||||
out = in;
|
||||
return TYPE_LLSD;
|
||||
}
|
||||
|
||||
|
||||
#if TEST_CACHED_CONTROL
|
||||
|
||||
#define DECL_LLCC(T, V) static LLCachedControl<T> mySetting_##T("TestCachedControl"#T, V)
|
||||
DECL_LLCC(U32, (U32)666);
|
||||
DECL_LLCC(S32, (S32)-666);
|
||||
DECL_LLCC(F32, (F32)-666.666);
|
||||
DECL_LLCC(bool, true);
|
||||
DECL_LLCC(BOOL, FALSE);
|
||||
static LLCachedControl<std::string> mySetting_string("TestCachedControlstring", "Default String Value");
|
||||
DECL_LLCC(LLVector3, LLVector3(1.0f, 2.0f, 3.0f));
|
||||
DECL_LLCC(LLVector3d, LLVector3d(6.0f, 5.0f, 4.0f));
|
||||
DECL_LLCC(LLRect, LLRect(0, 0, 100, 500));
|
||||
DECL_LLCC(LLColor4, LLColor4(0.0f, 0.5f, 1.0f));
|
||||
DECL_LLCC(LLColor3, LLColor3(1.0f, 0.f, 0.5f));
|
||||
DECL_LLCC(LLColor4U, LLColor4U(255, 200, 100, 255));
|
||||
|
||||
LLSD test_llsd = LLSD()["testing1"] = LLSD()["testing2"];
|
||||
DECL_LLCC(LLSD, test_llsd);
|
||||
|
||||
static LLCachedControl<std::string> test_BrowserHomePage("BrowserHomePage", "hahahahahha", "Not the real comment");
|
||||
|
||||
void test_cached_control()
|
||||
{
|
||||
#define TEST_LLCC(T, V) if((T)mySetting_##T != V) llerrs << "Fail "#T << llendl
|
||||
TEST_LLCC(U32, 666);
|
||||
TEST_LLCC(S32, (S32)-666);
|
||||
TEST_LLCC(F32, (F32)-666.666);
|
||||
TEST_LLCC(bool, true);
|
||||
TEST_LLCC(BOOL, FALSE);
|
||||
if((std::string)mySetting_string != "Default String Value") llerrs << "Fail string" << llendl;
|
||||
TEST_LLCC(LLVector3, LLVector3(1.0f, 2.0f, 3.0f));
|
||||
TEST_LLCC(LLVector3d, LLVector3d(6.0f, 5.0f, 4.0f));
|
||||
TEST_LLCC(LLRect, LLRect(0, 0, 100, 500));
|
||||
TEST_LLCC(LLColor4, LLColor4(0.0f, 0.5f, 1.0f));
|
||||
TEST_LLCC(LLColor3, LLColor3(1.0f, 0.f, 0.5f));
|
||||
TEST_LLCC(LLColor4U, LLColor4U(255, 200, 100, 255));
|
||||
//There's no LLSD comparsion for LLCC yet. TEST_LLCC(LLSD, test_llsd);
|
||||
|
||||
if((std::string)test_BrowserHomePage != "http://www.secondlife.com") llerrs << "Fail BrowserHomePage" << llendl;
|
||||
}
|
||||
#endif // TEST_CACHED_CONTROL
|
||||
|
||||
|
|
|
|||
|
|
@ -65,4 +65,114 @@ extern LLControlGroup gCrashSettings;
|
|||
extern std::string gLastRunVersion;
|
||||
extern std::string gCurrentVersion;
|
||||
|
||||
//! Helper function for LLCachedControl
|
||||
template <class T>
|
||||
eControlType get_control_type(const T& in, LLSD& out)
|
||||
{
|
||||
llerrs << "Usupported control type: " << typeid(T).name() << "." << llendl;
|
||||
return TYPE_COUNT;
|
||||
}
|
||||
|
||||
//! Publish/Subscribe object to interact with LLControlGroups.
|
||||
|
||||
//! An LLCachedControl instance to connect to a LLControlVariable
|
||||
//! without have to manually create and bind a listener to a local
|
||||
//! object.
|
||||
template <class T>
|
||||
class LLCachedControl
|
||||
{
|
||||
T mCachedValue;
|
||||
LLPointer<LLControlVariable> mControl;
|
||||
boost::signals::connection mConnection;
|
||||
|
||||
public:
|
||||
LLCachedControl(const std::string& name,
|
||||
const T& default_value,
|
||||
const std::string& comment = "Declared In Code")
|
||||
{
|
||||
mControl = gSavedSettings.getControl(name);
|
||||
if(mControl.isNull())
|
||||
{
|
||||
declareTypedControl(gSavedSettings, name, default_value, comment);
|
||||
mControl = gSavedSettings.getControl(name);
|
||||
if(mControl.isNull())
|
||||
{
|
||||
llerrs << "The control could not be created!!!" << llendl;
|
||||
}
|
||||
|
||||
mCachedValue = default_value;
|
||||
}
|
||||
else
|
||||
{
|
||||
mCachedValue = (const T&)mControl->getValue();
|
||||
}
|
||||
|
||||
// Add a listener to the controls signal...
|
||||
mControl->getSignal()->connect(
|
||||
boost::bind(&LLCachedControl<T>::handleValueChange, this, _1)
|
||||
);
|
||||
}
|
||||
|
||||
~LLCachedControl()
|
||||
{
|
||||
if(mConnection.connected())
|
||||
{
|
||||
mConnection.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
LLCachedControl& operator =(const T& newvalue)
|
||||
{
|
||||
setTypeValue(*mControl, newvalue);
|
||||
}
|
||||
|
||||
operator const T&() { return mCachedValue; }
|
||||
|
||||
private:
|
||||
void declareTypedControl(LLControlGroup& group,
|
||||
const std::string& name,
|
||||
const T& default_value,
|
||||
const std::string& comment)
|
||||
{
|
||||
LLSD init_value;
|
||||
eControlType type = get_control_type<T>(default_value, init_value);
|
||||
if(type < TYPE_COUNT)
|
||||
{
|
||||
group.declareControl(name, type, init_value, comment, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
bool handleValueChange(const LLSD& newvalue)
|
||||
{
|
||||
mCachedValue = (const T &)newvalue;
|
||||
return true;
|
||||
}
|
||||
|
||||
void setTypeValue(LLControlVariable& c, const T& v)
|
||||
{
|
||||
// Implicit conversion from T to LLSD...
|
||||
c.set(v);
|
||||
}
|
||||
};
|
||||
|
||||
template <> eControlType get_control_type<U32>(const U32& in, LLSD& out);
|
||||
template <> eControlType get_control_type<S32>(const S32& in, LLSD& out);
|
||||
template <> eControlType get_control_type<F32>(const F32& in, LLSD& out);
|
||||
template <> eControlType get_control_type<bool> (const bool& in, LLSD& out);
|
||||
// Yay BOOL, its really an S32.
|
||||
//template <> eControlType get_control_type<BOOL> (const BOOL& in, LLSD& out)
|
||||
template <> eControlType get_control_type<std::string>(const std::string& in, LLSD& out);
|
||||
template <> eControlType get_control_type<LLVector3>(const LLVector3& in, LLSD& out);
|
||||
template <> eControlType get_control_type<LLVector3d>(const LLVector3d& in, LLSD& out);
|
||||
template <> eControlType get_control_type<LLRect>(const LLRect& in, LLSD& out);
|
||||
template <> eControlType get_control_type<LLColor4>(const LLColor4& in, LLSD& out);
|
||||
template <> eControlType get_control_type<LLColor3>(const LLColor3& in, LLSD& out);
|
||||
template <> eControlType get_control_type<LLColor4U>(const LLColor4U& in, LLSD& out);
|
||||
template <> eControlType get_control_type<LLSD>(const LLSD& in, LLSD& out);
|
||||
|
||||
//#define TEST_CACHED_CONTROL 1
|
||||
#ifdef TEST_CACHED_CONTROL
|
||||
void test_cached_control();
|
||||
#endif // TEST_CACHED_CONTROL
|
||||
|
||||
#endif // LL_LLVIEWERCONTROL_H
|
||||
|
|
|
|||
|
|
@ -44,6 +44,10 @@
|
|||
#include "llmediamanager.h"
|
||||
#include "lluuid.h"
|
||||
|
||||
#include <boost/bind.hpp> // for SkinFolder listener
|
||||
#include <boost/signal.hpp>
|
||||
|
||||
|
||||
// Implementation functions not exported into header file
|
||||
class LLViewerMediaImpl
|
||||
: public LLMediaObserver
|
||||
|
|
@ -55,8 +59,6 @@ class LLViewerMediaImpl
|
|||
mMovieImageHasMips(false)
|
||||
{ }
|
||||
|
||||
void initControlListeners();
|
||||
|
||||
void destroyMediaSource();
|
||||
|
||||
void play(const std::string& media_url,
|
||||
|
|
@ -79,6 +81,15 @@ class LLViewerMediaImpl
|
|||
void updateImagesMediaStreams();
|
||||
LLUUID getMediaTextureID();
|
||||
|
||||
// Internally set our desired browser user agent string, including
|
||||
// the Second Life version and skin name. Used because we can
|
||||
// switch skins without restarting the app.
|
||||
static void updateBrowserUserAgent();
|
||||
|
||||
// Callback for when the SkinCurrent control is changed to
|
||||
// switch the user agent string to indicate the new skin.
|
||||
static bool handleSkinCurrentChanged(const LLSD& newvalue);
|
||||
|
||||
public:
|
||||
|
||||
// a single media url with some data and an impl.
|
||||
|
|
@ -93,6 +104,8 @@ class LLViewerMediaImpl
|
|||
|
||||
static LLViewerMediaImpl sViewerMediaImpl;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void LLViewerMediaImpl::destroyMediaSource()
|
||||
{
|
||||
LLMediaManager* mgr = LLMediaManager::getInstance();
|
||||
|
|
@ -405,12 +418,44 @@ void LLViewerMediaImpl::onMediaSizeChange(const EventType& event_in)
|
|||
*/
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
LLUUID LLViewerMediaImpl::getMediaTextureID()
|
||||
{
|
||||
return mMovieImageID;
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerMediaImpl::updateBrowserUserAgent()
|
||||
{
|
||||
// Don't use user-visible string to avoid
|
||||
// punctuation and strange characters.
|
||||
std::string skin_name = gSavedSettings.getString("SkinCurrent");
|
||||
|
||||
// Just in case we need to check browser differences in A/B test
|
||||
// builds.
|
||||
std::string channel = gSavedSettings.getString("VersionChannelName");
|
||||
|
||||
// append our magic version number string to the browser user agent id
|
||||
// See the HTTP 1.0 and 1.1 specifications for allowed formats:
|
||||
// http://www.ietf.org/rfc/rfc1945.txt section 10.15
|
||||
// http://www.ietf.org/rfc/rfc2068.txt section 3.8
|
||||
// This was also helpful:
|
||||
// http://www.mozilla.org/build/revised-user-agent-strings.html
|
||||
std::ostringstream codec;
|
||||
codec << "SecondLife/";
|
||||
codec << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH << "." << LL_VERSION_BUILD;
|
||||
codec << " (" << channel << "; " << skin_name << " skin)";
|
||||
llinfos << codec.str() << llendl;
|
||||
LLMediaManager::setBrowserUserAgent( codec.str() );
|
||||
}
|
||||
|
||||
// static
|
||||
bool LLViewerMediaImpl::handleSkinCurrentChanged(const LLSD& /*newvalue*/)
|
||||
{
|
||||
// gSavedSettings is already updated when this function is called.
|
||||
updateBrowserUserAgent();
|
||||
return true;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Wrapper class
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -434,6 +479,7 @@ void LLViewerMedia::initBrowser()
|
|||
// static
|
||||
void LLViewerMedia::initClass()
|
||||
{
|
||||
// *TODO: This looks like a memory leak to me. JC
|
||||
LLMediaManagerData* init_data = new LLMediaManagerData;
|
||||
buildMediaManagerData( init_data );
|
||||
LLMediaManager::initClass( init_data );
|
||||
|
|
@ -482,14 +528,6 @@ void LLViewerMedia::buildMediaManagerData( LLMediaManagerData* init_data )
|
|||
component_dir += "mozilla";
|
||||
#endif
|
||||
|
||||
// append our magic version number string to the browser user agent id
|
||||
std::ostringstream codec;
|
||||
codec << "[Second Life ";
|
||||
codec << "(" << gSavedSettings.getString("VersionChannelName") << ")";
|
||||
codec << " - " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH << "." << LL_VERSION_BUILD;
|
||||
codec << "]";
|
||||
init_data->setBrowserUserAgentId( codec.str() );
|
||||
|
||||
std::string application_dir = gDirUtilp->getExecutableDir();
|
||||
|
||||
init_data->setBrowserApplicationDir( application_dir );
|
||||
|
|
@ -499,6 +537,15 @@ void LLViewerMedia::buildMediaManagerData( LLMediaManagerData* init_data )
|
|||
std::string profile_name("Second Life");
|
||||
init_data->setBrowserProfileName( profile_name );
|
||||
init_data->setBrowserParentWindow( gViewerWindow->getPlatformWindow() );
|
||||
|
||||
// We use a custom user agent with viewer version and skin name.
|
||||
LLViewerMediaImpl::updateBrowserUserAgent();
|
||||
|
||||
// Users can change skins while client is running, so make sure
|
||||
// we pick up on changes.
|
||||
gSavedSettings.getControl("SkinCurrent")->getSignal()->connect(
|
||||
boost::bind( LLViewerMediaImpl::handleSkinCurrentChanged, _1 ) );
|
||||
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -432,10 +432,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
|
|||
gSavedSettings.getBOOL("RenderUIInSnapshot"),
|
||||
FALSE))
|
||||
{
|
||||
if (!gSavedSettings.getBOOL("QuietSnapshotsToDisk"))
|
||||
{
|
||||
gViewerWindow->playSnapshotAnimAndSound();
|
||||
}
|
||||
gViewerWindow->playSnapshotAnimAndSound();
|
||||
|
||||
LLImageBase::setSizeOverride(TRUE);
|
||||
LLPointer<LLImageFormatted> formatted;
|
||||
|
|
|
|||
|
|
@ -517,11 +517,11 @@ public:
|
|||
ypos += y_inc;
|
||||
}
|
||||
|
||||
if (LLViewerJoystick::getInstance()->getOverrideCamera())
|
||||
/*if (LLViewerJoystick::getInstance()->getOverrideCamera())
|
||||
{
|
||||
addText(xpos + 200, ypos, llformat("Flycam"));
|
||||
ypos += y_inc;
|
||||
}
|
||||
}*/
|
||||
|
||||
if (gSavedSettings.getBOOL("DebugShowRenderInfo"))
|
||||
{
|
||||
|
|
@ -1853,6 +1853,10 @@ void LLViewerWindow::adjustRectanglesForFirstUse(const LLRect& window)
|
|||
{
|
||||
LLRect r;
|
||||
|
||||
// *NOTE: The width and height of these floaters must be
|
||||
// identical in settings.xml and their relevant floater.xml
|
||||
// files, otherwise the window construction will get
|
||||
// confused. JC
|
||||
adjust_rect_bottom_center("FloaterMoveRect2", window);
|
||||
|
||||
adjust_rect_top_center("FloaterCameraRect3", window);
|
||||
|
|
@ -1861,7 +1865,7 @@ void LLViewerWindow::adjustRectanglesForFirstUse(const LLRect& window)
|
|||
|
||||
adjust_rect_top_left("FloaterLandRect5", window);
|
||||
|
||||
adjust_rect_top_left("FloaterHUDRect", window);
|
||||
adjust_rect_top_left("FloaterHUDRect2", window);
|
||||
|
||||
adjust_rect_top_left("FloaterFindRect2", window);
|
||||
|
||||
|
|
@ -4187,6 +4191,10 @@ BOOL LLViewerWindow::saveSnapshot( const std::string& filepath, S32 image_width,
|
|||
|
||||
void LLViewerWindow::playSnapshotAnimAndSound()
|
||||
{
|
||||
if (gSavedSettings.getBOOL("QuietSnapshotsToDisk"))
|
||||
{
|
||||
return;
|
||||
}
|
||||
gAgent.sendAnimationRequest(ANIM_AGENT_SNAPSHOT, ANIM_REQUEST_START);
|
||||
send_sound_trigger(LLUUID(gSavedSettings.getString("UISndSnapshot")), 1.0f);
|
||||
}
|
||||
|
|
@ -4557,14 +4565,15 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
|
|||
// Note: this formula depends on the number of components being 3. Not obvious, but it's correct.
|
||||
image_width += (image_width * 3) % 4;
|
||||
|
||||
BOOL ret = TRUE ;
|
||||
// Resize image
|
||||
if(llabs(image_width - image_buffer_x) > 4 || llabs(image_height - image_buffer_y) > 4)
|
||||
{
|
||||
raw->scale( image_width, image_height );
|
||||
ret = raw->scale( image_width, image_height );
|
||||
}
|
||||
else if(image_width != image_buffer_x || image_height != image_buffer_y)
|
||||
{
|
||||
raw->scale( image_width, image_height, FALSE );
|
||||
ret = raw->scale( image_width, image_height, FALSE );
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -4585,7 +4594,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
|
|||
send_agent_resume();
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return ret;
|
||||
}
|
||||
|
||||
void LLViewerWindow::destroyWindow()
|
||||
|
|
|
|||
|
|
@ -696,7 +696,7 @@ void LLWinDebug::generateCrashStacks(struct _EXCEPTION_POINTERS *exception_infop
|
|||
// Since there is exception info... Release the hounds.
|
||||
gEmergencyMemoryReserve.release();
|
||||
|
||||
if(gSavedSettings.getControl("SaveMinidump") != NULL && gSavedSettings.getBOOL("SaveMinidump"))
|
||||
if(gSavedSettings.getControl("SaveMinidump").isNull() && gSavedSettings.getBOOL("SaveMinidump"))
|
||||
{
|
||||
_MINIDUMP_EXCEPTION_INFORMATION ExInfo;
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<settings version = "101">
|
||||
</settings>
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
|
|
@ -0,0 +1,25 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Verbindung nicht möglich</title>
|
||||
<style>
|
||||
body {background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;width:100%;padding:0px;margin:0px;}
|
||||
a {color:#93a9d5;}
|
||||
a:active {color:#50607C;text-decoration:underline;}
|
||||
a:hover {color:#ff7900;text-decoration:underline;}
|
||||
#infobox{position:absolute;top:40%;left:50%;z-index:1;padding:0;width:592px;margin-left:-296px;margin-top:-150px;text-align:center;font-size:1.2em; color:#ccc;}
|
||||
#infobox #submitbtn {padding:15px 3px 5px 15px;height:28px;width:127px;margin-left:244px;}
|
||||
#infobox #submitbtn input {text-transform:capitalize;color:#fff;font-size:1.0em;height:28px;width:127px;border:none;font-weight:normal;background:url(../../btn_purplepill_bg.png) bottom left no-repeat;vertical-align:text-bottom;font-weight:bold;}
|
||||
#infobox #submitbtn input:hover.input_over, #login_box #submitbtn input:hover.input_off {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) bottom right no-repeat;}
|
||||
#infobox #submitbtn input:active.input_over {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) top left no-repeat;}
|
||||
#infobox #submitbtn input.pressed {color:#888;border:none;background:url(../../btn_purplepill_bg.png) top right no-repeat;}
|
||||
</style>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
|
||||
<body> <div id="infobox"> <img src="../../unabletoconnect.png"><br/>
|
||||
<p> Second Life kann keine Verbindung mit dem Anmeldeserver herstellen.
|
||||
</p>
|
||||
<p> Überprüfen Sie Ihre Internetverbindung. Falls Ihr Computer oder Netzwerk durch eine Firewall oder einen Proxy geschützt ist, so müssen Sie dafür sorgen, dass Second Life auf das Internet zugreifen darf.
|
||||
</p> <div id="submitbtn">
|
||||
<input class="input_over" type="submit" value="Erneut versuchen" onclick="document.location='secondlife:///app/login_refresh'; this.className='pressed';" onmouseover="this.className='input_over';" onmouseout="this.className='input_off';" /> </div> </div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Unable to Connect</title>
|
||||
<style>
|
||||
body {background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;width:100%;padding:0px;margin:0px;}
|
||||
a {color:#93a9d5;}
|
||||
a:active {color:#50607C;text-decoration:underline;}
|
||||
a:hover {color:#ff7900;text-decoration:underline;}
|
||||
#infobox{position:absolute;top:40%;left:50%;z-index:1;padding:0;width:592px;margin-left:-296px;margin-top:-150px;text-align:center;font-size:1.2em; color:#ccc;}
|
||||
#infobox #submitbtn {padding:15px 3px 5px 15px;height:28px;width:127px;margin-left:244px;}
|
||||
#infobox #submitbtn input {text-transform:capitalize;color:#fff;font-size:1.0em;height:28px;width:127px;border:none;font-weight:normal;background:url(../../btn_purplepill_bg.png) bottom left no-repeat;vertical-align:text-bottom;font-weight:bold;}
|
||||
#infobox #submitbtn input:hover.input_over, #login_box #submitbtn input:hover.input_off {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) bottom right no-repeat;}
|
||||
#infobox #submitbtn input:active.input_over {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) top left no-repeat;}
|
||||
#infobox #submitbtn input.pressed {color:#888;border:none;background:url(../../btn_purplepill_bg.png) top right no-repeat;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="infobox">
|
||||
<img src="../../unabletoconnect.png"><br/>
|
||||
<p>
|
||||
Second Life can't establish a connection to the login server.
|
||||
</p>
|
||||
<p>
|
||||
Please check your internet connection. If your computer or network is protected by a firewall or proxy, make sure that Second Life is permitted to access the network.
|
||||
</p>
|
||||
<div id="submitbtn">
|
||||
<input class="input_over" type="submit" value="Try Again" onclick="document.location='secondlife:///app/login_refresh'; this.className='pressed';" onmouseover="this.className='input_over';" onmouseout="this.className='input_off';" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
|
||||
<table width="100%" height="100%" border="0">
|
||||
<tr>
|
||||
<td align="center" valign="middle" style="font-size:0.8em;">
|
||||
<img src="sl_logo_rotate_black.gif" align="absmiddle"><br/> loading...
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
|
After Width: | Height: | Size: 7.3 KiB |
|
|
@ -0,0 +1,25 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>No se puede establecer una conexión</title>
|
||||
<style>
|
||||
body {background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;width:100%;padding:0px;margin:0px;}
|
||||
a {color:#93a9d5;}
|
||||
a:active {color:#50607C;text-decoration:underline;}
|
||||
a:hover {color:#ff7900;text-decoration:underline;}
|
||||
#infobox{position:absolute;top:40%;left:50%;z-index:1;padding:0;width:592px;margin-left:-296px;margin-top:-150px;text-align:center;font-size:1.2em; color:#ccc;}
|
||||
#infobox #submitbtn {padding:15px 3px 5px 15px;height:28px;width:127px;margin-left:244px;}
|
||||
#infobox #submitbtn input {text-transform:capitalize;color:#fff;font-size:1.0em;height:28px;width:127px;border:none;font-weight:normal;background:url(../../btn_purplepill_bg.png) bottom left no-repeat;vertical-align:text-bottom;font-weight:bold;}
|
||||
#infobox #submitbtn input:hover.input_over, #login_box #submitbtn input:hover.input_off {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) bottom right no-repeat;}
|
||||
#infobox #submitbtn input:active.input_over {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) top left no-repeat;}
|
||||
#infobox #submitbtn input.pressed {color:#888;border:none;background:url(../../btn_purplepill_bg.png) top right no-repeat;}
|
||||
</style>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
|
||||
<body> <div id="infobox"> <img src="../../unabletoconnect.png"><br/>
|
||||
<p> Second Life no puede establecer una conexión con el servidor de inicio de sesión.
|
||||
</p>
|
||||
<p> Compruebe la conexión a Internet. Si su computadora o red están protegidas con un firewall o proxy, asegúrese de permitirle el acceso a Second Life a la red.
|
||||
</p> <div id="submitbtn">
|
||||
<input class="input_over" type="submit" value="Volver a intentarlo" onclick="document.location='secondlife:///app/login_refresh'; this.className='pressed';" onmouseover="this.className='input_over';" onmouseout="this.className='input_off';" /> </div> </div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Connexion impossible</title>
|
||||
<style>
|
||||
body {background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;width:100%;padding:0px;margin:0px;}
|
||||
a {color:#93a9d5;}
|
||||
a:active {color:#50607C;text-decoration:underline;}
|
||||
a:hover {color:#ff7900;text-decoration:underline;}
|
||||
#infobox{position:absolute;top:40%;left:50%;z-index:1;padding:0;width:592px;margin-left:-296px;margin-top:-150px;text-align:center;font-size:1.2em; color:#ccc;}
|
||||
#infobox #submitbtn {padding:15px 3px 5px 15px;height:28px;width:127px;margin-left:244px;}
|
||||
#infobox #submitbtn input {text-transform:capitalize;color:#fff;font-size:1.0em;height:28px;width:127px;border:none;font-weight:normal;background:url(../../btn_purplepill_bg.png) bottom left no-repeat;vertical-align:text-bottom;font-weight:bold;}
|
||||
#infobox #submitbtn input:hover.input_over, #login_box #submitbtn input:hover.input_off {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) bottom right no-repeat;}
|
||||
#infobox #submitbtn input:active.input_over {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) top left no-repeat;}
|
||||
#infobox #submitbtn input.pressed {color:#888;border:none;background:url(../../btn_purplepill_bg.png) top right no-repeat;}
|
||||
</style>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
|
||||
<body> <div id="infobox"> <img src="../../unabletoconnect.png"><br/>
|
||||
<p> Second Life ne peut pas établir de connexion avec le serveur.
|
||||
</p>
|
||||
<p> Vérifiez votre connexion Internet. Si votre ordinateur ou votre réseau est protégé par un.pare-feu ou un proxy, assurez-vous que Second Life a l'autorisation d'accéder au réseau.
|
||||
</p> <div id="submitbtn">
|
||||
<input class="input_over" type="submit" value="Essayer à nouveau" onclick="document.location='secondlife:///app/login_refresh'; this.className='pressed';" onmouseover="this.className='input_over';" onmouseout="this.className='input_off';" /> </div> </div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>接続できません</title>
|
||||
<style>
|
||||
body {background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;width:100%;padding:0px;margin:0px;}
|
||||
a {color:#93a9d5;}
|
||||
a:active {color:#50607C;text-decoration:underline;}
|
||||
a:hover {color:#ff7900;text-decoration:underline;}
|
||||
#infobox{position:absolute;top:40%;left:50%;z-index:1;padding:0;width:592px;margin-left:-296px;margin-top:-150px;text-align:center;font-size:1.2em; color:#ccc;}
|
||||
#infobox #submitbtn {padding:15px 3px 5px 15px;height:28px;width:127px;margin-left:244px;}
|
||||
#infobox #submitbtn input {text-transform:capitalize;color:#fff;font-size:1.0em;height:28px;width:127px;border:none;font-weight:normal;background:url(../../btn_purplepill_bg.png) bottom left no-repeat;vertical-align:text-bottom;font-weight:bold;}
|
||||
#infobox #submitbtn input:hover.input_over, #login_box #submitbtn input:hover.input_off {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) bottom right no-repeat;}
|
||||
#infobox #submitbtn input:active.input_over {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) top left no-repeat;}
|
||||
#infobox #submitbtn input.pressed {color:#888;border:none;background:url(../../btn_purplepill_bg.png) top right no-repeat;}
|
||||
</style>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
|
||||
<body> <div id="infobox"> <img src="../../unabletoconnect.png"><br/>
|
||||
<p> Second Lifeによるログインサーバーへの接続が確立できません。
|
||||
</p>
|
||||
<p> インターネット接続を確認してください。 お使いのコンピュータやネットワークがファイヤウォールまたはプロキシにより保護されている場合は、Second Lifeによるネットワークへのアクセスが許可されていることを確認してください。
|
||||
</p> <div id="submitbtn">
|
||||
<input class="input_over" type="submit" value="もう一度試す" onclick="document.location='secondlife:///app/login_refresh'; this.className='pressed';" onmouseover="this.className='input_over';" onmouseout="this.className='input_off';" /> </div> </div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>연결할 수 없습니다.</title>
|
||||
<style>
|
||||
body {background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;width:100%;padding:0px;margin:0px;}
|
||||
a {color:#93a9d5;}
|
||||
a:active {color:#50607C;text-decoration:underline;}
|
||||
a:hover {color:#ff7900;text-decoration:underline;}
|
||||
#infobox{position:absolute;top:40%;left:50%;z-index:1;padding:0;width:592px;margin-left:-296px;margin-top:-150px;text-align:center;font-size:1.2em; color:#ccc;}
|
||||
#infobox #submitbtn {padding:15px 3px 5px 15px;height:28px;width:127px;margin-left:244px;}
|
||||
#infobox #submitbtn input {text-transform:capitalize;color:#fff;font-size:1.0em;height:28px;width:127px;border:none;font-weight:normal;background:url(../../btn_purplepill_bg.png) bottom left no-repeat;vertical-align:text-bottom;font-weight:bold;}
|
||||
#infobox #submitbtn input:hover.input_over, #login_box #submitbtn input:hover.input_off {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) bottom right no-repeat;}
|
||||
#infobox #submitbtn input:active.input_over {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) top left no-repeat;}
|
||||
#infobox #submitbtn input.pressed {color:#888;border:none;background:url(../../btn_purplepill_bg.png) top right no-repeat;}
|
||||
</style>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
|
||||
<body> <div id="infobox"> <img src="../../unabletoconnect.png"><br/>
|
||||
<p> Second Life에서 로그인 서버에 대한 보안 연결을 설정할 수 없습니다.
|
||||
</p>
|
||||
<p> 인터넷 연결을 확인하십시오. 사용 중인 컴퓨터 또는 네트워크가 방화벽이나 프록시에 의해 보호된 경우 Second Life가 네트워크에 액세스할 수 있도록 허가되었는지 확인하십시오.
|
||||
</p> <div id="submitbtn">
|
||||
<input class="input_over" type="submit" value="다시 시도" onclick="document.location='secondlife:///app/login_refresh'; this.className='pressed';" onmouseover="this.className='input_over';" onmouseout="this.className='input_off';" /> </div> </div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Não é Possível Conectar</title>
|
||||
<style>
|
||||
body {background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;width:100%;padding:0px;margin:0px;}
|
||||
a {color:#93a9d5;}
|
||||
a:active {color:#50607C;text-decoration:underline;}
|
||||
a:hover {color:#ff7900;text-decoration:underline;}
|
||||
#infobox{position:absolute;top:40%;left:50%;z-index:1;padding:0;width:592px;margin-left:-296px;margin-top:-150px;text-align:center;font-size:1.2em; color:#ccc;}
|
||||
#infobox #submitbtn {padding:15px 3px 5px 15px;height:28px;width:127px;margin-left:244px;}
|
||||
#infobox #submitbtn input {text-transform:capitalize;color:#fff;font-size:1.0em;height:28px;width:127px;border:none;font-weight:normal;background:url(../../btn_purplepill_bg.png) bottom left no-repeat;vertical-align:text-bottom;font-weight:bold;}
|
||||
#infobox #submitbtn input:hover.input_over, #login_box #submitbtn input:hover.input_off {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) bottom right no-repeat;}
|
||||
#infobox #submitbtn input:active.input_over {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) top left no-repeat;}
|
||||
#infobox #submitbtn input.pressed {color:#888;border:none;background:url(../../btn_purplepill_bg.png) top right no-repeat;}
|
||||
</style>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
|
||||
<body> <div id="infobox"> <img src="../../unabletoconnect.png"><br/>
|
||||
<p> O Second Life não consegue estabelecer uma conexão com o servidor de login.
|
||||
</p>
|
||||
<p> Verifique a sua conexão com a Internet. Se o seu computador ou sua rede estiverem protegidos por um firewall ou um proxy, verifique se o Second Life tem permissão de acesso na rede.
|
||||
</p> <div id="submitbtn">
|
||||
<input class="input_over" type="submit" value="Tentar Novamente" onclick="document.location='secondlife:///app/login_refresh'; this.className='pressed';" onmouseover="this.className='input_over';" onmouseout="this.className='input_off';" /> </div> </div>
|
||||
</div>
|
||||
</body>
|
||||
|
After Width: | Height: | Size: 16 KiB |
|
|
@ -0,0 +1,25 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>无法连接</title>
|
||||
<style>
|
||||
body {background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;width:100%;padding:0px;margin:0px;}
|
||||
a {color:#93a9d5;}
|
||||
a:active {color:#50607C;text-decoration:underline;}
|
||||
a:hover {color:#ff7900;text-decoration:underline;}
|
||||
#infobox{position:absolute;top:40%;left:50%;z-index:1;padding:0;width:592px;margin-left:-296px;margin-top:-150px;text-align:center;font-size:1.2em; color:#ccc;}
|
||||
#infobox #submitbtn {padding:15px 3px 5px 15px;height:28px;width:127px;margin-left:244px;}
|
||||
#infobox #submitbtn input {text-transform:capitalize;color:#fff;font-size:1.0em;height:28px;width:127px;border:none;font-weight:normal;background:url(../../btn_purplepill_bg.png) bottom left no-repeat;vertical-align:text-bottom;font-weight:bold;}
|
||||
#infobox #submitbtn input:hover.input_over, #login_box #submitbtn input:hover.input_off {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) bottom right no-repeat;}
|
||||
#infobox #submitbtn input:active.input_over {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) top left no-repeat;}
|
||||
#infobox #submitbtn input.pressed {color:#888;border:none;background:url(../../btn_purplepill_bg.png) top right no-repeat;}
|
||||
</style>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
|
||||
<body> <div id="infobox"> <img src="../../unabletoconnect.png"><br/>
|
||||
<p> 第二人生无法与登录服务器连接。
|
||||
</p>
|
||||
<p> 请检查您的因特网连接 如果您的计算机或网络由防火墙或代理器保护,请确认第二人生能在该网络里访问因特网。
|
||||
</p> <div id="submitbtn">
|
||||
<input class="input_over" type="submit" value="请再试一次" onclick="document.location='secondlife:///app/login_refresh'; this.className='pressed';" onmouseover="this.className='input_over';" onmouseout="this.className='input_off';" /> </div> </div>
|
||||
</div>
|
||||
</body>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 300 B |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 812 B |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 1.0 KiB |