summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BuildParams4
-rw-r--r--indra/llui/CMakeLists.txt1
-rw-r--r--indra/llui/llhandle.h8
-rw-r--r--indra/llui/lllineeditor.cpp2
-rw-r--r--indra/llui/lllineeditor.h2
-rw-r--r--indra/llui/llmenugl.cpp42
-rw-r--r--indra/llui/llmenugl.h7
-rw-r--r--indra/llui/llnotifications.cpp212
-rw-r--r--indra/llui/llnotifications.h19
-rw-r--r--indra/llui/llnotificationtemplate.h12
-rw-r--r--indra/llui/llnotificationvisibilityrule.h87
-rw-r--r--indra/llui/llpanel.cpp2
-rw-r--r--indra/llui/llui.cpp18
-rw-r--r--indra/llui/llview.cpp25
-rw-r--r--indra/llui/llview.h17
-rw-r--r--indra/llwindow/llkeyboard.h2
-rw-r--r--indra/llwindow/llwindowwin32.cpp22
-rw-r--r--indra/llxuixml/llregistry.h5
-rw-r--r--indra/newview/CMakeLists.txt2
-rw-r--r--indra/newview/app_settings/cmd_line.xml10
-rw-r--r--indra/newview/app_settings/keys.ini357
-rw-r--r--indra/newview/app_settings/keys.xml350
-rw-r--r--indra/newview/app_settings/settings.xml68
-rw-r--r--indra/newview/llagentcamera.cpp2
-rw-r--r--indra/newview/llappviewer.cpp28
-rw-r--r--indra/newview/llbottomtray.cpp28
-rw-r--r--indra/newview/llbottomtray.h9
-rw-r--r--indra/newview/lldirpicker.cpp40
-rw-r--r--indra/newview/lldirpicker.h1
-rw-r--r--indra/newview/llfilepicker.cpp96
-rw-r--r--indra/newview/llfilepicker.h4
-rw-r--r--indra/newview/llfloatercamera.cpp3
-rw-r--r--indra/newview/llfloaternotificationsconsole.cpp1
-rw-r--r--indra/newview/lllistcontextmenu.cpp28
-rw-r--r--indra/newview/lllistcontextmenu.h3
-rw-r--r--indra/newview/llmoveview.cpp33
-rw-r--r--indra/newview/llnavigationbar.cpp3
-rw-r--r--indra/newview/llnearbychatbar.cpp30
-rw-r--r--indra/newview/llnearbychatbar.h4
-rw-r--r--indra/newview/llpanellogin.cpp11
-rw-r--r--indra/newview/llpopupview.cpp3
-rw-r--r--indra/newview/llpopupview.h2
-rw-r--r--indra/newview/llsidetray.cpp2
-rw-r--r--indra/newview/lltool.cpp8
-rw-r--r--indra/newview/lltoolpie.cpp16
-rw-r--r--indra/newview/llviewerkeyboard.cpp183
-rw-r--r--indra/newview/llviewerkeyboard.h37
-rw-r--r--indra/newview/llviewermenu.cpp52
-rw-r--r--indra/newview/llviewerwindow.cpp12
-rw-r--r--indra/newview/llviewerwindow.h2
-rw-r--r--indra/newview/llvoiceclient.cpp138
-rw-r--r--indra/newview/llvoiceclient.h34
-rw-r--r--indra/newview/llvoicevivox.cpp177
-rw-r--r--indra/newview/llvoicevivox.h32
-rw-r--r--indra/newview/skins/default/xui/en/main_view.xml8
-rw-r--r--indra/newview/skins/default/xui/en/notification_visibility.xml5
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml98
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_login.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_navigation_bar.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/sidetray_tab.xml4
62 files changed, 1547 insertions, 868 deletions
diff --git a/BuildParams b/BuildParams
index 898cb7bbd3..b9b90d7316 100644
--- a/BuildParams
+++ b/BuildParams
@@ -185,5 +185,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
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index e98201ea63..864f3f699e 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -159,6 +159,7 @@ set(llui_HEADER_FILES
llnotificationslistener.h
llnotificationsutil.h
llnotificationtemplate.h
+ llnotificationvisibilityrule.h
llpanel.h
llprogressbar.h
llradiogroup.h
diff --git a/indra/llui/llhandle.h b/indra/llui/llhandle.h
index a43f095d67..8c000eee48 100644
--- a/indra/llui/llhandle.h
+++ b/indra/llui/llhandle.h
@@ -61,13 +61,6 @@ public:
return *this;
}
- template<typename Subclass>
- LLHandle<T>& operator =(const LLHandle<Subclass>& other)
- {
- mTombStone = other.mTombStone;
- return *this;
- }
-
bool isDead() const
{
return mTombStone->getTarget() == NULL;
@@ -99,7 +92,6 @@ public:
{
return lhs.mTombStone > rhs.mTombStone;
}
-protected:
protected:
LLPointer<LLTombStone<T> > mTombStone;
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index a1fc977ce1..16e86a8eac 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -1491,6 +1491,8 @@ void LLLineEditor::drawBackground()
{
image = mBgImage;
}
+
+ if (!image) return;
F32 alpha = getDrawContext().mAlpha;
// optionally draw programmatic border
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index 76d0187712..66fe8304e2 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -326,7 +326,7 @@ protected:
std::vector<S32> mPreeditPositions;
LLPreeditor::standouts_t mPreeditStandouts;
- LLHandle<LLView> mContextMenuHandle;
+ LLHandle<LLContextMenu> mContextMenuHandle;
private:
// Instances that by default point to the statics but can be overidden in XML.
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 6d590cf54e..64f84bae7c 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -2596,6 +2596,7 @@ LLMenuItemGL* LLMenuGL::getHighlightedItem()
LLMenuItemGL* LLMenuGL::highlightNextItem(LLMenuItemGL* cur_item, BOOL skip_disabled)
{
+ if (mItems.empty()) return NULL;
// highlighting first item on a torn off menu is the
// same as giving focus to it
if (!cur_item && getTornOff())
@@ -2674,6 +2675,8 @@ LLMenuItemGL* LLMenuGL::highlightNextItem(LLMenuItemGL* cur_item, BOOL skip_disa
LLMenuItemGL* LLMenuGL::highlightPrevItem(LLMenuItemGL* cur_item, BOOL skip_disabled)
{
+ if (mItems.empty()) return NULL;
+
// highlighting first item on a torn off menu is the
// same as giving focus to it
if (!cur_item && getTornOff())
@@ -2986,6 +2989,11 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y)
const S32 CURSOR_HEIGHT = 22; // Approximate "normal" cursor size
const S32 CURSOR_WIDTH = 12;
+ if(menu->getChildList()->empty())
+ {
+ return;
+ }
+
// Save click point for detecting cursor moves before mouse-up.
// Must be in local coords to compare with mouseUp events.
// If the mouse doesn't move, the menu will stay open ala the Mac.
@@ -3066,7 +3074,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())
{
@@ -3683,9 +3694,7 @@ public:
LLContextMenuBranch(const Params&);
virtual ~LLContextMenuBranch()
- {
- delete mBranch;
- }
+ {}
// called to rebuild the draw label
virtual void buildDrawLabel( void );
@@ -3693,21 +3702,21 @@ public:
// onCommit() - do the primary funcationality of the menu item.
virtual void onCommit( void );
- LLContextMenu* getBranch() { return mBranch; }
+ LLContextMenu* getBranch() { return mBranch.get(); }
void setHighlight( BOOL highlight );
protected:
void showSubMenu();
- LLContextMenu* mBranch;
+ LLHandle<LLContextMenu> mBranch;
};
LLContextMenuBranch::LLContextMenuBranch(const LLContextMenuBranch::Params& p)
: LLMenuItemGL(p),
- mBranch( p.branch )
+ mBranch( p.branch()->getHandle() )
{
- mBranch->hide();
- mBranch->setParentMenuItem(this);
+ mBranch.get()->hide();
+ mBranch.get()->setParentMenuItem(this);
}
// called to rebuild the draw label
@@ -3716,12 +3725,12 @@ void LLContextMenuBranch::buildDrawLabel( void )
{
// default enablement is this -- if any of the subitems are
// enabled, this item is enabled. JC
- U32 sub_count = mBranch->getItemCount();
+ U32 sub_count = mBranch.get()->getItemCount();
U32 i;
BOOL any_enabled = FALSE;
for (i = 0; i < sub_count; i++)
{
- LLMenuItemGL* item = mBranch->getItem(i);
+ LLMenuItemGL* item = mBranch.get()->getItem(i);
item->buildDrawLabel();
if (item->getEnabled() && !item->getDrawTextDisabled() )
{
@@ -3743,13 +3752,13 @@ void LLContextMenuBranch::buildDrawLabel( void )
void LLContextMenuBranch::showSubMenu()
{
- LLMenuItemGL* menu_item = mBranch->getParentMenuItem();
+ LLMenuItemGL* menu_item = mBranch.get()->getParentMenuItem();
if (menu_item != NULL && menu_item->getVisible())
{
S32 center_x;
S32 center_y;
localPointToScreen(getRect().getWidth(), getRect().getHeight() , &center_x, &center_y);
- mBranch->show(center_x, center_y);
+ mBranch.get()->show(center_x, center_y);
}
}
@@ -3769,7 +3778,7 @@ void LLContextMenuBranch::setHighlight( BOOL highlight )
}
else
{
- mBranch->hide();
+ mBranch.get()->hide();
}
}
@@ -3800,6 +3809,11 @@ void LLContextMenu::setVisible(BOOL visible)
// Takes cursor position in screen space?
void LLContextMenu::show(S32 x, S32 y)
{
+ if (getChildList()->empty())
+ {
+ // nothing to show, so abort
+ return;
+ }
// Save click point for detecting cursor moves before mouse-up.
// Must be in local coords to compare with mouseUp events.
// If the mouse doesn't move, the menu will stay open ala the Mac.
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index 19b738312e..bb17bf4102 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -670,9 +670,12 @@ public:
BOOL appendContextSubMenu(LLContextMenu *menu);
+ LLHandle<LLContextMenu> getHandle() { mHandle.bind(this); return mHandle; }
+
protected:
- BOOL mHoveredAnyItem;
- LLMenuItemGL* mHoverItem;
+ BOOL mHoveredAnyItem;
+ LLMenuItemGL* mHoverItem;
+ LLRootHandle<LLContextMenu> mHandle;
};
diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index 30cd85619e..92fa6ada54 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -28,6 +28,7 @@
#include "llnotifications.h"
#include "llnotificationtemplate.h"
+#include "llnotificationvisibilityrule.h"
#include "llinstantmessage.h"
#include "llxmlnode.h"
@@ -133,12 +134,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 +168,28 @@ 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;
+}
+
+bool visibilityRuleMached(const LLSD& payload)
+{
+ // This is needed because LLNotifications::isVisibleByRules may have cancelled the notification.
+ // Returning true here makes LLNotificationChannelBase::updateItem do an early out, which prevents things from happening in the wrong order.
+ return true;
+}
+
+
namespace LLNotificationFilters
{
// a sample filter
@@ -403,9 +420,26 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par
mUniqueContext.push_back(it->key);
}
+ for(LLInitParam::ParamIterator<LLNotificationTemplate::Tag>::const_iterator it = p.tags.begin(),
+ end_it = p.tags.end();
+ it != end_it;
+ ++it)
+ {
+ mTags.push_back(it->value);
+ }
+
mForm = LLNotificationFormPtr(new LLNotificationForm(p.name, p.form_ref.form));
}
+LLNotificationVisibilityRule::LLNotificationVisibilityRule(const LLNotificationVisibilityRule::Params &p)
+: mVisible(p.visible),
+ mResponse(p.response),
+ mType(p.type),
+ mTag(p.tag),
+ mName(p.name)
+{
+}
+
LLNotification::LLNotification(const LLNotification::Params& p) :
mTimestamp(p.time_stamp),
mSubstitutions(p.substitutions),
@@ -675,6 +709,25 @@ bool LLNotification::hasUniquenessConstraints() const
return (mTemplatep ? mTemplatep->mUnique : false);
}
+bool LLNotification::matchesTag(const std::string& tag)
+{
+ bool result = false;
+
+ if(mTemplatep)
+ {
+ std::list<std::string>::iterator it;
+ for(it = mTemplatep->mTags.begin(); it != mTemplatep->mTags.end(); it++)
+ {
+ if((*it) == tag)
+ {
+ result = true;
+ break;
+ }
+ }
+ }
+
+ return result;
+}
void LLNotification::setIgnored(bool ignore)
{
@@ -1060,12 +1113,12 @@ std::string LLNotificationChannel::summarize()
// LLNotifications implementation
// ---
LLNotifications::LLNotifications() : LLNotificationChannelBase(LLNotificationFilters::includeEverything,
- LLNotificationComparators::orderByUUID()),
- mIgnoreAllNotifications(false)
+ LLNotificationComparators::orderByUUID()),
+ mIgnoreAllNotifications(false)
{
LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Notification.Show", boost::bind(&LLNotifications::addFromCallback, this, _2));
-
- mListener.reset(new LLNotificationsListener(*this));
+
+ mListener.reset(new LLNotificationsListener(*this));
}
@@ -1180,6 +1233,7 @@ LLNotificationChannelPtr LLNotifications::getChannel(const std::string& channelN
void LLNotifications::initSingleton()
{
loadTemplates();
+ loadVisibilityRules();
createDefaultChannels();
}
@@ -1187,15 +1241,19 @@ 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));
LLNotificationChannel::buildChannel("Ignore", "Unique",
filterIgnoredNotifications);
- LLNotificationChannel::buildChannel("Visible", "Ignore",
+ LLNotificationChannel::buildChannel("VisibilityRules", "Ignore",
+ boost::bind(&LLNotifications::isVisibleByRules, this, _1));
+ LLNotificationChannel::buildChannel("Visible", "VisibilityRules",
&LLNotificationFilters::includeEverything);
// create special persistent notification channel
@@ -1203,6 +1261,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
@@ -1214,6 +1274,8 @@ void LLNotifications::createDefaultChannels()
// connectFailedFilter(boost::bind(&LLNotifications::failedUniquenessTest, this, _1));
LLNotifications::instance().getChannel("Ignore")->
connectFailedFilter(&handleIgnoredNotification);
+ LLNotifications::instance().getChannel("VisibilityRules")->
+ connectFailedFilter(&visibilityRuleMached);
}
bool LLNotifications::addTemplate(const std::string &name,
@@ -1343,6 +1405,12 @@ bool LLNotifications::loadTemplates()
LLXUIParser parser;
parser.readXUI(root, params, full_filename);
+ if(!params.validateBlock())
+ {
+ llerrs << "Problem reading UI Notifications file: " << full_filename << llendl;
+ return false;
+ }
+
mTemplates.clear();
for(LLInitParam::ParamIterator<LLNotificationTemplate::GlobalString>::const_iterator it = params.strings.begin(), end_it = params.strings.end();
@@ -1392,6 +1460,42 @@ bool LLNotifications::loadTemplates()
return true;
}
+bool LLNotifications::loadVisibilityRules()
+{
+ const std::string xml_filename = "notification_visibility.xml";
+ std::string full_filename = gDirUtilp->findSkinnedFilename(LLUI::getXUIPaths().front(), xml_filename);
+
+ LLXMLNodePtr root;
+ BOOL success = LLUICtrlFactory::getLayeredXMLNode(xml_filename, root);
+
+ if (!success || root.isNull() || !root->hasName( "notification_visibility" ))
+ {
+ llerrs << "Problem reading UI Notification Visibility Rules file: " << full_filename << llendl;
+ return false;
+ }
+
+ LLNotificationVisibilityRule::Rules params;
+ LLXUIParser parser;
+ parser.readXUI(root, params, full_filename);
+
+ if(!params.validateBlock())
+ {
+ llerrs << "Problem reading UI Notification Visibility Rules file: " << full_filename << llendl;
+ return false;
+ }
+
+ mVisibilityRules.clear();
+
+ for(LLInitParam::ParamIterator<LLNotificationVisibilityRule::Params>::iterator it = params.rules.begin(), end_it = params.rules.end();
+ it != end_it;
+ ++it)
+ {
+ mVisibilityRules.push_back(LLNotificationVisibilityRulePtr(new LLNotificationVisibilityRule(*it)));
+ }
+
+ return true;
+}
+
// Add a simple notification (from XUI)
void LLNotifications::addFromCallback(const LLSD& name)
{
@@ -1542,6 +1646,88 @@ bool LLNotifications::getIgnoreAllNotifications()
return mIgnoreAllNotifications;
}
+bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
+{
+ if(n->isRespondedTo())
+ {
+ // This avoids infinite recursion in the case where the filter calls respond()
+ return true;
+ }
+
+ VisibilityRuleList::iterator it;
+
+ for(it = mVisibilityRules.begin(); it != mVisibilityRules.end(); it++)
+ {
+ // An empty type or tag string will match any notification, so only do the comparison when the string is non-empty in the rule.
+
+ if(!(*it)->mType.empty())
+ {
+ if((*it)->mType != n->getType())
+ {
+ // Type doesn't match, so skip this rule.
+ continue;
+ }
+ }
+
+ if(!(*it)->mTag.empty())
+ {
+ // check this notification's tag(s) against it->mTag and continue if no match is found.
+ if(!n->matchesTag((*it)->mTag))
+ {
+ // This rule's non-empty tag didn't match one of the notification's tags. Skip this rule.
+ continue;
+ }
+ }
+
+ if(!(*it)->mName.empty())
+ {
+ lldebugs << "rule name = " << (*it)->mName << ", notification name = " << n->getName() << llendl;
+
+ // check this notification's name against the notification's name and continue if no match is found.
+ if((*it)->mName != n->getName())
+ {
+ // This rule's non-empty name didn't match the notification. Skip this rule.
+ continue;
+ }
+ }
+
+ // If we got here, the rule matches. Don't evaluate subsequent rules.
+ if(!(*it)->mVisible)
+ {
+ // This notification is being hidden.
+
+ if((*it)->mResponse.empty())
+ {
+ // Response property is empty. Cancel this notification.
+ lldebugs << "cancelling notification " << n->getName() << llendl;
+
+ n->cancel();
+ }
+ else
+ {
+ // Response property is not empty. Return the specified response.
+ LLSD response = n->getResponseTemplate(LLNotification::WITHOUT_DEFAULT_BUTTON);
+ // TODO: verify that the response template has an item with the correct name
+ response[(*it)->mResponse] = true;
+
+ lldebugs << "responding to notification " << n->getName() << " with response = " << response << llendl;
+
+ n->respond(response);
+ }
+
+ return false;
+ }
+
+ // If we got here, exit the loop and return true.
+ break;
+ }
+
+ lldebugs << "allowing notification " << n->getName() << llendl;
+
+ return true;
+}
+
+
// ---
// END OF LLNotifications implementation
// =========================================================
diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index f075c44520..5298549b58 100644
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -268,6 +268,11 @@ struct LLNotificationTemplate;
// with smart pointers
typedef boost::shared_ptr<LLNotificationTemplate> LLNotificationTemplatePtr;
+
+struct LLNotificationVisibilityRule;
+
+typedef boost::shared_ptr<LLNotificationVisibilityRule> LLNotificationVisibilityRulePtr;
+
/**
* @class LLNotification
* @brief The object that expresses the details of a notification
@@ -504,7 +509,7 @@ public:
std::string getLabel() const;
std::string getURL() const;
S32 getURLOption() const;
- S32 getURLOpenExternally() const;
+ S32 getURLOpenExternally() const;
const LLNotificationFormPtr getForm();
@@ -576,6 +581,8 @@ public:
bool hasUniquenessConstraints() const;
+ bool matchesTag(const std::string& tag);
+
virtual ~LLNotification() {}
};
@@ -857,6 +864,10 @@ public:
// OK to call more than once because it will reload
bool loadTemplates();
+ // load visibility rules from file;
+ // OK to call more than once because it will reload
+ bool loadVisibilityRules();
+
// Add a simple notification (from XUI)
void addFromCallback(const LLSD& name);
@@ -902,6 +913,8 @@ public:
// test for existence
bool templateExists(const std::string& name);
+ typedef std::list<LLNotificationVisibilityRulePtr> VisibilityRuleList;
+
void forceResponse(const LLNotification::Params& params, S32 option);
void createDefaultChannels();
@@ -917,6 +930,8 @@ public:
void setIgnoreAllNotifications(bool ignore);
bool getIgnoreAllNotifications();
+ bool isVisibleByRules(LLNotificationPtr pNotification);
+
private:
// we're a singleton, so we don't have a public constructor
LLNotifications();
@@ -936,6 +951,8 @@ private:
bool addTemplate(const std::string& name, LLNotificationTemplatePtr theTemplate);
TemplateMap mTemplates;
+ VisibilityRuleList mVisibilityRules;
+
std::string mFileName;
LLNotificationMap mUniqueNotifications;
diff --git a/indra/llui/llnotificationtemplate.h b/indra/llui/llnotificationtemplate.h
index 6bc0d2aaff..dfc2b10eb5 100644
--- a/indra/llui/llnotificationtemplate.h
+++ b/indra/llui/llnotificationtemplate.h
@@ -156,6 +156,15 @@ struct LLNotificationTemplate
{}
};
+ struct Tag : public LLInitParam::Block<Tag>
+ {
+ Mandatory<std::string> value;
+
+ Tag()
+ : value("value")
+ {}
+ };
+
struct Params : public LLInitParam::Block<Params>
{
Mandatory<std::string> name;
@@ -173,6 +182,7 @@ struct LLNotificationTemplate
Optional<FormRef> form_ref;
Optional<ENotificationPriority,
NotificationPriorityValues> priority;
+ Multiple<Tag> tags;
Params()
@@ -276,6 +286,8 @@ struct LLNotificationTemplate
// this is loaded as a name, but looked up to get the UUID upon template load.
// If null, it wasn't specified.
LLUUID mSoundEffect;
+ // List of tags that rules can match against.
+ std::list<std::string> mTags;
};
#endif //LL_LLNOTIFICATION_TEMPLATE_H
diff --git a/indra/llui/llnotificationvisibilityrule.h b/indra/llui/llnotificationvisibilityrule.h
new file mode 100644
index 0000000000..58a7eb6176
--- /dev/null
+++ b/indra/llui/llnotificationvisibilityrule.h
@@ -0,0 +1,87 @@
+/**
+* @file llnotificationvisibility.h
+* @brief Rules for
+* @author Monroe
+*
+* $LicenseInfo:firstyear=2010&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2010, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#ifndef LL_LLNOTIFICATION_VISIBILITY_RULE_H
+#define LL_LLNOTIFICATION_VISIBILITY_RULE_H
+
+#include "llinitparam.h"
+//#include "llnotifications.h"
+
+
+
+// This is the class of object read from the XML file (notification_visibility.xml,
+// from the appropriate local language directory).
+struct LLNotificationVisibilityRule
+{
+ struct Params : public LLInitParam::Block<Params>
+ {
+ Mandatory<bool> visible;
+ Optional<std::string> response;
+ Optional<std::string> type;
+ Optional<std::string> tag;
+ Optional<std::string> name;
+
+ Params()
+ : visible("visible"),
+ response("response"),
+ type("type"),
+ tag("tag"),
+ name("name")
+ {}
+ };
+
+
+ struct Rules : public LLInitParam::Block<Rules>
+ {
+ Multiple<Params> rules;
+
+ Rules()
+ : rules("rule")
+ {}
+ };
+
+ LLNotificationVisibilityRule(const Params& p);
+
+ // If true, this rule makes matching notifications visible. Otherwise, it makes them invisible.
+ bool mVisible;
+
+ // Which response to give when making a notification invisible. An empty string means the notification should be cancelled instead of responded to.
+ std::string mResponse;
+
+ // String to match against the notification's "type". An empty string matches all notifications.
+ std::string mType;
+
+ // String to match against the notification's tag(s). An empty string matches all notifications.
+ std::string mTag;
+
+ // String to match against the notification's name. An empty string matches all notifications.
+ std::string mName;
+
+};
+
+#endif //LL_LLNOTIFICATION_VISIBILITY_RULE_H
+
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index c8e56630f1..d0aba2733f 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -434,7 +434,7 @@ void LLPanel::initFromParams(const LLPanel::Params& p)
//and LLView::initFromParams will use them to set visible and enabled
setVisible(p.visible);
setEnabled(p.enabled);
-
+ setFocusRoot(p.focus_root);
setSoundFlags(p.sound_flags);
// control_name, tab_stop, focus_lost_callback, initial_value, rect, enabled, visible
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index ff9af21e54..1f86855a1e 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -1596,23 +1596,25 @@ void LLUI::initClass(const settings_map_t& settings,
sWindow = NULL; // set later in startup
LLFontGL::sShadowColor = LLUIColorTable::instance().getColor("ColorDropShadow");
+ LLUICtrl::CommitCallbackRegistry::Registrar& reg = LLUICtrl::CommitCallbackRegistry::defaultRegistrar();
+
// Callbacks for associating controls with floater visibilty:
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Floater.Toggle", boost::bind(&LLFloaterReg::toggleFloaterInstance, _2));
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Floater.Show", boost::bind(&LLFloaterReg::showFloaterInstance, _2));
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Floater.Hide", boost::bind(&LLFloaterReg::hideFloaterInstance, _2));
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Floater.InitToVisibilityControl", boost::bind(&LLFloaterReg::initUICtrlToFloaterVisibilityControl, _1, _2));
+ reg.add("Floater.Toggle", boost::bind(&LLFloaterReg::toggleFloaterInstance, _2));
+ reg.add("Floater.Show", boost::bind(&LLFloaterReg::showFloaterInstance, _2));
+ reg.add("Floater.Hide", boost::bind(&LLFloaterReg::hideFloaterInstance, _2));
+ reg.add("Floater.InitToVisibilityControl", boost::bind(&LLFloaterReg::initUICtrlToFloaterVisibilityControl, _1, _2));
// Button initialization callback for toggle buttons
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Button.SetFloaterToggle", boost::bind(&LLButton::setFloaterToggle, _1, _2));
+ reg.add("Button.SetFloaterToggle", boost::bind(&LLButton::setFloaterToggle, _1, _2));
// Button initialization callback for toggle buttons on dockale floaters
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Button.SetDockableFloaterToggle", boost::bind(&LLButton::setDockableFloaterToggle, _1, _2));
+ reg.add("Button.SetDockableFloaterToggle", boost::bind(&LLButton::setDockableFloaterToggle, _1, _2));
// Display the help topic for the current context
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Button.ShowHelp", boost::bind(&LLButton::showHelp, _1, _2));
+ reg.add("Button.ShowHelp", boost::bind(&LLButton::showHelp, _1, _2));
// Currently unused, but kept for reference:
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Button.ToggleFloater", boost::bind(&LLButton::toggleFloaterAndSetToggleState, _1, _2));
+ reg.add("Button.ToggleFloater", boost::bind(&LLButton::toggleFloaterAndSetToggleState, _1, _2));
// Used by menus along with Floater.Toggle to display visibility as a checkmark
LLUICtrl::EnableCallbackRegistry::defaultRegistrar().add("Floater.Visible", boost::bind(&LLFloaterReg::floaterInstanceVisible, _2));
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index 3fa86bf0ca..267640a226 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -102,6 +102,7 @@ LLView::Params::Params()
left_pad("left_pad"),
left_delta("left_delta", S32_MAX),
from_xui("from_xui", false),
+ focus_root("focus_root", false),
needs_translate("translate"),
xmlns("xmlns"),
xmlns_xsi("xmlns:xsi"),
@@ -117,7 +118,7 @@ LLView::LLView(const LLView::Params& p)
mParentView(NULL),
mReshapeFlags(FOLLOWS_NONE),
mFromXUI(p.from_xui),
- mIsFocusRoot(FALSE),
+ mIsFocusRoot(p.focus_root),
mLastVisible(FALSE),
mNextInsertionOrdinal(0),
mHoverCursor(getCursorFromString(p.hover_cursor)),
@@ -163,8 +164,6 @@ LLView::~LLView()
if (mDefaultWidgets)
{
- std::for_each(mDefaultWidgets->begin(), mDefaultWidgets->end(),
- DeletePairedPointer());
delete mDefaultWidgets;
mDefaultWidgets = NULL;
}
@@ -1682,18 +1681,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 +2792,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;
}
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index 33d345beff..a5d8e31640 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -116,7 +116,8 @@ public:
visible,
mouse_opaque,
use_bounding_rect,
- from_xui;
+ from_xui,
+ focus_root;
Optional<S32> tab_group,
default_tab_group;
@@ -466,12 +467,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);
}
//////////////////////////////////////////////
@@ -585,9 +582,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
@@ -654,7 +651,7 @@ template <class T> T* LLView::getChild(const std::string& name, BOOL recurse) co
return NULL;
}
- getDefaultWidgetMap()[name] = result;
+ getDefaultWidgetContainer().addChild(result);
}
}
return result;
diff --git a/indra/llwindow/llkeyboard.h b/indra/llwindow/llkeyboard.h
index be16f31abc..ba472cfde5 100644
--- a/indra/llwindow/llkeyboard.h
+++ b/indra/llwindow/llkeyboard.h
@@ -40,7 +40,7 @@ enum EKeystate
KEYSTATE_UP
};
-typedef void (*LLKeyFunc)(EKeystate keystate);
+typedef boost::function<void(EKeystate keystate)> LLKeyFunc;
typedef std::string (LLKeyStringTranslatorFunc)(const char *label);
enum EKeyboardInsertMode
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 87075c7318..ab089081e6 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -544,7 +544,27 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
if (closest_refresh == 0)
{
LL_WARNS("Window") << "Couldn't find display mode " << width << " by " << height << " at " << BITS_PER_PIXEL << " bits per pixel" << LL_ENDL;
- success = FALSE;
+ //success = FALSE;
+
+ if (!EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dev_mode))
+ {
+ success = FALSE;
+ }
+ else
+ {
+ if (dev_mode.dmBitsPerPel == BITS_PER_PIXEL)
+ {
+ LL_WARNS("Window") << "Current BBP is OK falling back to that" << LL_ENDL;
+ window_rect.right=width=dev_mode.dmPelsWidth;
+ window_rect.bottom=height=dev_mode.dmPelsHeight;
+ success = TRUE;
+ }
+ else
+ {
+ LL_WARNS("Window") << "Current BBP is BAD" << LL_ENDL;
+ success = FALSE;
+ }
+ }
}
// If we found a good resolution, use it.
diff --git a/indra/llxuixml/llregistry.h b/indra/llxuixml/llregistry.h
index eee9933739..36ce6a97b7 100644
--- a/indra/llxuixml/llregistry.h
+++ b/indra/llxuixml/llregistry.h
@@ -343,4 +343,9 @@ private:
ScopedRegistrar* mStaticScope;
};
+// helper macro for doing static registration
+#define GLUED_TOKEN(x, y) x ## y
+#define GLUE_TOKENS(x, y) GLUED_TOKEN(x, y)
+#define LLREGISTER_STATIC(REGISTRY, KEY, VALUE) static REGISTRY::StaticRegistrar GLUE_TOKENS(reg, __LINE__)(KEY, VALUE);
+
#endif
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 1f4302d870..074fa6397d 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1314,7 +1314,7 @@ set(viewer_APPSETTINGS_FILES
app_settings/grass.xml
app_settings/high_graphics.xml
app_settings/ignorable_dialogs.xml
- app_settings/keys.ini
+ app_settings/keys.xml
app_settings/keywords.ini
app_settings/logcontrol.xml
app_settings/low_graphics.xml
diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml
index 00d69f805e..aa2f1c41d2 100644
--- a/indra/newview/app_settings/cmd_line.xml
+++ b/indra/newview/app_settings/cmd_line.xml
@@ -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>
@@ -391,5 +391,13 @@
<string>CrashOnStartup</string>
</map>
+ <key>fullscreen</key>
+ <map>
+ <key>desc</key>
+ <string>Force full screen mode</string>
+ <key>map-to</key>
+ <string>WindowFullScreen</string>
+ </map>
+
</map>
</llsd>
diff --git a/indra/newview/app_settings/keys.ini b/indra/newview/app_settings/keys.ini
deleted file mode 100644
index b79e5bf508..0000000000
--- a/indra/newview/app_settings/keys.ini
+++ /dev/null
@@ -1,357 +0,0 @@
-# keys.ini
-#
-# keyboard binding initialization
-#
-# comments must have # in the first column
-# blank lines OK
-#
-# Format:
-# mode key mask function
-#
-# mode must be one of FIRST_PERSON, THIRD_PERSON, EDIT, EDIT_AVATAR, or CONVERSATION
-# key must be upper case, or SPACE, HOME, END, PGUP, PGDN, LEFT, RIGHT, UP, DOWN,
-# or one of ,.;'[]
-# mask must be NONE, SHIFT, ALT, ALT_SHIFT.
-# Control is reserved for user commands.
-# function must be a function named in llkeyboard.cpp
-
-FIRST_PERSON A NONE slide_left
-FIRST_PERSON D NONE slide_right
-FIRST_PERSON W NONE push_forward
-FIRST_PERSON S NONE push_backward
-FIRST_PERSON E NONE jump
-FIRST_PERSON C NONE push_down
-FIRST_PERSON F NONE toggle_fly
-
-FIRST_PERSON LEFT NONE slide_left
-FIRST_PERSON RIGHT NONE slide_right
-FIRST_PERSON UP NONE push_forward
-FIRST_PERSON DOWN NONE push_backward
-FIRST_PERSON PGUP NONE jump
-FIRST_PERSON PGDN NONE push_down
-FIRST_PERSON HOME NONE toggle_fly
-
-FIRST_PERSON PAD_LEFT NONE slide_left
-FIRST_PERSON PAD_RIGHT NONE slide_right
-FIRST_PERSON PAD_UP NONE push_forward
-FIRST_PERSON PAD_DOWN NONE push_backward
-FIRST_PERSON PAD_PGUP NONE jump
-FIRST_PERSON PAD_PGDN NONE push_down
-FIRST_PERSON PAD_HOME NONE toggle_fly
-FIRST_PERSON PAD_CENTER NONE stop_moving
-FIRST_PERSON PAD_ENTER NONE start_chat
-FIRST_PERSON PAD_DIVIDE NONE start_gesture
-
-FIRST_PERSON A SHIFT slide_left
-FIRST_PERSON D SHIFT slide_right
-FIRST_PERSON W SHIFT push_forward
-FIRST_PERSON S SHIFT push_backward
-FIRST_PERSON E SHIFT jump
-FIRST_PERSON C SHIFT push_down
-FIRST_PERSON F SHIFT toggle_fly
-
-FIRST_PERSON SPACE NONE stop_moving
-FIRST_PERSON ENTER NONE start_chat
-FIRST_PERSON DIVIDE NONE start_gesture
-
-FIRST_PERSON LEFT SHIFT slide_left
-FIRST_PERSON RIGHT SHIFT slide_right
-FIRST_PERSON UP SHIFT push_forward
-FIRST_PERSON DOWN SHIFT push_backward
-FIRST_PERSON PGUP SHIFT jump
-FIRST_PERSON PGDN SHIFT push_down
-
-FIRST_PERSON PAD_LEFT SHIFT slide_left
-FIRST_PERSON PAD_RIGHT SHIFT slide_right
-FIRST_PERSON PAD_UP SHIFT push_forward
-FIRST_PERSON PAD_DOWN SHIFT push_backward
-FIRST_PERSON PAD_PGUP SHIFT jump
-FIRST_PERSON PAD_PGDN SHIFT push_down
-FIRST_PERSON PAD_HOME SHIFT toggle_fly
-FIRST_PERSON PAD_ENTER SHIFT start_chat
-FIRST_PERSON PAD_DIVIDE SHIFT start_gesture
-
-THIRD_PERSON A NONE turn_left
-THIRD_PERSON D NONE turn_right
-THIRD_PERSON A SHIFT slide_left
-THIRD_PERSON D SHIFT slide_right
-THIRD_PERSON W NONE push_forward
-THIRD_PERSON S NONE push_backward
-THIRD_PERSON W SHIFT push_forward
-THIRD_PERSON S SHIFT push_backward
-THIRD_PERSON E NONE jump
-THIRD_PERSON C NONE push_down
-THIRD_PERSON E SHIFT jump
-THIRD_PERSON C SHIFT push_down
-
-THIRD_PERSON F NONE toggle_fly
-THIRD_PERSON F SHIFT toggle_fly
-
-THIRD_PERSON SPACE NONE stop_moving
-THIRD_PERSON ENTER NONE start_chat
-THIRD_PERSON DIVIDE NONE start_gesture
-
-THIRD_PERSON LEFT NONE turn_left
-THIRD_PERSON LEFT SHIFT slide_left
-THIRD_PERSON RIGHT NONE turn_right
-THIRD_PERSON RIGHT SHIFT slide_right
-THIRD_PERSON UP NONE push_forward
-THIRD_PERSON DOWN NONE push_backward
-THIRD_PERSON UP SHIFT push_forward
-THIRD_PERSON DOWN SHIFT push_backward
-THIRD_PERSON PGUP NONE jump
-THIRD_PERSON PGDN NONE push_down
-THIRD_PERSON PGUP SHIFT jump
-THIRD_PERSON PGDN SHIFT push_down
-THIRD_PERSON HOME SHIFT toggle_fly
-THIRD_PERSON HOME NONE toggle_fly
-
-THIRD_PERSON PAD_LEFT NONE turn_left
-THIRD_PERSON PAD_LEFT SHIFT slide_left
-THIRD_PERSON PAD_RIGHT NONE turn_right
-THIRD_PERSON PAD_RIGHT SHIFT slide_right
-THIRD_PERSON PAD_UP NONE push_forward
-THIRD_PERSON PAD_DOWN NONE push_backward
-THIRD_PERSON PAD_UP SHIFT push_forward
-THIRD_PERSON PAD_DOWN SHIFT push_backward
-THIRD_PERSON PAD_PGUP NONE jump
-THIRD_PERSON PAD_PGDN NONE push_down
-THIRD_PERSON PAD_PGUP SHIFT jump
-THIRD_PERSON PAD_PGDN SHIFT push_down
-THIRD_PERSON PAD_HOME NONE toggle_fly
-THIRD_PERSON PAD_HOME SHIFT toggle_fly
-THIRD_PERSON PAD_CENTER NONE stop_moving
-THIRD_PERSON PAD_CENTER SHIFT stop_moving
-THIRD_PERSON PAD_ENTER NONE start_chat
-THIRD_PERSON PAD_ENTER SHIFT start_chat
-THIRD_PERSON PAD_DIVIDE NONE start_gesture
-THIRD_PERSON PAD_DIVIDE SHIFT start_gesture
-
-# Camera controls in third person on Alt
-THIRD_PERSON LEFT ALT spin_around_cw
-THIRD_PERSON RIGHT ALT spin_around_ccw
-THIRD_PERSON UP ALT move_forward
-THIRD_PERSON DOWN ALT move_backward
-THIRD_PERSON PGUP ALT spin_over
-THIRD_PERSON PGDN ALT spin_under
-
-THIRD_PERSON A ALT spin_around_cw
-THIRD_PERSON D ALT spin_around_ccw
-THIRD_PERSON W ALT move_forward
-THIRD_PERSON S ALT move_backward
-THIRD_PERSON E ALT spin_over
-THIRD_PERSON C ALT spin_under
-
-THIRD_PERSON PAD_LEFT ALT spin_around_cw
-THIRD_PERSON PAD_RIGHT ALT spin_around_ccw
-THIRD_PERSON PAD_UP ALT move_forward
-THIRD_PERSON PAD_DOWN ALT move_backward
-THIRD_PERSON PAD_PGUP ALT spin_over
-THIRD_PERSON PAD_PGDN ALT spin_under
-THIRD_PERSON PAD_ENTER ALT start_chat
-THIRD_PERSON PAD_DIVIDE ALT start_gesture
-
-# mimic alt zoom behavior with keyboard only
-THIRD_PERSON A CTL_ALT spin_around_cw
-THIRD_PERSON D CTL_ALT spin_around_ccw
-THIRD_PERSON W CTL_ALT spin_over
-THIRD_PERSON S CTL_ALT spin_under
-THIRD_PERSON E CTL_ALT spin_over
-THIRD_PERSON C CTL_ALT spin_under
-
-THIRD_PERSON LEFT CTL_ALT spin_around_cw
-THIRD_PERSON RIGHT CTL_ALT spin_around_ccw
-THIRD_PERSON UP CTL_ALT spin_over
-THIRD_PERSON DOWN CTL_ALT spin_under
-THIRD_PERSON PGUP CTL_ALT spin_over
-THIRD_PERSON PGDN CTL_ALT spin_under
-
-THIRD_PERSON PAD_LEFT CTL_ALT spin_around_cw
-THIRD_PERSON PAD_RIGHT CTL_ALT spin_around_ccw
-THIRD_PERSON PAD_UP CTL_ALT spin_over
-THIRD_PERSON PAD_DOWN CTL_ALT spin_under
-THIRD_PERSON PAD_PGUP CTL_ALT spin_over
-THIRD_PERSON PAD_PGDN CTL_ALT spin_under
-THIRD_PERSON PAD_ENTER CTL_ALT start_chat
-THIRD_PERSON PAD_DIVIDE CTL_ALT start_gesture
-
-# Therefore pan on Alt-Shift
-THIRD_PERSON A CTL_ALT_SHIFT pan_left
-THIRD_PERSON D CTL_ALT_SHIFT pan_right
-THIRD_PERSON W CTL_ALT_SHIFT pan_up
-THIRD_PERSON S CTL_ALT_SHIFT pan_down
-
-THIRD_PERSON LEFT CTL_ALT_SHIFT pan_left
-THIRD_PERSON RIGHT CTL_ALT_SHIFT pan_right
-THIRD_PERSON UP CTL_ALT_SHIFT pan_up
-THIRD_PERSON DOWN CTL_ALT_SHIFT pan_down
-
-THIRD_PERSON PAD_LEFT CTL_ALT_SHIFT pan_left
-THIRD_PERSON PAD_RIGHT CTL_ALT_SHIFT pan_right
-THIRD_PERSON PAD_UP CTL_ALT_SHIFT pan_up
-THIRD_PERSON PAD_DOWN CTL_ALT_SHIFT pan_down
-THIRD_PERSON PAD_ENTER CTL_ALT_SHIFT start_chat
-THIRD_PERSON PAD_DIVIDE CTL_ALT_SHIFT start_gesture
-
-# Basic editing camera control
-EDIT A NONE spin_around_cw
-EDIT D NONE spin_around_ccw
-EDIT W NONE move_forward
-EDIT S NONE move_backward
-EDIT E NONE spin_over
-EDIT C NONE spin_under
-EDIT ENTER NONE start_chat
-EDIT DIVIDE NONE start_gesture
-EDIT PAD_ENTER NONE start_chat
-EDIT PAD_DIVIDE NONE start_gesture
-
-EDIT LEFT NONE spin_around_cw
-EDIT RIGHT NONE spin_around_ccw
-EDIT UP NONE move_forward
-EDIT DOWN NONE move_backward
-EDIT PGUP NONE spin_over
-EDIT PGDN NONE spin_under
-
-EDIT A SHIFT pan_left
-EDIT D SHIFT pan_right
-EDIT W SHIFT pan_up
-EDIT S SHIFT pan_down
-
-EDIT LEFT SHIFT pan_left
-EDIT RIGHT SHIFT pan_right
-EDIT UP SHIFT pan_up
-EDIT DOWN SHIFT pan_down
-
-# Walking works with ALT held down.
-EDIT A ALT slide_left
-EDIT D ALT slide_right
-EDIT W ALT push_forward
-EDIT S ALT push_backward
-EDIT E ALT jump
-EDIT C ALT push_down
-
-EDIT LEFT ALT slide_left
-EDIT RIGHT ALT slide_right
-EDIT UP ALT push_forward
-EDIT DOWN ALT push_backward
-EDIT PGUP ALT jump
-EDIT PGDN ALT push_down
-EDIT HOME ALT toggle_fly
-
-EDIT PAD_LEFT ALT slide_left
-EDIT PAD_RIGHT ALT slide_right
-EDIT PAD_UP ALT push_forward
-EDIT PAD_DOWN ALT push_backward
-EDIT PAD_PGUP ALT jump
-EDIT PAD_PGDN ALT push_down
-EDIT PAD_ENTER ALT start_chat
-EDIT PAD_DIVIDE ALT start_gesture
-
-SITTING A ALT spin_around_cw
-SITTING D ALT spin_around_ccw
-SITTING W ALT move_forward
-SITTING S ALT move_backward
-SITTING E ALT spin_over_sitting
-SITTING C ALT spin_under_sitting
-
-SITTING LEFT ALT spin_around_cw
-SITTING RIGHT ALT spin_around_ccw
-SITTING UP ALT move_forward
-SITTING DOWN ALT move_backward
-SITTING PGUP ALT spin_over
-SITTING PGDN ALT spin_under
-
-SITTING A CTL_ALT spin_around_cw
-SITTING D CTL_ALT spin_around_ccw
-SITTING W CTL_ALT spin_over
-SITTING S CTL_ALT spin_under
-SITTING E CTL_ALT spin_over
-SITTING C CTL_ALT spin_under
-
-SITTING LEFT CTL_ALT spin_around_cw
-SITTING RIGHT CTL_ALT spin_around_ccw
-SITTING UP CTL_ALT spin_over
-SITTING DOWN CTL_ALT spin_under
-SITTING PGUP CTL_ALT spin_over
-SITTING PGDN CTL_ALT spin_under
-
-
-SITTING A NONE spin_around_cw_sitting
-SITTING D NONE spin_around_ccw_sitting
-SITTING W NONE move_forward_sitting
-SITTING S NONE move_backward_sitting
-SITTING E NONE spin_over_sitting
-SITTING C NONE spin_under_sitting
-
-SITTING LEFT NONE spin_around_cw_sitting
-SITTING RIGHT NONE spin_around_ccw_sitting
-SITTING UP NONE move_forward_sitting
-SITTING DOWN NONE move_backward_sitting
-SITTING PGUP NONE spin_over_sitting
-SITTING PGDN NONE spin_under_sitting
-
-SITTING PAD_LEFT NONE spin_around_cw_sitting
-SITTING PAD_RIGHT NONE spin_around_ccw_sitting
-SITTING PAD_UP NONE move_forward_sitting
-SITTING PAD_DOWN NONE move_backward_sitting
-SITTING PAD_PGUP NONE spin_over_sitting
-SITTING PAD_PGDN NONE spin_under_sitting
-SITTING PAD_CENTER NONE stop_moving
-SITTING PAD_ENTER NONE start_chat
-SITTING PAD_DIVIDE NONE start_gesture
-
-# these are for passing controls when sitting on vehicles
-SITTING A SHIFT slide_left
-SITTING D SHIFT slide_right
-SITTING LEFT SHIFT slide_left
-SITTING RIGHT SHIFT slide_right
-
-SITTING PAD_LEFT SHIFT slide_left
-SITTING PAD_RIGHT SHIFT slide_right
-SITTING PAD_ENTER SHIFT start_chat
-SITTING PAD_DIVIDE SHIFT start_gesture
-
-# pan on Alt-Shift
-SITTING A CTL_ALT_SHIFT pan_left
-SITTING D CTL_ALT_SHIFT pan_right
-SITTING W CTL_ALT_SHIFT pan_up
-SITTING S CTL_ALT_SHIFT pan_down
-
-SITTING LEFT CTL_ALT_SHIFT pan_left
-SITTING RIGHT CTL_ALT_SHIFT pan_right
-SITTING UP CTL_ALT_SHIFT pan_up
-SITTING DOWN CTL_ALT_SHIFT pan_down
-
-SITTING PAD_LEFT CTL_ALT_SHIFT pan_left
-SITTING PAD_RIGHT CTL_ALT_SHIFT pan_right
-SITTING PAD_UP CTL_ALT_SHIFT pan_up
-SITTING PAD_DOWN CTL_ALT_SHIFT pan_down
-SITTING PAD_ENTER CTL_ALT_SHIFT start_chat
-SITTING PAD_DIVIDE CTL_ALT_SHIFT start_gesture
-
-SITTING ENTER NONE start_chat
-SITTING DIVIDE NONE start_gesture
-
-# Avatar editing camera controls
-EDIT_AVATAR A NONE edit_avatar_spin_cw
-EDIT_AVATAR D NONE edit_avatar_spin_ccw
-EDIT_AVATAR W NONE edit_avatar_move_forward
-EDIT_AVATAR S NONE edit_avatar_move_backward
-EDIT_AVATAR E NONE edit_avatar_spin_over
-EDIT_AVATAR C NONE edit_avatar_spin_under
-EDIT_AVATAR LEFT NONE edit_avatar_spin_cw
-EDIT_AVATAR RIGHT NONE edit_avatar_spin_ccw
-EDIT_AVATAR UP NONE edit_avatar_move_forward
-EDIT_AVATAR DOWN NONE edit_avatar_move_backward
-EDIT_AVATAR PGUP NONE edit_avatar_spin_over
-EDIT_AVATAR PGDN NONE edit_avatar_spin_under
-EDIT_AVATAR ENTER NONE start_chat
-EDIT_AVATAR DIVIDE NONE start_gesture
-EDIT_AVATAR PAD_LEFT NONE edit_avatar_spin_cw
-EDIT_AVATAR PAD_RIGHT NONE edit_avatar_spin_ccw
-EDIT_AVATAR PAD_UP NONE edit_avatar_move_forward
-EDIT_AVATAR PAD_DOWN NONE edit_avatar_move_backward
-EDIT_AVATAR PAD_PGUP NONE edit_avatar_spin_over
-EDIT_AVATAR PAD_PGDN NONE edit_avatar_spin_under
-EDIT_AVATAR PAD_ENTER NONE start_chat
-EDIT_AVATAR PAD_DIVIDE NONE start_gesture
diff --git a/indra/newview/app_settings/keys.xml b/indra/newview/app_settings/keys.xml
new file mode 100644
index 0000000000..d085475c6c
--- /dev/null
+++ b/indra/newview/app_settings/keys.xml
@@ -0,0 +1,350 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<keys>
+ <first_person>
+ <binding key="A" mask="NONE" command="slide_left"/>
+ <binding key="D" mask="NONE" command="slide_right"/>
+ <binding key="W" mask="NONE" command="push_forward"/>
+ <binding key="S" mask="NONE" command="push_backward"/>
+ <binding key="E" mask="NONE" command="jump"/>
+ <binding key="C" mask="NONE" command="push_down"/>
+ <binding key="F" mask="NONE" command="toggle_fly"/>
+
+ <binding key="LEFT" mask="NONE" command="slide_left"/>
+ <binding key="RIGHT" mask="NONE" command="slide_right"/>
+ <binding key="UP" mask="NONE" command="push_forward"/>
+ <binding key="DOWN" mask="NONE" command="push_backward"/>
+ <binding key="PGUP" mask="NONE" command="jump"/>
+ <binding key="PGDN" mask="NONE" command="push_down"/>
+ <binding key="HOME" mask="NONE" command="toggle_fly"/>
+
+ <binding key="PAD_LEFT" mask="NONE" command="slide_left"/>
+ <binding key="PAD_RIGHT" mask="NONE" command="slide_right"/>
+ <binding key="PAD_UP" mask="NONE" command="push_forward"/>
+ <binding key="PAD_DOWN" mask="NONE" command="push_backward"/>
+ <binding key="PAD_PGUP" mask="NONE" command="jump"/>
+ <binding key="PAD_PGDN" mask="NONE" command="push_down"/>
+ <binding key="PAD_HOME" mask="NONE" command="toggle_fly"/>
+ <binding key="PAD_CENTER" mask="NONE" command="stop_moving"/>
+ <binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
+
+ <binding key="A" mask="SHIFT" command="slide_left"/>
+ <binding key="D" mask="SHIFT" command="slide_right"/>
+ <binding key="W" mask="SHIFT" command="push_forward"/>
+ <binding key="S" mask="SHIFT" command="push_backward"/>
+ <binding key="E" mask="SHIFT" command="jump"/>
+ <binding key="C" mask="SHIFT" command="push_down"/>
+ <binding key="F" mask="SHIFT" command="toggle_fly"/>
+
+ <binding key="SPACE" mask="NONE" command="stop_moving"/>
+ <binding key="ENTER" mask="NONE" command="start_chat"/>
+ <binding key="DIVIDE" mask="NONE" command="start_gesture"/>
+
+ <binding key="LEFT" mask="SHIFT" command="slide_left"/>
+ <binding key="RIGHT" mask="SHIFT" command="slide_right"/>
+ <binding key="UP" mask="SHIFT" command="push_forward"/>
+ <binding key="DOWN" mask="SHIFT" command="push_backward"/>
+ <binding key="PGUP" mask="SHIFT" command="jump"/>
+ <binding key="PGDN" mask="SHIFT" command="push_down"/>
+
+ <binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/>
+ <binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/>
+ <binding key="PAD_UP" mask="SHIFT" command="push_forward"/>
+ <binding key="PAD_DOWN" mask="SHIFT" command="push_backward"/>
+ <binding key="PAD_PGUP" mask="SHIFT" command="jump"/>
+ <binding key="PAD_PGDN" mask="SHIFT" command="push_down"/>
+ <binding key="PAD_HOME" mask="SHIFT" command="toggle_fly"/>
+ <binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/>
+ </first_person>
+ <third_person>
+ <binding key="A" mask="NONE" command="turn_left"/>
+ <binding key="D" mask="NONE" command="turn_right"/>
+ <binding key="A" mask="SHIFT" command="slide_left"/>
+ <binding key="D" mask="SHIFT" command="slide_right"/>
+ <binding key="W" mask="NONE" command="push_forward"/>
+ <binding key="S" mask="NONE" command="push_backward"/>
+ <binding key="W" mask="SHIFT" command="push_forward"/>
+ <binding key="S" mask="SHIFT" command="push_backward"/>
+ <binding key="E" mask="NONE" command="jump"/>
+ <binding key="C" mask="NONE" command="push_down"/>
+ <binding key="E" mask="SHIFT" command="jump"/>
+ <binding key="C" mask="SHIFT" command="push_down"/>
+
+ <binding key="F" mask="NONE" command="toggle_fly"/>
+ <binding key="F" mask="SHIFT" command="toggle_fly"/>
+
+ <binding key="SPACE" mask="NONE" command="stop_moving"/>
+ <binding key="ENTER" mask="NONE" command="start_chat"/>
+ <binding key="DIVIDE" mask="NONE" command="start_gesture"/>
+
+ <binding key="LEFT" mask="NONE" command="turn_left"/>
+ <binding key="LEFT" mask="SHIFT" command="slide_left"/>
+ <binding key="RIGHT" mask="NONE" command="turn_right"/>
+ <binding key="RIGHT" mask="SHIFT" command="slide_right"/>
+ <binding key="UP" mask="NONE" command="push_forward"/>
+ <binding key="DOWN" mask="NONE" command="push_backward"/>
+ <binding key="UP" mask="SHIFT" command="push_forward"/>
+ <binding key="DOWN" mask="SHIFT" command="push_backward"/>
+ <binding key="PGUP" mask="NONE" command="jump"/>
+ <binding key="PGDN" mask="NONE" command="push_down"/>
+ <binding key="PGUP" mask="SHIFT" command="jump"/>
+ <binding key="PGDN" mask="SHIFT" command="push_down"/>
+ <binding key="HOME" mask="SHIFT" command="toggle_fly"/>
+ <binding key="HOME" mask="NONE" command="toggle_fly"/>
+
+ <binding key="PAD_LEFT" mask="NONE" command="turn_left"/>
+ <binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/>
+ <binding key="PAD_RIGHT" mask="NONE" command="turn_right"/>
+ <binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/>
+ <binding key="PAD_UP" mask="NONE" command="push_forward"/>
+ <binding key="PAD_DOWN" mask="NONE" command="push_backward"/>
+ <binding key="PAD_UP" mask="SHIFT" command="push_forward"/>
+ <binding key="PAD_DOWN" mask="SHIFT" command="push_backward"/>
+ <binding key="PAD_PGUP" mask="NONE" command="jump"/>
+ <binding key="PAD_PGDN" mask="NONE" command="push_down"/>
+ <binding key="PAD_PGUP" mask="SHIFT" command="jump"/>
+ <binding key="PAD_PGDN" mask="SHIFT" command="push_down"/>
+ <binding key="PAD_HOME" mask="NONE" command="toggle_fly"/>
+ <binding key="PAD_HOME" mask="SHIFT" command="toggle_fly"/>
+ <binding key="PAD_CENTER" mask="NONE" command="stop_moving"/>
+ <binding key="PAD_CENTER" mask="SHIFT" command="stop_moving"/>
+ <binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
+ <binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
+ <binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/>
+
+ <!--Camera controls in third person on Alt-->
+ <binding key="LEFT" mask="ALT" command="spin_around_cw"/>
+ <binding key="RIGHT" mask="ALT" command="spin_around_ccw"/>
+ <binding key="UP" mask="ALT" command="move_forward"/>
+ <binding key="DOWN" mask="ALT" command="move_backward"/>
+ <binding key="PGUP" mask="ALT" command="spin_over"/>
+ <binding key="PGDN" mask="ALT" command="spin_under"/>
+
+ <binding key="A" mask="ALT" command="spin_around_cw"/>
+ <binding key="D" mask="ALT" command="spin_around_ccw"/>
+ <binding key="W" mask="ALT" command="move_forward"/>
+ <binding key="S" mask="ALT" command="move_backward"/>
+ <binding key="E" mask="ALT" command="spin_over"/>
+ <binding key="C" mask="ALT" command="spin_under"/>
+
+ <binding key="PAD_LEFT" mask="ALT" command="spin_around_cw"/>
+ <binding key="PAD_RIGHT" mask="ALT" command="spin_around_ccw"/>
+ <binding key="PAD_UP" mask="ALT" command="move_forward"/>
+ <binding key="PAD_DOWN" mask="ALT" command="move_backward"/>
+ <binding key="PAD_PGUP" mask="ALT" command="spin_over"/>
+ <binding key="PAD_PGDN" mask="ALT" command="spin_under"/>
+ <binding key="PAD_ENTER" mask="ALT" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="ALT" command="start_gesture"/>
+
+ <!--mimic alt zoom behavior with keyboard only-->
+ <binding key="A" mask="CTL_ALT" command="spin_around_cw"/>
+ <binding key="D" mask="CTL_ALT" command="spin_around_ccw"/>
+ <binding key="W" mask="CTL_ALT" command="spin_over"/>
+ <binding key="S" mask="CTL_ALT" command="spin_under"/>
+ <binding key="E" mask="CTL_ALT" command="spin_over"/>
+ <binding key="C" mask="CTL_ALT" command="spin_under"/>
+
+ <binding key="LEFT" mask="CTL_ALT" command="spin_around_cw"/>
+ <binding key="RIGHT" mask="CTL_ALT" command="spin_around_ccw"/>
+ <binding key="UP" mask="CTL_ALT" command="spin_over"/>
+ <binding key="DOWN" mask="CTL_ALT" command="spin_under"/>
+ <binding key="PGUP" mask="CTL_ALT" command="spin_over"/>
+ <binding key="PGDN" mask="CTL_ALT" command="spin_under"/>
+
+ <binding key="PAD_LEFT" mask="CTL_ALT" command="spin_around_cw"/>
+ <binding key="PAD_RIGHT" mask="CTL_ALT" command="spin_around_ccw"/>
+ <binding key="PAD_UP" mask="CTL_ALT" command="spin_over"/>
+ <binding key="PAD_DOWN" mask="CTL_ALT" command="spin_under"/>
+ <binding key="PAD_PGUP" mask="CTL_ALT" command="spin_over"/>
+ <binding key="PAD_PGDN" mask="CTL_ALT" command="spin_under"/>
+ <binding key="PAD_ENTER" mask="CTL_ALT" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="CTL_ALT" command="start_gesture"/>
+
+ <!--Therefore pan on Alt-Shift-->
+ <binding key="A" mask="CTL_ALT_SHIFT" command="pan_left"/>
+ <binding key="D" mask="CTL_ALT_SHIFT" command="pan_right"/>
+ <binding key="W" mask="CTL_ALT_SHIFT" command="pan_up"/>
+ <binding key="S" mask="CTL_ALT_SHIFT" command="pan_down"/>
+
+ <binding key="LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/>
+ <binding key="RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/>
+ <binding key="UP" mask="CTL_ALT_SHIFT" command="pan_up"/>
+ <binding key="DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/>
+
+ <binding key="PAD_LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/>
+ <binding key="PAD_RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/>
+ <binding key="PAD_UP" mask="CTL_ALT_SHIFT" command="pan_up"/>
+ <binding key="PAD_DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/>
+ <binding key="PAD_ENTER" mask="CTL_ALT_SHIFT" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="CTL_ALT_SHIFT" command="start_gesture"/>
+ </third_person>
+
+ # Basic editing camera control
+ <edit>
+ <binding key="A" mask="NONE" command="spin_around_cw"/>
+ <binding key="D" mask="NONE" command="spin_around_ccw"/>
+ <binding key="W" mask="NONE" command="move_forward"/>
+ <binding key="S" mask="NONE" command="move_backward"/>
+ <binding key="E" mask="NONE" command="spin_over"/>
+ <binding key="C" mask="NONE" command="spin_under"/>
+ <binding key="ENTER" mask="NONE" command="start_chat"/>
+ <binding key="DIVIDE" mask="NONE" command="start_gesture"/>
+ <binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
+
+ <binding key="LEFT" mask="NONE" command="spin_around_cw"/>
+ <binding key="RIGHT" mask="NONE" command="spin_around_ccw"/>
+ <binding key="UP" mask="NONE" command="move_forward"/>
+ <binding key="DOWN" mask="NONE" command="move_backward"/>
+ <binding key="PGUP" mask="NONE" command="spin_over"/>
+ <binding key="PGDN" mask="NONE" command="spin_under"/>
+
+ <binding key="A" mask="SHIFT" command="pan_left"/>
+ <binding key="D" mask="SHIFT" command="pan_right"/>
+ <binding key="W" mask="SHIFT" command="pan_up"/>
+ <binding key="S" mask="SHIFT" command="pan_down"/>
+
+ <binding key="LEFT" mask="SHIFT" command="pan_left"/>
+ <binding key="RIGHT" mask="SHIFT" command="pan_right"/>
+ <binding key="UP" mask="SHIFT" command="pan_up"/>
+ <binding key="DOWN" mask="SHIFT" command="pan_down"/>
+
+ <!--Walking works with ALT held down.-->
+ <binding key="A" mask="ALT" command="slide_left"/>
+ <binding key="D" mask="ALT" command="slide_right"/>
+ <binding key="W" mask="ALT" command="push_forward"/>
+ <binding key="S" mask="ALT" command="push_backward"/>
+ <binding key="E" mask="ALT" command="jump"/>
+ <binding key="C" mask="ALT" command="push_down"/>
+
+ <binding key="LEFT" mask="ALT" command="slide_left"/>
+ <binding key="RIGHT" mask="ALT" command="slide_right"/>
+ <binding key="UP" mask="ALT" command="push_forward"/>
+ <binding key="DOWN" mask="ALT" command="push_backward"/>
+ <binding key="PGUP" mask="ALT" command="jump"/>
+ <binding key="PGDN" mask="ALT" command="push_down"/>
+ <binding key="HOME" mask="ALT" command="toggle_fly"/>
+
+ <binding key="PAD_LEFT" mask="ALT" command="slide_left"/>
+ <binding key="PAD_RIGHT" mask="ALT" command="slide_right"/>
+ <binding key="PAD_UP" mask="ALT" command="push_forward"/>
+ <binding key="PAD_DOWN" mask="ALT" command="push_backward"/>
+ <binding key="PAD_PGUP" mask="ALT" command="jump"/>
+ <binding key="PAD_PGDN" mask="ALT" command="push_down"/>
+ <binding key="PAD_ENTER" mask="ALT" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="ALT" command="start_gesture"/>
+ </edit>
+ <sitting>
+ <binding key="A" mask="ALT" command="spin_around_cw"/>
+ <binding key="D" mask="ALT" command="spin_around_ccw"/>
+ <binding key="W" mask="ALT" command="move_forward"/>
+ <binding key="S" mask="ALT" command="move_backward"/>
+ <binding key="E" mask="ALT" command="spin_over_sitting"/>
+ <binding key="C" mask="ALT" command="spin_under_sitting"/>
+
+ <binding key="LEFT" mask="ALT" command="spin_around_cw"/>
+ <binding key="RIGHT" mask="ALT" command="spin_around_ccw"/>
+ <binding key="UP" mask="ALT" command="move_forward"/>
+ <binding key="DOWN" mask="ALT" command="move_backward"/>
+ <binding key="PGUP" mask="ALT" command="spin_over"/>
+ <binding key="PGDN" mask="ALT" command="spin_under"/>
+
+ <binding key="A" mask="CTL_ALT" command="spin_around_cw"/>
+ <binding key="D" mask="CTL_ALT" command="spin_around_ccw"/>
+ <binding key="W" mask="CTL_ALT" command="spin_over"/>
+ <binding key="S" mask="CTL_ALT" command="spin_under"/>
+ <binding key="E" mask="CTL_ALT" command="spin_over"/>
+ <binding key="C" mask="CTL_ALT" command="spin_under"/>
+
+ <binding key="LEFT" mask="CTL_ALT" command="spin_around_cw"/>
+ <binding key="RIGHT" mask="CTL_ALT" command="spin_around_ccw"/>
+ <binding key="UP" mask="CTL_ALT" command="spin_over"/>
+ <binding key="DOWN" mask="CTL_ALT" command="spin_under"/>
+ <binding key="PGUP" mask="CTL_ALT" command="spin_over"/>
+ <binding key="PGDN" mask="CTL_ALT" command="spin_under"/>
+
+
+ <binding key="A" mask="NONE" command="spin_around_cw_sitting"/>
+ <binding key="D" mask="NONE" command="spin_around_ccw_sitting"/>
+ <binding key="W" mask="NONE" command="move_forward_sitting"/>
+ <binding key="S" mask="NONE" command="move_backward_sitting"/>
+ <binding key="E" mask="NONE" command="spin_over_sitting"/>
+ <binding key="C" mask="NONE" command="spin_under_sitting"/>
+
+ <binding key="LEFT" mask="NONE" command="spin_around_cw_sitting"/>
+ <binding key="RIGHT" mask="NONE" command="spin_around_ccw_sitting"/>
+ <binding key="UP" mask="NONE" command="move_forward_sitting"/>
+ <binding key="DOWN" mask="NONE" command="move_backward_sitting"/>
+ <binding key="PGUP" mask="NONE" command="spin_over_sitting"/>
+ <binding key="PGDN" mask="NONE" command="spin_under_sitting"/>
+
+ <binding key="PAD_LEFT" mask="NONE" command="spin_around_cw_sitting"/>
+ <binding key="PAD_RIGHT" mask="NONE" command="spin_around_ccw_sitting"/>
+ <binding key="PAD_UP" mask="NONE" command="move_forward_sitting"/>
+ <binding key="PAD_DOWN" mask="NONE" command="move_backward_sitting"/>
+ <binding key="PAD_PGUP" mask="NONE" command="spin_over_sitting"/>
+ <binding key="PAD_PGDN" mask="NONE" command="spin_under_sitting"/>
+ <binding key="PAD_CENTER" mask="NONE" command="stop_moving"/>
+ <binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
+
+ <!--these are for passing controls when sitting on vehicles-->
+ <binding key="A" mask="SHIFT" command="slide_left"/>
+ <binding key="D" mask="SHIFT" command="slide_right"/>
+ <binding key="LEFT" mask="SHIFT" command="slide_left"/>
+ <binding key="RIGHT" mask="SHIFT" command="slide_right"/>
+
+ <binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/>
+ <binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/>
+ <binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/>
+
+ <!--pan on Alt-Shift-->
+ <binding key="A" mask="CTL_ALT_SHIFT" command="pan_left"/>
+ <binding key="D" mask="CTL_ALT_SHIFT" command="pan_right"/>
+ <binding key="W" mask="CTL_ALT_SHIFT" command="pan_up"/>
+ <binding key="S" mask="CTL_ALT_SHIFT" command="pan_down"/>
+
+ <binding key="LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/>
+ <binding key="RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/>
+ <binding key="UP" mask="CTL_ALT_SHIFT" command="pan_up"/>
+ <binding key="DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/>
+
+ <binding key="PAD_LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/>
+ <binding key="PAD_RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/>
+ <binding key="PAD_UP" mask="CTL_ALT_SHIFT" command="pan_up"/>
+ <binding key="PAD_DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/>
+ <binding key="PAD_ENTER" mask="CTL_ALT_SHIFT" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="CTL_ALT_SHIFT" command="start_gesture"/>
+
+ <binding key="ENTER" mask="NONE" command="start_chat"/>
+ <binding key="DIVIDE" mask="NONE" command="start_gesture"/>
+ </sitting>
+ <edit_avatar>
+ <!--Avatar editing camera controls-->
+ <binding key="A" mask="NONE" command="edit_avatar_spin_cw"/>
+ <binding key="D" mask="NONE" command="edit_avatar_spin_ccw"/>
+ <binding key="W" mask="NONE" command="edit_avatar_move_forward"/>
+ <binding key="S" mask="NONE" command="edit_avatar_move_backward"/>
+ <binding key="E" mask="NONE" command="edit_avatar_spin_over"/>
+ <binding key="C" mask="NONE" command="edit_avatar_spin_under"/>
+ <binding key="LEFT" mask="NONE" command="edit_avatar_spin_cw"/>
+ <binding key="RIGHT" mask="NONE" command="edit_avatar_spin_ccw"/>
+ <binding key="UP" mask="NONE" command="edit_avatar_move_forward"/>
+ <binding key="DOWN" mask="NONE" command="edit_avatar_move_backward"/>
+ <binding key="PGUP" mask="NONE" command="edit_avatar_spin_over"/>
+ <binding key="PGDN" mask="NONE" command="edit_avatar_spin_under"/>
+ <binding key="ENTER" mask="NONE" command="start_chat"/>
+ <binding key="DIVIDE" mask="NONE" command="start_gesture"/>
+ <binding key="PAD_LEFT" mask="NONE" command="edit_avatar_spin_cw"/>
+ <binding key="PAD_RIGHT" mask="NONE" command="edit_avatar_spin_ccw"/>
+ <binding key="PAD_UP" mask="NONE" command="edit_avatar_move_forward"/>
+ <binding key="PAD_DOWN" mask="NONE" command="edit_avatar_move_backward"/>
+ <binding key="PAD_PGUP" mask="NONE" command="edit_avatar_spin_over"/>
+ <binding key="PAD_PGDN" mask="NONE" command="edit_avatar_spin_under"/>
+ <binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
+ </edit_avatar>
+</keys> \ No newline at end of file
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 742a20a849..04d1137ac8 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -2820,6 +2820,39 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>EnableGrab</key>
+ <map>
+ <key>Comment</key>
+ <string>Use Ctrl+mouse to grab and manipulate objects</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableAltZoom</key>
+ <map>
+ <key>Comment</key>
+ <string>Use Alt+mouse to look at and zoom in on objects</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableMouselook</key>
+ <map>
+ <key>Comment</key>
+ <string>Allow first person perspective and mouse control of camera</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>EnableRippleWater</key>
<map>
<key>Comment</key>
@@ -3914,7 +3947,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 +4570,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>
@@ -11366,6 +11410,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>
@@ -11674,6 +11729,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>WindowFullScreen</key>
+ <map>
+ <key>Comment</key>
+ <string>SL viewer window full screen</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>WindowHeight</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index 68e408d3e4..e7fee26dc5 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -2038,7 +2038,7 @@ void LLAgentCamera::resetCamera()
//-----------------------------------------------------------------------------
void LLAgentCamera::changeCameraToMouselook(BOOL animate)
{
- if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ if (!gSavedSettings.getBOOL("EnableMouselook") || LLViewerJoystick::getInstance()->getOverrideCamera())
{
return;
}
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 333c92e50d..a9bdabe794 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -820,16 +820,22 @@ bool LLAppViewer::init()
gGLManager.getGLInfo(gDebugInfo);
gGLManager.printGLInfoString();
- //load key settings
- bind_keyboard_functions();
-
// Load Default bindings
- if (!gViewerKeyboard.loadBindings(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"keys.ini")))
+ std::string key_bindings_file = gDirUtilp->findFile("keys.xml",
+ gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, ""),
+ gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
+
+
+ if (!gViewerKeyboard.loadBindingsXML(key_bindings_file))
{
- LL_ERRS("InitInfo") << "Unable to open keys.ini" << LL_ENDL;
+ std::string key_bindings_file = gDirUtilp->findFile("keys.ini",
+ gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, ""),
+ gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
+ if (!gViewerKeyboard.loadBindings(key_bindings_file))
+ {
+ LL_ERRS("InitInfo") << "Unable to open keys.ini" << LL_ENDL;
+ }
}
- // Load Custom bindings (override defaults)
- gViewerKeyboard.loadBindings(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"custom_keys.ini"));
// If we don't have the right GL requirements, exit.
if (!gGLManager.mHasRequirements && !gNoRender)
@@ -2135,7 +2141,7 @@ bool LLAppViewer::initConfiguration()
if (clp.hasOption("nonotifications"))
{
- gSavedSettings.setBOOL("IgnoreAllNotifications", TRUE);
+ gSavedSettings.getControl("IgnoreAllNotifications")->setValue(true, false);
}
if (clp.hasOption("debugsession"))
@@ -2182,8 +2188,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");
@@ -2386,7 +2392,7 @@ bool LLAppViewer::initWindow()
VIEWER_WINDOW_CLASSNAME,
gSavedSettings.getS32("WindowX"), gSavedSettings.getS32("WindowY"),
gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"),
- FALSE, ignorePixelDepth);
+ gSavedSettings.getBOOL("WindowFullScreen"), ignorePixelDepth);
// Need to load feature table before cheking to start watchdog.
const S32 NEVER_SUBMIT_REPORT = 2;
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index ef6f2f7337..e47009c540 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -65,31 +65,42 @@ LLDefaultChildRegistry::Register<LLBottomtrayButton> bottomtray_button("bottomtr
// virtual
BOOL LLBottomtrayButton::handleHover(S32 x, S32 y, MASK mask)
{
+ if (mCanDrag)
+ {
S32 screenX, screenY;
localPointToScreen(x, y, &screenX, &screenY);
// pass hover to bottomtray
LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY);
- return FALSE;
+ return TRUE;
+ }
+ else
+ {
+ return LLButton::handleHover(x, y, mask);
+ }
}
//virtual
BOOL LLBottomtrayButton::handleMouseUp(S32 x, S32 y, MASK mask)
{
+ if (mCanDrag)
+ {
S32 screenX, screenY;
localPointToScreen(x, y, &screenX, &screenY);
// pass mouse up to bottomtray
LLBottomTray::getInstance()->onDraggableButtonMouseUp(this, screenX, screenY);
- LLButton::handleMouseUp(x, y, mask);
- return FALSE;
+ }
+ return LLButton::handleMouseUp(x, y, mask);
}
//virtual
BOOL LLBottomtrayButton::handleMouseDown(S32 x, S32 y, MASK mask)
{
+ if (mCanDrag)
+ {
S32 screenX, screenY;
localPointToScreen(x, y, &screenX, &screenY);
// pass mouse up to bottomtray
LLBottomTray::getInstance()->onDraggableButtonMouseDown(this, screenX, screenY);
- LLButton::handleMouseDown(x, y, mask);
- return FALSE;
+ }
+ return LLButton::handleMouseDown(x, y, mask);
}
static void update_build_button_enable_state()
@@ -150,8 +161,6 @@ public:
{
mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL);
buildFromFile("panel_bottomtray_lite.xml");
- // Necessary for focus movement among child controls
- setFocusRoot(TRUE);
}
BOOL postBuild()
@@ -211,16 +220,11 @@ LLBottomTray::LLBottomTray(const LLSD&)
buildFromFile("panel_bottomtray.xml");
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2));
-
//this is to fix a crash that occurs because LLBottomTray is a singleton
//and thus is deleted at the end of the viewers lifetime, but to be cleanly
//destroyed LLBottomTray requires some subsystems that are long gone
//LLUI::getRootView()->addChild(this);
- // Necessary for focus movement among child controls
- setFocusRoot(TRUE);
-
{
mBottomTrayLite = new LLBottomTrayLite();
mBottomTrayLite->setFollowsAll();
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 8d8a42c553..dc98170049 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -54,7 +54,9 @@ class LLBottomtrayButton : public LLButton
public:
struct Params : public LLInitParam::Block<Params, LLButton::Params>
{
- Params(){}
+ Optional<bool> can_drag;
+ Params()
+ : can_drag("can_drag", true){}
};
/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
@@ -62,11 +64,14 @@ public:
protected:
LLBottomtrayButton(const Params& p)
- : LLButton(p)
+ : LLButton(p),
+ mCanDrag(p.can_drag)
{
}
friend class LLUICtrlFactory;
+
+ bool mCanDrag;
};
class LLBottomTray
diff --git a/indra/newview/lldirpicker.cpp b/indra/newview/lldirpicker.cpp
index 53101f0ce2..dd243397a1 100644
--- a/indra/newview/lldirpicker.cpp
+++ b/indra/newview/lldirpicker.cpp
@@ -35,6 +35,7 @@
#include "llframetimer.h"
#include "lltrans.h"
#include "llwindow.h" // beforeDialog()
+#include "llviewercontrol.h"
#if LL_LINUX || LL_SOLARIS
# include "llfilepicker.h"
@@ -53,6 +54,23 @@ LLDirPicker LLDirPicker::sInstance;
//
// Implementation
//
+
+// 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 LLDirPicker::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 )
+ {
+ mDir.clear(); // Windows
+ mFileName = NULL; // Mac/Linux
+ return false;
+ }
+
+ return true;
+}
+
#if LL_WINDOWS
LLDirPicker::LLDirPicker() :
@@ -72,6 +90,13 @@ BOOL LLDirPicker::getDir(std::string* filename)
{
return FALSE;
}
+
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
BOOL success = FALSE;
// Modal, so pause agent
@@ -231,7 +256,13 @@ BOOL LLDirPicker::getDir(std::string* filename)
if( mLocked ) return FALSE;
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;
+ }
+
mFileName = filename;
// mNavOptions.saveFileName
@@ -289,6 +320,13 @@ void LLDirPicker::reset()
BOOL LLDirPicker::getDir(std::string* filename)
{
reset();
+
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
if (mFilePicker)
{
GtkWindow* picker = mFilePicker->buildFilePicker(false, true,
diff --git a/indra/newview/lldirpicker.h b/indra/newview/lldirpicker.h
index a360293fff..2188b7edd0 100644
--- a/indra/newview/lldirpicker.h
+++ b/indra/newview/lldirpicker.h
@@ -75,6 +75,7 @@ private:
};
void buildDirname( void );
+ bool check_local_file_access_enabled();
#if LL_DARWIN
NavDialogCreationOptions mNavOptions;
diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index c14be89641..f0840774bd 100644
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -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;
}
diff --git a/indra/newview/llfilepicker.h b/indra/newview/llfilepicker.h
index 5819ac4fd8..596bfa3e69 100644
--- a/indra/newview/llfilepicker.h
+++ b/indra/newview/llfilepicker.h
@@ -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
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index ad24c6534a..b4e211a38e 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -336,6 +336,9 @@ LLFloaterCamera::LLFloaterCamera(const LLSD& val)
mCurrMode(CAMERA_CTRL_MODE_PAN),
mPrevMode(CAMERA_CTRL_MODE_PAN)
{
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ registrar.add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2));
+
}
// virtual
diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp
index 42dc60f9e0..29af81d64c 100644
--- a/indra/newview/llfloaternotificationsconsole.cpp
+++ b/indra/newview/llfloaternotificationsconsole.cpp
@@ -174,6 +174,7 @@ BOOL LLFloaterNotificationConsole::postBuild()
// these are in the order of processing
addChannel("Unexpired");
addChannel("Ignore");
+ addChannel("VisibilityRules");
addChannel("Visible", true);
// all the ones below attach to the Visible channel
addChannel("Persistent");
diff --git a/indra/newview/lllistcontextmenu.cpp b/indra/newview/lllistcontextmenu.cpp
index ea744072d2..6421ab42bf 100644
--- a/indra/newview/lllistcontextmenu.cpp
+++ b/indra/newview/lllistcontextmenu.cpp
@@ -36,7 +36,6 @@
#include "llviewermenu.h" // for LLViewerMenuHolderGL
LLListContextMenu::LLListContextMenu()
-: mMenu(NULL)
{
}
@@ -51,23 +50,22 @@ LLListContextMenu::~LLListContextMenu()
// of mMenu has already been deleted except of using LLHandle. EXT-4762.
if (!mMenuHandle.isDead())
{
- mMenu->die();
- mMenu = NULL;
+ mMenuHandle.get()->die();
}
}
void LLListContextMenu::show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y)
{
- if (mMenu)
+ LLContextMenu* menup = mMenuHandle.get();
+ if (menup)
{
//preventing parent (menu holder) from deleting already "dead" context menus on exit
- LLView* parent = mMenu->getParent();
+ LLView* parent = menup->getParent();
if (parent)
{
- parent->removeChild(mMenu);
+ parent->removeChild(menup);
}
- delete mMenu;
- mMenu = NULL;
+ delete menup;
mUUIDs.clear();
}
@@ -79,23 +77,23 @@ void LLListContextMenu::show(LLView* spawning_view, const uuid_vec_t& uuids, S32
mUUIDs.resize(uuids.size());
std::copy(uuids.begin(), uuids.end(), mUUIDs.begin());
- mMenu = createMenu();
- if (!mMenu)
+ menup = createMenu();
+ if (!menup)
{
llwarns << "Context menu creation failed" << llendl;
return;
}
- mMenuHandle = mMenu->getHandle();
- mMenu->show(x, y);
- LLMenuGL::showPopup(spawning_view, mMenu, x, y);
+ mMenuHandle = menup->getHandle();
+ menup->show(x, y);
+ LLMenuGL::showPopup(spawning_view, menup, x, y);
}
void LLListContextMenu::hide()
{
- if(mMenu)
+ if(mMenuHandle.get())
{
- mMenu->hide();
+ mMenuHandle.get()->hide();
}
}
diff --git a/indra/newview/lllistcontextmenu.h b/indra/newview/lllistcontextmenu.h
index 5dedc30b0c..fabd68ee20 100644
--- a/indra/newview/lllistcontextmenu.h
+++ b/indra/newview/lllistcontextmenu.h
@@ -71,8 +71,7 @@ protected:
static void handleMultiple(functor_t functor, const uuid_vec_t& ids);
uuid_vec_t mUUIDs;
- LLContextMenu* mMenu;
- LLHandle<LLView> mMenuHandle;
+ LLHandle<LLContextMenu> mMenuHandle;
};
#endif // LL_LLLISTCONTEXTMENU_H
diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp
index 6658e1d7e8..f6b85de4b8 100644
--- a/indra/newview/llmoveview.cpp
+++ b/indra/newview/llmoveview.cpp
@@ -448,17 +448,20 @@ void LLFloaterMove::updatePosition()
LLBottomTray* tray = LLBottomTray::getInstance();
if (!tray) return;
- LLButton* movement_btn = tray->getChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME);
+ LLButton* movement_btn = tray->findChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME);
- //align centers of a button and a floater
- S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2;
-
- S32 y = 0;
- if (!mModeActionsPanel->getVisible())
+ if (movement_btn)
{
- y = mModeActionsPanel->getRect().getHeight();
+ //align centers of a button and a floater
+ S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2;
+
+ S32 y = 0;
+ if (!mModeActionsPanel->getVisible())
+ {
+ y = mModeActionsPanel->getRect().getHeight();
+ }
+ setOrigin(x, y);
}
- setOrigin(x, y);
}
//static
@@ -735,10 +738,18 @@ void LLPanelStandStopFlying::updatePosition()
LLBottomTray* tray = LLBottomTray::getInstance();
if (!tray || mAttached) return;
- LLButton* movement_btn = tray->getChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME);
+ LLButton* movement_btn = tray->findChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME);
- // Align centers of the button and the panel.
- S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2;
+ S32 x = 0;
+ if (movement_btn)
+ {
+ // Align centers of the button and the panel.
+ x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2;
+ }
+ else
+ {
+ x = tray->calcScreenRect().getCenterX() - getRect().getWidth()/2;
+ }
setOrigin(x, 0);
}
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 58849393b4..e4f83ce6b9 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -276,9 +276,6 @@ LLNavigationBar::LLNavigationBar()
// set a listener function for LoginComplete event
LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLNavigationBar::handleLoginComplete, this));
-
- // Necessary for focus movement among child controls
- setFocusRoot(TRUE);
}
LLNavigationBar::~LLNavigationBar()
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 932ad75f29..836ae9a0cf 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -94,15 +94,19 @@ public:
LLGestureComboList::Params::Params()
: combo_button("combo_button"),
- combo_list("combo_list")
+ combo_list("combo_list"),
+ get_more("get_more", true),
+ view_all("view_all", true)
{
}
LLGestureComboList::LLGestureComboList(const LLGestureComboList::Params& p)
-: LLUICtrl(p)
- , mLabel(p.label)
- , mViewAllItemIndex(0)
- , mGetMoreItemIndex(0)
+: LLUICtrl(p),
+ mLabel(p.label),
+ mViewAllItemIndex(-1),
+ mGetMoreItemIndex(-1),
+ mShowViewAll(p.view_all),
+ mShowGetMore(p.get_more)
{
LLBottomtrayButton::Params button_params = p.combo_button;
button_params.follows.flags(FOLLOWS_LEFT|FOLLOWS_BOTTOM|FOLLOWS_RIGHT);
@@ -286,12 +290,16 @@ void LLGestureComboList::refreshGestures()
sortByName();
// store indices for Get More and View All items (idx is the index followed by the last added Gesture)
- mGetMoreItemIndex = idx;
- mViewAllItemIndex = idx + 1;
-
- // add Get More and View All items at the bottom
- mList->addSimpleElement(LLTrans::getString("GetMoreGestures"), ADD_BOTTOM, LLSD(mGetMoreItemIndex));
- mList->addSimpleElement(LLTrans::getString("ViewAllGestures"), ADD_BOTTOM, LLSD(mViewAllItemIndex));
+ if (mShowGetMore)
+ {
+ mGetMoreItemIndex = idx;
+ mList->addSimpleElement(LLTrans::getString("GetMoreGestures"), ADD_BOTTOM, LLSD(mGetMoreItemIndex));
+ }
+ if (mShowViewAll)
+ {
+ mViewAllItemIndex = idx + 1;
+ mList->addSimpleElement(LLTrans::getString("ViewAllGestures"), ADD_BOTTOM, LLSD(mViewAllItemIndex));
+ }
// Insert label after sorting, at top, with separator below it
mList->addSeparator(ADD_TOP);
diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h
index cc905736fd..033d1dd5a2 100644
--- a/indra/newview/llnearbychatbar.h
+++ b/indra/newview/llnearbychatbar.h
@@ -46,6 +46,8 @@ public:
{
Optional<LLBottomtrayButton::Params> combo_button;
Optional<LLScrollListCtrl::Params> combo_list;
+ Optional<bool> get_more,
+ view_all;
Params();
};
@@ -56,6 +58,8 @@ protected:
LLGestureComboList(const Params&);
std::vector<LLMultiGesture*> mGestures;
std::string mLabel;
+ bool mShowViewAll;
+ bool mShowGetMore;
LLSD::Integer mViewAllItemIndex;
LLSD::Integer mGetMoreItemIndex;
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 7c93d8a1f9..f348692e3d 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -163,8 +163,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
mHtmlAvailable( TRUE ),
mListener(new LLPanelLoginListener(this))
{
- setFocusRoot(TRUE);
-
setBackgroundVisible(FALSE);
setBackgroundOpaque(TRUE);
@@ -181,8 +179,11 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
mPasswordModified = FALSE;
LLPanelLogin::sInstance = this;
- // add to front so we are the bottom-most child
- gViewerWindow->getRootView()->addChildInBack(this);
+ LLView* login_holder = gViewerWindow->getLoginPanelHolder();
+ if (login_holder)
+ {
+ login_holder->addChild(this);
+ }
// Logo
mLogoImage = LLUI::getUIImage("startup_logo");
@@ -739,7 +740,7 @@ void LLPanelLogin::closePanel()
{
if (sInstance)
{
- gViewerWindow->getRootView()->removeChild( LLPanelLogin::sInstance );
+ LLPanelLogin::sInstance->getParent()->removeChild( LLPanelLogin::sInstance );
delete sInstance;
sInstance = NULL;
diff --git a/indra/newview/llpopupview.cpp b/indra/newview/llpopupview.cpp
index 499b6a8f5f..18035c42f4 100644
--- a/indra/newview/llpopupview.cpp
+++ b/indra/newview/llpopupview.cpp
@@ -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));
diff --git a/indra/newview/llpopupview.h b/indra/newview/llpopupview.h
index fec4afd79c..b378f61984 100644
--- a/indra/newview/llpopupview.h
+++ b/indra/newview/llpopupview.h
@@ -32,7 +32,7 @@
class LLPopupView : public LLPanel
{
public:
- LLPopupView();
+ LLPopupView(const Params& p = LLPanel::Params());
~LLPopupView();
/*virtual*/ void draw();
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 521e5005e8..53d8a5c19e 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -155,8 +155,6 @@ LLSideTrayTab::LLSideTrayTab(const Params& p)
mDescription(p.description),
mMainPanel(NULL)
{
- // Necessary for focus movement among child controls
- setFocusRoot(TRUE);
}
LLSideTrayTab::~LLSideTrayTab()
diff --git a/indra/newview/lltool.cpp b/indra/newview/lltool.cpp
index 282d4e19c6..2d8ce95347 100644
--- a/indra/newview/lltool.cpp
+++ b/indra/newview/lltool.cpp
@@ -33,6 +33,7 @@
#include "llview.h"
#include "llviewerwindow.h"
+#include "llviewercontrol.h"
#include "lltoolcomp.h"
#include "lltoolfocus.h"
#include "llfocusmgr.h"
@@ -190,9 +191,12 @@ LLTool* LLTool::getOverrideTool(MASK mask)
{
return NULL;
}
- if (mask & MASK_ALT)
+ if (gSavedSettings.getBOOL("EnableAltZoom"))
{
- return LLToolCamera::getInstance();
+ if (mask & MASK_ALT)
+ {
+ return LLToolCamera::getInstance();
+ }
}
return NULL;
}
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 864de018e0..2ee3e4ffed 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -1210,15 +1210,17 @@ void LLToolPie::handleDeselect()
LLTool* LLToolPie::getOverrideTool(MASK mask)
{
- if (mask == MASK_CONTROL)
+ if (gSavedSettings.getBOOL("EnableGrab"))
{
- return LLToolGrab::getInstance();
- }
- else if (mask == (MASK_CONTROL | MASK_SHIFT))
- {
- return LLToolGrab::getInstance();
+ if (mask == MASK_CONTROL)
+ {
+ return LLToolGrab::getInstance();
+ }
+ else if (mask == (MASK_CONTROL | MASK_SHIFT))
+ {
+ return LLToolGrab::getInstance();
+ }
}
-
return LLTool::getOverrideTool(mask);
}
diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp
index d7e15e7d6c..1aa9fd8a45 100644
--- a/indra/newview/llviewerkeyboard.cpp
+++ b/indra/newview/llviewerkeyboard.cpp
@@ -40,6 +40,7 @@
#include "llviewerwindow.h"
#include "llvoavatarself.h"
#include "llfloatercamera.h"
+#include "llinitparam.h"
//
// Constants
@@ -53,6 +54,11 @@ const S32 NUDGE_FRAMES = 2;
const F32 ORBIT_NUDGE_RATE = 0.05f; // fraction of normal speed
const F32 YAW_NUDGE_RATE = 0.05f; // fraction of normal speed
+struct LLKeyboardActionRegistry
+: public LLRegistrySingleton<std::string, boost::function<void (EKeystate keystate)>, LLKeyboardActionRegistry>
+{
+};
+
LLViewerKeyboard gViewerKeyboard;
void agent_jump( EKeystate s )
@@ -550,52 +556,50 @@ void start_gesture( EKeystate s )
}
}
-void bind_keyboard_functions()
-{
- gViewerKeyboard.bindNamedFunction("jump", agent_jump);
- gViewerKeyboard.bindNamedFunction("push_down", agent_push_down);
- gViewerKeyboard.bindNamedFunction("push_forward", agent_push_forward);
- gViewerKeyboard.bindNamedFunction("push_backward", agent_push_backward);
- gViewerKeyboard.bindNamedFunction("look_up", agent_look_up);
- gViewerKeyboard.bindNamedFunction("look_down", agent_look_down);
- gViewerKeyboard.bindNamedFunction("toggle_fly", agent_toggle_fly);
- gViewerKeyboard.bindNamedFunction("turn_left", agent_turn_left);
- gViewerKeyboard.bindNamedFunction("turn_right", agent_turn_right);
- gViewerKeyboard.bindNamedFunction("slide_left", agent_slide_left);
- gViewerKeyboard.bindNamedFunction("slide_right", agent_slide_right);
- gViewerKeyboard.bindNamedFunction("spin_around_ccw", camera_spin_around_ccw);
- gViewerKeyboard.bindNamedFunction("spin_around_cw", camera_spin_around_cw);
- gViewerKeyboard.bindNamedFunction("spin_around_ccw_sitting", camera_spin_around_ccw_sitting);
- gViewerKeyboard.bindNamedFunction("spin_around_cw_sitting", camera_spin_around_cw_sitting);
- gViewerKeyboard.bindNamedFunction("spin_over", camera_spin_over);
- gViewerKeyboard.bindNamedFunction("spin_under", camera_spin_under);
- gViewerKeyboard.bindNamedFunction("spin_over_sitting", camera_spin_over_sitting);
- gViewerKeyboard.bindNamedFunction("spin_under_sitting", camera_spin_under_sitting);
- gViewerKeyboard.bindNamedFunction("move_forward", camera_move_forward);
- gViewerKeyboard.bindNamedFunction("move_backward", camera_move_backward);
- gViewerKeyboard.bindNamedFunction("move_forward_sitting", camera_move_forward_sitting);
- gViewerKeyboard.bindNamedFunction("move_backward_sitting", camera_move_backward_sitting);
- gViewerKeyboard.bindNamedFunction("pan_up", camera_pan_up);
- gViewerKeyboard.bindNamedFunction("pan_down", camera_pan_down);
- gViewerKeyboard.bindNamedFunction("pan_left", camera_pan_left);
- gViewerKeyboard.bindNamedFunction("pan_right", camera_pan_right);
- gViewerKeyboard.bindNamedFunction("pan_in", camera_pan_in);
- gViewerKeyboard.bindNamedFunction("pan_out", camera_pan_out);
- gViewerKeyboard.bindNamedFunction("move_forward_fast", camera_move_forward_fast);
- gViewerKeyboard.bindNamedFunction("move_backward_fast", camera_move_backward_fast);
- gViewerKeyboard.bindNamedFunction("edit_avatar_spin_ccw", edit_avatar_spin_ccw);
- gViewerKeyboard.bindNamedFunction("edit_avatar_spin_cw", edit_avatar_spin_cw);
- gViewerKeyboard.bindNamedFunction("edit_avatar_spin_over", edit_avatar_spin_over);
- gViewerKeyboard.bindNamedFunction("edit_avatar_spin_under", edit_avatar_spin_under);
- gViewerKeyboard.bindNamedFunction("edit_avatar_move_forward", edit_avatar_move_forward);
- gViewerKeyboard.bindNamedFunction("edit_avatar_move_backward", edit_avatar_move_backward);
- gViewerKeyboard.bindNamedFunction("stop_moving", stop_moving);
- gViewerKeyboard.bindNamedFunction("start_chat", start_chat);
- gViewerKeyboard.bindNamedFunction("start_gesture", start_gesture);
-}
-
-LLViewerKeyboard::LLViewerKeyboard() :
- mNamedFunctionCount(0)
+#define REGISTER_KEYBOARD_ACTION(KEY, ACTION) LLREGISTER_STATIC(LLKeyboardActionRegistry, KEY, ACTION);
+REGISTER_KEYBOARD_ACTION("jump", agent_jump);
+REGISTER_KEYBOARD_ACTION("push_down", agent_push_down);
+REGISTER_KEYBOARD_ACTION("push_forward", agent_push_forward);
+REGISTER_KEYBOARD_ACTION("push_backward", agent_push_backward);
+REGISTER_KEYBOARD_ACTION("look_up", agent_look_up);
+REGISTER_KEYBOARD_ACTION("look_down", agent_look_down);
+REGISTER_KEYBOARD_ACTION("toggle_fly", agent_toggle_fly);
+REGISTER_KEYBOARD_ACTION("turn_left", agent_turn_left);
+REGISTER_KEYBOARD_ACTION("turn_right", agent_turn_right);
+REGISTER_KEYBOARD_ACTION("slide_left", agent_slide_left);
+REGISTER_KEYBOARD_ACTION("slide_right", agent_slide_right);
+REGISTER_KEYBOARD_ACTION("spin_around_ccw", camera_spin_around_ccw);
+REGISTER_KEYBOARD_ACTION("spin_around_cw", camera_spin_around_cw);
+REGISTER_KEYBOARD_ACTION("spin_around_ccw_sitting", camera_spin_around_ccw_sitting);
+REGISTER_KEYBOARD_ACTION("spin_around_cw_sitting", camera_spin_around_cw_sitting);
+REGISTER_KEYBOARD_ACTION("spin_over", camera_spin_over);
+REGISTER_KEYBOARD_ACTION("spin_under", camera_spin_under);
+REGISTER_KEYBOARD_ACTION("spin_over_sitting", camera_spin_over_sitting);
+REGISTER_KEYBOARD_ACTION("spin_under_sitting", camera_spin_under_sitting);
+REGISTER_KEYBOARD_ACTION("move_forward", camera_move_forward);
+REGISTER_KEYBOARD_ACTION("move_backward", camera_move_backward);
+REGISTER_KEYBOARD_ACTION("move_forward_sitting", camera_move_forward_sitting);
+REGISTER_KEYBOARD_ACTION("move_backward_sitting", camera_move_backward_sitting);
+REGISTER_KEYBOARD_ACTION("pan_up", camera_pan_up);
+REGISTER_KEYBOARD_ACTION("pan_down", camera_pan_down);
+REGISTER_KEYBOARD_ACTION("pan_left", camera_pan_left);
+REGISTER_KEYBOARD_ACTION("pan_right", camera_pan_right);
+REGISTER_KEYBOARD_ACTION("pan_in", camera_pan_in);
+REGISTER_KEYBOARD_ACTION("pan_out", camera_pan_out);
+REGISTER_KEYBOARD_ACTION("move_forward_fast", camera_move_forward_fast);
+REGISTER_KEYBOARD_ACTION("move_backward_fast", camera_move_backward_fast);
+REGISTER_KEYBOARD_ACTION("edit_avatar_spin_ccw", edit_avatar_spin_ccw);
+REGISTER_KEYBOARD_ACTION("edit_avatar_spin_cw", edit_avatar_spin_cw);
+REGISTER_KEYBOARD_ACTION("edit_avatar_spin_over", edit_avatar_spin_over);
+REGISTER_KEYBOARD_ACTION("edit_avatar_spin_under", edit_avatar_spin_under);
+REGISTER_KEYBOARD_ACTION("edit_avatar_move_forward", edit_avatar_move_forward);
+REGISTER_KEYBOARD_ACTION("edit_avatar_move_backward", edit_avatar_move_backward);
+REGISTER_KEYBOARD_ACTION("stop_moving", stop_moving);
+REGISTER_KEYBOARD_ACTION("start_chat", start_chat);
+REGISTER_KEYBOARD_ACTION("start_gesture", start_gesture);
+#undef REGISTER_KEYBOARD_ACTION
+
+LLViewerKeyboard::LLViewerKeyboard()
{
for (S32 i = 0; i < MODE_COUNT; i++)
{
@@ -613,16 +617,6 @@ LLViewerKeyboard::LLViewerKeyboard() :
}
}
-
-void LLViewerKeyboard::bindNamedFunction(const std::string& name, LLKeyFunc func)
-{
- S32 i = mNamedFunctionCount;
- mNamedFunctions[i].mName = name;
- mNamedFunctions[i].mFunction = func;
- mNamedFunctionCount++;
-}
-
-
BOOL LLViewerKeyboard::modeFromString(const std::string& string, S32 *mode)
{
if (string == "FIRST_PERSON")
@@ -695,8 +689,9 @@ BOOL LLViewerKeyboard::handleKey(KEY translated_key, MASK translated_mask, BOOL
BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name)
{
- S32 i,index;
- void (*function)(EKeystate keystate) = NULL;
+ S32 index;
+ typedef boost::function<void(EKeystate)> function_t;
+ function_t function = NULL;
std::string name;
// Allow remapping of F2-F12
@@ -719,13 +714,11 @@ BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, c
}
// Not remapped, look for a function
- for (i = 0; i < mNamedFunctionCount; i++)
+
+ function_t* result = LLKeyboardActionRegistry::getValue(function_name);
+ if (result)
{
- if (function_name == mNamedFunctions[i].mName)
- {
- function = mNamedFunctions[i].mFunction;
- name = mNamedFunctions[i].mName;
- }
+ function = *result;
}
if (!function)
@@ -755,7 +748,6 @@ BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, c
mBindings[mode][index].mKey = key;
mBindings[mode][index].mMask = mask;
-// mBindings[mode][index].mName = name;
mBindings[mode][index].mFunction = function;
if (index == mBindingCount[mode])
@@ -764,6 +756,61 @@ BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, c
return TRUE;
}
+LLViewerKeyboard::KeyBinding::KeyBinding()
+: key("key"),
+ mask("mask"),
+ command("command")
+{}
+
+LLViewerKeyboard::KeyMode::KeyMode(EKeyboardMode _mode)
+: bindings("binding"),
+ mode(_mode)
+{}
+
+LLViewerKeyboard::Keys::Keys()
+: first_person("first_person", KeyMode(MODE_FIRST_PERSON)),
+ third_person("third_person", KeyMode(MODE_THIRD_PERSON)),
+ edit("edit", KeyMode(MODE_EDIT)),
+ sitting("sitting", KeyMode(MODE_SITTING)),
+ edit_avatar("edit_avatar", KeyMode(MODE_EDIT_AVATAR))
+{}
+
+S32 LLViewerKeyboard::loadBindingsXML(const std::string& filename)
+{
+ S32 binding_count = 0;
+ Keys keys;
+ LLSimpleXUIParser parser;
+
+ if (parser.readXUI(filename, keys)
+ && keys.validateBlock())
+ {
+ binding_count += loadBindingMode(keys.first_person);
+ binding_count += loadBindingMode(keys.third_person);
+ binding_count += loadBindingMode(keys.edit);
+ binding_count += loadBindingMode(keys.sitting);
+ binding_count += loadBindingMode(keys.edit_avatar);
+ }
+ return binding_count;
+}
+
+S32 LLViewerKeyboard::loadBindingMode(const LLViewerKeyboard::KeyMode& keymode)
+{
+ S32 binding_count = 0;
+ for (LLInitParam::ParamIterator<KeyBinding>::const_iterator it = keymode.bindings.begin(),
+ end_it = keymode.bindings.end();
+ it != end_it;
+ ++it)
+ {
+ KEY key;
+ MASK mask;
+ LLKeyboard::keyFromString(it->key, &key);
+ LLKeyboard::maskFromString(it->mask, &mask);
+ bindKey(keymode.mode, key, mask, it->command);
+ binding_count++;
+ }
+
+ return binding_count;
+}
S32 LLViewerKeyboard::loadBindings(const std::string& filename)
{
@@ -912,18 +959,18 @@ void LLViewerKeyboard::scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_lev
if (key_down && !repeat)
{
// ...key went down this frame, call function
- (*binding[i].mFunction)( KEYSTATE_DOWN );
+ binding[i].mFunction( KEYSTATE_DOWN );
}
else if (key_up)
{
// ...key went down this frame, call function
- (*binding[i].mFunction)( KEYSTATE_UP );
+ binding[i].mFunction( KEYSTATE_UP );
}
else if (key_level)
{
// ...key held down from previous frame
// Not windows, just call the function.
- (*binding[i].mFunction)( KEYSTATE_LEVEL );
+ binding[i].mFunction( KEYSTATE_LEVEL );
}//if
}//if
}//for
diff --git a/indra/newview/llviewerkeyboard.h b/indra/newview/llviewerkeyboard.h
index 2fa5d5dfa6..925244e89b 100644
--- a/indra/newview/llviewerkeyboard.h
+++ b/indra/newview/llviewerkeyboard.h
@@ -55,26 +55,51 @@ typedef enum e_keyboard_mode
void bind_keyboard_functions();
-
class LLViewerKeyboard
{
public:
+ struct KeyBinding : public LLInitParam::Block<KeyBinding>
+ {
+ Mandatory<std::string> key,
+ mask,
+ command;
+
+ KeyBinding();
+ };
+
+ struct KeyMode : public LLInitParam::Block<KeyMode>
+ {
+ Multiple<KeyBinding> bindings;
+ EKeyboardMode mode;
+ KeyMode(EKeyboardMode mode);
+ };
+
+ struct Keys : public LLInitParam::Block<Keys>
+ {
+ Optional<KeyMode> first_person,
+ third_person,
+ edit,
+ sitting,
+ edit_avatar;
+
+ Keys();
+ };
+
LLViewerKeyboard();
BOOL handleKey(KEY key, MASK mask, BOOL repeated);
- void bindNamedFunction(const std::string& name, LLKeyFunc func);
-
S32 loadBindings(const std::string& filename); // returns number bound, 0 on error
+ S32 loadBindingsXML(const std::string& filename); // returns number bound, 0 on error
EKeyboardMode getMode();
BOOL modeFromString(const std::string& string, S32 *mode); // False on failure
void scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level);
-protected:
+
+private:
+ S32 loadBindingMode(const LLViewerKeyboard::KeyMode& keymode);
BOOL bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name);
- S32 mNamedFunctionCount;
- LLNamedFunction mNamedFunctions[MAX_NAMED_FUNCTIONS];
// Hold all the ugly stuff torn out to make LLKeyboard non-viewer-specific here
S32 mBindingCount[MODE_COUNT];
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index d4af5048c3..0ff5181cc5 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -190,6 +190,8 @@ BOOL is_selection_buy_not_take();
S32 selection_price();
BOOL enable_take();
void handle_take();
+void handle_object_show_inspector();
+void handle_avatar_show_inspector();
bool confirm_take(const LLSD& notification, const LLSD& response);
void handle_buy_object(LLSaleInfo sale_info);
@@ -842,6 +844,25 @@ class LLAdvancedCheckFeature : public view_listener_t
}
};
+void LLDestinationGuideToggle()
+{
+ LLView* destination_guide = gViewerWindow->getRootView()->getChildView("destination_guide_container");
+ if ( destination_guide )
+ {
+ if ( destination_guide->getVisible() )
+ {
+ destination_guide->setVisible( FALSE );
+ }
+ else
+ {
+ destination_guide->setVisible( true );
+ }
+ }
+ else
+ {
+ llwarns << "ERROR: unable to find destination guide container" << llendl;
+ }
+};
//////////////////
// INFO DISPLAY //
@@ -4368,6 +4389,33 @@ void handle_take()
}
}
+void handle_object_show_inspector()
+{
+ LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
+ LLViewerObject* objectp = selection->getFirstRootObject(TRUE);
+ if (!objectp)
+ {
+ return;
+ }
+
+ LLSD params;
+ params["object_id"] = objectp->getID();
+ LLFloaterReg::showInstance("inspect_object", params);
+}
+
+void handle_avatar_show_inspector()
+{
+ LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
+ if(avatar)
+ {
+ LLSD params;
+ params["avatar_id"] = avatar->getID();
+ LLFloaterReg::showInstance("inspect_avatar", params);
+ }
+}
+
+
+
bool confirm_take(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
@@ -8158,6 +8206,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLAvatarInviteToGroup(), "Avatar.InviteToGroup");
view_listener_t::addMenu(new LLAvatarGiveCard(), "Avatar.GiveCard");
commit.add("Avatar.Eject", boost::bind(&handle_avatar_eject, LLSD()));
+ commit.add("Avatar.ShowInspector", boost::bind(&handle_avatar_show_inspector));
view_listener_t::addMenu(new LLAvatarSendIM(), "Avatar.SendIM");
view_listener_t::addMenu(new LLAvatarCall(), "Avatar.Call");
enable.add("Avatar.EnableCall", boost::bind(&LLAvatarActions::canCall));
@@ -8185,6 +8234,7 @@ void initialize_menus()
commit.add("Object.Inspect", boost::bind(&handle_object_inspect));
commit.add("Object.Open", boost::bind(&handle_object_open));
commit.add("Object.Take", boost::bind(&handle_take));
+ commit.add("Object.ShowInspector", boost::bind(&handle_object_show_inspector));
enable.add("Object.EnableOpen", boost::bind(&enable_object_open));
enable.add("Object.EnableTouch", boost::bind(&enable_object_touch, _1));
enable.add("Object.EnableDelete", boost::bind(&enable_object_delete));
@@ -8244,4 +8294,6 @@ void initialize_menus()
view_listener_t::addMenu(new LLEditableSelectedMono(), "EditableSelectedMono");
view_listener_t::addMenu(new LLToggleUIHints(), "ToggleUIHints");
+
+ commit.add("DestinationGuide.toggle", boost::bind(&LLDestinationGuideToggle));
}
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 983a2d25c8..c6ed3f8979 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1351,6 +1351,15 @@ LLViewerWindow::LLViewerWindow(
LL_WARNS("Window") << " Someone took over my signal/exception handler (post createWindow)!" << LL_ENDL;
}
+ LLCoordScreen scr;
+ mWindow->getSize(&scr);
+
+ if(fullscreen && ( scr.mX!=width || scr.mY!=height))
+ {
+ llwarns << "Fullscreen has forced us in to a different resolution now using "<<scr.mX<<" x "<<scr.mY<<llendl;
+ gSavedSettings.setS32("FullScreenWidth",scr.mX);
+ gSavedSettings.setS32("FullScreenHeight",scr.mY);
+ }
if (NULL == mWindow)
{
@@ -1524,8 +1533,9 @@ 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();
+ mLoginPanelHolder = main_view->getChild<LLView>("login_panel_holder")->getHandle();
// Constrain floaters to inside the menu and status bar regions.
gFloaterView = main_view->getChild<LLFloaterView>("Floater View");
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 633c3a41d2..c944317933 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -288,6 +288,7 @@ public:
LLView* getNonSideTrayView() { return mNonSideTrayView.get(); }
LLView* getFloaterViewHolder() { return mFloaterViewHolder.get(); }
LLView* getHintHolder() { return mHintHolder.get(); }
+ LLView* getLoginPanelHolder() { return mLoginPanelHolder.get(); }
BOOL handleKey(KEY key, MASK mask);
void handleScrollWheel (S32 clicks);
@@ -448,6 +449,7 @@ protected:
LLHandle<LLView> mNonSideTrayView; // parent of world view + bottom bar, etc...everything but the side tray
LLHandle<LLView> mFloaterViewHolder; // container for floater_view
LLHandle<LLView> mHintHolder; // container for hints
+ LLHandle<LLView> mLoginPanelHolder; // container for login panel
LLPopupView* mPopupView; // container for transient popups
class LLDebugText* mDebugText; // Internal class for debug text
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 6c44f639ec..730f022c50 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -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 mPTTIsToggle;
+}
+
+void LLVoiceClient::setPTTKey(std::string &key)
+{
+ if(key == "MiddleMouse")
{
- return mVoiceModule->getPTTIsToggle();
+ mPTTIsMiddleMouse = true;
}
- else {
- return false;
+ 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);
+ }
+ }
}
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index 24d7d7163e..c9aeea35a9 100644
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -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;
};
/**
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index e674fec053..3cdbe04fae 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -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,40 +5188,13 @@ 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();
- }
- }
- else // set open-mic state as an absolute
- {
- setUserPTTState(down);
+ mMuteMic = muted;
+ mMuteMicDirty = true;
}
}
-
-void LLVivoxVoiceClient::toggleUserPTTState(void)
-{
- mUserPTTState = !mUserPTTState;
-}
-
void LLVivoxVoiceClient::setVoiceEnabled(bool enabled)
{
if (enabled != mVoiceEnabled)
@@ -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>"
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index 08f2f75a39..04ac35ff82 100644
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -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;
diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
index 8d9ebf6e06..7c588fd10c 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -8,6 +8,12 @@
tab_stop="false"
name="main_view"
width="1024">
+ <panel top="0"
+ follows="all"
+ height="768"
+ mouse_opaque="false"
+ name="login_panel_holder"
+ width="1024"/>
<layout_stack border_size="0"
follows="all"
mouse_opaque="false"
@@ -121,7 +127,7 @@
user_resize="false"
visible="false"
width="333"/>
- </layout_stack>
+ </layout_stack>
<panel follows="all"
height="500"
left="0"
diff --git a/indra/newview/skins/default/xui/en/notification_visibility.xml b/indra/newview/skins/default/xui/en/notification_visibility.xml
new file mode 100644
index 0000000000..cb36890fe6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/notification_visibility.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" ?>
+<notification_visibility>
+ <rule visible="true"/>
+</notification_visibility>
+
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index e1aecda151..cf5a6ad255 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -441,6 +441,7 @@ Please invite members within 48 hours.
icon="alertmodal.tga"
name="LandBuyPass"
type="alertmodal">
+ <tag>fail</tag>
For L$[COST] you can enter this land (&apos;[PARCEL_NAME]&apos;) for [TIME] hours. Buy a pass?
<usetemplate
name="okcancelbuttons"
@@ -1589,6 +1590,7 @@ If you continue to get this message, please check the [SUPPORT_SITE].
icon="alertmodal.tga"
name="blocked_tport"
type="alertmodal">
+ <tag>fail</tag>
Sorry, teleport is currently blocked. Try again in a moment. If you still cannot teleport, please log out and log back in to resolve the problem.
</notification>
<notification
@@ -1601,42 +1603,49 @@ Sorry, but system was unable to locate landmark destination.
icon="alertmodal.tga"
name="timeout_tport"
type="alertmodal">
+ <tag>fail</tag>
Sorry, but system was unable to complete the teleport connection. Try again in a moment.
</notification>
<notification
icon="alertmodal.tga"
name="noaccess_tport"
type="alertmodal">
+ <tag>fail</tag>
Sorry, you do not have access to that teleport destination.
</notification>
<notification
icon="alertmodal.tga"
name="missing_attach_tport"
type="alertmodal">
+ <tag>fail</tag>
Your attachments have not arrived yet. Try waiting for a few more seconds or log out and back in again before attempting to teleport.
</notification>
<notification
icon="alertmodal.tga"
name="too_many_uploads_tport"
type="alertmodal">
+ <tag>fail</tag>
The asset queue in this region is currently clogged so your teleport request will not be able to succeed in a timely manner. Please try again in a few minutes or go to a less busy area.
</notification>
<notification
icon="alertmodal.tga"
name="expired_tport"
type="alertmodal">
+ <tag>fail</tag>
Sorry, but the system was unable to complete your teleport request in a timely fashion. Please try again in a few minutes.
</notification>
<notification
icon="alertmodal.tga"
name="expired_region_handoff"
type="alertmodal">
+ <tag>fail</tag>
Sorry, but the system was unable to complete your region crossing in a timely fashion. Please try again in a few minutes.
</notification>
<notification
icon="alertmodal.tga"
name="no_host"
type="alertmodal">
+ <tag>fail</tag>
Unable to find teleport destination. The destination may be temporarily unavailable or no longer exists. Please try again in a few minutes.
</notification>
<notification
@@ -2069,7 +2078,7 @@ Would you be my friend?
<button
default="true"
index="0"
- name="Offer"
+ name="OK"
text="OK"/>
<button
index="1"
@@ -2091,7 +2100,7 @@ Would you be my friend?
<button
default="true"
index="0"
- name="Offer"
+ name="OK"
text="OK"/>
<button
index="1"
@@ -2114,7 +2123,7 @@ Would you be my friend?
<button
default="true"
index="0"
- name="Offer"
+ name="OK"
text="OK"/>
<button
index="1"
@@ -2418,6 +2427,7 @@ Display settings have been set to recommended levels based on your system config
icon="alertmodal.tga"
name="AvatarMovedDesired"
type="alertmodal">
+ <tag>fail</tag>
Your desired location is not currently available.
You have been moved into a nearby region.
</notification>
@@ -2426,6 +2436,7 @@ You have been moved into a nearby region.
icon="alertmodal.tga"
name="AvatarMovedLast"
type="alertmodal">
+ <tag>fail</tag>
Your last location is not currently available.
You have been moved into a nearby region.
</notification>
@@ -2434,6 +2445,7 @@ You have been moved into a nearby region.
icon="alertmodal.tga"
name="AvatarMovedHome"
type="alertmodal">
+ <tag>fail</tag>
Your home location is not currently available.
You have been moved into a nearby region.
You may want to set a new home location.
@@ -2443,6 +2455,7 @@ You may want to set a new home location.
icon="alertmodal.tga"
name="ClothingLoading"
type="alertmodal">
+ <tag>fail</tag>
Your clothing is still downloading.
You can use [SECOND_LIFE] normally and other people will see you correctly.
<form name="form">
@@ -2470,6 +2483,7 @@ Return to [http://join.secondlife.com secondlife.com] to create a new account?
icon="alertmodal.tga"
name="LoginPacketNeverReceived"
type="alertmodal">
+ <tag>fail</tag>
We&apos;re having trouble connecting. There may be a problem with your Internet connection or the [SECOND_LIFE_GRID].
You can either check your Internet connection and try again in a few minutes, click Help to view the [SUPPORT_SITE], or click Teleport to attempt to teleport home.
@@ -3118,6 +3132,7 @@ You have reached your maximum number of groups. Please leave some group before j
icon="alert.tga"
name="KickUser"
type="alert">
+ <tag>win</tag>
Kick this Resident with what message?
<form name="form">
<input name="message" type="text">
@@ -3139,6 +3154,7 @@ An administrator has logged you off.
icon="alert.tga"
name="KickAllUsers"
type="alert">
+ <tag>win</tag>
Kick everyone currently on the grid with what message?
<form name="form">
<input name="message" type="text">
@@ -3160,6 +3176,7 @@ An administrator has logged you off.
icon="alert.tga"
name="FreezeUser"
type="alert">
+ <tag>win</tag>
Freeze this Resident with what message?
<form name="form">
<input name="message" type="text">
@@ -3181,6 +3198,7 @@ You have been frozen. You cannot move or chat. An administrator will contact you
icon="alert.tga"
name="UnFreezeUser"
type="alert">
+ <tag>win</tag>
Unfreeze this Resident with what message?
<form name="form">
<input name="message" type="text">
@@ -3470,6 +3488,7 @@ Are you sure you want to change the Estate Covenant?
icon="alertmodal.tga"
name="RegionEntryAccessBlocked"
type="alertmodal">
+ <tag>fail</tag>
You are not allowed in that Region due to your maturity Rating. This may be a result of a lack of information validating your age.
Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating.
@@ -3482,6 +3501,7 @@ Please verify you have the latest Viewer installed, and go to the Knowledge Base
icon="alertmodal.tga"
name="RegionEntryAccessBlocked_KB"
type="alertmodal">
+ <tag>fail</tag>
You are not allowed in that region due to your maturity Rating.
Go to the Knowledge Base for more information about maturity Ratings?
@@ -3499,6 +3519,7 @@ Go to the Knowledge Base for more information about maturity Ratings?
icon="notifytip.tga"
name="RegionEntryAccessBlocked_Notify"
type="notifytip">
+ <tag>fail</tag>
You are not allowed in that region due to your maturity Rating.
</notification>
@@ -3506,6 +3527,7 @@ You are not allowed in that region due to your maturity Rating.
icon="alertmodal.tga"
name="RegionEntryAccessBlocked_Change"
type="alertmodal">
+ <tag>fail</tag>
You are not allowed in that Region due to your maturity Rating preference.
To enter the desired region, please change your maturity Rating preference. This will allow you to search for and access [REGIONMATURITY] content. To undo any changes, go to Me &gt; Preferences &gt; General.
@@ -4422,6 +4444,7 @@ Would you like to automatically wear the clothing you are about to create?
icon="alertmodal.tga"
name="NotAgeVerified"
type="alertmodal">
+ <tag>fail</tag>
You must be age-verified to visit this area. Do you want to go to the [SECOND_LIFE] website and verify your age?
[_URL]
@@ -4812,24 +4835,6 @@ Please select at least one type of content to search (General, Moderate, or Adul
<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"
persist="true"
type="notify">
@@ -4994,6 +4999,7 @@ You can be hurt here. If you die, you will be teleported to your home location.
persist="true"
type="notify"
unique="true">
+ <tag>fail</tag>
This area has flying disabled.
You can&apos;t fly here.
</notification>
@@ -5046,6 +5052,7 @@ This region is not running any scripts.
name="NoOutsideScripts"
persist="true"
type="notify">
+ <tag>fail</tag>
This land has outside scripts disabled.
No scripts will work here except those belonging to the land owner.
@@ -5064,6 +5071,7 @@ You can only claim public land in the Region you&apos;re in.
name="RegionTPAccessBlocked"
persist="true"
type="notify">
+ <tag>fail</tag>
You aren&apos;t allowed in that Region due to your maturity Rating. You may need to validate your age and/or install the latest Viewer.
Please go to the Knowledge Base for details on accessing areas with this maturity Rating.
@@ -5074,6 +5082,7 @@ Please go to the Knowledge Base for details on accessing areas with this maturit
name="URBannedFromRegion"
persist="true"
type="notify">
+ <tag>fail</tag>
You are banned from the region.
</notification>
@@ -5082,6 +5091,7 @@ You are banned from the region.
name="NoTeenGridAccess"
persist="true"
type="notify">
+ <tag>fail</tag>
Your account cannot connect to this teen grid region.
</notification>
@@ -5090,6 +5100,7 @@ Your account cannot connect to this teen grid region.
name="ImproperPaymentStatus"
persist="true"
type="notify">
+ <tag>fail</tag>
You do not have proper payment status to enter this region.
</notification>
@@ -5098,6 +5109,7 @@ You do not have proper payment status to enter this region.
name="MustGetAgeRgion"
persist="true"
type="notify">
+ <tag>fail</tag>
You must be age-verified to enter this region.
</notification>
@@ -5106,6 +5118,7 @@ You must be age-verified to enter this region.
name="MustGetAgeParcel"
persist="true"
type="notify">
+ <tag>fail</tag>
You must be age-verified to enter this parcel.
</notification>
@@ -5114,6 +5127,7 @@ You must be age-verified to enter this parcel.
name="NoDestRegion"
persist="true"
type="notify">
+ <tag>fail</tag>
No destination region found.
</notification>
@@ -5122,6 +5136,7 @@ No destination region found.
name="NotAllowedInDest"
persist="true"
type="notify">
+ <tag>fail</tag>
You are not allowed into the destination.
</notification>
@@ -5130,6 +5145,7 @@ You are not allowed into the destination.
name="RegionParcelBan"
persist="true"
type="notify">
+ <tag>fail</tag>
Cannot region cross into banned parcel. Try another way.
</notification>
@@ -5138,6 +5154,7 @@ Cannot region cross into banned parcel. Try another way.
name="TelehubRedirect"
persist="true"
type="notify">
+ <tag>fail</tag>
You have been redirected to a telehub.
</notification>
@@ -5146,6 +5163,7 @@ You have been redirected to a telehub.
name="CouldntTPCloser"
persist="true"
type="notify">
+ <tag>fail</tag>
Could not teleport closer to destination.
</notification>
@@ -5162,6 +5180,7 @@ Teleport cancelled.
name="FullRegionTryAgain"
persist="true"
type="notify">
+ <tag>fail</tag>
The region you are attempting to enter is currently full.
Please try again in a few moments.
</notification>
@@ -5171,6 +5190,7 @@ Please try again in a few moments.
name="GeneralFailure"
persist="true"
type="notify">
+ <tag>fail</tag>
General failure.
</notification>
@@ -5179,6 +5199,7 @@ General failure.
name="RoutedWrongRegion"
persist="true"
type="notify">
+ <tag>fail</tag>
Routed to wrong region. Please try again.
</notification>
@@ -5187,6 +5208,7 @@ Routed to wrong region. Please try again.
name="NoValidAgentID"
persist="true"
type="notify">
+ <tag>fail</tag>
No valid agent id.
</notification>
@@ -5195,6 +5217,7 @@ No valid agent id.
name="NoValidSession"
persist="true"
type="notify">
+ <tag>fail</tag>
No valid session id.
</notification>
@@ -5203,6 +5226,7 @@ No valid session id.
name="NoValidCircuit"
persist="true"
type="notify">
+ <tag>fail</tag>
No valid circuit code.
</notification>
@@ -5211,6 +5235,7 @@ No valid circuit code.
name="NoValidTimestamp"
persist="true"
type="notify">
+ <tag>fail</tag>
No valid timestamp.
</notification>
@@ -5219,6 +5244,7 @@ No valid timestamp.
name="NoPendingConnection"
persist="true"
type="notify">
+ <tag>fail</tag>
Unable to create pending connection.
</notification>
@@ -5227,6 +5253,7 @@ Unable to create pending connection.
name="InternalUsherError"
persist="true"
type="notify">
+ <tag>fail</tag>
Internal error attempting to connect agent usher.
</notification>
@@ -5235,6 +5262,7 @@ Internal error attempting to connect agent usher.
name="NoGoodTPDestination"
persist="true"
type="notify">
+ <tag>fail</tag>
Unable to find a good teleport destination in this region.
</notification>
@@ -5243,6 +5271,7 @@ Unable to find a good teleport destination in this region.
name="InternalErrorRegionResolver"
persist="true"
type="notify">
+ <tag>fail</tag>
Internal error attempting to activate region resolver.
</notification>
@@ -5251,6 +5280,7 @@ Internal error attempting to activate region resolver.
name="NoValidLanding"
persist="true"
type="notify">
+ <tag>fail</tag>
A valid landing point could not be found.
</notification>
@@ -5259,6 +5289,7 @@ A valid landing point could not be found.
name="NoValidParcel"
persist="true"
type="notify">
+ <tag>fail</tag>
No valid parcel could be found.
</notification>
@@ -5635,6 +5666,7 @@ Grant this request?
name="FirstBalanceIncrease"
persist="true"
type="notify">
+ <tag>win</tag>
You just received L$[AMOUNT].
Your L$ balance is shown in the upper-right.
</notification>
@@ -6054,6 +6086,7 @@ New Voice Morphs are available!
icon="notifytip.tga"
name="Cannot enter parcel: not a group member"
type="notifytip">
+ <tag>fail</tag>
Only members of a certain group can visit this area.
</notification>
@@ -6061,6 +6094,7 @@ Only members of a certain group can visit this area.
icon="notifytip.tga"
name="Cannot enter parcel: banned"
type="notifytip">
+ <tag>fail</tag>
Cannot enter parcel, you have been banned.
</notification>
@@ -6068,6 +6102,7 @@ Cannot enter parcel, you have been banned.
icon="notifytip.tga"
name="Cannot enter parcel: not on access list"
type="notifytip">
+ <tag>fail</tag>
Cannot enter parcel, you are not on the access list.
</notification>
@@ -6113,6 +6148,7 @@ The SLurl you clicked on is not supported.
name="BlockedSLURL"
priority="high"
type="notifytip">
+ <tag>win</tag>
A SLurl was received from an untrusted browser and has been blocked for your security.
</notification>
@@ -6313,13 +6349,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 +6364,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
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 63068a069f..013a8090f7 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -5,6 +5,7 @@
bg_opaque_color="DkGray"
chrome="true"
follows="left|bottom|right"
+ focus_root="true"
height="33"
layout="topleft"
left="0"
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml
index efb1da4c05..b5e1a5f16d 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml
@@ -10,6 +10,7 @@
layout="topleft"
left="0"
name="bottom_tray_lite"
+ focus_root="true"
tab_stop="true"
top="28"
chrome="true"
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index 891616b838..321e6c4cda 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -5,6 +5,7 @@ height="600"
layout="topleft"
left="0"
name="panel_login"
+focus_root="true"
top="600"
width="996">
<panel.string
diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
index 082d51ed3c..8a7bd53054 100644
--- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
@@ -4,6 +4,7 @@
background_visible="true"
bg_opaque_color="MouseGray"
follows="left|top|right"
+ focus_root="true"
height="60"
layout="topleft"
name="navigation_bar"
diff --git a/indra/newview/skins/default/xui/en/widgets/sidetray_tab.xml b/indra/newview/skins/default/xui/en/widgets/sidetray_tab.xml
new file mode 100644
index 0000000000..aa8461d367
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/sidetray_tab.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<sidetray_tab
+ focus_root="true"
+ />