summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/llcommon/llkeybind.cpp9
-rw-r--r--indra/llcommon/llkeybind.h3
-rw-r--r--indra/llui/llscrolllistcell.h2
-rw-r--r--indra/newview/CMakeLists.txt2
-rw-r--r--indra/newview/app_settings/key_bindings.xml (renamed from indra/newview/app_settings/keys.xml)79
-rw-r--r--indra/newview/llappviewer.cpp4
-rw-r--r--indra/newview/llfloaterpreference.cpp20
-rw-r--r--indra/newview/llfloaterpreference.h8
-rw-r--r--indra/newview/llkeyconflict.cpp18
-rw-r--r--indra/newview/llpanelpresetspulldown.cpp1
-rw-r--r--indra/newview/llsetkeybinddialog.cpp18
-rw-r--r--indra/newview/llsetkeybinddialog.h18
-rw-r--r--indra/newview/llviewerinput.cpp164
-rw-r--r--indra/newview/llviewerinput.h28
-rw-r--r--indra/newview/skins/default/xui/en/control_table_contents.xml14
-rw-r--r--indra/newview/skins/default/xui/en/floater_select_key.xml15
16 files changed, 152 insertions, 251 deletions
diff --git a/indra/llcommon/llkeybind.cpp b/indra/llcommon/llkeybind.cpp
index ff88a9c9aa..46a3230240 100644
--- a/indra/llcommon/llkeybind.cpp
+++ b/indra/llcommon/llkeybind.cpp
@@ -92,14 +92,11 @@ LLSD LLKeyData::asLLSD() const
LLSD data;
data["mouse"] = (LLSD::Integer)mMouse;
data["key"] = (LLSD::Integer)mKey;
+ data["mask"] = (LLSD::Integer)mMask;
if (mIgnoreMasks)
{
data["ignore_accelerators"] = (LLSD::Boolean)mIgnoreMasks;
}
- else
- {
- data["mask"] = (LLSD::Integer)mMask;
- }
return data;
}
@@ -147,7 +144,7 @@ bool LLKeyData::canHandle(const LLKeyData& data) const
{
if (data.mKey == mKey
&& data.mMouse == mMouse
- && (mIgnoreMasks || data.mMask == mMask))
+ && ((mIgnoreMasks && (data.mMask & mMask) == data.mMask) || data.mMask == mMask))
{
return true;
}
@@ -158,7 +155,7 @@ bool LLKeyData::canHandle(EMouseClickType mouse, KEY key, MASK mask) const
{
if (mouse == mMouse
&& key == mKey
- && (mIgnoreMasks || mask == mMask))
+ && ((mIgnoreMasks && (mask & mMask) == mask) || mask == mMask))
{
return true;
}
diff --git a/indra/llcommon/llkeybind.h b/indra/llcommon/llkeybind.h
index 39cb668aac..ad0ebec67c 100644
--- a/indra/llcommon/llkeybind.h
+++ b/indra/llcommon/llkeybind.h
@@ -53,7 +53,8 @@ public:
EMouseClickType mMouse;
KEY mKey;
MASK mMask;
- bool mIgnoreMasks;
+ // Either to expect exact match or ignore not expected masks
+ bool mIgnoreMasks;
};
// One function can bind to multiple Key options
diff --git a/indra/llui/llscrolllistcell.h b/indra/llui/llscrolllistcell.h
index ef7f717b57..19576fb247 100644
--- a/indra/llui/llscrolllistcell.h
+++ b/indra/llui/llscrolllistcell.h
@@ -70,7 +70,7 @@ public:
Optional<LLColor4> color;
Params()
- : type("cell_type", "text"), // Don't use "type", it overlaps with xml's parameter
+ : type("type", "text"),
column("column"),
width("width"),
enabled("enabled", true),
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 8345d5c445..cbd2dd8b2f 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1666,7 +1666,7 @@ set(viewer_APPSETTINGS_FILES
app_settings/grass.xml
app_settings/high_graphics.xml
app_settings/ignorable_dialogs.xml
- app_settings/keys.xml
+ app_settings/key_bindings.xml
app_settings/keywords_lsl_default.xml
app_settings/logcontrol.xml
app_settings/low_graphics.xml
diff --git a/indra/newview/app_settings/keys.xml b/indra/newview/app_settings/key_bindings.xml
index a8037fec05..0c90ef26df 100644
--- a/indra/newview/app_settings/keys.xml
+++ b/indra/newview/app_settings/key_bindings.xml
@@ -28,34 +28,9 @@
<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"/>
@@ -64,15 +39,10 @@
<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"/>
@@ -84,13 +54,8 @@
<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"/>
@@ -99,20 +64,12 @@
<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"/>
@@ -139,28 +96,14 @@
<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"/>
@@ -251,15 +194,11 @@
<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"/>
@@ -294,23 +233,23 @@
<binding key="A" mask="SHIFT" command="slide_left"/>
<binding key="D" mask="SHIFT" command="slide_right"/>
<binding key="W" mask="SHIFT" command="move_forward_sitting"/>
- <binding key="S" mask="SHIFT" command="move_backward_sitting"/>
- <binding key="E" mask="SHIFT" command="spin_over_sitting"/>
- <binding key="C" mask="SHIFT" command="spin_under_sitting"/>
+ <binding key="S" mask="SHIFT" command="move_backward_sitting"/>
+ <binding key="E" mask="SHIFT" command="spin_over_sitting"/>
+ <binding key="C" mask="SHIFT" command="spin_under_sitting"/>
<binding key="LEFT" mask="SHIFT" command="slide_left"/>
<binding key="RIGHT" mask="SHIFT" command="slide_right"/>
<binding key="UP" mask="SHIFT" command="move_forward_sitting"/>
- <binding key="DOWN" mask="SHIFT" command="move_backward_sitting"/>
- <binding key="PGUP" mask="SHIFT" command="spin_over_sitting"/>
- <binding key="PGDN" mask="SHIFT" command="spin_under_sitting"/>
+ <binding key="DOWN" mask="SHIFT" command="move_backward_sitting"/>
+ <binding key="PGUP" mask="SHIFT" command="spin_over_sitting"/>
+ <binding key="PGDN" mask="SHIFT" command="spin_under_sitting"/>
<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="move_forward_sitting"/>
- <binding key="PAD_DOWN" mask="SHIFT" command="move_backward_sitting"/>
- <binding key="PAD_PGUP" mask="SHIFT" command="spin_over_sitting"/>
- <binding key="PAD_PGDN" mask="SHIFT" command="spin_under_sitting"/>
+ <binding key="PAD_DOWN" mask="SHIFT" command="move_backward_sitting"/>
+ <binding key="PAD_PGUP" mask="SHIFT" command="spin_over_sitting"/>
+ <binding key="PAD_PGDN" mask="SHIFT" command="spin_under_sitting"/>
<binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/>
<binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 1023a553f8..96e77410c3 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -1005,11 +1005,11 @@ bool LLAppViewer::init()
gGLManager.printGLInfoString();
// Load User's bindings
- std::string key_bindings_file = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "keys.xml");
+ std::string key_bindings_file = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "key_bindings.xml");
if (!gDirUtilp->fileExists(key_bindings_file) || !gViewerInput.loadBindingsXML(key_bindings_file))
{
// Failed to load custom bindings, try default ones
- key_bindings_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "keys.xml");
+ key_bindings_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "key_bindings.xml");
if (!gViewerInput.loadBindingsXML(key_bindings_file))
{
LL_ERRS("InitInfo") << "Unable to open default key bindings from" << key_bindings_file << LL_ENDL;
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 6ee1bbee1a..61fd13f219 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -2926,7 +2926,7 @@ void LLPanelPreferenceControls::onListCommit()
{
mEditingControl = control;
mEditingColumn = cell_ind;
- dialog->setParent(this, DEFAULT_KEY_FILTER);
+ dialog->setParent(this, pControlsTable, DEFAULT_KEY_FILTER);
LLFloater* root_floater = gFloaterView->getParentFloater(this);
if (root_floater)
@@ -2946,6 +2946,14 @@ void LLPanelPreferenceControls::onModeCommit()
regenerateControls();
}
+void LLPanelPreferenceControls::onRestoreDefaults()
+{
+ for (U32 i = 0; i < LLKeyConflictHandler::MODE_COUNT - 1; ++i)
+ {
+ mConflictHandler[mEditingMode].resetToDefaults();
+ }
+}
+
// todo: copy onSetKeyBind to interface and inherit from interface
bool LLPanelPreferenceControls::onSetKeyBind(EMouseClickType click, KEY key, MASK mask, bool ignore_mask)
{
@@ -2956,21 +2964,13 @@ bool LLPanelPreferenceControls::onSetKeyBind(EMouseClickType click, KEY key, MAS
if ( mEditingColumn > 0)
{
- mConflictHandler[mEditingMode].registerControl(mEditingControl, mEditingColumn - 1, click, key, mask, ignore_mask);
+ mConflictHandler[mEditingMode].registerControl(mEditingControl, mEditingColumn - 1, click, key, mask, true);
}
updateTable();
return true;
}
-void LLPanelPreferenceControls::onRestoreDefaults()
-{
- for (U32 i = 0; i < LLKeyConflictHandler::MODE_COUNT - 1; ++i)
- {
- mConflictHandler[mEditingMode].resetToDefaults();
- }
-}
-
void LLPanelPreferenceControls::onDefaultKeyBind()
{
if (!mConflictHandler[mEditingMode].canAssignControl(mEditingControl))
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 9734ea30a2..bc19564bf6 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -291,7 +291,7 @@ class LLPanelPreferenceControls : public LLPanelPreference, public LLKeyBindResp
LOG_CLASS(LLPanelPreferenceControls);
public:
LLPanelPreferenceControls();
- ~LLPanelPreferenceControls();
+ virtual ~LLPanelPreferenceControls();
BOOL postBuild();
@@ -302,10 +302,10 @@ public:
void onListCommit();
void onModeCommit();
- bool onSetKeyBind(EMouseClickType click, KEY key, MASK mask, bool ignore_mask);
void onRestoreDefaults();
- void onDefaultKeyBind();
- void onCancelKeyBind();
+ /*virtual*/ bool onSetKeyBind(EMouseClickType click, KEY key, MASK mask, bool ignore_mask);
+ /*virtual*/ void onDefaultKeyBind();
+ /*virtual*/ void onCancelKeyBind();
private:
void regenerateControls();
diff --git a/indra/newview/llkeyconflict.cpp b/indra/newview/llkeyconflict.cpp
index bad4e4a2d8..0b9aaea478 100644
--- a/indra/newview/llkeyconflict.cpp
+++ b/indra/newview/llkeyconflict.cpp
@@ -243,10 +243,6 @@ std::string LLKeyConflictHandler::getStringFromKeyData(const LLKeyData& keydata)
{
result = LLKeyboard::stringFromAccelerator(keydata.mMask);
}
- else if (keydata.mIgnoreMasks)
- {
- result = "acc+";
- }
result += string_from_mouse(keydata.mMouse);
@@ -283,7 +279,6 @@ void LLKeyConflictHandler::loadFromSettings(const LLViewerInput::KeyMode& keymod
KEY key;
MASK mask;
EMouseClickType mouse = it->mouse.isProvided() ? mouse_from_string(it->mouse) : CLICK_NONE;
- bool ignore = it->ignore.isProvided() ? it->ignore.getValue() : false;
if (it->key.getValue().empty())
{
key = KEY_NONE;
@@ -297,7 +292,7 @@ void LLKeyConflictHandler::loadFromSettings(const LLViewerInput::KeyMode& keymod
// might not know all the commands, so UI will have to know what to fill by its own
LLKeyConflict &type_data = (*destination)[it->command];
type_data.mAssignable = true;
- type_data.mKeyBind.addKeyData(mouse, key, mask, ignore);
+ type_data.mKeyBind.addKeyData(mouse, key, mask, true);
}
}
@@ -380,7 +375,7 @@ void LLKeyConflictHandler::loadFromSettings(ESourceMode load_mode)
else
{
// load defaults
- std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "keys.xml");
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "key_bindings.xml");
if (!loadFromSettings(load_mode, filename, &mDefaultsMap))
{
LL_WARNS() << "Failed to load default settings, aborting" << LL_ENDL;
@@ -388,7 +383,7 @@ void LLKeyConflictHandler::loadFromSettings(ESourceMode load_mode)
}
// load user's
- filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "keys.xml");
+ filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "key_bindings.xml");
if (!gDirUtilp->fileExists(filename) || loadFromSettings(load_mode, filename, &mControlsMap))
{
// mind placeholders
@@ -440,7 +435,7 @@ void LLKeyConflictHandler::saveToSettings()
else
{
// loaded full copy of original file
- std::string filename = gDirUtilp->findFile("keys.xml",
+ std::string filename = gDirUtilp->findFile("key_bindings.xml",
gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, ""),
gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
@@ -494,7 +489,6 @@ void LLKeyConflictHandler::saveToSettings()
}
binding.mask = string_from_mask(data.mMask);
binding.mouse.set(string_from_mouse(data.mMouse), true); //set() because 'optional', for compatibility purposes
- binding.ignore.set(data.mIgnoreMasks, true);
binding.command = iter->first;
mode.bindings.add(binding);
}
@@ -537,7 +531,7 @@ void LLKeyConflictHandler::saveToSettings()
}
// write back to user's xml;
- std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "keys.xml");
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "key_bindings.xml");
LLXMLNodePtr output_node = new LLXMLNode("keys", false);
LLXUIParser parser;
@@ -708,7 +702,7 @@ void LLKeyConflictHandler::clear()
void LLKeyConflictHandler::resetKeyboardBindings()
{
- std::string filename = gDirUtilp->findFile("keys.xml",
+ std::string filename = gDirUtilp->findFile("key_bindings.xml",
gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, ""),
gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
diff --git a/indra/newview/llpanelpresetspulldown.cpp b/indra/newview/llpanelpresetspulldown.cpp
index 1a49cbc250..0ca4a83779 100644
--- a/indra/newview/llpanelpresetspulldown.cpp
+++ b/indra/newview/llpanelpresetspulldown.cpp
@@ -33,6 +33,7 @@
#include "llbutton.h"
#include "lltabcontainer.h"
+#include "llfloater.h"
#include "llfloaterreg.h"
#include "llpresetsmanager.h"
#include "llsliderctrl.h"
diff --git a/indra/newview/llsetkeybinddialog.cpp b/indra/newview/llsetkeybinddialog.cpp
index 0ad71cb372..320f1f297d 100644
--- a/indra/newview/llsetkeybinddialog.cpp
+++ b/indra/newview/llsetkeybinddialog.cpp
@@ -34,6 +34,7 @@
#include "llcheckboxctrl.h"
#include "lleventtimer.h"
#include "llfocusmgr.h"
+#include "llkeyconflict.h"
class LLSetKeyBindDialog::Updater : public LLEventTimer
{
@@ -85,6 +86,7 @@ BOOL LLSetKeyBindDialog::postBuild()
getChild<LLUICtrl>("Cancel")->setFocus(TRUE);
pCheckBox = getChild<LLCheckBoxCtrl>("ignore_masks");
+ pDesription = getChild<LLTextBase>("descritption");
gFocusMgr.setKeystrokesOnly(TRUE);
@@ -116,14 +118,12 @@ void LLSetKeyBindDialog::draw()
LLModalDialog::draw();
}
-void LLSetKeyBindDialog::setParent(LLPanelPreferenceControls* parent, U32 key_mask)
+void LLSetKeyBindDialog::setParent(LLKeyBindResponderInterface* parent, LLView* frustum_origin, U32 key_mask)
{
pParent = parent;
- setFrustumOrigin(parent);
+ setFrustumOrigin(frustum_origin);
mKeyFilterMask = key_mask;
- LLTextBase *text_ctrl = getChild<LLTextBase>("descritption");
-
std::string input;
if ((key_mask & ALLOW_MOUSE) != 0)
{
@@ -137,7 +137,8 @@ void LLSetKeyBindDialog::setParent(LLPanelPreferenceControls* parent, U32 key_ma
}
input += getString("keyboard");
}
- text_ctrl->setTextArg("[INPUT]", input);
+ pDesription->setText(getString("basic_description"));
+ pDesription->setTextArg("[INPUT]", input);
bool can_ignore_masks = (key_mask & CAN_IGNORE_MASKS) != 0;
pCheckBox->setVisible(can_ignore_masks);
@@ -185,6 +186,13 @@ BOOL LLSetKeyBindDialog::handleKeyHere(KEY key, MASK mask)
return FALSE;
}
+ if (LLKeyConflictHandler::isReservedByMenu(key, mask))
+ {
+ pDesription->setText(getString("reserved_by_menu"));
+ pDesription->setTextArg("[KEYSTR]", LLKeyboard::stringFromAccelerator(mask,key));
+ return TRUE;
+ }
+
setKeyBind(CLICK_NONE, key, mask, pCheckBox->getValue().asBoolean());
closeFloater();
return TRUE;
diff --git a/indra/newview/llsetkeybinddialog.h b/indra/newview/llsetkeybinddialog.h
index fb3b2a2269..8faa2cc363 100644
--- a/indra/newview/llsetkeybinddialog.h
+++ b/indra/newview/llsetkeybinddialog.h
@@ -32,6 +32,7 @@
#include "lldrawfrustum.h"
class LLCheckBoxCtrl;
+class LLTextBase;
// Filters for LLSetKeyBindDialog
static const U32 ALLOW_MOUSE = 1;
@@ -40,18 +41,18 @@ static const U32 ALLOW_KEYS = 4; //keyboard
static const U32 ALLOW_MASK_KEYS = 8;
static const U32 ALLOW_MASKS = 16;
static const U32 CAN_IGNORE_MASKS = 32; // For example W (aka Forward) should work regardless of SHIFT being pressed
-static const U32 DEFAULT_KEY_FILTER = ALLOW_MOUSE | ALLOW_MASK_MOUSE | ALLOW_KEYS | ALLOW_MASK_KEYS | CAN_IGNORE_MASKS;
+static const U32 DEFAULT_KEY_FILTER = ALLOW_MOUSE | ALLOW_MASK_MOUSE | ALLOW_KEYS | ALLOW_MASK_KEYS;
class LLKeyBindResponderInterface
{
public:
- virtual ~LLKeyBindResponderInterface();
+ virtual ~LLKeyBindResponderInterface() {};
- virtual void onCancelKeyBind();
- virtual void onDefaultKeyBind();
+ virtual void onCancelKeyBind() = 0;
+ virtual void onDefaultKeyBind() = 0;
// returns true if parent failed to set key due to key being in use
- virtual bool onSetKeyBind(EMouseClickType click, KEY key, MASK mask, bool ignore);
+ virtual bool onSetKeyBind(EMouseClickType click, KEY key, MASK mask, bool ignore) = 0;
};
class LLSetKeyBindDialog : public LLModalDialog, public LLDrawFrustum
@@ -64,7 +65,7 @@ public:
/*virtual*/ void onClose(bool app_quiting);
/*virtual*/ void draw();
- void setParent(LLKeyBindResponderInterface* parent, U32 key_mask = DEFAULT_KEY_FILTER);
+ void setParent(LLKeyBindResponderInterface* parent, LLView* frustum_origin, U32 key_mask = DEFAULT_KEY_FILTER);
BOOL handleKeyHere(KEY key, MASK mask);
BOOL handleAnyMouseClick(S32 x, S32 y, MASK mask, EMouseClickType clicktype, BOOL down);
@@ -77,8 +78,9 @@ public:
private:
void setKeyBind(EMouseClickType click, KEY key, MASK mask, bool ignore);
- LLKeyBindResponderInterface* pParent;
- LLCheckBoxCtrl* pCheckBox;
+ LLKeyBindResponderInterface *pParent;
+ LLCheckBoxCtrl *pCheckBox;
+ LLTextBase *pDesription;
U32 mKeyFilterMask;
Updater *pUpdater;
diff --git a/indra/newview/llviewerinput.cpp b/indra/newview/llviewerinput.cpp
index eff578cf26..95c26cdde2 100644
--- a/indra/newview/llviewerinput.cpp
+++ b/indra/newview/llviewerinput.cpp
@@ -1005,7 +1005,7 @@ BOOL LLViewerInput::handleKeyUp(KEY translated_key, MASK translated_mask)
return gViewerWindow->handleKeyUp(translated_key, translated_mask);
}
-BOOL LLViewerInput::bindKey(const S32 mode, const KEY key, const MASK mask, const bool ignore, const std::string& function_name)
+BOOL LLViewerInput::bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name)
{
S32 index;
typedef boost::function<bool(EKeystate)> function_t;
@@ -1046,57 +1046,30 @@ BOOL LLViewerInput::bindKey(const S32 mode, const KEY key, const MASK mask, cons
}
// check for duplicate first and overwrite
- if (ignore)
+ S32 size = mKeyBindings[mode].size();
+ for (index = 0; index < size; index++)
{
- for (index = 0; index < mKeyIgnoreMaskCount[mode]; index++)
- {
- if (key == mKeyIgnoreMask[mode][index].mKey)
- break;
- }
- }
- else
- {
- for (index = 0; index < mKeyBindingCount[mode]; index++)
- {
- if (key == mKeyBindings[mode][index].mKey && mask == mKeyBindings[mode][index].mMask)
- break;
- }
+ if (key == mKeyBindings[mode][index].mKey && mask == mKeyBindings[mode][index].mMask)
+ break;
}
- if (index >= MAX_KEY_BINDINGS)
- {
- LL_ERRS() << "LLKeyboard::bindKey() - too many keys for mode " << mode << LL_ENDL;
- return FALSE;
- }
-
if (mode >= MODE_COUNT)
{
LL_ERRS() << "LLKeyboard::bindKey() - unknown mode passed" << mode << LL_ENDL;
return FALSE;
}
- if (ignore)
- {
- mKeyIgnoreMask[mode][index].mKey = key;
- mKeyIgnoreMask[mode][index].mFunction = function;
-
- if (index == mKeyIgnoreMaskCount[mode])
- mKeyIgnoreMaskCount[mode]++;
- }
- else
- {
- mKeyBindings[mode][index].mKey = key;
- mKeyBindings[mode][index].mMask = mask;
- mKeyBindings[mode][index].mFunction = function;
+ LLKeyboardBinding bind;
+ bind.mKey = key;
+ bind.mMask = mask;
+ bind.mFunction = function;
- if (index == mKeyBindingCount[mode])
- mKeyBindingCount[mode]++;
- }
+ mKeyBindings[mode].push_back(bind);
return TRUE;
}
-BOOL LLViewerInput::bindMouse(const S32 mode, const EMouseClickType mouse, const MASK mask, const bool ignore, const std::string& function_name)
+BOOL LLViewerInput::bindMouse(const S32 mode, const EMouseClickType mouse, const MASK mask, const std::string& function_name)
{
S32 index;
typedef boost::function<bool(EKeystate)> function_t;
@@ -1115,27 +1088,11 @@ BOOL LLViewerInput::bindMouse(const S32 mode, const EMouseClickType mouse, const
}
// check for duplicate first and overwrite
- if (ignore)
- {
- for (index = 0; index < mMouseIgnoreMaskCount[mode]; index++)
- {
- if (mouse == mMouseIgnoreMask[mode][index].mMouse)
- break;
- }
- }
- else
- {
- for (index = 0; index < mMouseBindingCount[mode]; index++)
- {
- if (mouse == mMouseBindings[mode][index].mMouse && mask == mMouseBindings[mode][index].mMask)
- break;
- }
- }
-
- if (index >= MAX_KEY_BINDINGS)
+ S32 size = mMouseBindings[mode].size();
+ for (index = 0; index < size; index++)
{
- LL_ERRS() << "LLKeyboard::bindKey() - too many keys for mode " << mode << LL_ENDL;
- return FALSE;
+ if (mouse == mMouseBindings[mode][index].mMouse && mask == mMouseBindings[mode][index].mMask)
+ break;
}
if (mode >= MODE_COUNT)
@@ -1144,23 +1101,12 @@ BOOL LLViewerInput::bindMouse(const S32 mode, const EMouseClickType mouse, const
return FALSE;
}
- if (ignore)
- {
- mMouseIgnoreMask[mode][index].mMouse = mouse;
- mMouseIgnoreMask[mode][index].mFunction = function;
-
- if (index == mMouseIgnoreMaskCount[mode])
- mMouseIgnoreMaskCount[mode]++;
- }
- else
- {
- mMouseBindings[mode][index].mMouse = mouse;
- mMouseBindings[mode][index].mMask = mask;
- mMouseBindings[mode][index].mFunction = function;
+ LLMouseBinding bind;
+ bind.mMouse = mouse;
+ bind.mMask = mask;
+ bind.mFunction = function;
- if (index == mMouseBindingCount[mode])
- mMouseBindingCount[mode]++;
- }
+ mMouseBindings[mode].push_back(bind);
return TRUE;
}
@@ -1169,8 +1115,7 @@ LLViewerInput::KeyBinding::KeyBinding()
: key("key"),
mouse("mouse"),
mask("mask"),
- command("command"),
- ignore("ignore", false)
+ command("command")
{}
LLViewerInput::KeyMode::KeyMode()
@@ -1189,10 +1134,8 @@ void LLViewerInput::resetBindings()
{
for (S32 i = 0; i < MODE_COUNT; i++)
{
- mKeyBindingCount[i] = 0;
- mKeyIgnoreMaskCount[i] = 0;
- mMouseBindingCount[i] = 0;
- mMouseIgnoreMaskCount[i] = 0;
+ mKeyBindings[i].clear();
+ mMouseBindings[i].clear();
}
}
@@ -1216,6 +1159,34 @@ S32 LLViewerInput::loadBindingsXML(const std::string& filename)
return binding_count;
}
+S32 count_masks(const MASK &mask)
+{
+ S32 res = 0;
+ if (mask & MASK_CONTROL)
+ {
+ res++;
+ }
+ if (mask & MASK_SHIFT)
+ {
+ res++;
+ }
+ if (mask & MASK_ALT)
+ {
+ res++;
+ }
+ return res;
+}
+
+bool compare_key_by_mask(LLKeyboardBinding i1, LLKeyboardBinding i2)
+{
+ return (count_masks(i1.mMask) > count_masks(i2.mMask));
+}
+
+bool compare_mouse_by_mask(LLMouseBinding i1, LLMouseBinding i2)
+{
+ return (count_masks(i1.mMask) > count_masks(i2.mMask));
+}
+
S32 LLViewerInput::loadBindingMode(const LLViewerInput::KeyMode& keymode, S32 mode)
{
S32 binding_count = 0;
@@ -1232,9 +1203,8 @@ S32 LLViewerInput::loadBindingMode(const LLViewerInput::KeyMode& keymode, S32 mo
if (key != KEY_NONE)
{
MASK mask;
- bool ignore = it->ignore.isProvided() ? it->ignore.getValue() : false;
LLKeyboard::maskFromString(it->mask, &mask);
- bindKey(mode, key, mask, ignore, it->command);
+ bindKey(mode, key, mask, it->command);
processed = true;
}
else
@@ -1249,9 +1219,8 @@ S32 LLViewerInput::loadBindingMode(const LLViewerInput::KeyMode& keymode, S32 mo
if (mouse != CLICK_NONE)
{
MASK mask;
- bool ignore = it->ignore.isProvided() ? it->ignore.getValue() : false;
LLKeyboard::maskFromString(it->mask, &mask);
- bindMouse(mode, mouse, mask, ignore, it->command);
+ bindMouse(mode, mouse, mask, it->command);
processed = true;
}
else
@@ -1264,7 +1233,11 @@ S32 LLViewerInput::loadBindingMode(const LLViewerInput::KeyMode& keymode, S32 mo
// total
binding_count++;
}
- }
+ }
+
+ // sort lists by mask (so that Shift+W is executed before W, if both are assigned, but if Shift+W is not assigned W should be executed)
+ std::sort(mKeyBindings[mode].begin(), mKeyBindings[mode].end(), compare_key_by_mask);
+ std::sort(mMouseBindings[mode].begin(), mMouseBindings[mode].end(), compare_mouse_by_mask);
return binding_count;
}
@@ -1289,7 +1262,7 @@ EKeyboardMode LLViewerInput::getMode() const
}
}
-bool LLViewerInput::scanKey(const LLKeyboardBinding* binding,
+bool LLViewerInput::scanKey(const std::vector<LLKeyboardBinding> &binding,
S32 binding_count,
KEY key,
MASK mask,
@@ -1302,7 +1275,7 @@ bool LLViewerInput::scanKey(const LLKeyboardBinding* binding,
{
if (binding[i].mKey == key)
{
- if (binding[i].mMask == mask)
+ if ((binding[i].mMask & mask) == binding[i].mMask)
{
bool res = false;
if (key_down && !repeat)
@@ -1350,12 +1323,7 @@ bool LLViewerInput::scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level)
// don't process key down on repeated keys
BOOL repeat = gKeyboard->getKeyRepeated(key);
- bool res = scanKey(mKeyBindings[mode], mKeyBindingCount[mode], key, mask, key_down, key_up, key_level, repeat);
- if (!res)
- {
- // Nothing found, try ignore list
- res = scanKey(mKeyIgnoreMask[mode], mKeyIgnoreMaskCount[mode], key, MASK_NONE, key_down, key_up, key_level, repeat);
- }
+ bool res = scanKey(mKeyBindings[mode], mKeyBindings[mode].size(), key, mask, key_down, key_up, key_level, repeat);
if (!res && agent_control_lbutton.canHandle(CLICK_NONE, key, mask))
{
@@ -1443,11 +1411,11 @@ BOOL LLViewerInput::handleMouse(LLWindow *window_impl, LLCoordGL pos, MASK mask,
return handled;
}
-bool LLViewerInput::scanMouse(const LLMouseBinding *binding, S32 binding_count, EMouseClickType mouse, MASK mask, EMouseState state) const
+bool LLViewerInput::scanMouse(const std::vector<LLMouseBinding> &binding, S32 binding_count, EMouseClickType mouse, MASK mask, EMouseState state) const
{
for (S32 i = 0; i < binding_count; i++)
{
- if (binding[i].mMouse == mouse && binding[i].mMask == mask)
+ if (binding[i].mMouse == mouse && (binding[i].mMask & mask) == binding[i].mMask)
{
bool res = false;
switch (state)
@@ -1484,11 +1452,7 @@ bool LLViewerInput::scanMouse(EMouseClickType click, EMouseState state) const
bool res = false;
S32 mode = getMode();
MASK mask = gKeyboard->currentMask(TRUE);
- res = scanMouse(mMouseBindings[mode], mMouseBindingCount[mode], click, mask, state);
- if (!res)
- {
- res = scanMouse(mMouseIgnoreMask[mode], mMouseIgnoreMaskCount[mode], click, MASK_NONE, state);
- }
+ res = scanMouse(mMouseBindings[mode], mMouseBindings[mode].size(), click, mask, state);
// no user defined actions found or those actions can't handle the key/button, handle control if nessesary
if (!res && agent_control_lbutton.canHandle(click, KEY_NONE, mask))
{
diff --git a/indra/newview/llviewerinput.h b/indra/newview/llviewerinput.h
index d18a61eaf0..b7124a54b2 100644
--- a/indra/newview/llviewerinput.h
+++ b/indra/newview/llviewerinput.h
@@ -30,7 +30,6 @@
#include "llkeyboard.h" // For EKeystate
#include "llinitparam.h"
-const S32 MAX_NAMED_FUNCTIONS = 100;
const S32 MAX_KEY_BINDINGS = 128; // was 60
class LLNamedFunction
@@ -48,7 +47,6 @@ class LLKeyboardBinding
public:
KEY mKey;
MASK mMask;
- bool mIgnoreMask; // whether CTRL/ALT/SHIFT should be checked
LLKeyFunc mFunction;
};
@@ -58,7 +56,6 @@ class LLMouseBinding
public:
EMouseClickType mMouse;
MASK mMask;
- bool mIgnoreMask; // whether CTRL/ALT/SHIFT should be checked
LLKeyFunc mFunction;
};
@@ -86,8 +83,7 @@ public:
Mandatory<std::string> key,
mask,
command;
- Optional<std::string> mouse; // Note, not mandatory for the sake of backward campatibility
- Optional<bool> ignore;
+ Optional<std::string> mouse; // Note, not mandatory for the sake of backward campatibility with keys.xml
KeyBinding();
};
@@ -131,7 +127,7 @@ public:
void scanMouse();
private:
- bool scanKey(const LLKeyboardBinding* binding,
+ bool scanKey(const std::vector<LLKeyboardBinding> &binding,
S32 binding_count,
KEY key,
MASK mask,
@@ -149,34 +145,24 @@ private:
MOUSE_STATE_SILENT // notified about 'up', do not notify again
};
bool scanMouse(EMouseClickType click, EMouseState state) const;
- bool scanMouse(const LLMouseBinding *binding,
+ bool scanMouse(const std::vector<LLMouseBinding> &binding,
S32 binding_count,
EMouseClickType mouse,
MASK mask,
EMouseState state) const;
S32 loadBindingMode(const LLViewerInput::KeyMode& keymode, S32 mode);
- BOOL bindKey(const S32 mode, const KEY key, const MASK mask, const bool ignore, const std::string& function_name);
- BOOL bindMouse(const S32 mode, const EMouseClickType mouse, const MASK mask, const bool ignore, const std::string& function_name);
+ BOOL bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name);
+ BOOL bindMouse(const S32 mode, const EMouseClickType mouse, const MASK mask, const std::string& function_name);
void resetBindings();
// Hold all the ugly stuff torn out to make LLKeyboard non-viewer-specific here
- // We process specific keys first, then keys that should ignore mask.
- // This way with W+ignore defined to 'forward' and with ctrl+W tied to camera,
- // pressing undefined Shift+W will do 'forward', yet ctrl+W will do 'camera forward'
- // With A defined to 'turn', shift+A defined to strafe, pressing Shift+W+A will do strafe+forward
// TODO: at some point it is better to remake this, especially keyaboard part
// would be much better to send to functions actual state of the button than
// to send what we think function wants based on collection of bools (mKeyRepeated, mKeyLevel, mKeyDown)
- S32 mKeyBindingCount[MODE_COUNT];
- S32 mKeyIgnoreMaskCount[MODE_COUNT];
- S32 mMouseBindingCount[MODE_COUNT];
- S32 mMouseIgnoreMaskCount[MODE_COUNT];
- LLKeyboardBinding mKeyBindings[MODE_COUNT][MAX_KEY_BINDINGS];
- LLKeyboardBinding mKeyIgnoreMask[MODE_COUNT][MAX_KEY_BINDINGS];
- LLMouseBinding mMouseBindings[MODE_COUNT][MAX_KEY_BINDINGS];
- LLMouseBinding mMouseIgnoreMask[MODE_COUNT][MAX_KEY_BINDINGS];
+ std::vector<LLKeyboardBinding> mKeyBindings[MODE_COUNT];
+ std::vector<LLMouseBinding> mMouseBindings[MODE_COUNT];
typedef std::map<U32, U32> key_remap_t;
key_remap_t mRemapKeys[MODE_COUNT];
diff --git a/indra/newview/skins/default/xui/en/control_table_contents.xml b/indra/newview/skins/default/xui/en/control_table_contents.xml
index 00c2d27124..7d4b9be894 100644
--- a/indra/newview/skins/default/xui/en/control_table_contents.xml
+++ b/indra/newview/skins/default/xui/en/control_table_contents.xml
@@ -20,7 +20,7 @@
enabled="false"
value="">
<columns
- cell_type="icontext"
+ type="icontext"
column="lst_action"
font="SansSerif"
halign="left"
@@ -195,7 +195,7 @@
<rows
enabled="false">
<columns
- cell_type="icon"
+ type="icon"
color="0 0 0 0.7"
halign="center"
value="menu_separator" />
@@ -204,7 +204,7 @@
enabled="false"
value="">
<columns
- cell_type="icontext"
+ type="icontext"
column="lst_action"
font="SansSerif"
halign="left"
@@ -417,7 +417,7 @@
<rows
enabled="false">
<columns
- cell_type="icon"
+ type="icon"
color="0 0 0 0.7"
halign="center"
value="menu_separator" />
@@ -426,7 +426,7 @@
enabled="false"
value="">
<columns
- cell_type="icontext"
+ type="icontext"
column="lst_action"
font="SansSerif"
halign="left"
@@ -495,7 +495,7 @@
<rows
enabled="false">
<columns
- cell_type="icon"
+ type="icon"
color="0 0 0 0.7"
halign="center"
value="menu_separator" />
@@ -504,7 +504,7 @@
enabled="false"
value="">
<columns
- cell_type="icontext"
+ type="icontext"
column="lst_action"
font="SansSerif"
halign="left"
diff --git a/indra/newview/skins/default/xui/en/floater_select_key.xml b/indra/newview/skins/default/xui/en/floater_select_key.xml
index 32f091938e..255de60d00 100644
--- a/indra/newview/skins/default/xui/en/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/en/floater_select_key.xml
@@ -16,6 +16,15 @@
name="mouse">
Mouse Buttons
</floater.string>
+ <floater.string
+ name="basic_description">
+Press a key to set your trigger.
+Allowed input: [INPUT].
+ </floater.string>
+ <floater.string
+ name="reserved_by_menu">
+Combination [KEYSTR] is reserved by menu.
+ </floater.string>
<text
type="string"
halign="center"
@@ -35,11 +44,11 @@ Allowed input: [INPUT].
follows="top|left"
height="20"
initial_value="false"
- label="Ignore accelerator keys"
+ label="Ignore extra accelerator keys"
layout="topleft"
- left="8"
+ left="28"
name="ignore_masks"
- tool_tip="Ignore Shift, Alt and Ctrl keys. Example: This allows to hold W (forward, ignores shift) and Shift+A (slide left) simultaneously and agent will both move forward and slide left."
+ tool_tip="Ignore extra Shift, Alt and Ctrl keys. Example: This allows to hold W (forward, ignores shift) and Shift+A (slide left) simultaneously and agent will both move forward and slide left."
top_pad="8"
width="160" />