More WIP moap changes. Browser elements now function, added many required settings and notifications, and fixed some crashes and other bugs.

This commit is contained in:
Shyotl
2013-06-01 05:11:18 -05:00
parent ef3e918558
commit d4a545fb16
27 changed files with 539 additions and 472 deletions

View File

@@ -307,6 +307,8 @@ public:
virtual ~StaticRegistrar() {}
StaticRegistrar(ref_const_key_t key, ref_const_value_t value)
{
if(!singleton_t::instance().mStaticScope)
mStaticScope = new ScopedRegistrar();
singleton_t::instance().mStaticScope->add(key, value);
}
};
@@ -336,7 +338,7 @@ protected:
virtual void initSingleton()
{
mStaticScope = new ScopedRegistrar();
//mStaticScope = new ScopedRegistrar();
}
virtual ~LLRegistrySingleton()

View File

@@ -56,6 +56,7 @@ bool LLPluginClassMedia::init_impl(void)
{
// Queue up the media init message -- it will be sent after all the currently queued messages.
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "init");
message.setValue("target", mTarget);
sendMessage(message);
return true;
@@ -246,16 +247,18 @@ unsigned char* LLPluginClassMedia::getBitsData()
void LLPluginClassMedia::setSize(int width, int height)
{
if (width <= 0 || height <= 0)
{
width = height = -1;
}
if (mSetMediaWidth != width || mSetMediaHeight != height)
if((width > 0) && (height > 0))
{
mSetMediaWidth = width;
mSetMediaHeight = height;
setSizeInternal();
}
else
{
mSetMediaWidth = -1;
mSetMediaHeight = -1;
}
setSizeInternal();
}
void LLPluginClassMedia::setSizeInternal(void)

View File

@@ -78,13 +78,12 @@ void LLPanel::init()
setTabStop(FALSE);
mVisibleSignal = NULL;
mCommitCallbackRegistrar = false;
mEnableCallbackRegistrar = false;
}
LLPanel::LLPanel()
: mRectControl()
: mRectControl(),
mCommitCallbackRegistrar(false),
mEnableCallbackRegistrar(false)
{
init();
setName(std::string("panel"));
@@ -92,7 +91,9 @@ LLPanel::LLPanel()
LLPanel::LLPanel(const std::string& name)
: LLUICtrl(name),
mRectControl()
mRectControl(),
mCommitCallbackRegistrar(false),
mEnableCallbackRegistrar(false)
{
init();
}
@@ -100,7 +101,9 @@ LLPanel::LLPanel(const std::string& name)
LLPanel::LLPanel(const std::string& name, const LLRect& rect, BOOL bordered)
: LLUICtrl(name,rect),
mRectControl()
mRectControl(),
mCommitCallbackRegistrar(false),
mEnableCallbackRegistrar(false)
{
init();
if (bordered)
@@ -112,7 +115,9 @@ LLPanel::LLPanel(const std::string& name, const LLRect& rect, BOOL bordered)
LLPanel::LLPanel(const std::string& name, const std::string& rect_control, BOOL bordered)
: LLUICtrl(name, LLUI::sConfigGroup->getRect(rect_control)),
mRectControl( rect_control )
mRectControl( rect_control ),
mCommitCallbackRegistrar(false),
mEnableCallbackRegistrar(false)
{
init();
if (bordered)

View File

@@ -492,9 +492,9 @@ void LLUICtrl::initFromXML(LLXMLNodePtr node, LLView* parent)
if (func)
{
if(child_node->getAttributeString("parameter",attrib_str))
setCommitCallback(boost::bind((*func), this, LLSD(attrib_str)));
setValidateCallback(boost::bind((*func), this, LLSD(attrib_str)));
else
setCommitCallback(commit_signal_t::slot_type(*func));
setValidateCallback(enable_signal_t::slot_type(*func));
}
}
}

View File

@@ -41,6 +41,17 @@
#include "lluuid.h"
#include "lldiriterator.h"
#include "stringize.h"
#include <boost/foreach.hpp>
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/bind.hpp>
#include <boost/ref.hpp>
#include <algorithm>
using boost::assign::list_of;
using boost::assign::map_list_of;
#if LL_WINDOWS
#include "lldir_win32.h"
@@ -86,12 +97,17 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask)
std::string fullpath;
S32 result;
// File masks starting with "/" will match nothing, so we consider them invalid.
if (LLStringUtil::startsWith(mask, getDirDelimiter()))
{
llwarns << "Invalid file mask: " << mask << llendl;
llassert(!"Invalid file mask");
}
LLDirIterator iter(dirname, mask);
while (iter.next(filename))
{
fullpath = dirname;
fullpath += getDirDelimiter();
fullpath += filename;
fullpath = add(dirname, filename);
if(LLFile::isdir(fullpath))
{
@@ -259,12 +275,12 @@ std::string LLDir::buildSLOSCacheDir() const
}
else
{
res = getOSUserAppDir() + mDirDelimiter + "cache_sg1";
res = add(getOSUserAppDir(), "cache_sg1");
}
}
else
{
res = getOSCacheDir() + mDirDelimiter + "SingularityViewer";
res = add(getOSCacheDir(), "SingularityViewer");
}
return res;
}
@@ -312,6 +328,39 @@ const std::string &LLDir::getLLPluginDir() const
return mLLPluginDir;
}
static std::string ELLPathToString(ELLPath location)
{
typedef std::map<ELLPath, const char*> ELLPathMap;
#define ENT(symbol) (symbol, #symbol)
static const ELLPathMap sMap = map_list_of
ENT(LL_PATH_NONE)
ENT(LL_PATH_USER_SETTINGS)
ENT(LL_PATH_APP_SETTINGS)
ENT(LL_PATH_PER_SL_ACCOUNT) // returns/expands to blank string if we don't know the account name yet
ENT(LL_PATH_CACHE)
ENT(LL_PATH_CHARACTER)
ENT(LL_PATH_HELP)
ENT(LL_PATH_LOGS)
ENT(LL_PATH_TEMP)
ENT(LL_PATH_SKINS)
ENT(LL_PATH_TOP_SKIN)
ENT(LL_PATH_CHAT_LOGS)
ENT(LL_PATH_PER_ACCOUNT_CHAT_LOGS)
ENT(LL_PATH_USER_SKIN)
ENT(LL_PATH_LOCAL_ASSETS)
ENT(LL_PATH_EXECUTABLE)
ENT(LL_PATH_DEFAULT_SKIN)
ENT(LL_PATH_FONTS)
ENT(LL_PATH_LAST)
;
#undef ENT
ELLPathMap::const_iterator found = sMap.find(location);
if (found != sMap.end())
return found->second;
return STRINGIZE("Invalid ELLPath value " << location);
}
std::string LLDir::getExpandedFilename(ELLPath location, const std::string& filename) const
{
return getExpandedFilename(location, "", filename);
@@ -403,45 +452,29 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd
llassert(0);
}
std::string filename = in_filename;
if (!subdir2.empty())
{
filename = add(subdir2, filename);
}
if (!subdir1.empty())
{
filename = add(subdir1, filename);
}
if (prefix.empty())
{
llwarns << "prefix is empty, possible bad filename" << llendl;
}
std::string expanded_filename;
if (!filename.empty())
{
if (!prefix.empty())
{
expanded_filename = add(prefix, filename);
}
else
{
expanded_filename = filename;
}
}
else if (!prefix.empty())
{
// Directory only, no file name.
expanded_filename = prefix;
}
else
{
expanded_filename.assign("");
llwarns << ELLPathToString(location)
<< ", '" << subdir1 << "', '" << subdir2 << "', '" << in_filename
<< "': prefix is empty, possible bad filename" << llendl;
}
//llinfos << "*** EXPANDED FILENAME: <" << expanded_filename << ">" << llendl;
std::string expanded_filename = add(add(prefix, subdir1), subdir2);
if (expanded_filename.empty() && in_filename.empty())
{
return "";
}
// Use explicit concatenation here instead of another add() call. Callers
// passing in_filename as "" expect to obtain a pathname ending with
// mDirSeparator so they can later directly concatenate with a specific
// filename. A caller using add() doesn't care, but there's still code
// loose in the system that uses std::string::operator+().
expanded_filename += mDirDelimiter;
expanded_filename += in_filename;
LL_DEBUGS("LLDir") << ELLPathToString(location)
<< ", '" << subdir1 << "', '" << subdir2 << "', '" << in_filename
<< "' => '" << expanded_filename << "'" << LL_ENDL;
return expanded_filename;
}

View File

@@ -1133,9 +1133,7 @@ void *updatethreadproc(void*)
llinfos << "Clearing cache..." << llendl;
char mask[LL_MAX_PATH]; /* Flawfinder: ignore */
snprintf(mask, LL_MAX_PATH, "%s*.*", gDirUtilp->getDirDelimiter().c_str());
gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""),mask);
gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""),"*.*");
llinfos << "Clear complete." << llendl;

View File

@@ -455,7 +455,6 @@ set(viewer_SOURCE_FILES
llurl.cpp
llurldispatcher.cpp
llurlhistory.cpp
llurlsimstring.cpp
llurlwhitelist.cpp
lluserauth.cpp
llvectorperfoptions.cpp
@@ -957,7 +956,6 @@ set(viewer_HEADER_FILES
llurl.h
llurldispatcher.h
llurlhistory.h
llurlsimstring.h
llurlwhitelist.h
lluserauth.h
llvectorperfoptions.h

View File

@@ -2224,6 +2224,17 @@ This should be as low as possible, but too low may break functionality</string>
<string>F32</string>
<key>Value</key>
<real>0.075</real>
</map>
<key>AudioStreamingMedia</key>
<map>
<key>Comment</key>
<string>Enable streaming</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>AudioStreamingMusic</key>
<map>
@@ -2691,23 +2702,23 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>PluginAttachDebuggerToPlugins</key>
<key>BrowserEnableJSObject</key>
<map>
<key>Comment</key>
<string>Opens a terminal window with a debugger and attach it, every time a new SLPlugin process is started.</string>
<string>(WARNING: Advanced feature. Use if you are aware of the implications). Enable or disable the viewer to Javascript bridge object.</string>
<key>Persist</key>
<integer>1</integer>
<integer>0</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
<integer>0</integer>
</map>
<key>BlockAvatarAppearanceMessages</key>
<map>
<key>Comment</key>
<string>Ignores appearance messages (for simulating Ruth)</string>
<key>Persist</key>
<integer>1</integer>
<map>
<key>Comment</key>
<string>Ignores appearance messages (for simulating Ruth)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
@@ -3769,17 +3780,6 @@ This should be as low as possible, but too low may break functionality</string>
<string/>
</array>
</map>
<key>CmdLineRegionURI</key>
<map>
<key>Comment</key>
<string>URL of region to connect to through Agent Domain.</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string/>
</map>
<key>ColorPaletteEntry01</key>
<map>
<key>Comment</key>
@@ -5419,6 +5419,17 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>DisableExternalBrowser</key>
<map>
<key>Comment</key>
<string>Disable opening an external browser.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>DisableRendering</key>
<map>
<key>Comment</key>
@@ -6014,17 +6025,6 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FirstLoginThisInstall</key>
<map>
<key>Comment</key>
<string>Specifies that you have not successfully logged in since you installed the latest update</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FirstName</key>
<map>
<key>Comment</key>
@@ -6069,6 +6069,17 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FirstLoginThisInstall</key>
<map>
<key>Comment</key>
<string>Specifies that you have not successfully logged in since you installed the latest update</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FixedWeather</key>
<map>
<key>Comment</key>
@@ -9109,16 +9120,16 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>LoginLastLocation</key>
<key>LoginLocation</key>
<map>
<key>Comment</key>
<string>Login at same location you last logged out</string>
<string>Default Login location ('last', 'home') preference</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<string>String</string>
<key>Value</key>
<integer>1</integer>
<string>last</string>
</map>
<key>LoginPage</key>
<map>
@@ -9435,13 +9446,68 @@ This should be as low as possible, but too low may break functionality</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>MemoryFailurePreventionEnabled</key>
<map>
<key>Comment</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>MediaPerformanceManagerDebug</key>
<map>
<key>Comment</key>
<string>Whether to show debug data for the media performance manager in the nearby media list.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>MediaShowOnOthers</key>
<map>
<key>Comment</key>
<string>Whether or not to show media on other avatars</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>MediaShowOutsideParcel</key>
<map>
<key>Comment</key>
<string>Whether or not to show media from outside the current parcel</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>MediaShowWithinParcel</key>
<map>
<key>Comment</key>
<string>Whether or not to show media within the current parcel</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>MediaTentativeAutoPlay</key>
<map>
<key>Comment</key>
<string>This is a tentative flag that may be temporarily set off by the user, until she teleports</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>MemoryFailurePreventionEnabled</key>
<map>
<key>Comment</key>
<string>If set, the viewer will quit to avoid crash when memory failure happens</string>
<key>Persist</key>
<integer>1</integer>
@@ -10426,6 +10492,86 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>PluginAttachDebuggerToPlugins</key>
<map>
<key>Comment</key>
<string>If true, attach a debugger session to each plugin process as it's launched.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>PluginInstancesCPULimit</key>
<map>
<key>Comment</key>
<string>Amount of total plugin CPU usage before inworld plugins start getting turned down to "slideshow" priority. Set to 0 to disable this check.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>0.9</real>
</map>
<key>PlainTextChatHistory</key>
<map>
<key>Comment</key>
<string>Enable/Disable plain text chat history style</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>PluginInstancesLow</key>
<map>
<key>Comment</key>
<string>Limit on the number of inworld media plugins that will run at "low" priority</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>4</integer>
</map>
<key>PluginInstancesNormal</key>
<map>
<key>Comment</key>
<string>Limit on the number of inworld media plugins that will run at "normal" or higher priority</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>2</integer>
</map>
<key>PluginInstancesTotal</key>
<map>
<key>Comment</key>
<string>Hard limit on the number of plugins that will be instantiated at once for inworld media</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>8</integer>
</map>
<key>PluginUseReadThread</key>
<map>
<key>Comment</key>
<string>Use a separate thread to read incoming messages from plugins</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>PlayTypingSound</key>
<map>
<key>Comment</key>
@@ -10629,6 +10775,94 @@ This should be as low as possible, but too low may break functionality</string>
</array>
</map>
<key>PrimMediaMasterEnabled</key>
<map>
<key>Comment</key>
<string>Whether or not Media on a Prim is enabled.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>PrimMediaControlsUseHoverControlSet</key>
<map>
<key>Comment</key>
<string>Whether or not hovering over prim media uses minimal "hover" controls or the authored control set.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>PrimMediaDragNDrop</key>
<map>
<key>Comment</key>
<string>Enable drag and drop of URLs onto prim faces</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>PrimMediaMaxRetries</key>
<map>
<key>Comment</key>
<string>Maximum number of retries for media queries.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>4</integer>
</map>
<key>PrimMediaRequestQueueDelay</key>
<map>
<key>Comment</key>
<string>Timer delay for fetching media from the queue (in seconds).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>1.0</real>
</map>
<key>PrimMediaRetryTimerDelay</key>
<map>
<key>Comment</key>
<string>Timer delay for retrying on media queries (in seconds).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>5.0</real>
</map>
<key>PrimMediaMaxSortedQueueSize</key>
<map>
<key>Comment</key>
<string>Maximum number of objects the viewer will load media for initially</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>100000</integer>
</map>
<key>PrimMediaMaxRoundRobinQueueSize</key>
<map>
<key>Comment</key>
<string>Maximum number of objects the viewer will continuously update media for</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>100000</integer>
</map>
<key>PreviewAnimRect</key>
<map>
<key>Comment</key>
@@ -10937,6 +11171,50 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<real>1.0</real>
</map>
<key>WebContentWindowLimit</key>
<map>
<key>Comment</key>
<string>Maximum number of web browser windows that can be open at once in the Web content floater (0 for no limit)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>5</integer>
</map>
<key>MediaRollOffRate</key>
<map>
<key>Comment</key>
<string>Multiplier to change rate of media attenuation</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>0.125</real>
</map>
<key>MediaRollOffMin</key>
<map>
<key>Comment</key>
<string>Adjusts the distance at which media attentuation starts</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>5.0</real>
</map>
<key>MediaRollOffMax</key>
<map>
<key>Comment</key>
<string>Distance at which media volume is set to 0</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>30.0</real>
</map>
<key>RecentItemsSortOrder</key>
<map>
<key>Comment</key>

View File

@@ -980,6 +980,8 @@ bool LLAppViewer::init()
LLEnvManagerNew::instance().usePrefs();
gGLActive = FALSE;
LLViewerMedia::initClass();
LL_INFOS("InitInfo") << "Viewer media initialized." << LL_ENDL ;
return true;
}
@@ -1706,8 +1708,7 @@ bool LLAppViewer::cleanup()
if (mPurgeOnExit)
{
llinfos << "Purging all cache files on exit" << llendflush;
std::string mask = gDirUtilp->getDirDelimiter() + "*.*";
gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""),mask);
gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""),"*.*");
}
removeMarkerFile(); // Any crashes from here on we'll just have to ignore
@@ -2669,8 +2670,7 @@ void LLAppViewer::cleanupSavedSettings()
void LLAppViewer::removeCacheFiles(const std::string& file_mask)
{
std::string mask = gDirUtilp->getDirDelimiter() + file_mask;
gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""), mask);
gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""), file_mask);
}
void LLAppViewer::writeSystemInfo()

View File

@@ -459,7 +459,7 @@ gboolean viewer_app_api_GoSLURL(ViewerAppAPI *obj, gchar *slurl, gboolean **succ
std::string url = slurl;
LLMediaCtrl* web = NULL;
const bool trusted_browser = false;
if (LLURLDispatcher::dispatch(url, web, trusted_browser))
if (LLURLDispatcher::dispatch(url, "", web, trusted_browser))
{
// bring window to foreground, as it has just been "launched" from a URL
// todo: hmm, how to get there from here?

View File

@@ -475,7 +475,7 @@ OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn)
LLMediaCtrl* web = NULL;
const bool trusted_browser = false;
LLURLDispatcher::dispatch(url, web, trusted_browser);
LLURLDispatcher::dispatch(url, "", web, trusted_browser);
}
return(result);

View File

@@ -488,7 +488,7 @@ bool LLAppViewerWin32::initHardwareTest()
if (OSBTN_NO== button)
{
LL_INFOS("AppInit") << "User quitting after failed DirectX 9 detection" << LL_ENDL;
LLWeb::loadURLExternal(DIRECTX_9_URL);
LLWeb::loadURLExternal(DIRECTX_9_URL, false);
return false;
}
gSavedSettings.setWarning("AboutDirectX9", FALSE);

View File

@@ -134,9 +134,7 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
}*/
LLRect border_rect( 0, getRect().getHeight() + 2, getRect().getWidth() + 2, 0 );
mBorder = new LLViewBorder( std::string("web control border"), border_rect, LLViewBorder::BEVEL_IN );
addChild( mBorder );
//LLRect border_rect( 0, getRect().getHeight() + 2, getRect().getWidth() + 2, 0 );
}
LLMediaCtrl::~LLMediaCtrl()
@@ -152,10 +150,13 @@ LLMediaCtrl::~LLMediaCtrl()
//
void LLMediaCtrl::setBorderVisible( BOOL border_visible )
{
if ( mBorder )
if(border_visible && !mBorder)
{
mBorder->setVisible( border_visible );
};
mBorder = new LLViewBorder( std::string("web control border"), getLocalRect(), LLViewBorder::BEVEL_IN );
addChild( mBorder );
}
if(mBorder)
mBorder->setVisible(border_visible);
};
////////////////////////////////////////////////////////////////////////////////
@@ -705,7 +706,6 @@ LLPluginClassMedia* LLMediaCtrl::getMediaPlugin()
//
void LLMediaCtrl::draw()
{
if ( gRestoreGL == 1 )
{
LLRect r = getRect();

View File

@@ -61,7 +61,11 @@ BOOL LLPanelGeneral::postBuild()
LLComboBox* namesystem_combobox = getChild<LLComboBox>("namesystem_combobox");
namesystem_combobox->setCurrentByIndex(gSavedSettings.getS32("PhoenixNameSystem"));
childSetValue("default_start_location", gSavedSettings.getBOOL("LoginLastLocation") ? "MyLastLocation" : "MyHome");
std::string login_location = gSavedSettings.getString("LoginLocation");
if(login_location != "last" && login_location != "home")
login_location = "last";
childSetValue("default_start_location", login_location);
childSetValue("show_location_checkbox", gSavedSettings.getBOOL("ShowStartLocation"));
childSetValue("show_all_title_checkbox", gSavedSettings.getBOOL("RenderHideGroupTitleAll"));
childSetValue("language_is_public", gSavedSettings.getBOOL("LanguageIsPublic"));
@@ -147,7 +151,7 @@ void LLPanelGeneral::apply()
}
}
gSavedSettings.setBOOL("LoginLastLocation", childGetValue("default_start_location").asString() == "MyLastLocation");
gSavedSettings.setString("LoginLocation", childGetValue("default_start_location").asString());
gSavedSettings.setBOOL("ShowStartLocation", childGetValue("show_location_checkbox"));
gSavedSettings.setBOOL("RenderHideGroupTitleAll", childGetValue("show_all_title_checkbox"));
gSavedSettings.setBOOL("LanguageIsPublic", childGetValue("language_is_public"));

View File

@@ -38,7 +38,7 @@
struct LLOfferInfo;
const F32 UPDATE_MEMBERS_SECONDS_PER_FRAME = 0.005; // 5ms
const F32 UPDATE_MEMBERS_SECONDS_PER_FRAME = 0.005f; // 5ms
// Forward declares
class LLPanelGroupTab;

View File

@@ -108,7 +108,7 @@ static bool nameSplit(const std::string& full, std::string& first, std::string&
first = fragments[0];
if (fragments.size() == 1)
{
if (gHippoGridManager->getConnectedGrid()->isAurora())
if (gHippoGridManager->getCurrentGrid()->isAurora())
last = "";
else
last = "Resident";
@@ -183,6 +183,8 @@ class LLIamHereLogin : public LLHTTPClient::ResponderHeadersOnly
{
if (mParent)
{
if(200 <= status && status < 300)
llinfos << "Found site" << llendl;
mParent->setSiteIsAlive(200 <= status && status < 300);
}
}
@@ -276,7 +278,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
LLSLURL defaultStart(defaultStartLocation);
if ( defaultStart.isSpatial() )
{
LLStartUp::setStartSLURL(defaultStart);
LLStartUp::setStartSLURL(defaultStart); // calls onUpdateStartSLURL
}
else
{
@@ -284,36 +286,13 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
LLSLURL homeStart(LLSLURL::SIM_LOCATION_HOME);
LLStartUp::setStartSLURL(homeStart);
}
start_slurl = LLStartUp::getStartSLURL(); // calls onUpdateStartSLURL
}
else
{
LLPanelLogin::onUpdateStartSLURL(start_slurl); // updates grid if needed
}
// The XML file loads the combo with the following labels:
// 0 - "My Home"
// 1 - "My Last Location"
// 2 - "<Type region name>"
BOOL login_last = gSavedSettings.getBOOL("LoginLastLocation");
std::string sim_string = start_slurl.getRegion();
if (!sim_string.empty())
{
// Replace "<Type region name>" with this region name
location_combo->remove(2);
location_combo->add( sim_string );
location_combo->setTextEntry(sim_string);
location_combo->setCurrentByIndex( 2 );
}
else if (login_last)
{
location_combo->setCurrentByIndex( 1 );
}
else
{
location_combo->setCurrentByIndex( 0 );
}
childSetAction("connect_btn", onClickConnect, this);
setDefaultBtn("connect_btn");
@@ -342,16 +321,13 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
// get the web browser control
LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
web_browser->addObserver(this);
web_browser->setBackgroundColor(LLColor4::black);
reshapeBrowser();
childSetVisible("create_new_account_text",
!gHippoGridManager->getConnectedGrid()->getRegisterUrl().empty());
childSetVisible("forgot_password_text",
!gHippoGridManager->getConnectedGrid()->getPasswordUrl().empty());
loadLoginPage();
refreshLoginPage();
}
void LLPanelLogin::setSiteIsAlive( bool alive )
@@ -374,6 +350,8 @@ void LLPanelLogin::setSiteIsAlive( bool alive )
{
// hide browser control (revealing default one)
web_browser->setVisible( FALSE );
std::string str = LLWeb::escapeURL("data:text/html,<html><body bgcolor=\"rgb(0,0,0)\"></body></html>");
web_browser->navigateTo( str, "text/html" );
}
}
}
@@ -402,8 +380,8 @@ void LLPanelLogin::reshapeBrowser()
LLRect rect = gViewerWindow->getWindowRectScaled();
LLRect html_rect;
html_rect.setCenterAndSize(
rect.getCenterX() - 2, rect.getCenterY() + 40,
rect.getWidth() + 6, rect.getHeight() - 78 );
rect.getCenterX() /*- 2*/, rect.getCenterY() + 40,
rect.getWidth() /*+ 6*/, rect.getHeight() - 78 );
web_browser->setRect( html_rect );
web_browser->reshape( html_rect.getWidth(), html_rect.getHeight(), TRUE );
reshape( rect.getWidth(), rect.getHeight(), 1 );
@@ -761,7 +739,7 @@ void LLPanelLogin::onUpdateStartSLURL(const LLSLURL& new_start_slurl)
switch ( new_slurl_type )
{
case LLSLURL::LOCATION:
{
{
location_combo->setCurrentByIndex( 2 );
location_combo->setTextEntry(new_start_slurl.getLocationString());
}
@@ -845,7 +823,7 @@ void LLPanelLogin::loadLoginPage()
sInstance->updateGridCombo();
std::string login_page_str = gHippoGridManager->getConnectedGrid()->getLoginPage();
std::string login_page_str = gHippoGridManager->getCurrentGrid()->getLoginPage();
if (login_page_str.empty())
{
sInstance->setSiteIsAlive(false);
@@ -876,10 +854,10 @@ void LLPanelLogin::loadLoginPage()
// Grid
if (gHippoGridManager->getConnectedGrid()->isSecondLife()) {
if (gHippoGridManager->getCurrentGrid()->isSecondLife()) {
// find second life grid from login URI
// yes, this is heuristic, but hey, it is just to get the right login page...
std::string tmp = gHippoGridManager->getConnectedGrid()->getLoginUri();
std::string tmp = gHippoGridManager->getCurrentGrid()->getLoginUri();
int i = tmp.find(".lindenlab.com");
if (i != std::string::npos) {
tmp = tmp.substr(0, i);
@@ -892,11 +870,11 @@ void LLPanelLogin::loadLoginPage()
}
}
}
else if (gHippoGridManager->getConnectedGrid()->isOpenSimulator())
else if (gHippoGridManager->getCurrentGrid()->isOpenSimulator())
{
params["grid"] = gHippoGridManager->getConnectedGrid()->getGridNick();
params["grid"] = gHippoGridManager->getCurrentGrid()->getGridNick();
}
else if (gHippoGridManager->getConnectedGrid()->getPlatform() == HippoGridInfo::PLATFORM_AURORA)
else if (gHippoGridManager->getCurrentGrid()->getPlatform() == HippoGridInfo::PLATFORM_AURORA)
{
params["grid"] = LLViewerLogin::getInstance()->getGridLabel();
}
@@ -970,7 +948,7 @@ void LLPanelLogin::onClickConnect(void *)
}
else
{
if (gHippoGridManager->getConnectedGrid()->getRegisterUrl().empty()) {
if (gHippoGridManager->getCurrentGrid()->getRegisterUrl().empty()) {
LLNotificationsUtil::add("MustHaveAccountToLogInNoLinks");
} else {
LLNotificationsUtil::add("MustHaveAccountToLogIn", LLSD(), LLSD(),
@@ -1001,7 +979,7 @@ bool LLPanelLogin::newAccountAlertCallback(const LLSD& notification, const LLSD&
// static
void LLPanelLogin::onClickNewAccount()
{
const std::string &url = gHippoGridManager->getConnectedGrid()->getRegisterUrl();
const std::string &url = gHippoGridManager->getCurrentGrid()->getRegisterUrl();
if (!url.empty()) {
llinfos << "Going to account creation URL." << llendl;
LLWeb::loadURLExternal(url);
@@ -1030,7 +1008,7 @@ void LLPanelLogin::onClickForgotPassword()
{
if (sInstance )
{
const std::string &url = gHippoGridManager->getConnectedGrid()->getPasswordUrl();
const std::string &url = gHippoGridManager->getCurrentGrid()->getPasswordUrl();
if (!url.empty()) {
LLWeb::loadURLExternal(url);
} else {
@@ -1059,17 +1037,31 @@ void LLPanelLogin::refreshLoginPage()
sInstance->updateGridCombo();
sInstance->childSetVisible("create_new_account_text",
!gHippoGridManager->getConnectedGrid()->getRegisterUrl().empty());
!gHippoGridManager->getCurrentGrid()->getRegisterUrl().empty());
sInstance->childSetVisible("forgot_password_text",
!gHippoGridManager->getConnectedGrid()->getPasswordUrl().empty());
!gHippoGridManager->getCurrentGrid()->getPasswordUrl().empty());
// kick off a request to grab the url manually
gResponsePtr = LLIamHereLogin::build(sInstance);
std::string login_page = gHippoGridManager->getCurrentGrid()->getLoginPage();
if (!login_page.empty())
{
LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
if (web_browser->getCurrentNavUrl() != login_page)
{
if(gResponsePtr)
gResponsePtr->setParent(0); //Tell our previous responder that we no longer require its result.
gResponsePtr.reset(); //Deref previous responder
std::string login_page = gHippoGridManager->getConnectedGrid()->getLoginPage();
if (!login_page.empty()) {
LLHTTPClient::head(login_page, gResponsePtr.get());
} else {
llinfos << "Firing off lookup for " << login_page << llendl;
// kick off a request to grab the url manually
gResponsePtr = LLIamHereLogin::build(sInstance);
LLHTTPClient::head(login_page, gResponsePtr.get());
}
}
else
{
if(gResponsePtr)
gResponsePtr->setParent(0); //Tell our previous responder that we no longer require its result.
gResponsePtr.reset(); //Deref previous responder
sInstance->setSiteIsAlive(false);
}
}

View File

@@ -403,8 +403,6 @@ bool idle_startup()
static bool show_connect_box = true;
static bool samename = false;
// HACK: These are things from the main loop that usually aren't done
// until initialization is complete, but need to be done here for things
// to work.
@@ -1096,9 +1094,9 @@ bool idle_startup()
/*std::string location;
LLPanelLogin::getLocation( location );
LLURLSimString::setString( location );
*/
// END TODO
LLPanelLogin::close();*/
LLPanelLogin::close();
}
//For HTML parsing in text boxes.
@@ -1305,26 +1303,31 @@ bool idle_startup()
progress += 0.02f;
display_startup();
LLSLURL start_slurl = LLStartUp::getStartSLURL();
std::stringstream start;
if (LLURLSimString::parse())
LLSLURL::SLURL_TYPE start_slurl_type = start_slurl.getType();
switch ( start_slurl_type )
{
case LLSLURL::LOCATION:
{
// a startup URL was specified
std::stringstream unescaped_start;
unescaped_start << "uri:"
<< LLURLSimString::sInstance.mSimName << "&"
<< LLURLSimString::sInstance.mX << "&"
<< LLURLSimString::sInstance.mY << "&"
<< LLURLSimString::sInstance.mZ;
<< start_slurl.getRegion() << "&"
<< start_slurl.getPosition().mV[VX] << "&"
<< start_slurl.getPosition().mV[VY] << "&"
<< start_slurl.getPosition().mV[VZ];
start << xml_escape_string(unescaped_start.str());
}
else if (gSavedSettings.getBOOL("LoginLastLocation"))
{
start << "last";
}
else
{
}
break;
case LLSLURL::HOME_LOCATION:
start << "home";
break;
case LLSLURL::LAST_LOCATION:
start << "last";
break;
default:
break;
}
char hashed_mac_string[MD5HEX_STR_SIZE]; /* Flawfinder: ignore */

View File

@@ -1,184 +0,0 @@
/**
* @file llurlsimstring.cpp (was llsimurlstring.cpp)
* @brief Handles "SLURL fragments" like Ahern/123/45 for
* startup processing, login screen, prefs, etc.
*
* $LicenseInfo:firstyear=2006&license=viewergpl$
*
* Copyright (c) 2006-2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llurlsimstring.h"
#include "llpanellogin.h"
#include "llviewercontrol.h"
#include <curl/curl.h> // curl_unescape, curl_free
#ifdef DEBUG_CURLIO
#include "debug_libcurl.h"
#endif
//static
LLURLSimString LLURLSimString::sInstance;
std::string LLURLSimString::sLocationStringHome("My Home");
std::string LLURLSimString::sLocationStringLast("My Last Location");
// "secondlife://simname/x/y/z" -> "simname/x/y/z"
// (actually .*//foo -> foo)
// static
void LLURLSimString::setString(const std::string& sim_string)
{
sInstance.mSimString.clear();
sInstance.mSimName.clear();
sInstance.mParseState = NOT_PARSED;
if (sim_string == sLocationStringHome)
{
gSavedSettings.setBOOL("LoginLastLocation", FALSE);
}
else if (sim_string == sLocationStringLast)
{
gSavedSettings.setBOOL("LoginLastLocation", TRUE);
}
else
{
char* curlstr = curl_unescape(sim_string.c_str(), sim_string.size());
std::string tstring = std::string(curlstr);
curl_free(curlstr);
std::string::size_type idx = tstring.find("//");
idx = (idx == std::string::npos) ? 0 : idx+2;
sInstance.mSimString = tstring.substr(idx);
}
}
// "/100" -> 100
// static
std::string::size_type LLURLSimString::parseGridIdx(const std::string& in_string,
std::string::size_type idx0,
std::string::size_type* res)
{
if (idx0 == std::string::npos || in_string[idx0] != '/')
{
return std::string::npos; // parse error
}
idx0++;
std::string::size_type idx1 = in_string.find_first_of('/', idx0);
std::string::size_type len = (idx1 == std::string::npos) ? std::string::npos : idx1-idx0;
std::string tstring = in_string.substr(idx0,len);
if (!tstring.empty())
{
std::string::size_type val = atoi(tstring.c_str());
*res = val;
}
return idx1;
}
// "simname/x/y/z" -> mSimName = simname, mX = x, mY = y, mZ = z
// static
bool LLURLSimString::parse()
{
if (sInstance.mParseState == NOT_SET)
{
return false;
}
if (sInstance.mParseState == NOT_PARSED)
{
if (parse(sInstance.mSimString,
&sInstance.mSimName,
&sInstance.mX,
&sInstance.mY,
&sInstance.mZ))
{
sInstance.mParseState = PARSE_OK;
}
else
{
sInstance.mParseState = PARSE_FAIL;
}
}
return (sInstance.mParseState == PARSE_OK);
}
// static
bool LLURLSimString::parse(const std::string& sim_string,
std::string *region_name,
S32 *x, S32 *y, S32 *z)
{
// strip any bogus initial '/'
std::string::size_type idx0 = sim_string.find_first_not_of('/');
if (idx0 == std::string::npos) idx0 = 0;
std::string::size_type idx1 = sim_string.find_first_of('/', idx0);
std::string::size_type len = (idx1 == std::string::npos) ? std::string::npos : idx1-idx0;
std::string tstring = sim_string.substr(idx0,len);
*region_name = unescapeRegionName(tstring);
if (!region_name->empty())
{
// return position data if found. otherwise leave passed-in values alone. (DEV-18380) -MG
if (idx1 != std::string::npos)
{
std::string::size_type xs = *x, ys = *y, zs = *z;
idx1 = parseGridIdx(sim_string, idx1, &xs);
idx1 = parseGridIdx(sim_string, idx1, &ys);
idx1 = parseGridIdx(sim_string, idx1, &zs);
*x = xs;
*y = ys;
*z = zs;
}
return true;
}
else
{
return false;
}
}
// static
std::string LLURLSimString::getURL()
{
std::string url;
if (sInstance.mParseState == PARSE_OK)
{
url = llformat("secondlife://%s/%d/%d/%d/",
sInstance.mSimName.c_str(),
sInstance.mX,
sInstance.mY,
sInstance.mZ);
}
return url;
}
// static
std::string LLURLSimString::unescapeRegionName(std::string region_name)
{
std::string result;
char* curlstr = curl_unescape(region_name.c_str(), region_name.size());
result = std::string(curlstr);
curl_free(curlstr);
return result;
}

View File

@@ -1,84 +0,0 @@
/**
* @file llsimurlstring.h
* @brief Handles "SLURL fragments" like Ahern/123/45 for
* startup processing, login screen, prefs, etc.
*
* $LicenseInfo:firstyear=2006&license=viewergpl$
*
* Copyright (c) 2006-2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#ifndef LLSIMURLSTRING_H
#define LLSIMURLSTRING_H
#include "llstring.h"
class LLURLSimString
{
public:
enum { NOT_SET=0, NOT_PARSED=1, PARSE_OK=2, PARSE_FAIL=-1 };
static void setString(const std::string& url);
// Accepts all sorts of fragments:
// secondlife://RegionName/1/2/
// sl://RegionName/1/2/3/
// //Ahern/123/45/
// Ahern
static bool parse();
// Returns true if we have an URL fragment in the static instance
// (and it parsed correctly, which is basically always because
// any bare region string is a valid fragment).
static bool parse(const std::string& sim_string, std::string *region_name, S32 *x, S32 *y, S32 *z);
// Parse a sim string "Ahern/1/2" and return location data,
// doesn't affect static instance.
static std::string getURL();
// Get the canonical URL secondlife://RegionName/123/45/6/
static std::string unescapeRegionName(std::string region_name);
// Does URL unescaping, in particular %20 -> space
LLURLSimString() : mX(128), mY(128), mZ(0), mParseState(NOT_PARSED) {}
private:
static std::string::size_type parseGridIdx(const std::string& in_string,
std::string::size_type idx0,
std::string::size_type* res);
public:
static LLURLSimString sInstance;
static std::string sLocationStringHome;
static std::string sLocationStringLast;
public:
std::string mSimString; // "name/x/y/z"
std::string mSimName;
S32 mX,mY,mZ;
S32 mParseState;
};
#endif

View File

@@ -3046,8 +3046,8 @@ void LLViewerMediaImpl::setVisible(bool visible)
if(plugin && plugin->isPluginExited())
{
destroyMediaSource();
plugin = NULL;
}
if(!plugin)
{
createMediaSource();
@@ -3716,11 +3716,10 @@ void LLViewerMediaImpl::setPriority(EPriority priority)
mPreviousMediaTime = plugin->getCurrentTime();
destroyMediaSource();
plugin = NULL;
}
}
if(plugin)
{
if(mPriority >= PRIORITY_LOW)

View File

@@ -185,9 +185,7 @@ void LLViewerTextureList::doPreloadImages()
static std::string get_texture_list_name()
{
//return std::string("texture_list_") + gSavedSettings.getString("LoginLocation") + ".xml";
bool login_last = gSavedSettings.getBOOL("LoginLastLocation");
return std::string("texture_list_") + (login_last?"last":"home") + ".xml";
return std::string("texture_list_") + gSavedSettings.getString("LoginLocation") + ".xml";
}
void LLViewerTextureList::doPrefetchImages()

View File

@@ -521,7 +521,7 @@ bool LLWaterParamManager::removeParamSet(const std::string& name, bool delete_fr
bool LLWaterParamManager::isSystemPreset(const std::string& preset_name) const
{
// *TODO: file system access is excessive here.
return gDirUtilp->fileExists(getSysDir() + LLWeb::curlEscape(preset_name) + ".xml");
return gDirUtilp->fileExists(getSysDir() + LLURI::escape(preset_name) + ".xml");
}
void LLWaterParamManager::getPresetNames(preset_name_list_t& presets) const

View File

@@ -2771,6 +2771,15 @@ Please choose the male or female avatar. You can change your mind later.
notext="Female"
yestext="Male"/>
</notification>
<notification icon="alertmodal.tga"
name="CantTeleportToGrid"
type="alertmodal">
Could not teleport to [SLURL] as it's on a different grid ([GRID]) than the current grid ([CURRENT_GRID]). Please close your viewer and try again.
<tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
@@ -3512,9 +3521,12 @@ which exceeds the limit of [LIMIT].
name="okbutton"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="OfferTeleportFromGod"
type="alertmodal">
God summon user to your location?
God summon Resident to your location?
<form name="form">
<input name="message" type="text">
Join me in [REGION]
@@ -7353,6 +7365,16 @@ The SLurl you clicked on is not supported.
A SLurl was received from an untrusted browser and has been blocked for your security.
</notification>
<notification
icon="notifytip.tga"
name="ThrottledSLURL"
priority="high"
type="notifytip">
<tag>security</tag>
Multiple SLurls were received from an untrusted browser within a short period.
They will be blocked for a few seconds for your security.
</notification>
<notification
duration="10"
icon="notifytip.tga"

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel border="true" bottom="-409" height="408" label="General" left="102" name="general_panel" width="517">
<radio_group bottom="-44" height="40" left="109" name="default_start_location" width="199">
<radio_item bottom="-20" height="20" name="MyHome" tool_tip="Log into my home location by default.">My Home</radio_item>
<radio_item bottom="-20" height="20" left="93" name="MyLastLocation" tool_tip="Log into my last location by default.">My Last Location</radio_item>
<radio_item bottom="-20" height="20" name="home" tool_tip="Log into my home location by default.">My Home</radio_item>
<radio_item bottom="-20" height="20" left="93" name="last" tool_tip="Log into my last location by default.">My Last Location</radio_item>
</radio_group>
<check_box bottom="-42" height="16" initial_value="true" label="Show Start Location on Login Screen" name="show_location_checkbox"/>
<combo_box bottom_delta="-27" follows="top" height="18" left="103" name="fade_out_combobox" width="111">

View File

@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel label="General" name="general_panel">
<radio_group name="default_start_location" width="250">
<radio_item name="MyHome" tool_tip="Iniciar sesión de forma predeterminada en Mi Base.">
<radio_item name="home" tool_tip="Iniciar sesión de forma predeterminada en Mi Base.">
Mi Base
</radio_item>
<radio_item name="MyLastLocation" tool_tip="Iniciar sesión de forma predeterminada en mi última ubicación.">
<radio_item name="last" tool_tip="Iniciar sesión de forma predeterminada en mi última ubicación.">
Mi Última Ubicación
</radio_item>
</radio_group>

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel label="Général" name="general_panel">
<radio_group name="default_start_location" width="280">
<radio_item name="MyHome" tool_tip="Par défaut, choisit le domicile comme lieu de départ.">Domicile</radio_item>
<radio_item name="MyLastLocation" tool_tip="Par défaut, choisit le dernier emplacement comme lieu de départ.">Dernier emplacement</radio_item>
<radio_item name="home" tool_tip="Par défaut, choisit le domicile comme lieu de départ.">Domicile</radio_item>
<radio_item name="last" tool_tip="Par défaut, choisit le dernier emplacement comme lieu de départ.">Dernier emplacement</radio_item>
</radio_group>
<check_box label="Afficher le lieu de départ sur l'écran de connexion" name="show_location_checkbox"/>
<combo_box name="fade_out_combobox">

View File

@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Geral" name="general_panel">
<radio_group name="default_start_location">
<radio_item name="MyHome" tool_tip="Como padrão, registrar na minha casa.">
<radio_item name="home" tool_tip="Como padrão, registrar na minha casa.">
Minha Casa
</radio_item>
<radio_item name="MyLastLocation" tool_tip="Por padrão, registrar na minha última localidade.">
<radio_item name="last" tool_tip="Por padrão, registrar na minha última localidade.">
Minha Última Localidade
</radio_item>
</radio_group>