merge
commit
ad440a68bb
|
|
@ -183,5 +183,9 @@ viewer-tut-teamcity.email = enus@lindenlab.com
|
|||
viewer-tut-teamcity.build_server = false
|
||||
viewer-tut-teamcity.build_server_tests = false
|
||||
|
||||
# ========================================
|
||||
# experience
|
||||
# ========================================
|
||||
viewer-experience.public_build = false
|
||||
|
||||
# eof
|
||||
|
|
|
|||
|
|
@ -3066,7 +3066,10 @@ BOOL LLMenuBarGL::handleAcceleratorKey(KEY key, MASK mask)
|
|||
mAltKeyTrigger = FALSE;
|
||||
}
|
||||
|
||||
if(!result && (key == KEY_F10 && mask == MASK_CONTROL) && !gKeyboard->getKeyRepeated(key))
|
||||
if(!result
|
||||
&& (key == KEY_F10 && mask == MASK_CONTROL)
|
||||
&& !gKeyboard->getKeyRepeated(key)
|
||||
&& isInVisibleChain())
|
||||
{
|
||||
if (getHighlightedItem())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -133,12 +133,6 @@ private:
|
|||
|
||||
bool filterIgnoredNotifications(LLNotificationPtr notification)
|
||||
{
|
||||
// filter everything if we are to ignore ALL
|
||||
if(LLNotifications::instance().getIgnoreAllNotifications())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
LLNotificationFormPtr form = notification->getForm();
|
||||
// Check to see if the user wants to ignore this alert
|
||||
return !notification->getForm()->getIgnored();
|
||||
|
|
@ -173,6 +167,20 @@ bool handleIgnoredNotification(const LLSD& payload)
|
|||
return false;
|
||||
}
|
||||
|
||||
bool defaultResponse(const LLSD& payload)
|
||||
{
|
||||
if (payload["sigtype"].asString() == "add")
|
||||
{
|
||||
LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID());
|
||||
if (pNotif)
|
||||
{
|
||||
// supply default response
|
||||
pNotif->respond(pNotif->getResponseTemplate(LLNotification::WITH_DEFAULT_BUTTON));
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
namespace LLNotificationFilters
|
||||
{
|
||||
// a sample filter
|
||||
|
|
@ -1187,9 +1195,11 @@ void LLNotifications::createDefaultChannels()
|
|||
{
|
||||
// now construct the various channels AFTER loading the notifications,
|
||||
// because the history channel is going to rewrite the stored notifications file
|
||||
LLNotificationChannel::buildChannel("Expiration", "",
|
||||
LLNotificationChannel::buildChannel("Enabled", "",
|
||||
!boost::bind(&LLNotifications::getIgnoreAllNotifications, this));
|
||||
LLNotificationChannel::buildChannel("Expiration", "Enabled",
|
||||
boost::bind(&LLNotifications::expirationFilter, this, _1));
|
||||
LLNotificationChannel::buildChannel("Unexpired", "",
|
||||
LLNotificationChannel::buildChannel("Unexpired", "Enabled",
|
||||
!boost::bind(&LLNotifications::expirationFilter, this, _1)); // use negated bind
|
||||
LLNotificationChannel::buildChannel("Unique", "Unexpired",
|
||||
boost::bind(&LLNotifications::uniqueFilter, this, _1));
|
||||
|
|
@ -1203,6 +1213,8 @@ void LLNotifications::createDefaultChannels()
|
|||
new LLPersistentNotificationChannel();
|
||||
|
||||
// connect action methods to these channels
|
||||
LLNotifications::instance().getChannel("Enabled")->
|
||||
connectFailedFilter(&defaultResponse);
|
||||
LLNotifications::instance().getChannel("Expiration")->
|
||||
connectChanged(boost::bind(&LLNotifications::expirationHandler, this, _1));
|
||||
// uniqueHandler slot should be added as first slot of the signal due to
|
||||
|
|
|
|||
|
|
@ -163,8 +163,6 @@ LLView::~LLView()
|
|||
|
||||
if (mDefaultWidgets)
|
||||
{
|
||||
std::for_each(mDefaultWidgets->begin(), mDefaultWidgets->end(),
|
||||
DeletePairedPointer());
|
||||
delete mDefaultWidgets;
|
||||
mDefaultWidgets = NULL;
|
||||
}
|
||||
|
|
@ -1682,18 +1680,7 @@ BOOL LLView::hasChild(const std::string& childname, BOOL recurse) const
|
|||
//-----------------------------------------------------------------------------
|
||||
LLView* LLView::getChildView(const std::string& name, BOOL recurse) const
|
||||
{
|
||||
LLView* child = findChildView(name, recurse);
|
||||
if (!child)
|
||||
{
|
||||
child = getDefaultWidget<LLView>(name);
|
||||
if (!child)
|
||||
{
|
||||
LLView::Params view_params;
|
||||
view_params.name = name;
|
||||
child = LLUICtrlFactory::create<LLView>(view_params);
|
||||
}
|
||||
}
|
||||
return child;
|
||||
return getChild<LLView>(name, recurse);
|
||||
}
|
||||
|
||||
static LLFastTimer::DeclareTimer FTM_FIND_VIEWS("Find Widgets");
|
||||
|
|
@ -2804,11 +2791,14 @@ LLView::root_to_view_iterator_t LLView::endRootToView()
|
|||
|
||||
// only create maps on demand, as they incur heap allocation/deallocation cost
|
||||
// when a view is constructed/deconstructed
|
||||
LLView::default_widget_map_t& LLView::getDefaultWidgetMap() const
|
||||
LLView& LLView::getDefaultWidgetContainer() const
|
||||
{
|
||||
if (!mDefaultWidgets)
|
||||
{
|
||||
mDefaultWidgets = new default_widget_map_t();
|
||||
LLView::Params p;
|
||||
p.name = "default widget container";
|
||||
p.visible = false; // ensures default widgets can't steal focus, etc.
|
||||
mDefaultWidgets = new LLView(p);
|
||||
}
|
||||
return *mDefaultWidgets;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -461,12 +461,8 @@ public:
|
|||
|
||||
template <class T> T* getDefaultWidget(const std::string& name) const
|
||||
{
|
||||
default_widget_map_t::const_iterator found_it = getDefaultWidgetMap().find(name);
|
||||
if (found_it == getDefaultWidgetMap().end())
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
return dynamic_cast<T*>(found_it->second);
|
||||
LLView* widgetp = getDefaultWidgetContainer().findChildView(name);
|
||||
return dynamic_cast<T*>(widgetp);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////
|
||||
|
|
@ -580,9 +576,9 @@ private:
|
|||
|
||||
typedef std::map<std::string, LLView*> default_widget_map_t;
|
||||
// allocate this map no demand, as it is rarely needed
|
||||
mutable default_widget_map_t* mDefaultWidgets;
|
||||
mutable LLView* mDefaultWidgets;
|
||||
|
||||
default_widget_map_t& getDefaultWidgetMap() const;
|
||||
LLView& getDefaultWidgetContainer() const;
|
||||
|
||||
public:
|
||||
// Depth in view hierarchy during rendering
|
||||
|
|
@ -649,7 +645,7 @@ template <class T> T* LLView::getChild(const std::string& name, BOOL recurse) co
|
|||
return NULL;
|
||||
}
|
||||
|
||||
getDefaultWidgetMap()[name] = result;
|
||||
getDefaultWidgetContainer().addChild(result);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
|
|
|
|||
|
|
@ -149,7 +149,7 @@
|
|||
<key>nonotifications</key>
|
||||
<map>
|
||||
<key>desc</key>
|
||||
<string>User will not get any notifications. NOTE: All notifications that occur will get added to ignore file for future runs.</string>
|
||||
<string>User will not get any notifications.</string>
|
||||
<key>map-to</key>
|
||||
<string>IgnoreAllNotifications</string>
|
||||
</map>
|
||||
|
|
|
|||
|
|
@ -3914,7 +3914,7 @@
|
|||
<key>Comment</key>
|
||||
<string>Ignore all notifications so we never need user input on them.</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
|
|
@ -4537,6 +4537,17 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>LocalFileSystemBrowsingEnabled</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable/disable access to the local file system via the file picker</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>LoginSRVTimeout</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -11355,6 +11366,17 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>VoiceDisableMic</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Completely disable the ability to open the mic.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>VoiceEffectExpiryWarningTime</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -2135,7 +2135,7 @@ bool LLAppViewer::initConfiguration()
|
|||
|
||||
if (clp.hasOption("nonotifications"))
|
||||
{
|
||||
gSavedSettings.setBOOL("IgnoreAllNotifications", TRUE);
|
||||
gSavedSettings.getControl("IgnoreAllNotifications")->setValue(true, false);
|
||||
}
|
||||
|
||||
if (clp.hasOption("debugsession"))
|
||||
|
|
@ -2182,8 +2182,8 @@ bool LLAppViewer::initConfiguration()
|
|||
if(skinfolder && LLStringUtil::null != skinfolder->getValue().asString())
|
||||
{
|
||||
// hack to force the skin to default.
|
||||
//gDirUtilp->setSkinFolder(skinfolder->getValue().asString());
|
||||
gDirUtilp->setSkinFolder("default");
|
||||
gDirUtilp->setSkinFolder(skinfolder->getValue().asString());
|
||||
//gDirUtilp->setSkinFolder("default");
|
||||
}
|
||||
|
||||
mYieldTime = gSavedSettings.getS32("YieldTime");
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@
|
|||
#include "lldir.h"
|
||||
#include "llframetimer.h"
|
||||
#include "lltrans.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llwindow.h" // beforeDialog()
|
||||
|
||||
#if LL_SDL
|
||||
|
|
@ -104,6 +105,20 @@ LLFilePicker::~LLFilePicker()
|
|||
// nothing
|
||||
}
|
||||
|
||||
// utility function to check if access to local file system via file browser
|
||||
// is enabled and if not, tidy up and indicate we're not allowed to do this.
|
||||
bool LLFilePicker::check_local_file_access_enabled()
|
||||
{
|
||||
// if local file browsing is turned off, return without opening dialog
|
||||
bool local_file_system_browsing_enabled = gSavedSettings.getBOOL("LocalFileSystemBrowsingEnabled");
|
||||
if ( ! local_file_system_browsing_enabled )
|
||||
{
|
||||
mFiles.clear();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const std::string LLFilePicker::getFirstFile()
|
||||
{
|
||||
|
|
@ -203,6 +218,12 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter)
|
|||
}
|
||||
BOOL success = FALSE;
|
||||
|
||||
// if local file browsing is turned off, return without opening dialog
|
||||
if ( check_local_file_access_enabled() == false )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// don't provide default file selection
|
||||
mFilesW[0] = '\0';
|
||||
|
||||
|
|
@ -241,6 +262,12 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
|
|||
}
|
||||
BOOL success = FALSE;
|
||||
|
||||
// if local file browsing is turned off, return without opening dialog
|
||||
if ( check_local_file_access_enabled() == false )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// don't provide default file selection
|
||||
mFilesW[0] = '\0';
|
||||
|
||||
|
|
@ -304,6 +331,12 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
|
|||
}
|
||||
BOOL success = FALSE;
|
||||
|
||||
// if local file browsing is turned off, return without opening dialog
|
||||
if ( check_local_file_access_enabled() == false )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
mOFN.lpstrFile = mFilesW;
|
||||
if (!filename.empty())
|
||||
{
|
||||
|
|
@ -581,6 +614,12 @@ OSStatus LLFilePicker::doNavChooseDialog(ELoadFilter filter)
|
|||
NavDialogRef navRef = NULL;
|
||||
NavReplyRecord navReply;
|
||||
|
||||
// if local file browsing is turned off, return without opening dialog
|
||||
if ( check_local_file_access_enabled() == false )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
memset(&navReply, 0, sizeof(navReply));
|
||||
|
||||
// NOTE: we are passing the address of a local variable here.
|
||||
|
|
@ -809,6 +848,12 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter)
|
|||
|
||||
BOOL success = FALSE;
|
||||
|
||||
// if local file browsing is turned off, return without opening dialog
|
||||
if ( check_local_file_access_enabled() == false )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
OSStatus error = noErr;
|
||||
|
||||
reset();
|
||||
|
|
@ -845,6 +890,12 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
|
|||
|
||||
BOOL success = FALSE;
|
||||
|
||||
// if local file browsing is turned off, return without opening dialog
|
||||
if ( check_local_file_access_enabled() == false )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
OSStatus error = noErr;
|
||||
|
||||
reset();
|
||||
|
|
@ -876,6 +927,12 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
|
|||
BOOL success = FALSE;
|
||||
OSStatus error = noErr;
|
||||
|
||||
// if local file browsing is turned off, return without opening dialog
|
||||
if ( check_local_file_access_enabled() == false )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
reset();
|
||||
|
||||
mNavOptions.optionFlags &= ~kNavAllowMultipleFiles;
|
||||
|
|
@ -1100,6 +1157,12 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename
|
|||
{
|
||||
BOOL rtn = FALSE;
|
||||
|
||||
// if local file browsing is turned off, return without opening dialog
|
||||
if ( check_local_file_access_enabled() == false )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gViewerWindow->mWindow->beforeDialog();
|
||||
|
||||
reset();
|
||||
|
|
@ -1189,6 +1252,12 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
|
|||
{
|
||||
BOOL rtn = FALSE;
|
||||
|
||||
// if local file browsing is turned off, return without opening dialog
|
||||
if ( check_local_file_access_enabled() == false )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gViewerWindow->mWindow->beforeDialog();
|
||||
|
||||
reset();
|
||||
|
|
@ -1233,6 +1302,12 @@ BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
|
|||
{
|
||||
BOOL rtn = FALSE;
|
||||
|
||||
// if local file browsing is turned off, return without opening dialog
|
||||
if ( check_local_file_access_enabled() == false )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gViewerWindow->mWindow->beforeDialog();
|
||||
|
||||
reset();
|
||||
|
|
@ -1263,6 +1338,13 @@ BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
|
|||
|
||||
BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename )
|
||||
{
|
||||
// if local file browsing is turned off, return without opening dialog
|
||||
// (Even though this is a stub, I think we still should not return anything at all)
|
||||
if ( check_local_file_access_enabled() == false )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
reset();
|
||||
|
||||
llinfos << "getSaveFile suggested filename is [" << filename
|
||||
|
|
@ -1277,6 +1359,13 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename
|
|||
|
||||
BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
|
||||
{
|
||||
// if local file browsing is turned off, return without opening dialog
|
||||
// (Even though this is a stub, I think we still should not return anything at all)
|
||||
if ( check_local_file_access_enabled() == false )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
reset();
|
||||
|
||||
// HACK: Static filenames for 'open' until we implement filepicker
|
||||
|
|
@ -1295,6 +1384,13 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
|
|||
|
||||
BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
|
||||
{
|
||||
// if local file browsing is turned off, return without opening dialog
|
||||
// (Even though this is a stub, I think we still should not return anything at all)
|
||||
if ( check_local_file_access_enabled() == false )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
reset();
|
||||
return FALSE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -140,6 +140,10 @@ private:
|
|||
//FILENAME_BUFFER_SIZE = 65536
|
||||
FILENAME_BUFFER_SIZE = 65000
|
||||
};
|
||||
|
||||
// utility function to check if access to local file system via file browser
|
||||
// is enabled and if not, tidy up and indicate we're not allowed to do this.
|
||||
bool check_local_file_access_enabled();
|
||||
|
||||
#if LL_WINDOWS
|
||||
OPENFILENAMEW mOFN; // for open and save dialogs
|
||||
|
|
|
|||
|
|
@ -40,7 +40,8 @@ bool view_visible(LLView* viewp)
|
|||
}
|
||||
|
||||
|
||||
LLPopupView::LLPopupView()
|
||||
LLPopupView::LLPopupView(const LLPopupView::Params& p)
|
||||
: LLPanel(p)
|
||||
{
|
||||
// register ourself as handler of UI popups
|
||||
LLUI::setPopupFuncs(boost::bind(&LLPopupView::addPopup, this, _1), boost::bind(&LLPopupView::removePopup, this, _1), boost::bind(&LLPopupView::clearPopups, this));
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
class LLPopupView : public LLPanel
|
||||
{
|
||||
public:
|
||||
LLPopupView();
|
||||
LLPopupView(const Params& p = LLPanel::Params());
|
||||
~LLPopupView();
|
||||
|
||||
/*virtual*/ void draw();
|
||||
|
|
|
|||
|
|
@ -1524,7 +1524,7 @@ void LLViewerWindow::initBase()
|
|||
mWorldViewPlaceholder = main_view->getChildView("world_view_rect")->getHandle();
|
||||
mNonSideTrayView = main_view->getChildView("non_side_tray_view")->getHandle();
|
||||
mFloaterViewHolder = main_view->getChildView("floater_view_holder")->getHandle();
|
||||
mPopupView = main_view->findChild<LLPopupView>("popup_holder");
|
||||
mPopupView = main_view->getChild<LLPopupView>("popup_holder");
|
||||
mHintHolder = main_view->getChild<LLView>("hint_holder")->getHandle();
|
||||
|
||||
// Constrain floaters to inside the menu and status bar regions.
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
#include "llnotificationsutil.h"
|
||||
#include "llsdserialize.h"
|
||||
#include "llui.h"
|
||||
#include "llkeyboard.h"
|
||||
|
||||
const F32 LLVoiceClient::OVERDRIVEN_POWER_LEVEL = 0.7f;
|
||||
|
||||
|
|
@ -113,8 +114,18 @@ LLVoiceClient::LLVoiceClient()
|
|||
mVoiceModule(NULL),
|
||||
m_servicePump(NULL),
|
||||
mVoiceEffectEnabled(LLCachedControl<bool>(gSavedSettings, "VoiceMorphingEnabled")),
|
||||
mVoiceEffectDefault(LLCachedControl<std::string>(gSavedPerAccountSettings, "VoiceEffectDefault"))
|
||||
mVoiceEffectDefault(LLCachedControl<std::string>(gSavedPerAccountSettings, "VoiceEffectDefault")),
|
||||
mPTTDirty(true),
|
||||
mPTT(true),
|
||||
mUsePTT(true),
|
||||
mPTTIsMiddleMouse(false),
|
||||
mPTTKey(0),
|
||||
mPTTIsToggle(false),
|
||||
mUserPTTState(false),
|
||||
mMuteMic(false),
|
||||
mDisableMic(false)
|
||||
{
|
||||
updateSettings();
|
||||
}
|
||||
|
||||
//---------------------------------------------------
|
||||
|
|
@ -173,6 +184,14 @@ const LLVoiceVersionInfo LLVoiceClient::getVersion()
|
|||
|
||||
void LLVoiceClient::updateSettings()
|
||||
{
|
||||
setUsePTT(gSavedSettings.getBOOL("PTTCurrentlyEnabled"));
|
||||
std::string keyString = gSavedSettings.getString("PushToTalkButton");
|
||||
setPTTKey(keyString);
|
||||
setPTTIsToggle(gSavedSettings.getBOOL("PushToTalkToggle"));
|
||||
mDisableMic = gSavedSettings.getBOOL("VoiceDisableMic");
|
||||
|
||||
updateMicMuteLogic();
|
||||
|
||||
if (mVoiceModule) mVoiceModule->updateSettings();
|
||||
}
|
||||
|
||||
|
|
@ -481,6 +500,26 @@ void LLVoiceClient::setVoiceEnabled(bool enabled)
|
|||
if (mVoiceModule) mVoiceModule->setVoiceEnabled(enabled);
|
||||
}
|
||||
|
||||
void LLVoiceClient::updateMicMuteLogic()
|
||||
{
|
||||
// If not configured to use PTT, the mic should be open (otherwise the user will be unable to speak).
|
||||
bool new_mic_mute = false;
|
||||
|
||||
if(mUsePTT)
|
||||
{
|
||||
// If configured to use PTT, track the user state.
|
||||
new_mic_mute = !mUserPTTState;
|
||||
}
|
||||
|
||||
if(mMuteMic || mDisableMic)
|
||||
{
|
||||
// Either of these always overrides any other PTT setting.
|
||||
new_mic_mute = true;
|
||||
}
|
||||
|
||||
if (mVoiceModule) mVoiceModule->setMuteMic(new_mic_mute);
|
||||
}
|
||||
|
||||
void LLVoiceClient::setLipSyncEnabled(BOOL enabled)
|
||||
{
|
||||
if (mVoiceModule) mVoiceModule->setLipSyncEnabled(enabled);
|
||||
|
|
@ -500,7 +539,8 @@ BOOL LLVoiceClient::lipSyncEnabled()
|
|||
|
||||
void LLVoiceClient::setMuteMic(bool muted)
|
||||
{
|
||||
if (mVoiceModule) mVoiceModule->setMuteMic(muted);
|
||||
mMuteMic = muted;
|
||||
updateMicMuteLogic();
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -509,64 +549,116 @@ void LLVoiceClient::setMuteMic(bool muted)
|
|||
|
||||
void LLVoiceClient::setUserPTTState(bool ptt)
|
||||
{
|
||||
if (mVoiceModule) mVoiceModule->setUserPTTState(ptt);
|
||||
mUserPTTState = ptt;
|
||||
updateMicMuteLogic();
|
||||
}
|
||||
|
||||
bool LLVoiceClient::getUserPTTState()
|
||||
{
|
||||
if (mVoiceModule)
|
||||
{
|
||||
return mVoiceModule->getUserPTTState();
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return mUserPTTState;
|
||||
}
|
||||
|
||||
void LLVoiceClient::setUsePTT(bool usePTT)
|
||||
{
|
||||
if (mVoiceModule) mVoiceModule->setUsePTT(usePTT);
|
||||
if(usePTT && !mUsePTT)
|
||||
{
|
||||
// When the user turns on PTT, reset the current state.
|
||||
mUserPTTState = false;
|
||||
}
|
||||
mUsePTT = usePTT;
|
||||
|
||||
updateMicMuteLogic();
|
||||
}
|
||||
|
||||
void LLVoiceClient::setPTTIsToggle(bool PTTIsToggle)
|
||||
{
|
||||
if (mVoiceModule) mVoiceModule->setPTTIsToggle(PTTIsToggle);
|
||||
if(!PTTIsToggle && mPTTIsToggle)
|
||||
{
|
||||
// When the user turns off toggle, reset the current state.
|
||||
mUserPTTState = false;
|
||||
}
|
||||
|
||||
mPTTIsToggle = PTTIsToggle;
|
||||
|
||||
updateMicMuteLogic();
|
||||
}
|
||||
|
||||
bool LLVoiceClient::getPTTIsToggle()
|
||||
{
|
||||
if (mVoiceModule)
|
||||
{
|
||||
return mVoiceModule->getPTTIsToggle();
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
return mPTTIsToggle;
|
||||
}
|
||||
|
||||
void LLVoiceClient::setPTTKey(std::string &key)
|
||||
{
|
||||
if(key == "MiddleMouse")
|
||||
{
|
||||
mPTTIsMiddleMouse = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
mPTTIsMiddleMouse = false;
|
||||
if(!LLKeyboard::keyFromString(key, &mPTTKey))
|
||||
{
|
||||
// If the call failed, don't match any key.
|
||||
key = KEY_NONE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLVoiceClient::inputUserControlState(bool down)
|
||||
{
|
||||
if (mVoiceModule) mVoiceModule->inputUserControlState(down);
|
||||
if(mPTTIsToggle)
|
||||
{
|
||||
if(down) // toggle open-mic state on 'down'
|
||||
{
|
||||
toggleUserPTTState();
|
||||
}
|
||||
}
|
||||
else // set open-mic state as an absolute
|
||||
{
|
||||
setUserPTTState(down);
|
||||
}
|
||||
}
|
||||
|
||||
void LLVoiceClient::toggleUserPTTState(void)
|
||||
{
|
||||
if (mVoiceModule) mVoiceModule->toggleUserPTTState();
|
||||
setUserPTTState(!getUserPTTState());
|
||||
}
|
||||
|
||||
void LLVoiceClient::keyDown(KEY key, MASK mask)
|
||||
{
|
||||
if (mVoiceModule) mVoiceModule->keyDown(key, mask);
|
||||
if (gKeyboard->getKeyRepeated(key))
|
||||
{
|
||||
// ignore auto-repeat keys
|
||||
return;
|
||||
}
|
||||
|
||||
if(!mPTTIsMiddleMouse)
|
||||
{
|
||||
bool down = (mPTTKey != KEY_NONE)
|
||||
&& gKeyboard->getKeyDown(mPTTKey);
|
||||
inputUserControlState(down);
|
||||
}
|
||||
|
||||
}
|
||||
void LLVoiceClient::keyUp(KEY key, MASK mask)
|
||||
{
|
||||
if (mVoiceModule) mVoiceModule->keyUp(key, mask);
|
||||
if(!mPTTIsMiddleMouse)
|
||||
{
|
||||
bool down = (mPTTKey != KEY_NONE)
|
||||
&& gKeyboard->getKeyDown(mPTTKey);
|
||||
inputUserControlState(down);
|
||||
}
|
||||
}
|
||||
void LLVoiceClient::middleMouseState(bool down)
|
||||
{
|
||||
if (mVoiceModule) mVoiceModule->middleMouseState(down);
|
||||
if(mPTTIsMiddleMouse)
|
||||
{
|
||||
if(mPTTIsMiddleMouse)
|
||||
{
|
||||
inputUserControlState(down);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -191,25 +191,9 @@ public:
|
|||
virtual void setVoiceEnabled(bool enabled)=0;
|
||||
virtual void setLipSyncEnabled(BOOL enabled)=0;
|
||||
virtual BOOL lipSyncEnabled()=0;
|
||||
virtual void setMuteMic(bool muted)=0; // Use this to mute the local mic (for when the client is minimized, etc), ignoring user PTT state.
|
||||
virtual void setMuteMic(bool muted)=0; // Set the mute state of the local mic.
|
||||
//@}
|
||||
|
||||
////////////////////////
|
||||
/// @name PTT
|
||||
//@{
|
||||
virtual void setUserPTTState(bool ptt)=0;
|
||||
virtual bool getUserPTTState()=0;
|
||||
virtual void setUsePTT(bool usePTT)=0;
|
||||
virtual void setPTTIsToggle(bool PTTIsToggle)=0;
|
||||
virtual bool getPTTIsToggle()=0;
|
||||
virtual void toggleUserPTTState(void)=0;
|
||||
virtual void inputUserControlState(bool down)=0; // interpret any sort of up-down mic-open control input according to ptt-toggle prefs
|
||||
|
||||
virtual void keyDown(KEY key, MASK mask)=0;
|
||||
virtual void keyUp(KEY key, MASK mask)=0;
|
||||
virtual void middleMouseState(bool down)=0;
|
||||
//@}
|
||||
|
||||
|
||||
//////////////////////////
|
||||
/// @name nearby speaker accessors
|
||||
//@{
|
||||
|
|
@ -406,6 +390,9 @@ public:
|
|||
void setUsePTT(bool usePTT);
|
||||
void setPTTIsToggle(bool PTTIsToggle);
|
||||
bool getPTTIsToggle();
|
||||
void setPTTKey(std::string &key);
|
||||
|
||||
void updateMicMuteLogic();
|
||||
|
||||
BOOL lipSyncEnabled();
|
||||
|
||||
|
|
@ -471,6 +458,17 @@ protected:
|
|||
|
||||
LLCachedControl<bool> mVoiceEffectEnabled;
|
||||
LLCachedControl<std::string> mVoiceEffectDefault;
|
||||
|
||||
bool mPTTDirty;
|
||||
bool mPTT;
|
||||
|
||||
bool mUsePTT;
|
||||
bool mPTTIsMiddleMouse;
|
||||
KEY mPTTKey;
|
||||
bool mPTTIsToggle;
|
||||
bool mUserPTTState;
|
||||
bool mMuteMic;
|
||||
bool mDisableMic;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -44,7 +44,6 @@
|
|||
#include "llviewernetwork.h" // for gGridChoice
|
||||
#include "llbase64.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llkeyboard.h"
|
||||
#include "llappviewer.h" // for gDisconnected, gDisableVoice
|
||||
#include "llmutelist.h" // to check for muted avatars
|
||||
#include "llagent.h"
|
||||
|
|
@ -322,14 +321,8 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() :
|
|||
mRenderDeviceDirty(false),
|
||||
mSpatialCoordsDirty(false),
|
||||
|
||||
mPTTDirty(true),
|
||||
mPTT(true),
|
||||
mUsePTT(true),
|
||||
mPTTIsMiddleMouse(false),
|
||||
mPTTKey(0),
|
||||
mPTTIsToggle(false),
|
||||
mUserPTTState(false),
|
||||
mMuteMic(false),
|
||||
mMuteMicDirty(false),
|
||||
mFriendsListDirty(true),
|
||||
|
||||
mEarLocation(0),
|
||||
|
|
@ -431,10 +424,6 @@ const LLVoiceVersionInfo& LLVivoxVoiceClient::getVersion()
|
|||
void LLVivoxVoiceClient::updateSettings()
|
||||
{
|
||||
setVoiceEnabled(gSavedSettings.getBOOL("EnableVoiceChat"));
|
||||
setUsePTT(gSavedSettings.getBOOL("PTTCurrentlyEnabled"));
|
||||
std::string keyString = gSavedSettings.getString("PushToTalkButton");
|
||||
setPTTKey(keyString);
|
||||
setPTTIsToggle(gSavedSettings.getBOOL("PushToTalkToggle"));
|
||||
setEarLocation(gSavedSettings.getS32("VoiceEarLocation"));
|
||||
|
||||
std::string inputDevice = gSavedSettings.getString("VoiceInputAudioDevice");
|
||||
|
|
@ -946,7 +935,7 @@ void LLVivoxVoiceClient::stateMachine()
|
|||
setState(stateDaemonLaunched);
|
||||
|
||||
// Dirty the states we'll need to sync with the daemon when it comes up.
|
||||
mPTTDirty = true;
|
||||
mMuteMicDirty = true;
|
||||
mMicVolumeDirty = true;
|
||||
mSpeakerVolumeDirty = true;
|
||||
mSpeakerMuteDirty = true;
|
||||
|
|
@ -1531,7 +1520,7 @@ void LLVivoxVoiceClient::stateMachine()
|
|||
if(mAudioSession && mAudioSession->mVoiceEnabled)
|
||||
{
|
||||
// Dirty state that may need to be sync'ed with the daemon.
|
||||
mPTTDirty = true;
|
||||
mMuteMicDirty = true;
|
||||
mSpeakerVolumeDirty = true;
|
||||
mSpatialCoordsDirty = true;
|
||||
|
||||
|
|
@ -1572,35 +1561,6 @@ void LLVivoxVoiceClient::stateMachine()
|
|||
}
|
||||
else
|
||||
{
|
||||
|
||||
// Figure out whether the PTT state needs to change
|
||||
{
|
||||
bool newPTT;
|
||||
if(mUsePTT)
|
||||
{
|
||||
// If configured to use PTT, track the user state.
|
||||
newPTT = mUserPTTState;
|
||||
}
|
||||
else
|
||||
{
|
||||
// If not configured to use PTT, it should always be true (otherwise the user will be unable to speak).
|
||||
newPTT = true;
|
||||
}
|
||||
|
||||
if(mMuteMic)
|
||||
{
|
||||
// This always overrides any other PTT setting.
|
||||
newPTT = false;
|
||||
}
|
||||
|
||||
// Dirty if state changed.
|
||||
if(newPTT != mPTT)
|
||||
{
|
||||
mPTT = newPTT;
|
||||
mPTTDirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
if(!inSpatialChannel())
|
||||
{
|
||||
// When in a non-spatial channel, never send positional updates.
|
||||
|
|
@ -1622,7 +1582,7 @@ void LLVivoxVoiceClient::stateMachine()
|
|||
// Send an update only if the ptt or mute state has changed (which shouldn't be able to happen that often
|
||||
// -- the user can only click so fast) or every 10hz, whichever is sooner.
|
||||
// Sending for every volume update causes an excessive flood of messages whenever a volume slider is dragged.
|
||||
if((mAudioSession && mAudioSession->mMuteDirty) || mPTTDirty || mUpdateTimer.hasExpired())
|
||||
if((mAudioSession && mAudioSession->mMuteDirty) || mMuteMicDirty || mUpdateTimer.hasExpired())
|
||||
{
|
||||
mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS);
|
||||
sendPositionalUpdate();
|
||||
|
|
@ -2745,19 +2705,17 @@ void LLVivoxVoiceClient::buildLocalAudioUpdates(std::ostringstream &stream)
|
|||
|
||||
buildSetRenderDevice(stream);
|
||||
|
||||
if(mPTTDirty)
|
||||
if(mMuteMicDirty)
|
||||
{
|
||||
mPTTDirty = false;
|
||||
mMuteMicDirty = false;
|
||||
|
||||
// Send a local mute command.
|
||||
// NOTE that the state of "PTT" is the inverse of "local mute".
|
||||
// (i.e. when PTT is true, we send a mute command with "false", and vice versa)
|
||||
|
||||
LL_DEBUGS("Voice") << "Sending MuteLocalMic command with parameter " << (mPTT?"false":"true") << LL_ENDL;
|
||||
LL_DEBUGS("Voice") << "Sending MuteLocalMic command with parameter " << (mMuteMic?"true":"false") << LL_ENDL;
|
||||
|
||||
stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">"
|
||||
<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"
|
||||
<< "<Value>" << (mPTT?"false":"true") << "</Value>"
|
||||
<< "<Value>" << (mMuteMic?"true":"false") << "</Value>"
|
||||
<< "</Request>\n\n\n";
|
||||
|
||||
}
|
||||
|
|
@ -5230,38 +5188,11 @@ void LLVivoxVoiceClient::leaveChannel(void)
|
|||
|
||||
void LLVivoxVoiceClient::setMuteMic(bool muted)
|
||||
{
|
||||
mMuteMic = muted;
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::setUserPTTState(bool ptt)
|
||||
{
|
||||
mUserPTTState = ptt;
|
||||
}
|
||||
|
||||
bool LLVivoxVoiceClient::getUserPTTState()
|
||||
{
|
||||
return mUserPTTState;
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::inputUserControlState(bool down)
|
||||
{
|
||||
if(mPTTIsToggle)
|
||||
if(mMuteMic != muted)
|
||||
{
|
||||
if(down) // toggle open-mic state on 'down'
|
||||
{
|
||||
toggleUserPTTState();
|
||||
}
|
||||
mMuteMic = muted;
|
||||
mMuteMicDirty = true;
|
||||
}
|
||||
else // set open-mic state as an absolute
|
||||
{
|
||||
setUserPTTState(down);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LLVivoxVoiceClient::toggleUserPTTState(void)
|
||||
{
|
||||
mUserPTTState = !mUserPTTState;
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::setVoiceEnabled(bool enabled)
|
||||
|
|
@ -5312,48 +5243,6 @@ BOOL LLVivoxVoiceClient::lipSyncEnabled()
|
|||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::setUsePTT(bool usePTT)
|
||||
{
|
||||
if(usePTT && !mUsePTT)
|
||||
{
|
||||
// When the user turns on PTT, reset the current state.
|
||||
mUserPTTState = false;
|
||||
}
|
||||
mUsePTT = usePTT;
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::setPTTIsToggle(bool PTTIsToggle)
|
||||
{
|
||||
if(!PTTIsToggle && mPTTIsToggle)
|
||||
{
|
||||
// When the user turns off toggle, reset the current state.
|
||||
mUserPTTState = false;
|
||||
}
|
||||
|
||||
mPTTIsToggle = PTTIsToggle;
|
||||
}
|
||||
|
||||
bool LLVivoxVoiceClient::getPTTIsToggle()
|
||||
{
|
||||
return mPTTIsToggle;
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::setPTTKey(std::string &key)
|
||||
{
|
||||
if(key == "MiddleMouse")
|
||||
{
|
||||
mPTTIsMiddleMouse = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
mPTTIsMiddleMouse = false;
|
||||
if(!LLKeyboard::keyFromString(key, &mPTTKey))
|
||||
{
|
||||
// If the call failed, don't match any key.
|
||||
key = KEY_NONE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::setEarLocation(S32 loc)
|
||||
{
|
||||
|
|
@ -5394,44 +5283,6 @@ void LLVivoxVoiceClient::setMicGain(F32 volume)
|
|||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::keyDown(KEY key, MASK mask)
|
||||
{
|
||||
if (gKeyboard->getKeyRepeated(key))
|
||||
{
|
||||
// ignore auto-repeat keys
|
||||
return;
|
||||
}
|
||||
|
||||
if(!mPTTIsMiddleMouse)
|
||||
{
|
||||
bool down = (mPTTKey != KEY_NONE)
|
||||
&& gKeyboard->getKeyDown(mPTTKey);
|
||||
inputUserControlState(down);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
void LLVivoxVoiceClient::keyUp(KEY key, MASK mask)
|
||||
{
|
||||
if(!mPTTIsMiddleMouse)
|
||||
{
|
||||
bool down = (mPTTKey != KEY_NONE)
|
||||
&& gKeyboard->getKeyDown(mPTTKey);
|
||||
inputUserControlState(down);
|
||||
}
|
||||
|
||||
}
|
||||
void LLVivoxVoiceClient::middleMouseState(bool down)
|
||||
{
|
||||
if(mPTTIsMiddleMouse)
|
||||
{
|
||||
if(mPTTIsMiddleMouse)
|
||||
{
|
||||
inputUserControlState(down);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////
|
||||
// Accessors for data related to nearby speakers
|
||||
BOOL LLVivoxVoiceClient::getVoiceEnabled(const LLUUID& id)
|
||||
|
|
@ -7005,8 +6856,8 @@ void LLVivoxVoiceClient::captureBufferRecordStartSendMessage()
|
|||
<< "<Value>false</Value>"
|
||||
<< "</Request>\n\n\n";
|
||||
|
||||
// Dirty the PTT state so that it will get reset when we finishing previewing
|
||||
mPTTDirty = true;
|
||||
// Dirty the mute mic state so that it will get reset when we finishing previewing
|
||||
mMuteMicDirty = true;
|
||||
|
||||
writeString(stream.str());
|
||||
}
|
||||
|
|
@ -7020,7 +6871,7 @@ void LLVivoxVoiceClient::captureBufferRecordStopSendMessage()
|
|||
|
||||
LL_DEBUGS("Voice") << "Stopping audio capture to buffer." << LL_ENDL;
|
||||
|
||||
// Mute the mic. PTT state was dirtied at recording start, so will be reset when finished previewing.
|
||||
// Mute the mic. Mic mute state was dirtied at recording start, so will be reset when finished previewing.
|
||||
stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">"
|
||||
<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"
|
||||
<< "<Value>true</Value>"
|
||||
|
|
|
|||
|
|
@ -173,25 +173,9 @@ public:
|
|||
virtual void setVoiceEnabled(bool enabled);
|
||||
virtual BOOL lipSyncEnabled();
|
||||
virtual void setLipSyncEnabled(BOOL enabled);
|
||||
virtual void setMuteMic(bool muted); // Use this to mute the local mic (for when the client is minimized, etc), ignoring user PTT state.
|
||||
virtual void setMuteMic(bool muted); // Set the mute state of the local mic.
|
||||
//@}
|
||||
|
||||
////////////////////////
|
||||
/// @name PTT
|
||||
//@{
|
||||
virtual void setUserPTTState(bool ptt);
|
||||
virtual bool getUserPTTState();
|
||||
virtual void setUsePTT(bool usePTT);
|
||||
virtual void setPTTIsToggle(bool PTTIsToggle);
|
||||
virtual bool getPTTIsToggle();
|
||||
virtual void inputUserControlState(bool down); // interpret any sort of up-down mic-open control input according to ptt-toggle prefs
|
||||
virtual void toggleUserPTTState(void);
|
||||
|
||||
virtual void keyDown(KEY key, MASK mask);
|
||||
virtual void keyUp(KEY key, MASK mask);
|
||||
virtual void middleMouseState(bool down);
|
||||
//@}
|
||||
|
||||
|
||||
//////////////////////////
|
||||
/// @name nearby speaker accessors
|
||||
//@{
|
||||
|
|
@ -534,9 +518,6 @@ protected:
|
|||
// Use this to determine whether to show a "no speech" icon in the menu bar.
|
||||
|
||||
|
||||
// PTT
|
||||
void setPTTKey(std::string &key);
|
||||
|
||||
/////////////////////////////
|
||||
// Recording controls
|
||||
void recordingLoopStart(int seconds = 3600, int deltaFramesPerControlFrame = 200);
|
||||
|
|
@ -800,15 +781,8 @@ private:
|
|||
LLVector3 mAvatarVelocity;
|
||||
LLMatrix3 mAvatarRot;
|
||||
|
||||
bool mPTTDirty;
|
||||
bool mPTT;
|
||||
|
||||
bool mUsePTT;
|
||||
bool mPTTIsMiddleMouse;
|
||||
KEY mPTTKey;
|
||||
bool mPTTIsToggle;
|
||||
bool mUserPTTState;
|
||||
bool mMuteMic;
|
||||
bool mMuteMicDirty;
|
||||
|
||||
// Set to true when the friends list is known to have changed.
|
||||
bool mFriendsListDirty;
|
||||
|
|
|
|||
|
|
@ -2069,7 +2069,7 @@ Would you be my friend?
|
|||
<button
|
||||
default="true"
|
||||
index="0"
|
||||
name="Offer"
|
||||
name="OK"
|
||||
text="OK"/>
|
||||
<button
|
||||
index="1"
|
||||
|
|
@ -2091,7 +2091,7 @@ Would you be my friend?
|
|||
<button
|
||||
default="true"
|
||||
index="0"
|
||||
name="Offer"
|
||||
name="OK"
|
||||
text="OK"/>
|
||||
<button
|
||||
index="1"
|
||||
|
|
@ -2114,7 +2114,7 @@ Would you be my friend?
|
|||
<button
|
||||
default="true"
|
||||
index="0"
|
||||
name="Offer"
|
||||
name="OK"
|
||||
text="OK"/>
|
||||
<button
|
||||
index="1"
|
||||
|
|
@ -4810,24 +4810,6 @@ Some terms in your search query were excluded due to content restrictions as cla
|
|||
Please select at least one type of content to search (General, Moderate, or Adult).
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="notify.tga"
|
||||
name="GroupVote"
|
||||
type="notify">
|
||||
[NAME] has proposed to vote on:
|
||||
[MESSAGE]
|
||||
<form name="form">
|
||||
<button
|
||||
index="0"
|
||||
name="VoteNow"
|
||||
text="Vote Now"/>
|
||||
<button
|
||||
index="1"
|
||||
name="Later"
|
||||
text="Later"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="notify.tga"
|
||||
name="SystemMessage"
|
||||
|
|
@ -6313,13 +6295,9 @@ Avatar '[NAME]' left appearance mode.
|
|||
type="alertmodal">
|
||||
We're having trouble connecting using [PROTOCOL] [HOSTID].
|
||||
Please check your network and firewall setup.
|
||||
<form name="form">
|
||||
<button
|
||||
default="true"
|
||||
index="0"
|
||||
name="OK"
|
||||
text="OK"/>
|
||||
</form>
|
||||
<usetemplate
|
||||
name="okbutton"
|
||||
yestext="OK"/>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
|
|
@ -6332,13 +6310,9 @@ We're having trouble connecting to your voice server:
|
|||
|
||||
Voice communications will not be available.
|
||||
Please check your network and firewall setup.
|
||||
<form name="form">
|
||||
<button
|
||||
default="true"
|
||||
index="0"
|
||||
name="OK"
|
||||
text="OK"/>
|
||||
</form>
|
||||
<usetemplate
|
||||
name="okbutton"
|
||||
yestext="OK"/>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
|
|
|
|||
|
|
@ -0,0 +1,27 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel
|
||||
follows="left|right|top|bottom"
|
||||
height="768"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
mouse_opaque="false"
|
||||
tab_stop="false"
|
||||
name="main_view"
|
||||
width="1024">
|
||||
<view top="0"
|
||||
follows="all"
|
||||
height="768"
|
||||
left="0"
|
||||
mouse_opaque="false"
|
||||
name="world_view_rect"
|
||||
width="1024"/>
|
||||
<panel top="0"
|
||||
follows="all"
|
||||
height="768"
|
||||
mouse_opaque="true"
|
||||
name="progress_view"
|
||||
filename="panel_progress.xml"
|
||||
class="progress_view"
|
||||
width="1024"
|
||||
visible="false"/>
|
||||
</panel>
|
||||
Loading…
Reference in New Issue