summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/integration_tests/llui_libtest/llui_libtest.cpp2
-rw-r--r--indra/linux_updater/linux_updater.cpp2
-rw-r--r--indra/llvfs/lldir.cpp2
-rw-r--r--indra/llvfs/lldir.h28
-rw-r--r--indra/llvfs/lldir_linux.cpp48
-rw-r--r--indra/llvfs/lldir_linux.h3
-rw-r--r--indra/llvfs/lldir_mac.cpp42
-rw-r--r--indra/llvfs/lldir_mac.h3
-rw-r--r--indra/llvfs/lldir_solaris.cpp48
-rw-r--r--indra/llvfs/lldir_solaris.h3
-rw-r--r--indra/llvfs/lldir_win32.cpp127
-rw-r--r--indra/llvfs/lldir_win32.h5
-rw-r--r--indra/llvfs/tests/lldir_test.cpp153
-rw-r--r--indra/newview/app_settings/settings.xml22
-rw-r--r--indra/newview/app_settings/settings_per_account.xml12
-rw-r--r--indra/newview/llappviewer.cpp4
-rw-r--r--indra/newview/llappviewerlinux.cpp3
-rw-r--r--indra/newview/llcolorswatch.cpp14
-rw-r--r--indra/newview/llcolorswatch.h2
-rw-r--r--indra/newview/llfloaterpreference.cpp2
-rw-r--r--indra/newview/llfloateruipreview.cpp12
-rw-r--r--indra/newview/llimview.cpp11
-rw-r--r--indra/newview/lllogchat.cpp64
-rw-r--r--indra/newview/lllogchat.h4
-rw-r--r--indra/newview/llmaniptranslate.cpp2
-rw-r--r--indra/newview/llpanelobject.cpp4
-rw-r--r--indra/newview/llviewermedia.cpp2
-rw-r--r--indra/newview/llviewermessage.cpp1
-rw-r--r--indra/newview/llviewerobject.cpp217
-rw-r--r--indra/newview/llviewerobject.h21
-rw-r--r--indra/newview/llviewerobjectlist.cpp19
-rw-r--r--indra/newview/llvoavatar.cpp1
-rw-r--r--indra/newview/llvoavatarself.cpp21
-rw-r--r--indra/newview/llvoavatarself.h2
-rw-r--r--indra/newview/llwaterparammanager.cpp4
-rw-r--r--indra/newview/llwlparammanager.cpp4
-rw-r--r--indra/newview/llworld.cpp5
-rw-r--r--indra/newview/llworld.h2
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences.xml28
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_advanced.xml311
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_chat.xml359
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_colors.xml346
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_general.xml167
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_move.xml206
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_privacy.xml38
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_setup.xml49
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_sound.xml140
47 files changed, 1495 insertions, 1070 deletions
diff --git a/indra/integration_tests/llui_libtest/llui_libtest.cpp b/indra/integration_tests/llui_libtest/llui_libtest.cpp
index 1f15b73182..c34115ee80 100644
--- a/indra/integration_tests/llui_libtest/llui_libtest.cpp
+++ b/indra/integration_tests/llui_libtest/llui_libtest.cpp
@@ -174,7 +174,7 @@ void export_test_floaters()
std::string delim = gDirUtilp->getDirDelimiter();
std::string xui_dir = get_xui_dir() + "en" + delim;
std::string filename;
- while (gDirUtilp->getNextFileInDir(xui_dir, "floater_test_*.xml", filename, false))
+ while (gDirUtilp->getNextFileInDir(xui_dir, "floater_test_*.xml", filename))
{
if (filename.find("_new.xml") != std::string::npos)
{
diff --git a/indra/linux_updater/linux_updater.cpp b/indra/linux_updater/linux_updater.cpp
index be4d810860..23c34e52e7 100644
--- a/indra/linux_updater/linux_updater.cpp
+++ b/indra/linux_updater/linux_updater.cpp
@@ -216,7 +216,7 @@ gboolean rotate_image_cb(gpointer data)
std::string next_image_filename(std::string& image_path)
{
std::string image_filename;
- gDirUtilp->getNextFileInDir(image_path, "/*.jpg", image_filename, true);
+ gDirUtilp->getNextFileInDir(image_path, "/*.jpg", image_filename);
return image_path + "/" + image_filename;
}
diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp
index 938fb008c9..1179180da2 100644
--- a/indra/llvfs/lldir.cpp
+++ b/indra/llvfs/lldir.cpp
@@ -83,7 +83,7 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask)
std::string filename;
std::string fullpath;
S32 result;
- while (getNextFileInDir(dirname, mask, filename, FALSE))
+ while (getNextFileInDir(dirname, mask, filename))
{
fullpath = dirname;
fullpath += getDirDelimiter();
diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h
index 4f63c04aab..42996fd051 100644
--- a/indra/llvfs/lldir.h
+++ b/indra/llvfs/lldir.h
@@ -74,8 +74,32 @@ class LLDir
// pure virtual functions
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask) = 0;
- 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;
+
+ /// Walk the files in a directory, with file pattern matching
+ virtual BOOL getNextFileInDir(const std::string& dirname, ///< directory path - must end in trailing slash!
+ const std::string& mask, ///< file pattern string (use "*" for all)
+ std::string& fname ///< output: found file name
+ ) = 0;
+ /**<
+ * @returns true if a file was found, false if the entire directory has been scanned.
+ *
+ * @note that this function is NOT thread safe
+ *
+ * This function may not be used to scan part of a directory, then start a new search of a different
+ * directory, and then restart the first search where it left off; the entire search must run to
+ * completion or be abandoned - there is no restart.
+ *
+ * @bug: See http://jira.secondlife.com/browse/VWR-23697
+ * and/or the tests in test/lldir_test.cpp
+ * This is known to fail with patterns that have both:
+ * a wildcard left of a . and more than one sequential ? right of a .
+ * the pattern foo.??x appears to work
+ * but *.??x or foo?.??x do not
+ *
+ * @todo this really should be rewritten as an iterator object, and the
+ * filtering should be done in a platform-independent way.
+ */
+
virtual std::string getCurPath() = 0;
virtual BOOL fileExists(const std::string &filename) const = 0;
diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp
index a1c6669b97..73f2336f94 100644
--- a/indra/llvfs/lldir_linux.cpp
+++ b/indra/llvfs/lldir_linux.cpp
@@ -243,8 +243,7 @@ U32 LLDir_Linux::countFilesInDir(const std::string &dirname, const std::string &
}
// get the next file in the directory
-// automatically wrap if we've hit the end
-BOOL LLDir_Linux::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap)
+BOOL LLDir_Linux::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
{
glob_t g;
BOOL result = FALSE;
@@ -276,11 +275,6 @@ BOOL LLDir_Linux::getNextFileInDir(const std::string &dirname, const std::string
mCurrentDirIndex++;
- if((mCurrentDirIndex >= (int)g.gl_pathc) && wrap)
- {
- mCurrentDirIndex = 0;
- }
-
if(mCurrentDirIndex < (int)g.gl_pathc)
{
// llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl;
@@ -308,47 +302,7 @@ BOOL LLDir_Linux::getNextFileInDir(const std::string &dirname, const std::string
}
-// get a random file in the directory
-// automatically wrap if we've hit the end
-void LLDir_Linux::getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
-{
- S32 num_files;
- S32 which_file;
- DIR *dirp;
- dirent *entryp = NULL;
-
- fname = "";
- num_files = countFilesInDir(dirname,mask);
- if (!num_files)
- {
- return;
- }
-
- which_file = ll_rand(num_files);
-
-// llinfos << "Random select file #" << which_file << llendl;
-
- // which_file now indicates the (zero-based) index to which file to play
-
- if (!((dirp = opendir(dirname.c_str()))))
- {
- while (which_file--)
- {
- if (!((entryp = readdir(dirp))))
- {
- return;
- }
- }
-
- if ((!which_file) && entryp)
- {
- fname = entryp->d_name;
- }
-
- closedir(dirp);
- }
-}
std::string LLDir_Linux::getCurPath()
{
diff --git a/indra/llvfs/lldir_linux.h b/indra/llvfs/lldir_linux.h
index 809959e873..451e81ae93 100644
--- a/indra/llvfs/lldir_linux.h
+++ b/indra/llvfs/lldir_linux.h
@@ -43,8 +43,7 @@ public:
public:
virtual std::string getCurPath();
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 getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
/*virtual*/ BOOL fileExists(const std::string &filename) const;
/*virtual*/ std::string getLLPluginLauncher();
diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp
index b41b0ec5dd..445285aa43 100644
--- a/indra/llvfs/lldir_mac.cpp
+++ b/indra/llvfs/lldir_mac.cpp
@@ -259,8 +259,7 @@ U32 LLDir_Mac::countFilesInDir(const std::string &dirname, const std::string &ma
}
// get the next file in the directory
-// automatically wrap if we've hit the end
-BOOL LLDir_Mac::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap)
+BOOL LLDir_Mac::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
{
glob_t g;
BOOL result = FALSE;
@@ -292,11 +291,6 @@ BOOL LLDir_Mac::getNextFileInDir(const std::string &dirname, const std::string &
mCurrentDirIndex++;
- if((mCurrentDirIndex >= g.gl_pathc) && wrap)
- {
- mCurrentDirIndex = 0;
- }
-
if(mCurrentDirIndex < g.gl_pathc)
{
// llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl;
@@ -323,41 +317,7 @@ BOOL LLDir_Mac::getNextFileInDir(const std::string &dirname, const std::string &
return(result);
}
-// get a random file in the directory
-void LLDir_Mac::getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
-{
- S32 which_file;
- glob_t g;
- fname = "";
-
- std::string tmp_str;
- tmp_str = dirname;
- tmp_str += mask;
-
- if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0)
- {
- if(g.gl_pathc > 0)
- {
-
- which_file = ll_rand(g.gl_pathc);
-
-// llinfos << "getRandomFileInDir: returning number " << which_file << ", path is " << g.gl_pathv[which_file] << llendl;
- // The API wants just the filename, not the full path.
- //fname = g.gl_pathv[which_file];
- char *s = strrchr(g.gl_pathv[which_file], '/');
-
- if(s == NULL)
- s = g.gl_pathv[which_file];
- else if(s[0] == '/')
- s++;
-
- fname = s;
- }
-
- globfree(&g);
- }
-}
S32 LLDir_Mac::deleteFilesInDir(const std::string &dirname, const std::string &mask)
{
diff --git a/indra/llvfs/lldir_mac.h b/indra/llvfs/lldir_mac.h
index 04c52dc940..4eac3c3ae6 100644
--- a/indra/llvfs/lldir_mac.h
+++ b/indra/llvfs/lldir_mac.h
@@ -43,8 +43,7 @@ public:
virtual S32 deleteFilesInDir(const std::string &dirname, const std::string &mask);
virtual std::string getCurPath();
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 getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
virtual BOOL fileExists(const std::string &filename) const;
/*virtual*/ std::string getLLPluginLauncher();
diff --git a/indra/llvfs/lldir_solaris.cpp b/indra/llvfs/lldir_solaris.cpp
index 4323dfd44a..515fd66b6e 100644
--- a/indra/llvfs/lldir_solaris.cpp
+++ b/indra/llvfs/lldir_solaris.cpp
@@ -261,8 +261,7 @@ U32 LLDir_Solaris::countFilesInDir(const std::string &dirname, const std::string
}
// get the next file in the directory
-// automatically wrap if we've hit the end
-BOOL LLDir_Solaris::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap)
+BOOL LLDir_Solaris::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
{
glob_t g;
BOOL result = FALSE;
@@ -294,11 +293,6 @@ BOOL LLDir_Solaris::getNextFileInDir(const std::string &dirname, const std::stri
mCurrentDirIndex++;
- if((mCurrentDirIndex >= (int)g.gl_pathc) && wrap)
- {
- mCurrentDirIndex = 0;
- }
-
if(mCurrentDirIndex < (int)g.gl_pathc)
{
// llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl;
@@ -326,47 +320,7 @@ BOOL LLDir_Solaris::getNextFileInDir(const std::string &dirname, const std::stri
}
-// get a random file in the directory
-// automatically wrap if we've hit the end
-void LLDir_Solaris::getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
-{
- S32 num_files;
- S32 which_file;
- DIR *dirp;
- dirent *entryp = NULL;
-
- fname = "";
-
- num_files = countFilesInDir(dirname,mask);
- if (!num_files)
- {
- return;
- }
-
- which_file = ll_rand(num_files);
-
-// llinfos << "Random select file #" << which_file << llendl;
- // which_file now indicates the (zero-based) index to which file to play
-
- if (!((dirp = opendir(dirname.c_str()))))
- {
- while (which_file--)
- {
- if (!((entryp = readdir(dirp))))
- {
- return;
- }
- }
-
- if ((!which_file) && entryp)
- {
- fname = entryp->d_name;
- }
-
- closedir(dirp);
- }
-}
std::string LLDir_Solaris::getCurPath()
{
diff --git a/indra/llvfs/lldir_solaris.h b/indra/llvfs/lldir_solaris.h
index 6e0c5cfc69..4a1794f539 100644
--- a/indra/llvfs/lldir_solaris.h
+++ b/indra/llvfs/lldir_solaris.h
@@ -43,8 +43,7 @@ public:
public:
virtual std::string getCurPath();
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 getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
/*virtual*/ BOOL fileExists(const std::string &filename) const;
private:
diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp
index 52d864e26f..4a8526cc96 100644
--- a/indra/llvfs/lldir_win32.cpp
+++ b/indra/llvfs/lldir_win32.cpp
@@ -246,21 +246,13 @@ U32 LLDir_Win32::countFilesInDir(const std::string &dirname, const std::string &
// get the next file in the directory
-// automatically wrap if we've hit the end
-BOOL LLDir_Win32::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap)
+BOOL LLDir_Win32::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
{
- llutf16string dirnamew = utf8str_to_utf16str(dirname);
- return getNextFileInDir(dirnamew, mask, fname, wrap);
-
-}
+ BOOL fileFound = FALSE;
+ fname = "";
-BOOL LLDir_Win32::getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname, BOOL wrap)
-{
WIN32_FIND_DATAW FileData;
-
- fname = "";
- llutf16string pathname = dirname;
- pathname += utf8str_to_utf16str(mask);
+ llutf16string pathname = utf8str_to_utf16str(dirname) + utf8str_to_utf16str(mask);
if (pathname != mCurrentDir)
{
@@ -273,91 +265,44 @@ BOOL LLDir_Win32::getNextFileInDir(const llutf16string &dirname, const std::stri
// and open new one
// Check error opening Directory structure
- if ((mDirSearch_h = FindFirstFile(pathname.c_str(), &FileData)) == INVALID_HANDLE_VALUE)
- {
-// llinfos << "Unable to locate first file" << llendl;
- return(FALSE);
- }
- }
- else // get next file in list
- {
- // Find next entry
- if (!FindNextFile(mDirSearch_h, &FileData))
+ if ((mDirSearch_h = FindFirstFile(pathname.c_str(), &FileData)) != INVALID_HANDLE_VALUE)
{
- if (GetLastError() == ERROR_NO_MORE_FILES)
- {
- // No more files, so reset to beginning of directory
- FindClose(mDirSearch_h);
- mCurrentDir[0] = NULL;
-
- if (wrap)
- {
- return(getNextFileInDir(pathname,"",fname,TRUE));
- }
- else
- {
- fname[0] = 0;
- return(FALSE);
- }
- }
- else
- {
- // Error
-// llinfos << "Unable to locate next file" << llendl;
- return(FALSE);
- }
+ fileFound = TRUE;
}
}
- // convert from TCHAR to char
- fname = utf16str_to_utf8str(FileData.cFileName);
-
- // fname now first name in list
- return(TRUE);
-}
-
-
-// get a random file in the directory
-// automatically wrap if we've hit the end
-void LLDir_Win32::getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
-{
- S32 num_files;
- S32 which_file;
- HANDLE random_search_h;
-
- fname = "";
-
- llutf16string pathname = utf8str_to_utf16str(dirname);
- pathname += utf8str_to_utf16str(mask);
-
- WIN32_FIND_DATA FileData;
- fname[0] = NULL;
-
- num_files = countFilesInDir(dirname,mask);
- if (!num_files)
- {
- return;
- }
-
- which_file = ll_rand(num_files);
-
-// llinfos << "Random select mp3 #" << which_file << llendl;
-
- // which_file now indicates the (zero-based) index to which file to play
+ // Loop to skip over the current (.) and parent (..) directory entries
+ // (apparently returned in Win7 but not XP)
+ do
+ {
+ if ( fileFound
+ && ( (lstrcmp(FileData.cFileName, (LPCTSTR)TEXT(".")) == 0)
+ ||(lstrcmp(FileData.cFileName, (LPCTSTR)TEXT("..")) == 0)
+ )
+ )
+ {
+ fileFound = FALSE;
+ }
+ } while ( mDirSearch_h != INVALID_HANDLE_VALUE
+ && !fileFound
+ && (fileFound = FindNextFile(mDirSearch_h, &FileData)
+ )
+ );
+
+ if (!fileFound && GetLastError() == ERROR_NO_MORE_FILES)
+ {
+ // No more files, so reset to beginning of directory
+ FindClose(mDirSearch_h);
+ mCurrentDir[0] = '\000';
+ }
- if ((random_search_h = FindFirstFile(pathname.c_str(), &FileData)) != INVALID_HANDLE_VALUE)
- {
- while (which_file--)
- {
- if (!FindNextFile(random_search_h, &FileData))
- {
- return;
- }
- }
- FindClose(random_search_h);
-
- fname = utf16str_to_utf8str(llutf16string(FileData.cFileName));
+ if (fileFound)
+ {
+ // convert from TCHAR to char
+ fname = utf16str_to_utf8str(FileData.cFileName);
}
+
+ return fileFound;
}
std::string LLDir_Win32::getCurPath()
diff --git a/indra/llvfs/lldir_win32.h b/indra/llvfs/lldir_win32.h
index d3e45dc1f3..4c932c932c 100644
--- a/indra/llvfs/lldir_win32.h
+++ b/indra/llvfs/lldir_win32.h
@@ -40,15 +40,14 @@ public:
/*virtual*/ std::string getCurPath();
/*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 getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
/*virtual*/ BOOL fileExists(const std::string &filename) const;
/*virtual*/ std::string getLLPluginLauncher();
/*virtual*/ std::string getLLPluginFilename(std::string base_name);
private:
- BOOL LLDir_Win32::getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname, BOOL wrap);
+ BOOL LLDir_Win32::getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname);
void* mDirSearch_h;
llutf16string mCurrentDir;
diff --git a/indra/llvfs/tests/lldir_test.cpp b/indra/llvfs/tests/lldir_test.cpp
index bcffa449c8..83ccb277b3 100644
--- a/indra/llvfs/tests/lldir_test.cpp
+++ b/indra/llvfs/tests/lldir_test.cpp
@@ -256,5 +256,158 @@ namespace tut
gDirUtilp->getExtension(dottedPathExt),
"ext");
}
+
+ std::string makeTestFile( const std::string& dir, const std::string& file )
+ {
+ std::string delim = gDirUtilp->getDirDelimiter();
+ std::string path = dir + delim + file;
+ LLFILE* handle = LLFile::fopen( path, "w" );
+ ensure("failed to open test file '"+path+"'", handle != NULL );
+ ensure("failed to write to test file '"+path+"'", !fputs("test file", handle) );
+ fclose(handle);
+ return path;
+ }
+
+ std::string makeTestDir( const std::string& dirbase )
+ {
+ int counter;
+ std::string uniqueDir;
+ bool foundUnused;
+ std::string delim = gDirUtilp->getDirDelimiter();
+
+ for (counter=0, foundUnused=false; !foundUnused; counter++ )
+ {
+ char counterStr[3];
+ sprintf(counterStr, "%02d", counter);
+ uniqueDir = dirbase + counterStr;
+ foundUnused = ! ( LLFile::isdir(uniqueDir) || LLFile::isfile(uniqueDir) );
+ }
+ ensure("test directory '" + uniqueDir + "' creation failed", !LLFile::mkdir(uniqueDir));
+
+ return uniqueDir + delim; // HACK - apparently, the trailing delimiter is needed...
+ }
+
+ static const char* DirScanFilename[5] = { "file1.abc", "file2.abc", "file1.xyz", "file2.xyz", "file1.mno" };
+
+ void scanTest(const std::string& directory, const std::string& pattern, bool correctResult[5])
+ {
+
+ // Scan directory and see if any file1.* files are found
+ std::string scanResult;
+ int found = 0;
+ bool filesFound[5] = { false, false, false, false, false };
+ //std::cerr << "searching '"+directory+"' for '"+pattern+"'\n";
+
+ while ( found <= 5 && gDirUtilp->getNextFileInDir(directory, pattern, scanResult) )
+ {
+ found++;
+ //std::cerr << " found '"+scanResult+"'\n";
+ int check;
+ for (check=0; check < 5 && ! ( scanResult == DirScanFilename[check] ); check++)
+ {
+ }
+ // check is now either 5 (not found) or the index of the matching name
+ if (check < 5)
+ {
+ ensure( "found file '"+(std::string)DirScanFilename[check]+"' twice", ! filesFound[check] );
+ filesFound[check] = true;
+ }
+ else // check is 5 - should not happen
+ {
+ fail( "found unknown file '"+scanResult+"'");
+ }
+ }
+ for (int i=0; i<5; i++)
+ {
+ if (correctResult[i])
+ {
+ ensure("scan of '"+directory+"' using '"+pattern+"' did not return '"+DirScanFilename[i]+"'", filesFound[i]);
+ }
+ else
+ {
+ ensure("scan of '"+directory+"' using '"+pattern+"' incorrectly returned '"+DirScanFilename[i]+"'", !filesFound[i]);
+ }
+ }
+ }
+
+ template<> template<>
+ void LLDirTest_object_t::test<5>()
+ // getNextFileInDir
+ {
+ std::string delim = gDirUtilp->getDirDelimiter();
+ std::string dirTemp = LLFile::tmpdir();
+
+ // Create the same 5 file names of the two directories
+
+ std::string dir1 = makeTestDir(dirTemp + "getNextFileInDir");
+ std::string dir2 = makeTestDir(dirTemp + "getNextFileInDir");
+ std::string dir1files[5];
+ std::string dir2files[5];
+ for (int i=0; i<5; i++)
+ {
+ dir1files[i] = makeTestFile(dir1, DirScanFilename[i]);
+ dir2files[i] = makeTestFile(dir2, DirScanFilename[i]);
+ }
+
+ // Scan dir1 and see if each of the 5 files is found exactly once
+ bool expected1[5] = { true, true, true, true, true };
+ scanTest(dir1, "*", expected1);
+
+ // Scan dir2 and see if only the 2 *.xyz files are found
+ bool expected2[5] = { false, false, true, true, false };
+ scanTest(dir1, "*.xyz", expected2);
+
+ // Scan dir2 and see if only the 1 *.mno file is found
+ bool expected3[5] = { false, false, false, false, true };
+ scanTest(dir2, "*.mno", expected3);
+
+ // Scan dir1 and see if any *.foo files are found
+ bool expected4[5] = { false, false, false, false, false };
+ scanTest(dir1, "*.foo", expected4);
+
+ // Scan dir1 and see if any file1.* files are found
+ bool expected5[5] = { true, false, true, false, true };
+ scanTest(dir1, "file1.*", expected5);
+
+ // Scan dir1 and see if any file1.* files are found
+ bool expected6[5] = { true, true, false, false, false };
+ scanTest(dir1, "file?.abc", expected6);
+
+ // Scan dir2 and see if any file?.x?z files are found
+ bool expected7[5] = { false, false, true, true, false };
+ scanTest(dir2, "file?.x?z", expected7);
+
+ // Scan dir2 and see if any file?.??c files are found
+ // THESE FAIL ON Mac and Windows, SO ARE COMMENTED OUT FOR NOW
+ // bool expected8[5] = { true, true, false, false, false };
+ // scanTest(dir2, "file?.??c", expected8);
+ // scanTest(dir2, "*.??c", expected8);
+
+ // Scan dir1 and see if any *.?n? files are found
+ bool expected9[5] = { false, false, false, false, true };
+ scanTest(dir1, "*.?n?", expected9);
+
+ // Scan dir1 and see if any *.???? files are found
+ // THIS ONE FAILS ON WINDOWS (returns three charater suffixes) SO IS COMMENTED OUT FOR NOW
+ // bool expected10[5] = { false, false, false, false, false };
+ // scanTest(dir1, "*.????", expected10);
+
+ // Scan dir1 and see if any ?????.* files are found
+ bool expected11[5] = { true, true, true, true, true };
+ scanTest(dir1, "?????.*", expected11);
+
+ // Scan dir1 and see if any ??l??.xyz files are found
+ bool expected12[5] = { false, false, true, true, false };
+ scanTest(dir1, "??l??.xyz", expected12);
+
+ // clean up all test files and directories
+ for (int i=0; i<5; i++)
+ {
+ LLFile::remove(dir1files[i]);
+ LLFile::remove(dir2files[i]);
+ }
+ LLFile::rmdir(dir1);
+ LLFile::rmdir(dir2);
+ }
}
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index ebd93b5987..cc8ad74526 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -11388,6 +11388,28 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>InterpolationTime</key>
+ <map>
+ <key>Comment</key>
+ <string>How long to extrapolate object motion after last packet received</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <integer>3.0</integer>
+ </map>
+ <key>InterpolationPhaseOut</key>
+ <map>
+ <key>Comment</key>
+ <string>Seconds to phase out interpolated motion</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <integer>1.0</integer>
+ </map>
<key>VerboseLogs</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index dc76a4e518..705c73cbf7 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -110,7 +110,17 @@
<key>Value</key>
<string>00000000-0000-0000-0000-000000000000</string>
</map>
-
+ <key>LogFileNamewithDate</key>
+ <map>
+ <key>Comment</key>
+ <string>Add Date Stamp to chat and IM Logs with format chat-YYYY-MM-DD and 'IM file name'-YYYY-MM. To view old logs goto ..\Second Life\[login name]</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<!-- Settings below are for back compatibility only.
They are not used in current viewer anymore. But they can't be removed to avoid
influence on previous versions of the viewer in case of settings are not used or default value
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index bf0f948a6d..f66663891d 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -3036,7 +3036,7 @@ void LLAppViewer::migrateCacheDirectory()
S32 file_count = 0;
std::string file_name;
std::string mask = delimiter + "*.*";
- while (gDirUtilp->getNextFileInDir(old_cache_dir, mask, file_name, false))
+ while (gDirUtilp->getNextFileInDir(old_cache_dir, mask, file_name))
{
if (file_name == "." || file_name == "..") continue;
std::string source_path = old_cache_dir + delimiter + file_name;
@@ -3255,7 +3255,7 @@ bool LLAppViewer::initCache()
dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"");
std::string found_file;
- if (gDirUtilp->getNextFileInDir(dir, mask, found_file, false))
+ if (gDirUtilp->getNextFileInDir(dir, mask, found_file))
{
old_vfs_data_file = dir + gDirUtilp->getDirDelimiter() + found_file;
diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp
index 7629265730..898cc1c0ba 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -504,8 +504,7 @@ std::string LLAppViewerLinux::generateSerialNumber()
// trawl /dev/disk/by-uuid looking for a good-looking UUID to grab
std::string this_name;
- BOOL wrap = FALSE;
- while (gDirUtilp->getNextFileInDir(uuiddir, "*", this_name, wrap))
+ while (gDirUtilp->getNextFileInDir(uuiddir, "*", this_name))
{
if (this_name.length() > best.length() ||
(this_name.length() == best.length() &&
diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp
index c9a526a3be..e7634ff0f4 100644
--- a/indra/newview/llcolorswatch.cpp
+++ b/indra/newview/llcolorswatch.cpp
@@ -53,6 +53,7 @@ LLColorSwatchCtrl::Params::Params()
alpha_background_image("alpha_background_image"),
border_color("border_color"),
label_width("label_width", -1),
+ label_height("label_height", -1),
caption_text("caption_text"),
border("border")
{
@@ -68,17 +69,20 @@ LLColorSwatchCtrl::LLColorSwatchCtrl(const Params& p)
mOnCancelCallback(p.cancel_callback()),
mOnSelectCallback(p.select_callback()),
mBorderColor(p.border_color()),
- mLabelWidth(p.label_width)
+ mLabelWidth(p.label_width),
+ mLabelHeight(p.label_height)
{
LLTextBox::Params tp = p.caption_text;
+ // use custom label height if it is provided
+ mLabelHeight = mLabelHeight != -1 ? mLabelHeight : BTN_HEIGHT_SMALL;
// label_width is specified, not -1
if(mLabelWidth!= -1)
{
- tp.rect(LLRect( 0, BTN_HEIGHT_SMALL, mLabelWidth, 0 ));
+ tp.rect(LLRect( 0, mLabelHeight, mLabelWidth, 0 ));
}
else
{
- tp.rect(LLRect( 0, BTN_HEIGHT_SMALL, getRect().getWidth(), 0 ));
+ tp.rect(LLRect( 0, mLabelHeight, getRect().getWidth(), 0 ));
}
tp.initial_value(p.label());
@@ -88,7 +92,7 @@ LLColorSwatchCtrl::LLColorSwatchCtrl(const Params& p)
LLRect border_rect = getLocalRect();
border_rect.mTop -= 1;
border_rect.mRight -=1;
- border_rect.mBottom += BTN_HEIGHT_SMALL;
+ border_rect.mBottom += mLabelHeight;
LLViewBorder::Params params = p.border;
params.rect(border_rect);
@@ -194,7 +198,7 @@ void LLColorSwatchCtrl::draw()
F32 alpha = getDrawContext().mAlpha;
mBorder->setKeyboardFocusHighlight(hasFocus());
// Draw border
- LLRect border( 0, getRect().getHeight(), getRect().getWidth(), BTN_HEIGHT_SMALL );
+ LLRect border( 0, getRect().getHeight(), getRect().getWidth(), mLabelHeight );
gl_rect_2d( border, mBorderColor.get(), FALSE );
LLRect interior = border;
diff --git a/indra/newview/llcolorswatch.h b/indra/newview/llcolorswatch.h
index a4ce1ca099..cd859ea128 100644
--- a/indra/newview/llcolorswatch.h
+++ b/indra/newview/llcolorswatch.h
@@ -61,6 +61,7 @@ public:
Optional<commit_callback_t> select_callback;
Optional<LLUIColor> border_color;
Optional<S32> label_width;
+ Optional<S32> label_height;
Optional<LLTextBox::Params> caption_text;
Optional<LLViewBorder::Params> border;
@@ -112,6 +113,7 @@ protected:
commit_callback_t mOnCancelCallback;
commit_callback_t mOnSelectCallback;
S32 mLabelWidth;
+ S32 mLabelHeight;
LLPointer<LLUIImage> mAlphaGradientImage;
std::string mFallbackImageName;
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 5becd8f990..c105f023c7 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -1246,7 +1246,7 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im
getChildView("show_timestamps_check_im")->setEnabled(TRUE);
getChildView("log_path_string")->setEnabled(FALSE);// LineEditor becomes readonly in this case.
getChildView("log_path_button")->setEnabled(TRUE);
-
+ childEnable("logfile_name_datestamp");
std::string display_email(email);
getChild<LLUICtrl>("email_address")->setValue(display_email);
diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index 5dc8067648..5687b88a1f 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -480,7 +480,7 @@ BOOL LLFloaterUIPreview::postBuild()
mLanguageSelection->removeall(); // clear out anything temporarily in list from XML
while(found) // for every directory
{
- if((found = gDirUtilp->getNextFileInDir(xui_dir, "*", language_directory, FALSE))) // get next directory
+ if((found = gDirUtilp->getNextFileInDir(xui_dir, "*", language_directory))) // get next directory
{
std::string full_path = xui_dir + language_directory;
if(LLFile::isfile(full_path.c_str())) // if it's not a directory, skip it
@@ -634,7 +634,7 @@ void LLFloaterUIPreview::refreshList()
BOOL found = TRUE;
while(found) // for every floater file that matches the pattern
{
- if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "floater_*.xml", name, FALSE))) // get next file matching pattern
+ if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "floater_*.xml", name))) // get next file matching pattern
{
addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path)
}
@@ -642,7 +642,7 @@ void LLFloaterUIPreview::refreshList()
found = TRUE;
while(found) // for every inspector file that matches the pattern
{
- if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "inspect_*.xml", name, FALSE))) // get next file matching pattern
+ if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "inspect_*.xml", name))) // get next file matching pattern
{
addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path)
}
@@ -650,7 +650,7 @@ void LLFloaterUIPreview::refreshList()
found = TRUE;
while(found) // for every menu file that matches the pattern
{
- if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "menu_*.xml", name, FALSE))) // get next file matching pattern
+ if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "menu_*.xml", name))) // get next file matching pattern
{
addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path)
}
@@ -658,7 +658,7 @@ void LLFloaterUIPreview::refreshList()
found = TRUE;
while(found) // for every panel file that matches the pattern
{
- if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "panel_*.xml", name, FALSE))) // get next file matching pattern
+ if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "panel_*.xml", name))) // get next file matching pattern
{
addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path)
}
@@ -667,7 +667,7 @@ void LLFloaterUIPreview::refreshList()
found = TRUE;
while(found) // for every sidepanel file that matches the pattern
{
- if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "sidepanel_*.xml", name, FALSE))) // get next file matching pattern
+ if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "sidepanel_*.xml", name))) // get next file matching pattern
{
addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path)
}
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 857c27be63..cc48226052 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -537,16 +537,7 @@ bool LLIMModel::LLIMSession::isOtherParticipantAvaline()
void LLIMModel::LLIMSession::onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name)
{
- if (av_name.mLegacyFirstName.empty())
- {
- // if mLegacyFirstName is empty it means display names is off and the
- // data came from the gCacheName, mDisplayName will be the legacy name
- mHistoryFileName = LLCacheName::cleanFullName(av_name.mDisplayName);
- }
- else
- {
- mHistoryFileName = LLCacheName::cleanFullName(av_name.getLegacyName());
- }
+ mHistoryFileName = av_name.mUsername;
}
void LLIMModel::LLIMSession::buildHistoryFileName()
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 8c70b1e973..2fb5ba82ba 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -182,15 +182,31 @@ private:
//static
std::string LLLogChat::makeLogFileName(std::string filename)
{
+ if( gSavedPerAccountSettings.getBOOL("LogFileNamewithDate") )
+ {
+ time_t now;
+ time(&now);
+ char dbuffer[20]; /* Flawfinder: ignore */
+ if (filename == "chat")
+ {
+ strftime(dbuffer, 20, "-%Y-%m-%d", localtime(&now));
+ }
+ else
+ {
+ strftime(dbuffer, 20, "-%Y-%m", localtime(&now));
+ }
+ filename += dbuffer;
+ }
filename = cleanFileName(filename);
filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_ACCOUNT_CHAT_LOGS,filename);
filename += ".txt";
+ //LL_INFOS("") << "Current:" << filename << LL_ENDL;/* uncomment if you want to verify step, delete on commit */
return filename;
}
std::string LLLogChat::cleanFileName(std::string filename)
{
- std::string invalidChars = "\"\'\\/?*:<>|";
+ std::string invalidChars = "\"\'\\/?*:.<>|";
std::string::size_type position = filename.find_first_of(invalidChars);
while (position != filename.npos)
{
@@ -354,10 +370,19 @@ void LLLogChat::loadAllHistory(const std::string& file_name, std::list<LLSD>& me
llwarns << "Session name is Empty!" << llendl;
return ;
}
-
- LLFILE* fptr = LLFile::fopen(makeLogFileName(file_name), "r"); /*Flawfinder: ignore*/
- if (!fptr) return; //No previous conversation with this name.
-
+ //LL_INFOS("") << "Loading:" << file_name << LL_ENDL;/* uncomment if you want to verify step, delete on commit */
+ //LL_INFOS("") << "Current:" << makeLogFileName(file_name) << LL_ENDL;/* uncomment if you want to verify step, delete on commit */
+ LLFILE* fptr = LLFile::fopen(makeLogFileName(file_name), "r");/*Flawfinder: ignore*/
+ if (!fptr)
+ {
+ fptr = LLFile::fopen(oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
+ if (!fptr)
+ {
+ if (!fptr) return; //No previous conversation with this name.
+ }
+ }
+
+ //LL_INFOS("") << "Reading:" << file_name << LL_ENDL;
char buffer[LOG_RECALL_SIZE]; /*Flawfinder: ignore*/
char *bptr;
S32 len;
@@ -544,3 +569,32 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im)
im[IM_TEXT] = name_and_text[IDX_TEXT];
return true; //parsed name and message text, maybe have a timestamp too
}
+std::string LLLogChat::oldLogFileName(std::string filename)
+{
+ std::string scanResult;
+ std::string directory = gDirUtilp->getPerAccountChatLogsDir();/* get Users log directory */
+ directory += gDirUtilp->getDirDelimiter();/* add final OS dependent delimiter */
+ filename=cleanFileName(filename);/* lest make shure the file name has no invalad charecters befor making the pattern */
+ std::string pattern = (filename+(( filename == "chat" ) ? "-???\?-?\?-??.txt" : "-???\?-??.txt"));/* create search pattern*/
+ //LL_INFOS("") << "Checking:" << directory << " for " << pattern << LL_ENDL;/* uncomment if you want to verify step, delete on commit */
+ std::vector<std::string> allfiles;
+
+ while (gDirUtilp->getNextFileInDir(directory, pattern, scanResult))
+ {
+ //LL_INFOS("") << "Found :" << scanResult << LL_ENDL;
+ allfiles.push_back(scanResult);
+ }
+
+ if (allfiles.size() == 0) // if no result from date search, return generic filename
+ {
+ scanResult = directory + filename + ".txt";
+ }
+ else
+ {
+ std::sort(allfiles.begin(), allfiles.end());
+ scanResult = directory + allfiles.back();
+ // thisfile is now the most recent version of the file.
+ }
+ //LL_INFOS("") << "Reading:" << scanResult << LL_ENDL;/* uncomment if you want to verify step, delete on commit */
+ return scanResult;
+}
diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h
index 6958d56311..27752452c9 100644
--- a/indra/newview/lllogchat.h
+++ b/indra/newview/lllogchat.h
@@ -41,6 +41,10 @@ public:
};
static std::string timestamp(bool withdate = false);
static std::string makeLogFileName(std::string(filename));
+ /**
+ *Add functions to get old and non date stamped file names when needed
+ */
+ static std::string oldLogFileName(std::string(filename));
static void saveHistory(const std::string& filename,
const std::string& from,
const LLUUID& from_id,
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index 5eb3b789f2..f871df0c36 100644
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -726,7 +726,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)
LLVector3d new_position_global = selectNode->mSavedPositionGlobal + clamped_relative_move;
// Don't let object centers go too far underground
- F64 min_height = LLWorld::getInstance()->getMinAllowedZ(object);
+ F64 min_height = LLWorld::getInstance()->getMinAllowedZ(object, object->getPositionGlobal());
if (new_position_global.mdV[VZ] < min_height)
{
new_position_global.mdV[VZ] = min_height;
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index d756a1b931..a0c320ba19 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -1695,10 +1695,10 @@ void LLPanelObject::sendPosition(BOOL btn_down)
LLVector3 newpos(mCtrlPosX->get(), mCtrlPosY->get(), mCtrlPosZ->get());
LLViewerRegion* regionp = mObject->getRegion();
-
+
// Clamp the Z height
const F32 height = newpos.mV[VZ];
- const F32 min_height = LLWorld::getInstance()->getMinAllowedZ(mObject);
+ const F32 min_height = LLWorld::getInstance()->getMinAllowedZ(mObject, mObject->getPositionGlobal());
const F32 max_height = LLWorld::getInstance()->getRegionMaxHeight();
if (!mObject->isAttachment())
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 48ab122edf..31cf0acdd7 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -1083,7 +1083,7 @@ void LLViewerMedia::clearAllCookies()
}
// the hard part: iterate over all user directories and delete the cookie file from each one
- while(gDirUtilp->getNextFileInDir(base_dir, "*_*", filename, false))
+ while(gDirUtilp->getNextFileInDir(base_dir, "*_*", filename))
{
target = base_dir;
target += filename;
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 0ca30d5f3d..7c0fc681a4 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -3866,6 +3866,7 @@ void process_crossed_region(LLMessageSystem* msg, void**)
return;
}
LL_INFOS("Messaging") << "process_crossed_region()" << LL_ENDL;
+ gAgentAvatarp->resetRegionCrossingTimer();
U32 sim_ip;
msg->getIPAddrFast(_PREHASH_RegionData, _PREHASH_SimIP, sim_ip);
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 0e1553c421..1804fac1b3 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -103,8 +103,8 @@
//#define DEBUG_UPDATE_TYPE
-BOOL gVelocityInterpolate = TRUE;
-BOOL gPingInterpolate = TRUE;
+BOOL LLViewerObject::sVelocityInterpolate = TRUE;
+BOOL LLViewerObject::sPingInterpolate = TRUE;
U32 LLViewerObject::sNumZombieObjects = 0;
S32 LLViewerObject::sNumObjects = 0;
@@ -115,6 +115,11 @@ S32 LLViewerObject::sAxisArrowLength(50);
BOOL LLViewerObject::sPulseEnabled(FALSE);
BOOL LLViewerObject::sUseSharedDrawables(FALSE); // TRUE
+// sMaxUpdateInterpolationTime must be greater than sPhaseOutUpdateInterpolationTime
+F64 LLViewerObject::sMaxUpdateInterpolationTime = 3.0; // For motion interpolation: after X seconds with no updates, don't predict object motion
+F64 LLViewerObject::sPhaseOutUpdateInterpolationTime = 2.0; // For motion interpolation: after Y seconds with no updates, taper off motion prediction
+
+
static LLFastTimer::DeclareTimer FTM_CREATE_OBJECT("Create Object");
// static
@@ -205,6 +210,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
mLastInterpUpdateSecs(0.f),
mLastMessageUpdateSecs(0.f),
mLatestRecvPacketID(0),
+ mCircuitPacketCount(0),
mData(NULL),
mAudioSourcep(NULL),
mAudioGain(1.f),
@@ -1841,7 +1847,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
new_rot.normQuat();
- if (gPingInterpolate)
+ if (sPingInterpolate)
{
LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mesgsys->getSender());
if (cdp)
@@ -1862,6 +1868,8 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
//
//
+ // WTF? If we're going to skip this message, why are we
+ // doing all the parenting, etc above?
U32 packet_id = mesgsys->getCurrentRecvPacketID();
if (packet_id < mLatestRecvPacketID &&
mLatestRecvPacketID - packet_id < 65536)
@@ -1871,6 +1879,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
}
mLatestRecvPacketID = packet_id;
+ mCircuitPacketCount = 0;
// Set the change flags for scale
if (new_scale != getScale())
@@ -2002,7 +2011,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
// U32 ping_delay = mesgsys->mCircuitInfo.getPingDelay();
mLastInterpUpdateSecs = LLFrameTimer::getElapsedSeconds();
- mLastMessageUpdateSecs = LLFrameTimer::getElapsedSeconds();
+ mLastMessageUpdateSecs = mLastInterpUpdateSecs;
if (mDrawable.notNull())
{
// Don't clear invisibility flag on update if still orphaned!
@@ -2029,6 +2038,8 @@ BOOL LLViewerObject::isActive() const
return TRUE;
}
+
+
BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
{
static LLFastTimer::DeclareTimer ftm("Viewer Object");
@@ -2042,7 +2053,7 @@ BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
// CRO - don't velocity interp linked objects!
// Leviathan - but DO velocity interp joints
- if (!mStatic && gVelocityInterpolate && !isSelected())
+ if (!mStatic && sVelocityInterpolate && !isSelected())
{
// calculate dt from last update
F32 dt_raw = (F32)(time - mLastInterpUpdateSecs);
@@ -2132,33 +2143,8 @@ BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
return TRUE;
}
else
- {
- // linear motion
- // PHYSICS_TIMESTEP is used below to correct for the fact that the velocity in object
- // updates represents the average velocity of the last timestep, rather than the final velocity.
- // the time dilation above should guarantee that dt is never less than PHYSICS_TIMESTEP, theoretically
- //
- // There is a problem here if dt is negative. . .
-
- // *TODO: should also wrap linear accel/velocity in check
- // to see if object is selected, instead of explicitly
- // zeroing it out
- LLVector3 accel = getAcceleration();
- LLVector3 vel = getVelocity();
-
- if (!(accel.isExactlyZero() && vel.isExactlyZero()))
- {
- LLVector3 pos = (vel + (0.5f * (dt-PHYSICS_TIMESTEP)) * accel) * dt;
-
- // region local
- setPositionRegion(pos + getPositionRegion());
- setVelocity(vel + accel*dt);
-
- // for objects that are spinning but not translating, make sure to flag them as having moved
- setChanged(MOVED | SILHOUETTE);
- }
-
- mLastInterpUpdateSecs = time;
+ { // Move object based on it's velocity and rotation
+ interpolateLinearMotion(time, dt);
}
}
@@ -2174,6 +2160,158 @@ BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
}
+// Move an object due to idle-time viewer side updates by iterpolating motion
+void LLViewerObject::interpolateLinearMotion(const F64 & time, const F32 & dt)
+{
+ // linear motion
+ // PHYSICS_TIMESTEP is used below to correct for the fact that the velocity in object
+ // updates represents the average velocity of the last timestep, rather than the final velocity.
+ // the time dilation above should guarantee that dt is never less than PHYSICS_TIMESTEP, theoretically
+ //
+ // *TODO: should also wrap linear accel/velocity in check
+ // to see if object is selected, instead of explicitly
+ // zeroing it out
+
+ F64 time_since_last_update = time - mLastMessageUpdateSecs;
+ if (time_since_last_update <= 0.0 || dt <= 0.f)
+ {
+ return;
+ }
+
+ LLVector3 accel = getAcceleration();
+ LLVector3 vel = getVelocity();
+
+ if (sMaxUpdateInterpolationTime <= 0.0)
+ { // Old code path ... unbounded, simple interpolation
+ if (!(accel.isExactlyZero() && vel.isExactlyZero()))
+ {
+ LLVector3 pos = (vel + (0.5f * (dt-PHYSICS_TIMESTEP)) * accel) * dt;
+
+ // region local
+ setPositionRegion(pos + getPositionRegion());
+ setVelocity(vel + accel*dt);
+
+ // for objects that are spinning but not translating, make sure to flag them as having moved
+ setChanged(MOVED | SILHOUETTE);
+ }
+ }
+ else if (!accel.isExactlyZero() || !vel.isExactlyZero()) // object is moving
+ { // Object is moving, and hasn't been too long since we got an update from the server
+
+ // Calculate predicted position and velocity
+ LLVector3 new_pos = (vel + (0.5f * (dt-PHYSICS_TIMESTEP)) * accel) * dt;
+ LLVector3 new_v = accel * dt;
+
+ if (time_since_last_update > sPhaseOutUpdateInterpolationTime)
+ { // Haven't seen a viewer update in a while, check to see if the ciruit is still active
+ if (mRegionp)
+ { // The simulator will NOT send updates if the object continues normally on the path
+ // predicted by the velocity and the acceleration (often gravity) sent to the viewer
+ // So check to see if the circuit is blocked, which means the sim is likely in a long lag
+ LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit( mRegionp->getHost() );
+ if (cdp)
+ {
+ if (!cdp->isAlive() || // Circuit is dead or blocked
+ cdp->isBlocked() || // or doesn't seem to be getting any packets
+ (mCircuitPacketCount > 0 && mCircuitPacketCount == cdp->getPacketsIn()))
+ {
+ // Start to reduce motion interpolation since we haven't seen a server update in a while
+ F64 time_since_last_interpolation = time - mLastInterpUpdateSecs;
+ F64 phase_out = 1.0;
+ if (time_since_last_update > sMaxUpdateInterpolationTime)
+ { // Past the time limit, so stop the object
+ phase_out = 0.0;
+ //llinfos << "Motion phase out to zero" << llendl;
+
+ // Kill angular motion as well. Note - not adding this due to paranoia
+ // about stopping rotation for llTargetOmega objects and not having it restart
+ // setAngularVelocity(LLVector3::zero);
+ }
+ else if (mLastInterpUpdateSecs - mLastMessageUpdateSecs > sPhaseOutUpdateInterpolationTime)
+ { // Last update was already phased out a bit
+ phase_out = (sMaxUpdateInterpolationTime - time_since_last_update) /
+ (sMaxUpdateInterpolationTime - time_since_last_interpolation);
+ //llinfos << "Continuing motion phase out of " << (F32) phase_out << llendl;
+ }
+ else
+ { // Phase out from full value
+ phase_out = (sMaxUpdateInterpolationTime - time_since_last_update) /
+ (sMaxUpdateInterpolationTime - sPhaseOutUpdateInterpolationTime);
+ //llinfos << "Starting motion phase out of " << (F32) phase_out << llendl;
+ }
+ phase_out = llclamp(phase_out, 0.0, 1.0);
+
+ new_pos = new_pos * ((F32) phase_out);
+ new_v = new_v * ((F32) phase_out);
+ }
+
+ // Save current circuit packet count to see if it changes
+ mCircuitPacketCount = cdp->getPacketsIn();
+ }
+ }
+ }
+
+ new_pos = new_pos + getPositionRegion();
+ new_v = new_v + vel;
+
+
+ // Clamp interpolated position to minimum underground and maximum region height
+ LLVector3d new_pos_global = mRegionp->getPosGlobalFromRegion(new_pos);
+ F32 min_height;
+ if (isAvatar())
+ { // Make a better guess about AVs not going underground
+ min_height = LLWorld::getInstance()->resolveLandHeightGlobal(new_pos_global);
+ min_height += (0.5f * getScale().mV[VZ]);
+ }
+ else
+ { // This will put the object underground, but we can't tell if it will stop
+ // at ground level or not
+ min_height = LLWorld::getInstance()->getMinAllowedZ(this, new_pos_global);
+ }
+
+ new_pos.mV[VZ] = llmax(min_height, new_pos.mV[VZ]);
+ new_pos.mV[VZ] = llmin(LLWorld::getInstance()->getRegionMaxHeight(), new_pos.mV[VZ]);
+
+ // Check to see if it's going off the region
+ LLVector3 temp(new_pos);
+ if (temp.clamp(0.f, mRegionp->getWidth()))
+ { // Going off this region, so see if we might end up on another region
+ LLVector3d old_pos_global = mRegionp->getPosGlobalFromRegion(getPositionRegion());
+ new_pos_global = mRegionp->getPosGlobalFromRegion(new_pos); // Re-fetch in case it got clipped above
+
+ // Clip the positions to known regions
+ LLVector3d clip_pos_global = LLWorld::getInstance()->clipToVisibleRegions(old_pos_global, new_pos_global);
+ if (clip_pos_global != new_pos_global)
+ { // Was clipped, so this means we hit a edge where there is no region to enter
+
+ //llinfos << "Hit empty region edge, clipped predicted position to " << mRegionp->getPosRegionFromGlobal(clip_pos_global)
+ // << " from " << new_pos << llendl;
+ new_pos = mRegionp->getPosRegionFromGlobal(clip_pos_global);
+
+ // Stop motion and get server update for bouncing on the edge
+ new_v.clear();
+ setAcceleration(LLVector3::zero);
+ }
+ else
+ { // Let predicted movement cross into another region
+ //llinfos << "Predicting region crossing to " << new_pos << llendl;
+ }
+ }
+
+ // Set new position and velocity
+ setPositionRegion(new_pos);
+ setVelocity(new_v);
+
+ // for objects that are spinning but not translating, make sure to flag them as having moved
+ setChanged(MOVED | SILHOUETTE);
+ }
+
+ // Update the last time we did anything
+ mLastInterpUpdateSecs = time;
+}
+
+
+
BOOL LLViewerObject::setData(const U8 *datap, const U32 data_size)
{
LLMemType mt(LLMemType::MTYPE_OBJECT);
@@ -4962,6 +5100,7 @@ void LLViewerObject::setRegion(LLViewerRegion *regionp)
}
mLatestRecvPacketID = 0;
+ mCircuitPacketCount = 0;
mRegionp = regionp;
for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i)
@@ -4974,6 +5113,20 @@ void LLViewerObject::setRegion(LLViewerRegion *regionp)
updateDrawable(FALSE);
}
+// virtual
+void LLViewerObject::updateRegion(LLViewerRegion *regionp)
+{
+// if (regionp)
+// {
+// F64 now = LLFrameTimer::getElapsedSeconds();
+// llinfos << "Updating to region " << regionp->getName()
+// << ", ms since last update message: " << (F32)((now - mLastMessageUpdateSecs) * 1000.0)
+// << ", ms since last interpolation: " << (F32)((now - mLastInterpUpdateSecs) * 1000.0)
+// << llendl;
+// }
+}
+
+
bool LLViewerObject::specialHoverCursor() const
{
return (mFlags & FLAGS_USE_PHYSICS)
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index c2475c2709..fe670f8827 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -464,7 +464,7 @@ public:
bool specialHoverCursor() const; // does it have a special hover cursor?
void setRegion(LLViewerRegion *regionp);
- virtual void updateRegion(LLViewerRegion *regionp) {}
+ virtual void updateRegion(LLViewerRegion *regionp);
void updateFlags();
BOOL setFlags(U32 flag, BOOL state);
@@ -510,6 +510,9 @@ private:
// and the update wasn't due to this agent's last action.
U32 checkMediaURL(const std::string &media_url);
+ // Motion prediction between updates
+ void interpolateLinearMotion(const F64 & time, const F32 & dt);
+
public:
//
// Viewer-side only types - use the LL_PCODE_APP mask.
@@ -612,6 +615,8 @@ protected:
F64 mLastInterpUpdateSecs; // Last update for purposes of interpolation
F64 mLastMessageUpdateSecs; // Last update from a message from the simulator
TPACKETID mLatestRecvPacketID; // Latest time stamp on message from simulator
+ U32 mCircuitPacketCount; // Packet tracking for early detection of a stopped simulator circuit
+
// extra data sent from the sim...currently only used for tree species info
U8* mData;
@@ -669,9 +674,21 @@ protected:
mutable LLVector3 mPositionRegion;
mutable LLVector3 mPositionAgent;
+ static void setPhaseOutUpdateInterpolationTime(F32 value) { sPhaseOutUpdateInterpolationTime = (F64) value; }
+ static void setMaxUpdateInterpolationTime(F32 value) { sMaxUpdateInterpolationTime = (F64) value; }
+
+ static void setVelocityInterpolate(BOOL value) { sVelocityInterpolate = value; }
+ static void setPingInterpolate(BOOL value) { sPingInterpolate = value; }
+
private:
static S32 sNumObjects;
+ static F64 sPhaseOutUpdateInterpolationTime; // For motion interpolation
+ static F64 sMaxUpdateInterpolationTime; // For motion interpolation
+
+ static BOOL sVelocityInterpolate;
+ static BOOL sPingInterpolate;
+
//--------------------------------------------------------------------
// For objects that are attachments
//--------------------------------------------------------------------
@@ -742,7 +759,5 @@ public:
virtual void updateDrawable(BOOL force_damped);
};
-extern BOOL gVelocityInterpolate;
-extern BOOL gPingInterpolate;
#endif
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index a414e86866..f5a32438cf 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -659,9 +659,24 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent)
void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
{
LLMemType mt(LLMemType::MTYPE_OBJECT);
+
// Update globals
- gVelocityInterpolate = gSavedSettings.getBOOL("VelocityInterpolate");
- gPingInterpolate = gSavedSettings.getBOOL("PingInterpolate");
+ LLViewerObject::setVelocityInterpolate( gSavedSettings.getBOOL("VelocityInterpolate") );
+ LLViewerObject::setPingInterpolate( gSavedSettings.getBOOL("PingInterpolate") );
+
+ F32 interp_time = gSavedSettings.getF32("InterpolationTime");
+ F32 phase_out_time = gSavedSettings.getF32("InterpolationPhaseOut");
+ if (interp_time < 0.0 ||
+ phase_out_time < 0.0 ||
+ phase_out_time > interp_time)
+ {
+ llwarns << "Invalid values for InterpolationTime or InterpolationPhaseOut, resetting to defaults" << llendl;
+ interp_time = 3.0f;
+ phase_out_time = 1.0f;
+ }
+ LLViewerObject::setPhaseOutUpdateInterpolationTime( interp_time );
+ LLViewerObject::setMaxUpdateInterpolationTime( phase_out_time );
+
gAnimateTextures = gSavedSettings.getBOOL("AnimateTextures");
// update global timer
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 6f3aba29c6..7ae1f672e8 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -7864,6 +7864,7 @@ BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlMorphNodes(LLXmlTreeNode* root)
//virtual
void LLVOAvatar::updateRegion(LLViewerRegion *regionp)
{
+ LLViewerObject::updateRegion(regionp);
}
std::string LLVOAvatar::getFullname() const
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index e5cbf65682..0250627d1b 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -806,7 +806,24 @@ void LLVOAvatarSelf::removeMissingBakedTextures()
//virtual
void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp)
{
+ // Save the global position
+ LLVector3d global_pos_from_old_region = getPositionGlobal();
+
+ // Change the region
setRegion(regionp);
+
+ if (regionp)
+ { // Set correct region-relative position from global coordinates
+ setPositionGlobal(global_pos_from_old_region);
+
+ // Diagnostic info
+ //LLVector3d pos_from_new_region = getPositionGlobal();
+ //llinfos << "pos_from_old_region is " << global_pos_from_old_region
+ // << " while pos_from_new_region is " << pos_from_new_region
+ // << llendl;
+ }
+
+
if (!regionp || (regionp->getHandle() != mLastRegionHandle))
{
if (mLastRegionHandle != 0)
@@ -820,6 +837,9 @@ void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp)
F64 max = (mRegionCrossingCount == 1) ? 0 : LLViewerStats::getInstance()->getStat(LLViewerStats::ST_CROSSING_MAX);
max = llmax(delta, max);
LLViewerStats::getInstance()->setStat(LLViewerStats::ST_CROSSING_MAX, max);
+
+ // Diagnostics
+ llinfos << "Region crossing took " << (F32)(delta * 1000.0) << " ms " << llendl;
}
if (regionp)
{
@@ -827,6 +847,7 @@ void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp)
}
}
mRegionCrossingTimer.reset();
+ LLViewerObject::updateRegion(regionp);
}
//--------------------------------------------------------------------
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index 23a799ea3a..d13cf5ba38 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -123,6 +123,8 @@ public:
//--------------------------------------------------------------------
// Region state
//--------------------------------------------------------------------
+ void resetRegionCrossingTimer() { mRegionCrossingTimer.reset(); }
+
private:
U64 mLastRegionHandle;
LLFrameTimer mRegionCrossingTimer;
diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp
index 7314894c2e..d239347810 100644
--- a/indra/newview/llwaterparammanager.cpp
+++ b/indra/newview/llwaterparammanager.cpp
@@ -89,7 +89,7 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name)
while(found)
{
std::string name;
- found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name, false);
+ found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name);
if(found)
{
@@ -115,7 +115,7 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name)
while(found)
{
std::string name;
- found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name, false);
+ found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name);
if(found)
{
name=name.erase(name.length()-4);
diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp
index 9b6047395a..e5f52dfc97 100644
--- a/indra/newview/llwlparammanager.cpp
+++ b/indra/newview/llwlparammanager.cpp
@@ -104,7 +104,7 @@ void LLWLParamManager::loadPresets(const std::string& file_name)
while(found)
{
std::string name;
- found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name, false);
+ found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name);
if(found)
{
@@ -130,7 +130,7 @@ void LLWLParamManager::loadPresets(const std::string& file_name)
while(found)
{
std::string name;
- found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name, false);
+ found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name);
if(found)
{
name=name.erase(name.length()-4);
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 8fabaaba80..399442e5c4 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -431,14 +431,15 @@ BOOL LLWorld::positionRegionValidGlobal(const LLVector3d &pos_global)
// Allow objects to go up to their radius underground.
-F32 LLWorld::getMinAllowedZ(LLViewerObject* object)
+F32 LLWorld::getMinAllowedZ(LLViewerObject* object, const LLVector3d &global_pos)
{
- F32 land_height = resolveLandHeightGlobal(object->getPositionGlobal());
+ F32 land_height = resolveLandHeightGlobal(global_pos);
F32 radius = 0.5f * object->getScale().length();
return land_height - radius;
}
+
LLViewerRegion* LLWorld::resolveRegionGlobal(LLVector3 &pos_region, const LLVector3d &pos_global)
{
LLViewerRegion *regionp = getRegionFromPosGlobal(pos_global);
diff --git a/indra/newview/llworld.h b/indra/newview/llworld.h
index c60dc8dc29..d8ab4bc508 100644
--- a/indra/newview/llworld.h
+++ b/indra/newview/llworld.h
@@ -89,7 +89,7 @@ public:
// Return the lowest allowed Z point to prevent objects from being moved
// underground.
- F32 getMinAllowedZ(LLViewerObject* object);
+ F32 getMinAllowedZ(LLViewerObject* object, const LLVector3d &global_pos);
// takes a line segment defined by point_a and point_b, then
// determines the closest (to point_a) point of intersection that is
diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml
index 50d0011338..36108442f3 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences.xml
@@ -65,13 +65,6 @@
name="display" />
<panel
class="panel_preference"
- filename="panel_preferences_privacy.xml"
- label="Privacy"
- layout="topleft"
- help_topic="preferences_im_tab"
- name="im" />
- <panel
- class="panel_preference"
filename="panel_preferences_sound.xml"
label="Sound &amp; Media"
layout="topleft"
@@ -86,6 +79,13 @@
name="chat" />
<panel
class="panel_preference"
+ filename="panel_preferences_move.xml"
+ label="Move &amp; View"
+ layout="topleft"
+ help_topic="preferences_move_tab"
+ name="audio" />
+ <panel
+ class="panel_preference"
filename="panel_preferences_alerts.xml"
label="Notifications"
layout="topleft"
@@ -93,6 +93,20 @@
name="msgs" />
<panel
class="panel_preference"
+ filename="panel_preferences_colors.xml"
+ label="Colors"
+ layout="topleft"
+ help_topic="preferences_im_tab"
+ name="colors" />
+ <panel
+ class="panel_preference"
+ filename="panel_preferences_privacy.xml"
+ label="Privacy"
+ layout="topleft"
+ help_topic="preferences_im_tab"
+ name="im" />
+ <panel
+ class="panel_preference"
filename="panel_preferences_setup.xml"
label="Setup"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 006d7895b2..15d1222d00 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -13,238 +13,17 @@
name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <panel.string
- name="middle_mouse">
- Middle Mouse
- </panel.string>
- <slider
- can_edit_text="false"
- control_name="ActiveFloaterTransparency"
- decimal_digits="2"
- follows="left|top"
- height="16"
- increment="0.01"
- initial_value="0.8"
- layout="topleft"
- label_width="120"
- label="Active floater opacity:"
- left="240"
- max_val="1.00"
- min_val="0.00"
- name="active"
- show_text="true"
- top="75"
- width="290" />
- <slider
- can_edit_text="false"
- control_name="InactiveFloaterTransparency"
- decimal_digits="2"
- follows="left|top"
- height="16"
- increment="0.01"
- initial_value="0.5"
- layout="topleft"
- label_width="120"
- label="Inctive floater opacity:"
- left="240"
- max_val="1.00"
- min_val="0.00"
- name="active"
- show_text="true"
- top_pad="15"
- width="290" />
- <icon
- follows="left|top"
- height="18"
- image_name="Cam_FreeCam_Off"
- layout="topleft"
- name="camera_icon"
- mouse_opaque="false"
- visible="true"
- width="18"
- left="30"
- top="10"/>
- <slider
- can_edit_text="true"
- control_name="CameraAngle"
- decimal_digits="2"
- follows="left|top"
- height="16"
- increment="0.025"
- initial_value="1.57"
- layout="topleft"
- label_width="100"
- label="View angle"
- left_pad="30"
- max_val="2.97"
- min_val="0.17"
- name="camera_fov"
- show_text="false"
- width="240" />
- <slider
- can_edit_text="true"
- control_name="CameraOffsetScale"
- decimal_digits="2"
- follows="left|top"
- height="16"
- increment="0.025"
- initial_value="1"
- layout="topleft"
- label="Distance"
- left_delta="0"
- label_width="100"
- max_val="3"
- min_val="0.5"
- name="camera_offset_scale"
- show_text="false"
- width="240"
- top_pad="5"/>
- <text
- follows="left|top"
- type="string"
- length="1"
- height="10"
- left="80"
- name="heading2"
- width="240"
- top_pad="5">
-Automatic position for:
- </text>
- <check_box
- control_name="EditCameraMovement"
- height="20"
- follows="left|top"
- label="Build/Edit"
- layout="topleft"
- left_delta="30"
- name="edit_camera_movement"
- tool_tip="Use automatic camera positioning when entering and exiting edit mode"
- width="280"
- top_pad="5" />
- <check_box
- control_name="AppearanceCameraMovement"
- follows="left|top"
- height="16"
- label="Appearance"
- layout="topleft"
- name="appearance_camera_movement"
- tool_tip="Use automatic camera positioning while in edit mode"
- width="242" />
- <check_box
- control_name="SidebarCameraMovement"
- follows="left|top"
- height="16"
- initial_value="true"
- label="Sidebar"
- layout="topleft"
- name="appearance_sidebar_positioning"
- tool_tip="Use automatic camera positioning for sidebar"
- width="242" />
- <icon
- follows="left|top"
- height="18"
- image_name="Move_Walk_Off"
- layout="topleft"
- name="avatar_icon"
- mouse_opaque="false"
- visible="true"
- width="18"
- top_pad="2"
- left="30"
- />
- <check_box
- control_name="FirstPersonAvatarVisible"
- follows="left|top"
- height="20"
- label="Show me in Mouselook"
- layout="topleft"
- left_pad="30"
- name="first_person_avatar_visible"
- width="256" />
-
- <check_box
- control_name="ArrowKeysAlwaysMove"
- follows="left|top"
- height="20"
- label="Arrow keys always move me"
- layout="topleft"
- left_delta="0"
- name="arrow_keys_move_avatar_check"
- width="237"
- top_pad="0"/>
- <check_box
- control_name="AllowTapTapHoldRun"
- follows="left|top"
- height="20"
- label="Tap-tap-hold to run"
- layout="topleft"
- left_delta="0"
- name="tap_tap_hold_to_run"
- width="237"
- top_pad="0"/>
- <check_box
- control_name="LipSyncEnabled"
- follows="left|top"
- height="20"
- label="Move avatar lips when speaking"
- layout="topleft"
- left_delta="0"
- name="enable_lip_sync"
- width="237"
- top_pad="0" />
- <check_box
- control_name="UseChatBubbles"
- follows="left|top"
- height="16"
- label="Bubble chat"
- layout="topleft"
- left="78"
- top_pad="6"
- name="bubble_text_chat"
- width="150" />
- <slider
- control_name="ChatBubbleOpacity"
- follows="left|top"
- height="16"
- increment="0.05"
- initial_value="1"
- label="Opacity"
- layout="topleft"
- left="80"
- label_width="156"
- name="bubble_chat_opacity"
- top_pad = "10"
- width="347" />
- <color_swatch
- can_apply_immediately="true"
- color="0 0 0 1"
- control_name="BackgroundChatColor"
- follows="left|top"
- height="50"
- layout="topleft"
- left_pad="30"
- top="190"
- name="background"
- tool_tip="Choose color for bubble chat"
- width="38">
- <color_swatch.init_callback
- function="Pref.getUIColor"
- parameter="BackgroundChatColor" />
- <color_swatch.commit_callback
- function="Pref.applyUIColor"
- parameter="BackgroundChatColor" />
- </color_swatch>
<text
type="string"
length="1"
follows="left|top"
height="12"
layout="topleft"
- left="80"
+ left="33"
name="UI Size:"
top_pad="25"
- width="160">
- UI size
+ width="100">
+ UI size:
</text>
<slider
control_name="UIScaleFactor"
@@ -259,7 +38,7 @@ Automatic position for:
min_val="0.75"
name="ui_scale_slider"
top_pad="-14"
- width="180" />
+ width="250" />
<check_box
control_name="ShowScriptErrors"
follows="left|top"
@@ -298,65 +77,41 @@ Automatic position for:
top_delta="0"
width="315" />
</radio_group>
- <check_box
+
+ <check_box
follows="top|left"
- enabled_control="EnableVoiceChat"
- control_name="PushToTalkToggle"
height="15"
- label="Toggle speak on/off when I press:"
+ label="Allow Multiple Viewer"
layout="topleft"
left="30"
- name="push_to_talk_toggle_check"
- width="237"
- tool_tip="When in toggle mode, press and release the trigger key ONCE to switch your microphone on or off. When not in toggle mode, the microphone broadcasts your voice only while the trigger is being held down."/>
- <line_editor
+ name="allow_multiple_viewer_check"
+ top_pad="20"
+ width="237"/>
+ <check_box
follows="top|left"
- control_name="PushToTalkButton"
- enabled="false"
- enabled_control="EnableVoiceChat"
- height="23"
- left="80"
- max_length_bytes="200"
- name="modifier_combo"
- label="Push-to-Speak trigger"
+ height="15"
+ label="Show Grid Selection at login"
+ layout="topleft"
+ left="30"
+ name="show_grid_selection_check"
top_pad="5"
- width="200" />
- <button
- layout="topleft"
+ width="237"/>
+ <check_box
follows="top|left"
- enabled_control="EnableVoiceChat"
- height="23"
- label="Set Key"
- left_pad="5"
- name="set_voice_hotkey_button"
- width="100">
- <button.commit_callback
- function="Pref.VoiceSetKey" />
- </button>
- <button
- enabled_control="EnableVoiceChat"
+ height="15"
+ label="Show Advanced Menu"
+ layout="topleft"
+ left="30"
+ name="show_advanced_menu_check"
+ top_pad="5"
+ width="237"/>
+ <check_box
follows="top|left"
- halign="center"
- height="23"
- image_overlay="Refresh_Off"
- layout="topleft"
- tool_tip="Reset to Middle Mouse Button"
- mouse_opaque="true"
- name="set_voice_middlemouse_button"
- left_pad="5"
- width="25">
- <button.commit_callback
- function="Pref.VoiceSetMiddleMouse" />
- </button>
- <button
- height="23"
- label="Other Devices"
- left="30"
- name="joystick_setup_button"
- top_pad="27"
- width="155">
- <button.commit_callback
- function="Floater.Show"
- parameter="pref_joystick" />
- </button>
+ height="15"
+ label="Show Developer Menu"
+ layout="topleft"
+ left="30"
+ name="show_develop_menu_check"
+ top_pad="5"
+ width="237"/>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index 85824c2576..a1082d9c32 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -23,7 +23,7 @@
height="30"
layout="topleft"
left="40"
- control_name="ChatFontSize"
+ control_name="ChatFontSize"
name="chat_font_size"
top_pad="0"
width="440">
@@ -55,291 +55,7 @@
top_delta="0"
width="125" />
</radio_group>
-
- <text
- follows="left|top"
- layout="topleft"
- left="30"
- height="12"
- name="font_colors"
- top_pad="10"
- width="120"
- >
- Font colors:
- </text>
-
- <color_swatch
- can_apply_immediately="true"
- follows="left|top"
- height="47"
- layout="topleft"
- left="40"
- name="user"
- top_pad="10"
- width="44" >
- <color_swatch.init_callback
- function="Pref.getUIColor"
- parameter="UserChatColor" />
- <color_swatch.commit_callback
- function="Pref.applyUIColor"
- parameter="UserChatColor" />
- </color_swatch>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_pad="5"
- mouse_opaque="false"
- name="text_box1"
- top_delta="5"
- width="95">
- Me
- </text>
- <color_swatch
- can_apply_immediately="true"
- follows="left|top"
- height="47"
- layout="topleft"
- left="190"
- name="agent"
- top_pad="-15"
- width="44" >
- <color_swatch.init_callback
- function="Pref.getUIColor"
- parameter="AgentChatColor" />
- <color_swatch.commit_callback
- function="Pref.applyUIColor"
- parameter="AgentChatColor" />
- </color_swatch>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_pad="5"
- mouse_opaque="false"
- name="text_box2"
- top_delta="5"
- width="95">
- Others
- </text>
- <color_swatch
- can_apply_immediately="true"
- color="LtGray"
- follows="left|top"
- height="47"
- label_width="60"
- layout="topleft"
- left="360"
- name="im"
- top_pad="-15"
- width="44">
- <color_swatch.init_callback
- function="Pref.getUIColor"
- parameter="IMChatColor" />
- <color_swatch.commit_callback
- function="Pref.applyUIColor"
- parameter="IMChatColor" />
- </color_swatch>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_pad="5"
- mouse_opaque="false"
- name="text_box3"
- top_delta="5"
- width="95">
- IM
- </text>
- <color_swatch
- can_apply_immediately="true"
- color="LtGray"
- follows="left|top"
- height="47"
- label_width="44"
- layout="topleft"
- left="40"
- name="system"
- top_pad="22"
- width="44" >
- <color_swatch.init_callback
- function="Pref.getUIColor"
- parameter="SystemChatColor" />
- <color_swatch.commit_callback
- function="Pref.applyUIColor"
- parameter="SystemChatColor" />
- </color_swatch>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_pad="5"
- mouse_opaque="false"
- name="text_box4"
- top_delta="5"
- width="95">
- System
- </text>
- <color_swatch
- can_apply_immediately="true"
- color="Red"
- follows="left|top"
- height="47"
- layout="topleft"
- left="190"
- name="script_error"
- top_pad="-15"
- width="44">
- <color_swatch.init_callback
- function="Pref.getUIColor"
- parameter="ScriptErrorColor" />
- <color_swatch.commit_callback
- function="Pref.applyUIColor"
- parameter="ScriptErrorColor" />
- </color_swatch>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_pad="5"
- mouse_opaque="false"
- name="text_box5"
- top_delta="5"
- width="95">
- Errors
- </text>
- <color_swatch
- can_apply_immediately="true"
- color="EmphasisColor_35"
- follows="left|top"
- height="47"
- layout="topleft"
- left="360"
- name="objects"
- top_pad="-15"
- width="44" >
- <color_swatch.init_callback
- function="Pref.getUIColor"
- parameter="ObjectChatColor" />
- <color_swatch.commit_callback
- function="Pref.applyUIColor"
- parameter="ObjectChatColor" />
- </color_swatch>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_pad="5"
- mouse_opaque="false"
- name="text_box6"
- top_delta="5"
- width="95">
- Objects
- </text>
- <color_swatch
- can_apply_immediately="true"
- color="LtYellow"
- follows="left|top"
- height="47"
- layout="topleft"
- left="40"
- name="owner"
- top_pad="22"
- width="44" >
- <color_swatch.init_callback
- function="Pref.getUIColor"
- parameter="llOwnerSayChatColor" />
- <color_swatch.commit_callback
- function="Pref.applyUIColor"
- parameter="llOwnerSayChatColor" />
- </color_swatch>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_pad="5"
- mouse_opaque="false"
- name="text_box7"
- top_delta="5"
- width="95">
- Owner
- </text>
- <color_swatch
- can_apply_immediately="true"
- color="EmphasisColor"
- follows="left|top"
- height="47"
- layout="topleft"
- left="190"
- name="links"
- top_pad="-15"
- width="44" >
- <color_swatch.init_callback
- function="Pref.getUIColor"
- parameter="HTMLLinkColor" />
- <color_swatch.commit_callback
- function="Pref.applyUIColor"
- parameter="HTMLLinkColor" />
- </color_swatch>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_pad="5"
- mouse_opaque="false"
- name="text_box9"
- top_delta="5"
- width="95">
- URLs
- </text>
- <spinner
- control_name="NearbyToastLifeTime"
- decimal_digits="0"
- follows="left|top"
- height="23"
- increment="1"
- initial_value="23"
- label="Nearby chat toasts life time:"
- label_width="190"
- layout="topleft"
- left="290"
- max_val="60"
- min_val="1"
- name="nearby_toasts_lifetime"
- top_pad="33"
- width="210" />
- <spinner
- control_name="NearbyToastFadingTime"
- decimal_digits="0"
- follows="left|top"
- height="23"
- increment="1"
- initial_value="3"
- label="Nearby chat toasts fading time:"
- label_width="190"
- layout="topleft"
- left_delta="00"
- max_val="60"
- min_val="0"
- name="nearby_toasts_fadingtime"
- top_pad="15"
- width="210" />
+
<check_box
control_name="PlayTypingAnim"
height="16"
@@ -348,7 +64,7 @@
layout="topleft"
left="30"
name="play_typing_animation"
- top="205"
+ top_pad="10"
width="400" />
<check_box
enabled="false"
@@ -368,6 +84,16 @@
name="plain_text_chat_history"
top_pad="5"
width="400" />
+ <check_box
+ control_name="UseChatBubbles"
+ follows="left|top"
+ height="16"
+ label="Bubble Chat"
+ layout="topleft"
+ left_delta="0"
+ top_pad="5"
+ name="bubble_text_chat"
+ width="150" />
<text
name="show_ims_in_label"
follows="left|top"
@@ -375,7 +101,7 @@
left="30"
height="20"
width="170"
- top_pad="7">
+ top_pad="15">
Show IMs in:
</text>
<text
@@ -385,9 +111,8 @@
top_delta="0"
left="170"
height="20"
- width="130"
- text_color="White_25"
- >
+ width="130"
+ text_color="White_25">
(requires restart)
</text>
<radio_group
@@ -401,7 +126,7 @@
width="150">
<radio_item
height="16"
- label="Separate windows"
+ label="Separate Windows"
layout="topleft"
left="0"
name="radio"
@@ -422,19 +147,19 @@
name="disable_toast_label"
follows="left|top"
layout="topleft"
- top_delta="-22"
- left="280"
+ top_pad="20"
+ left="30"
height="10"
width="180">
- Enable Incoming Chat popups:
+ Enable incoming chat popups:
</text>
<check_box
control_name="EnableGroupChatPopups"
name="EnableGroupChatPopups"
label="Group Chats"
layout="topleft"
- top_delta="18"
- left="295"
+ top_pad="5"
+ left_delta="10"
height="20"
tool_tip="Check to see popups when a Group Chat message arrives"
width="400" />
@@ -443,11 +168,43 @@
name="EnableIMChatPopups"
label="IM Chats"
layout="topleft"
- top_delta="22"
- left="295"
- height="20"
+ top_pad="5"
+ height="16"
tool_tip="Check to see popups when an instant message arrives"
width="400" />
+ <spinner
+ control_name="NearbyToastLifeTime"
+ decimal_digits="0"
+ follows="left|top"
+ height="23"
+ increment="1"
+ initial_value="23"
+ label="Nearby chat toasts life time:"
+ label_width="190"
+ layout="topleft"
+ left="45"
+ max_val="60"
+ min_val="1"
+ name="nearby_toasts_lifetime"
+ top_pad="10"
+ width="230" />
+ <spinner
+ control_name="NearbyToastFadingTime"
+ decimal_digits="0"
+ follows="left|top"
+ height="23"
+ increment="1"
+ initial_value="3"
+ label="Nearby chat toasts fading time:"
+ label_width="190"
+ layout="topleft"
+ left_delta="0"
+ max_val="60"
+ min_val="0"
+ name="nearby_toasts_fadingtime"
+ top_pad="3"
+ width="230" />
+
<check_box
control_name="TranslateChat"
enabled="true"
@@ -456,7 +213,7 @@
layout="topleft"
left="30"
name="translate_chat_checkbox"
- bottom_delta="40"
+ bottom_delta="30"
width="400" />
<text
bottom_delta="30"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
new file mode 100644
index 0000000000..036730a646
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
@@ -0,0 +1,346 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ border="true"
+ follows="left|top|right|bottom"
+ height="408"
+ label="Colors"
+ layout="topleft"
+ left="102"
+ name="colors_panel"
+ top="1"
+ width="517">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="30"
+ name="effects_color_textbox"
+ top_pad="10"
+ width="200">
+ My effects (selection beam):
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="40"
+ name="effect_color_swatch"
+ tool_tip="Click to open Color Picker"
+ width="44">
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="EffectColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="EffectColor" />
+ <color_swatch.caption_text
+ height="0" />
+ </color_swatch>
+ <text
+ follows="left|top"
+ layout="topleft"
+ left="30"
+ height="12"
+ name="font_colors"
+ top_pad="20"
+ width="120"
+ >
+ Chat font colors:
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="40"
+ name="user"
+ top_pad="10"
+ width="44" >
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="UserChatColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="UserChatColor" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="text_box1"
+ top_delta="5"
+ width="95">
+ Me
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="190"
+ name="agent"
+ top_pad="-15"
+ width="44" >
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="AgentChatColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="AgentChatColor" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="text_box2"
+ top_delta="5"
+ width="95">
+ Others
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ color="LtGray"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ label_width="60"
+ layout="topleft"
+ left="360"
+ name="im"
+ top_pad="-15"
+ width="44">
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="IMChatColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="IMChatColor" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="text_box3"
+ top_delta="5"
+ width="95">
+ IM
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ color="LtGray"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ label_width="44"
+ layout="topleft"
+ left="40"
+ name="system"
+ top_pad="22"
+ width="44" >
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="SystemChatColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="SystemChatColor" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="text_box4"
+ top_delta="5"
+ width="95">
+ System
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ color="Red"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="190"
+ name="script_error"
+ top_pad="-15"
+ width="44">
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="ScriptErrorColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="ScriptErrorColor" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="text_box5"
+ top_delta="5"
+ width="95">
+ Errors
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ color="EmphasisColor_35"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="360"
+ name="objects"
+ top_pad="-15"
+ width="44" >
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="ObjectChatColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="ObjectChatColor" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="text_box6"
+ top_delta="5"
+ width="95">
+ Objects
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ color="LtYellow"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="40"
+ name="owner"
+ top_pad="22"
+ width="44" >
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="llOwnerSayChatColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="llOwnerSayChatColor" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="text_box7"
+ top_delta="5"
+ width="95">
+ Owner
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ color="EmphasisColor"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="190"
+ name="links"
+ top_pad="-15"
+ width="44" >
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="HTMLLinkColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="HTMLLinkColor" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="text_box9"
+ top_delta="5"
+ width="95">
+ URLs
+ </text>
+ <text
+ follows="left|top"
+ layout="topleft"
+ left="30"
+ height="12"
+ name="bubble_chat"
+ top_pad="28"
+ width="120"
+ >
+ Bubble chat:
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ color="0 0 0 1"
+ control_name="BackgroundChatColor"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left_delta="10"
+ top_pad="5"
+ name="background"
+ tool_tip="Choose color for bubble chat"
+ width="44">
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="BackgroundChatColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="BackgroundChatColor" />
+ </color_swatch>
+ <slider
+ control_name="ChatBubbleOpacity"
+ follows="left|top"
+ height="16"
+ increment="0.05"
+ initial_value="1"
+ label="Opacity"
+ layout="topleft"
+ left_pad="15"
+ label_width="56"
+ name="bubble_chat_opacity"
+ top_delta = "6"
+ width="347" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
index 392d50fc42..a660b5d785 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -106,7 +106,7 @@
height="15"
layout="topleft"
left="30"
- top_pad="14"
+ top_pad="8"
name="maturity_desired_prompt"
width="200">
I want to access content rated:
@@ -177,7 +177,7 @@
layout="topleft"
left="30"
name="start_location_textbox"
- top_pad="15"
+ top_pad="8"
width="394">
Start location:
</text>
@@ -216,7 +216,7 @@
layout="topleft"
left="30"
name="name_tags_textbox"
- top_pad="14"
+ top_pad="10"
width="400">
Name tags:
</text>
@@ -224,8 +224,8 @@
control_name="AvatarNameTagMode"
height="20"
layout="topleft"
- left="50"
- top_pad="5"
+ left="35"
+ top_pad="0"
name="Name_Tag_Preference">
<radio_item
label="Off"
@@ -261,9 +261,9 @@
height="16"
label="My name"
layout="topleft"
- left="70"
+ left="35"
name="show_my_name_checkbox1"
- top_pad="0"
+ top_pad="2"
width="100" />
<check_box
control_name="NameTagShowUsernames"
@@ -271,7 +271,7 @@
height="16"
label="Usernames"
layout="topleft"
- left_pad="70"
+ left_pad="50"
name="show_slids"
tool_tip="Show username, like bobsmith123"
top_delta="0" />
@@ -281,72 +281,102 @@
height="16"
label="Group titles"
layout="topleft"
- left="70"
+ left="35"
width="100"
name="show_all_title_checkbox1"
tool_tip="Show group titles, like Officer or Member"
- top_pad="5" />
-
- <check_box
- control_name="NameTagShowFriends"
+ top_pad="3" />
+ <check_box
+ control_name="NameTagShowFriends"
enabled_control="AvatarNameTagMode"
height="16"
- label="Highlight friends"
+ label="Highlight friends"
layout="topleft"
- left_pad="70"
- name="show_friends"
- tool_tip="Highlight the name tags of your friends"
- top_delta="0" />
-
+ left_pad="50"
+ name="show_friends"
+ tool_tip="Highlight the name tags of your friends"/>
+ <check_box
+ control_name="UseDisplayNames"
+ follows="top|left"
+ height="16"
+ label="View Display Names"
+ layout="topleft"
+ left="35"
+ name="display_names_check"
+ width="237"
+ tool_tip="Check to use display names in chat, IM, name tags, etc."
+ top_pad="3"/>
+
+ <check_box
+ control_name="EnableUIHints"
+ follows="top|left"
+ height="16"
+ label="Enable Viewer UI Hints"
+ layout="topleft"
+ left="27"
+ name="viewer_hints_check"
+ top_pad="5"
+ width="237"/>
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="30"
+ name="inworld_typing_rg_label"
+ top_pad="6"
+ width="400">
+ Pressing letter keys:
+ </text>
+ <radio_group
+ height="20"
+ layout="topleft"
+ left="35"
+ top_pad="0"
+ name="inworld_typing_preference">
+ <radio_item
+ label="Starts local chat"
+ name="radio_button1"
+ top_delta="20"
+ layout="topleft"
+ height="16"
+ left="0"
+ value="0"
+ width="150" />
+ <radio_item
+ label="Affects movement (i.e. WASD)"
+ left_pad="0"
+ layout="topleft"
+ top_delta="0"
+ height="16"
+ name="radio_button2"
+ value="1"
+ width="75" />
+ </radio_group>
+
<text
type="string"
length="1"
follows="left|top"
- height="15"
+ height="13"
layout="topleft"
left="30"
- name="effects_color_textbox"
- top_pad="9"
- width="200">
- My effects:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="13"
- layout="topleft"
- left_pad="5"
- name="title_afk_text"
- top_delta="0"
- width="190">
- Away timeout:
+ name="title_afk_text"
+ top_pad="4"
+ width="190">
+ Away timeout:
</text>
- <color_swatch
- can_apply_immediately="true"
- follows="left|top"
- height="50"
- layout="topleft"
- left="50"
- name="effect_color_swatch"
- tool_tip="Click to open Color Picker"
- width="38">
- <color_swatch.init_callback
- function="Pref.getUIColor"
- parameter="EffectColor" />
- <color_swatch.commit_callback
- function="Pref.applyUIColor"
- parameter="EffectColor" />
- </color_swatch>
<combo_box
- height="23"
- layout="topleft"
- control_name="AFKTimeout"
- left_pad="160"
- label="Away timeout:"
- top_delta="0"
- name="afk"
- width="130">
+ height="23"
+ layout="topleft"
+ control_name="AFKTimeout"
+ left="30"
+ label="Away timeout:"
+ top_pad="2"
+ name="afk"
+ width="130">
<combo_box.item
label="2 minutes"
name="item0"
@@ -368,17 +398,6 @@
name="item4"
value="0" />
</combo_box>
- <check_box
-control_name="UseDisplayNames"
-follows="top|left"
-height="14"
-label="View Display Names"
-layout="topleft"
-left="30"
-name="display_names_check"
-width="237"
-tool_tip="Check to use display names in chat, IM, name tags, etc."
-top_pad="20"/>
<text
type="string"
length="1"
@@ -388,7 +407,7 @@ top_pad="20"/>
left="30"
mouse_opaque="false"
name="text_box3"
- top_pad="10"
+ top_pad="5"
width="240">
Busy mode response:
</text>
@@ -399,11 +418,11 @@ top_pad="20"/>
use_ellipses="false"
commit_on_focus_lost = "true"
follows="left|top"
- height="42"
+ height="29"
layout="topleft"
left="50"
name="busy_response"
- width="450"
+ width="470"
word_wrap="true">
log_in_to_change
</text_editor>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_move.xml b/indra/newview/skins/default/xui/en/panel_preferences_move.xml
new file mode 100644
index 0000000000..ec80efe188
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_preferences_move.xml
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ border="true"
+ follows="left|top|right|bottom"
+ height="408"
+ label="Move"
+ layout="topleft"
+ left="102"
+ name="move_panel"
+ top="1"
+ width="517">
+ <icon
+ follows="left|top"
+ height="18"
+ image_name="Cam_FreeCam_Off"
+ layout="topleft"
+ name="camera_icon"
+ mouse_opaque="false"
+ visible="true"
+ width="18"
+ left="30"
+ top="10"/>
+ <slider
+ can_edit_text="true"
+ control_name="CameraAngle"
+ decimal_digits="2"
+ follows="left|top"
+ height="16"
+ increment="0.025"
+ initial_value="1.57"
+ layout="topleft"
+ label_width="100"
+ label="View angle"
+ left_pad="30"
+ max_val="2.97"
+ min_val="0.17"
+ name="camera_fov"
+ show_text="false"
+ width="240" />
+ <slider
+ can_edit_text="true"
+ control_name="CameraOffsetScale"
+ decimal_digits="2"
+ follows="left|top"
+ height="16"
+ increment="0.025"
+ initial_value="1"
+ layout="topleft"
+ label="Distance"
+ left_delta="0"
+ label_width="100"
+ max_val="3"
+ min_val="0.5"
+ name="camera_offset_scale"
+ show_text="false"
+ width="240"
+ top_pad="5"/>
+ <text
+ follows="left|top"
+ type="string"
+ length="1"
+ height="10"
+ left="80"
+ name="heading2"
+ width="270"
+ top_pad="5">
+ Automatic position for:
+ </text>
+ <check_box
+ control_name="EditCameraMovement"
+ height="20"
+ follows="left|top"
+ label="Build/Edit"
+ layout="topleft"
+ left_delta="30"
+ name="edit_camera_movement"
+ tool_tip="Use automatic camera positioning when entering and exiting edit mode"
+ width="280"
+ top_pad="5" />
+ <check_box
+ control_name="AppearanceCameraMovement"
+ follows="left|top"
+ height="16"
+ label="Appearance"
+ layout="topleft"
+ name="appearance_camera_movement"
+ tool_tip="Use automatic camera positioning while in edit mode"
+ width="242" />
+ <check_box
+ control_name="SidebarCameraMovement"
+ follows="left|top"
+ height="16"
+ initial_value="true"
+ label="Sidebar"
+ layout="topleft"
+ name="appearance_sidebar_positioning"
+ tool_tip="Use automatic camera positioning for sidebar"
+ width="242" />
+ <icon
+ follows="left|top"
+ height="18"
+ image_name="Move_Walk_Off"
+ layout="topleft"
+ name="avatar_icon"
+ mouse_opaque="false"
+ visible="true"
+ width="18"
+ top_pad="2"
+ left="30" />
+ <check_box
+ control_name="FirstPersonAvatarVisible"
+ follows="left|top"
+ height="20"
+ label="Show me in Mouselook"
+ layout="topleft"
+ left_pad="30"
+ name="first_person_avatar_visible"
+ width="256" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="3"
+ name=" Mouse Sensitivity"
+ top_pad="10"
+ width="160">
+ Mouselook mouse sensitivity:
+ </text>
+ <slider
+ control_name="MouseSensitivity"
+ follows="left|top"
+ height="15"
+ initial_value="2"
+ layout="topleft"
+ show_text="false"
+ left_pad="5"
+ max_val="15"
+ name="mouse_sensitivity"
+ top_delta="-1"
+ width="145" />
+ <check_box
+ control_name="InvertMouse"
+ height="16"
+ label="Invert"
+ layout="topleft"
+ left_pad="2"
+ name="invert_mouse"
+ top_delta="0"
+ width="128" />
+ <check_box
+ control_name="ArrowKeysAlwaysMove"
+ follows="left|top"
+ height="20"
+ label="Arrow keys always move me"
+ layout="topleft"
+ left="78"
+ name="arrow_keys_move_avatar_check"
+ width="237"
+ top_pad="1"/>
+ <check_box
+ control_name="AllowTapTapHoldRun"
+ follows="left|top"
+ height="20"
+ label="Tap-tap-hold to run"
+ layout="topleft"
+ left_delta="0"
+ name="tap_tap_hold_to_run"
+ width="237"
+ top_pad="0"/>
+ <check_box
+ follows="left|top"
+ height="20"
+ label="Double-Click to:"
+ layout="topleft"
+ left_delta="0"
+ name="double_click_chkbox"
+ width="237"
+ top_pad="0"/>
+ <radio_group
+ height="20"
+ layout="topleft"
+ left_delta="17"
+ top_pad="2"
+ name="double_click_action">
+ <radio_item
+ height="16"
+ label="Teleport"
+ layout="topleft"
+ left="0"
+ name="radio_teleport"
+ top_delta="20"
+ value="0"
+ width="100" />
+ <radio_item
+ height="16"
+ label="Auto-pilot"
+ left_pad="0"
+ layout="topleft"
+ name="radio_autopilot"
+ top_delta="0"
+ value="1"
+ width="75" />
+ </radio_group>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
index 4ebd4c76f8..2ddb81559f 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -47,7 +47,7 @@
layout="topleft"
left="30"
name="online_visibility"
- top_pad="20"
+ top_pad="30"
width="350" />
<check_box
enabled_control="EnableVoiceChat"
@@ -78,9 +78,9 @@
left="30"
mouse_opaque="false"
name="Logs:"
- top_pad="10"
+ top_pad="30"
width="350">
- Logs:
+ Chat Logs:
</text>
<check_box
enabled="false"
@@ -108,13 +108,23 @@
control_name="LogTimestamp"
enabled="false"
height="16"
- label="Add timestamp"
+ label="Add timestamp to each line in chat log"
layout="topleft"
left_delta="0"
name="show_timestamps_check_im"
top_pad="10"
width="237" />
- <text
+ <check_box
+ control_name="LogFileNamewithDate"
+ enabled="false"
+ height="16"
+ label="Add datestamp to log file name."
+ layout="topleft"
+ left_detla="5"
+ name="logfile_name_datestamp"
+ top_pad="10"
+ width="350"/>
+ <text
type="string"
length="1"
follows="left|top"
@@ -123,7 +133,7 @@
left_delta="0"
mouse_opaque="false"
name="log_path_desc"
- top_pad="5"
+ top_pad="30"
width="128">
Location of logs:
</text>
@@ -160,11 +170,25 @@
layout="topleft"
left="30"
name="block_list"
- top_pad="20"
+ top_pad="35"
width="145">
<!--<button.commit_callback
function="SideTray.ShowPanel"-->
<button.commit_callback
function="Pref.BlockList"/>
</button>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="10"
+ mouse_opaque="false"
+ name="cache_size_label_l"
+ top_delta="3"
+ text_color="LtGray_50"
+ width="300">
+ (People and/or Objects you have blocked)
+ </text>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
index 140d16e37f..14aa38c5d3 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -10,51 +10,6 @@
top="1"
width="517">
<text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="30"
- name="Mouselook:"
- top="10"
- width="300">
- Mouselook:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_delta="50"
- name=" Mouse Sensitivity"
- top_pad="10"
- width="150">
- Mouse sensitivity
- </text>
- <slider
- control_name="MouseSensitivity"
- follows="left|top"
- height="15"
- initial_value="2"
- layout="topleft"
- show_text="false"
- left_delta="150"
- max_val="15"
- name="mouse_sensitivity"
- top_delta="0"
- width="145" />
- <check_box
- control_name="InvertMouse"
- height="16"
- label="Invert"
- layout="topleft"
- left_pad="2"
- name="invert_mouse"
- top_delta="0"
- width="128" />
- <text
type="string"
length="1"
follows="left|top"
@@ -63,7 +18,7 @@
left="30"
name="Network:"
mouse_opaque="false"
- top_pad="4"
+ top="10"
width="300">
Network:
</text>
@@ -187,7 +142,7 @@
layout="topleft"
left="80"
name="Cache location"
- top_delta="20"
+ top_delta="40"
width="300">
Cache location:
</text>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index aa760edad3..8ade41f587 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -9,6 +9,10 @@
name="Preference Media panel"
top="1"
width="517">
+ <panel.string
+ name="middle_mouse">
+ Middle Mouse
+ </panel.string>
<slider
control_name="AudioLevelMaster"
follows="left|top"
@@ -66,7 +70,7 @@
name="UI Volume"
show_text="false"
slider_label.halign="right"
- top_pad="7"
+ top_pad="5"
volume="true"
width="300">
<slider.commit_callback
@@ -100,7 +104,7 @@
name="Wind Volume"
show_text="false"
slider_label.halign="right"
- top_pad="7"
+ top_pad="5"
volume="true"
width="300">
<slider.commit_callback
@@ -168,7 +172,7 @@
name="Music Volume"
slider_label.halign="right"
show_text="false"
- top_pad="7"
+ top_pad="5"
volume="true"
width="300">
<slider.commit_callback
@@ -211,7 +215,7 @@
name="Media Volume"
show_text="false"
slider_label.halign="right"
- top_pad="7"
+ top_pad="5"
volume="true"
width="300">
<slider.commit_callback
@@ -253,7 +257,7 @@
label_width="120"
layout="topleft"
left="0"
- top_delta="20"
+ top_pad="5"
name="Voice Volume"
show_text="false"
slider_label.halign="right"
@@ -307,7 +311,18 @@
height="15"
tool_tip="Uncheck this to hide media attached to other avatars nearby"
label="Play media attached to other avatars"
- left="25"/>
+ left="25"
+ width="230"/>
+ <check_box
+ control_name="LipSyncEnabled"
+ follows="left|top"
+ height="20"
+ label="Move avatar lips when speaking"
+ layout="topleft"
+ left_pad="0"
+ name="enable_lip_sync"
+ width="237"
+ top_delta="-4" />
<text
type="string"
@@ -317,8 +332,8 @@
layout="topleft"
left="25"
name="voice_chat_settings"
- width="200"
- top="210">
+ width="180"
+ top_pad="10">
Voice Chat Settings
</text>
<text
@@ -329,7 +344,7 @@
left="80"
top_delta="16"
name="Listen from"
- width="142">
+ width="102">
Listen from:
</text>
<icon
@@ -341,43 +356,96 @@
mouse_opaque="false"
visible="true"
width="18"
- left_pad="0"
+ left_pad="-4"
top_delta="-5"/>
<icon
follows="left|top"
height="18"
image_name="Move_Walk_Off"
layout="topleft"
+ left_pad="130"
name="avatar_icon"
mouse_opaque="false"
visible="true"
width="18"
- top_delta="20" />
+ top_delta="0" />
<radio_group
enabled_control="EnableVoiceChat"
control_name="VoiceEarLocation"
draw_border="false"
follows="left|top"
layout="topleft"
- left_pad="2"
+ left_delta="-128"
width="221"
- height="38"
+ height="20"
name="ear_location">
<radio_item
- height="16"
+ height="19"
label="Camera position"
follows="left|top"
layout="topleft"
name="0"
width="200"/>
<radio_item
- height="16"
+ height="19"
follows="left|top"
label="Avatar position"
layout="topleft"
+ left_pad="-54"
name="1"
+ top_delta ="0"
width="200" />
</radio_group>
+ <check_box
+ follows="top|left"
+ enabled_control="EnableVoiceChat"
+ control_name="PushToTalkToggle"
+ height="15"
+ label="Toggle speak on/off when I press:"
+ layout="topleft"
+ left="30"
+ name="push_to_talk_toggle_check"
+ width="237"
+ tool_tip="When in toggle mode, press and release the trigger key ONCE to switch your microphone on or off. When not in toggle mode, the microphone broadcasts your voice only while the trigger is being held down."/>
+ <line_editor
+ follows="top|left"
+ control_name="PushToTalkButton"
+ enabled="false"
+ enabled_control="EnableVoiceChat"
+ height="23"
+ left="80"
+ max_length_bytes="200"
+ name="modifier_combo"
+ label="Push-to-Speak trigger"
+ top_pad="3"
+ width="200" />
+ <button
+ layout="topleft"
+ follows="top|left"
+ enabled_control="EnableVoiceChat"
+ height="23"
+ label="Set Key"
+ left_pad="5"
+ name="set_voice_hotkey_button"
+ width="100">
+ <button.commit_callback
+ function="Pref.VoiceSetKey" />
+ </button>
+ <button
+ enabled_control="EnableVoiceChat"
+ follows="top|left"
+ halign="center"
+ height="23"
+ image_overlay="Refresh_Off"
+ layout="topleft"
+ tool_tip="Reset to Middle Mouse Button"
+ mouse_opaque="true"
+ name="set_voice_middlemouse_button"
+ left_pad="5"
+ width="25">
+ <button.commit_callback
+ function="Pref.VoiceSetMiddleMouse" />
+ </button>
<button
control_name="ShowDeviceSettings"
follows="left|top"
@@ -385,8 +453,8 @@
is_toggle="true"
label="Input/Output devices"
layout="topleft"
- left="80"
- top_pad="5"
+ left="20"
+ top_pad="8"
name="device_settings_btn"
width="190">
</button>
@@ -396,14 +464,14 @@
visiblity_control="ShowDeviceSettings"
border="false"
follows="top|left"
- height="120"
+ height="100"
label="Device Settings"
layout="topleft"
- left="0"
+ left_delta="-2"
name="device_settings_panel"
class="panel_voice_device_settings"
- width="501"
- top="285">
+ width="470"
+ top_pad="0">
<panel.string
name="default_text">
Default
@@ -419,7 +487,7 @@
<icon
height="18"
image_name="Microphone_On"
- left="80"
+ left_delta="4"
name="microphone_icon"
mouse_opaque="false"
top="7"
@@ -434,17 +502,17 @@
layout="topleft"
left_pad="3"
name="Input"
- width="200">
+ width="70">
Input
</text>
<combo_box
height="23"
control_name="VoiceInputAudioDevice"
layout="topleft"
- left="165"
+ left_pad="0"
max_chars="128"
name="voice_input_device"
- top_pad="-2"
+ top_delta="-5"
width="200" />
<text
type="string"
@@ -452,9 +520,9 @@
follows="left|top"
height="16"
layout="topleft"
- left="165"
+ left_delta="-70"
name="My volume label"
- top_pad="5"
+ top_pad="4"
width="200">
My volume:
</text>
@@ -465,11 +533,11 @@
increment="0.025"
initial_value="1.0"
layout="topleft"
- left="160"
+ left_delta="-6"
max_val="2"
name="mic_volume_slider"
tool_tip="Change the volume using this slider"
- top_pad="-2"
+ top_pad="-1"
width="220" />
<text
type="string"
@@ -480,7 +548,7 @@
layout="topleft"
left_pad="5"
name="wait_text"
- top_delta="0"
+ top_delta="-1"
width="110">
Please wait
</text>
@@ -489,7 +557,7 @@
layout="topleft"
left_delta="0"
name="bar0"
- top_delta="0"
+ top_delta="-2"
width="20" />
<locate
height="20"
@@ -522,10 +590,10 @@
<icon
height="18"
image_name="Parcel_Voice_Light"
- left="80"
+ left="5"
name="speaker_icon"
mouse_opaque="false"
- top_pad="-8"
+ top_pad="3"
visible="true"
width="22" />
<text
@@ -537,17 +605,17 @@
layout="topleft"
left_pad="0"
name="Output"
- width="200">
+ width="70">
Output
</text>
<combo_box
control_name="VoiceOutputAudioDevice"
height="23"
layout="topleft"
- left="165"
+ left_pad="0"
max_chars="128"
name="voice_output_device"
- top_pad="-2"
+ top_delta="-3"
width="200" />
</panel>
</panel>