SL-443 Keybindings: Backward compatibility #2

master
Andrey Kleshchev 2021-07-15 20:28:26 +03:00
parent 48921a6232
commit e7563ff13f
6 changed files with 30 additions and 46 deletions

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<keys version="1">
<keys xml_version="1">
<first_person>
<binding key="A" mask="NONE" command="slide_left"/>
<binding key="D" mask="NONE" command="slide_right"/>
@ -34,7 +34,7 @@
<binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/>
<binding key="" mask="NONE" mouse="LMB" command="sript_trigger_lbutton"/>
<binding key="" mask="NONE" mouse="LMB" command="script_trigger_lbutton"/>
</first_person>
<third_person>
<binding key="A" mask="NONE" command="turn_left"/>
@ -130,7 +130,7 @@
<binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/>
<binding key="" mask="NONE" mouse="LMB" command="walk_to"/>
<binding key="" mask="NONE" mouse="LMB" command="sript_trigger_lbutton"/>
<binding key="" mask="NONE" mouse="LMB" command="script_trigger_lbutton"/>
</third_person>
<sitting>
<binding key="A" mask="ALT" command="spin_around_cw"/>
@ -229,7 +229,7 @@
<binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/>
<binding key="" mask="NONE" mouse="LMB" command="sript_trigger_lbutton"/>
<binding key="" mask="NONE" mouse="LMB" command="script_trigger_lbutton"/>
</sitting>
<edit_avatar>
<!--Avatar editing camera controls-->
@ -258,6 +258,6 @@
<binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/>
<binding key="" mask="NONE" mouse="LMB" command="sript_trigger_lbutton"/>
<binding key="" mask="NONE" mouse="LMB" command="script_trigger_lbutton"/>
</edit_avatar>
</keys>

View File

@ -378,7 +378,7 @@ bool LLKeyConflictHandler::loadFromSettings(const ESourceMode &load_mode, const
}
// verify version
if (keys.version < 1)
if (keys.xml_version < 1)
{
// Updating from a version that was not aware of LMouse bindings.
// Assign defaults.
@ -389,7 +389,8 @@ bool LLKeyConflictHandler::loadFromSettings(const ESourceMode &load_mode, const
LLKeyData data(CLICK_LEFT, KEY_NONE, MASK_NONE, true);
type_data.mKeyBind.replaceKeyData(data, 0);
// Mark this mode for an update
// Mark this mode for an update, once user clicks 'OK' in preferences
// it should get saved
mHasUnsavedChanges = true;
}
}
@ -432,12 +433,6 @@ void LLKeyConflictHandler::loadFromSettings(ESourceMode load_mode)
}
}
mLoadMode = load_mode;
if (mHasUnsavedChanges)
{
// We ended up with some settings assigned due to changes in version, resave
saveToSettings(false);
}
}
void LLKeyConflictHandler::saveToSettings(bool temporary)
@ -597,6 +592,8 @@ void LLKeyConflictHandler::saveToSettings(bool temporary)
break;
}
keys.xml_version.set(keybindings_xml_version, true);
if (temporary)
{
// write to temporary xml and use it for gViewerInput
@ -821,9 +818,9 @@ void LLKeyConflictHandler::resetToDefault(const std::string &control_name)
resetToDefaultAndResolve(control_name, false);
}
void LLKeyConflictHandler::resetToDefaults(ESourceMode mode)
void LLKeyConflictHandler::resetToDefaultsAndResolve()
{
if (mode == MODE_SAVED_SETTINGS)
if (mLoadMode == MODE_SAVED_SETTINGS)
{
control_map_t::iterator iter = mControlsMap.begin();
control_map_t::iterator end = mControlsMap.end();
@ -836,7 +833,7 @@ void LLKeyConflictHandler::resetToDefaults(ESourceMode mode)
else
{
mControlsMap.clear();
generatePlaceholders(mode);
generatePlaceholders(mLoadMode);
mControlsMap.insert(mDefaultsMap.begin(), mDefaultsMap.end());
}
@ -847,7 +844,7 @@ void LLKeyConflictHandler::resetToDefaults()
{
if (!empty())
{
resetToDefaults(mLoadMode);
resetToDefaultsAndResolve();
}
else
{
@ -857,7 +854,7 @@ void LLKeyConflictHandler::resetToDefaults()
// 3. We are loading 'current' only to replace it
// but it is reliable and works Todo: consider optimizing.
loadFromSettings(mLoadMode);
resetToDefaults(mLoadMode);
resetToDefaultsAndResolve();
}
}
@ -890,7 +887,7 @@ void LLKeyConflictHandler::resetKeyboardBindings()
void LLKeyConflictHandler::generatePlaceholders(ESourceMode load_mode)
{
// These placeholds are meant to cause conflict resolution when user tries to assign same control somewhere else
// These placeholders are meant to cause conflict resolution when user tries to assign same control somewhere else
// also this can be used to pre-record controls that should not conflict or to assign conflict groups/masks
if (load_mode == MODE_FIRST_PERSON)
@ -1005,18 +1002,6 @@ bool LLKeyConflictHandler::removeConflicts(const LLKeyData &data, U32 conlict_ma
S32 index = cntrl_iter->second.mKeyBind.findKeyData(data);
if (index >= 0)
{
if (cmp_mask != U32_MAX)
{
const LLKeyData cmp_data = cntrl_iter->second.mKeyBind.getKeyData(index);
if ((cmp_mask & CONFLICT_LMOUSE) == 0
&& cmp_data.mMouse == CLICK_LEFT
&& cmp_data.mMask == MASK_NONE
&& cmp_data.mKey == KEY_NONE)
{
// Does not conflict
continue;
}
}
if (cntrl_iter->second.mAssignable)
{
// Potentially we can have multiple conflict flags conflicting

View File

@ -138,11 +138,11 @@ public:
bool hasUnsavedChanges() const { return mHasUnsavedChanges; }
void setLoadMode(ESourceMode mode) { mLoadMode = mode; }
ESourceMode getLoadMode() { return mLoadMode; }
ESourceMode getLoadMode() const { return mLoadMode; }
private:
void resetToDefaultAndResolve(const std::string &control_name, bool ignore_conflicts);
void resetToDefaults(ESourceMode mode);
void resetToDefaultsAndResolve();
// at the moment these kind of control is not savable, but takes part in conflict resolution
void registerTemporaryControl(const std::string &control_name, EMouseClickType mouse_ind, KEY key, MASK mask, U32 conflict_mask);

View File

@ -836,7 +836,7 @@ bool voice_follow_key(EKeystate s)
return false;
}
bool sript_trigger_lbutton(EKeystate s)
bool script_trigger_lbutton(EKeystate s)
{
// Check for script overriding/expecting left mouse button.
// Note that this does not pass event further and depends onto mouselook.
@ -848,8 +848,6 @@ bool sript_trigger_lbutton(EKeystate s)
switch (s)
{
case KEYSTATE_DOWN:
// at the moment sript_trigger_lbutton is only intended for mouselook
// but handling other modes just in case
if (mouselook)
{
gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN);
@ -947,7 +945,7 @@ REGISTER_KEYBOARD_ACTION("teleport_to", teleport_to);
REGISTER_KEYBOARD_ACTION("walk_to", walk_to);
REGISTER_KEYBOARD_ACTION("toggle_voice", toggle_voice);
REGISTER_KEYBOARD_ACTION("voice_follow_key", voice_follow_key);
REGISTER_KEYBOARD_ACTION(script_mouse_handler_name, sript_trigger_lbutton);
REGISTER_KEYBOARD_ACTION(script_mouse_handler_name, script_trigger_lbutton);
#undef REGISTER_KEYBOARD_ACTION
LLViewerInput::LLViewerInput()
@ -1213,7 +1211,7 @@ LLViewerInput::Keys::Keys()
third_person("third_person"),
sitting("sitting"),
edit_avatar("edit_avatar"),
version("version", 0)
xml_version("xml_version", 0)
{}
void LLViewerInput::resetBindings()
@ -1243,7 +1241,7 @@ S32 LLViewerInput::loadBindingsXML(const std::string& filename)
binding_count += loadBindingMode(keys.edit_avatar, MODE_EDIT_AVATAR);
// verify version
if (keys.version < 1)
if (keys.xml_version < 1)
{
// updating from a version that was not aware of LMouse bindings
for (S32 i = 0; i < MODE_COUNT; i++)
@ -1602,7 +1600,7 @@ void LLViewerInput::scanMouse()
}
}
bool LLViewerInput::isMouseBindUsed(const EMouseClickType mouse, const MASK mask, const S32 mode)
bool LLViewerInput::isMouseBindUsed(const EMouseClickType mouse, const MASK mask, const S32 mode) const
{
S32 size = mMouseBindings[mode].size();
for (S32 index = 0; index < size; index++)

View File

@ -31,7 +31,8 @@
#include "llinitparam.h"
const S32 MAX_KEY_BINDINGS = 128; // was 60
const std::string script_mouse_handler_name = "sript_trigger_lbutton";
const S32 keybindings_xml_version = 1;
const std::string script_mouse_handler_name = "script_trigger_lbutton";
class LLNamedFunction
{
@ -101,7 +102,7 @@ public:
third_person,
sitting,
edit_avatar;
Optional<U32> version;
Optional<S32> xml_version; // 'xml', because 'version' appears to be reserved
Keys();
};
@ -125,8 +126,8 @@ public:
BOOL handleMouse(LLWindow *window_impl, LLCoordGL pos, MASK mask, EMouseClickType clicktype, BOOL down);
void scanMouse();
bool isMouseBindUsed(const EMouseClickType mouse, const MASK mask, const S32 mode);
bool isLMouseHandlingDefault(const S32 mode) { return mLMouseDefaultHandling[mode]; }
bool isMouseBindUsed(const EMouseClickType mouse, const MASK mask, const S32 mode) const;
bool isLMouseHandlingDefault(const S32 mode) const { return mLMouseDefaultHandling[mode]; }
private:
bool scanKey(const std::vector<LLKeyboardBinding> &binding,

View File

@ -74,8 +74,8 @@
value="Start Gesture" />
</rows>
<rows
name="sript_trigger_lbutton"
value="sript_trigger_lbutton">
name="script_trigger_lbutton"
value="script_trigger_lbutton">
<columns
column="lst_action"
font="SansSerif"