SL-6109 Conflict resolution

master
andreykproductengine 2019-09-26 22:28:18 +03:00 committed by Andrey Kleshchev
parent 4ae2165c45
commit 2532a2ee9e
19 changed files with 616 additions and 473 deletions

View File

@ -218,13 +218,17 @@ bool LLKeyBind::isEmpty() const
LLSD LLKeyBind::asLLSD() const
{
LLSD data;
for (data_vector_t::const_iterator iter = mData.begin(); iter != mData.end(); iter++)
S32 last = mData.size() - 1;
while (mData[last].empty())
{
if (!iter->isEmpty())
{
data.append(iter->asLLSD());
}
last--;
}
LLSD data;
for (S32 i = 0; i <= last; ++i)
{
// append even if empty to not affect visual representation
data.append(mData[i].asLLSD());
}
return data;
}
@ -280,6 +284,43 @@ bool LLKeyBind::hasKeyData(const LLKeyData& data) const
return hasKeyData(data.mMouse, data.mKey, data.mMask, data.mIgnoreMasks);
}
bool LLKeyBind::hasKeyData(U32 index) const
{
return mData.size() > index;
}
S32 LLKeyBind::findKeyData(EMouseClickType mouse, KEY key, MASK mask, bool ignore) const
{
if (mouse != CLICK_NONE || key != KEY_NONE)
{
for (S32 i = 0; i < mData.size(); ++i)
{
if (mData[i].mKey == key
&& mData[i].mMask == mask
&& mData[i].mMouse == mouse
&& mData[i].mIgnoreMasks == ignore)
{
return i;
}
}
}
return -1;
}
S32 LLKeyBind::findKeyData(const LLKeyData& data) const
{
return findKeyData(data.mMouse, data.mKey, data.mMask, data.mIgnoreMasks);
}
LLKeyData LLKeyBind::getKeyData(U32 index) const
{
if (mData.size() > index)
{
return mData[index];
}
return LLKeyData();
}
bool LLKeyBind::addKeyData(EMouseClickType mouse, KEY key, MASK mask, bool ignore)
{
if (!hasKeyData(mouse, key, mask, ignore))
@ -344,28 +385,29 @@ void LLKeyBind::replaceKeyData(const LLKeyData& data, U32 index)
}
}
}
if (mData.size() > index)
if (mData.size() <= index)
{
mData[index] = data;
}
else
{
mData.push_back(data);
mData.resize(index + 1);
}
mData[index] = data;
}
bool LLKeyBind::hasKeyData(U32 index) const
{
return mData.size() > index;
}
LLKeyData LLKeyBind::getKeyData(U32 index) const
void LLKeyBind::resetKeyData(S32 index)
{
if (mData.size() > index)
{
return mData[index];
mData[index].reset();
}
}
void LLKeyBind::trimEmpty()
{
S32 last = mData.size() - 1;
while (last >= 0 && mData[last].empty())
{
mData.erase(mData.begin() + last);
last--;
}
return LLKeyData();
}
U32 LLKeyBind::getDataCount()

View File

@ -74,17 +74,26 @@ public:
bool canHandleKey(KEY key, MASK mask) const;
bool canHandleMouse(EMouseClickType mouse, MASK mask) const;
bool LLKeyBind::hasKeyData(EMouseClickType mouse, KEY key, MASK mask, bool ignore) const;
bool LLKeyBind::hasKeyData(const LLKeyData& data) const;
// contains specified combination
bool hasKeyData(EMouseClickType mouse, KEY key, MASK mask, bool ignore) const;
bool hasKeyData(const LLKeyData& data) const;
bool hasKeyData(U32 index) const;
// index of contained LLKeyData
S32 findKeyData(EMouseClickType mouse, KEY key, MASK mask, bool ignore) const;
S32 findKeyData(const LLKeyData& data) const;
LLKeyData getKeyData(U32 index) const;
// these methods enshure there will be no repeats
bool addKeyData(EMouseClickType mouse, KEY key, MASK mask, bool ignore);
bool addKeyData(const LLKeyData& data);
void replaceKeyData(EMouseClickType mouse, KEY key, MASK mask, bool ignore, U32 index);
void replaceKeyData(const LLKeyData& data, U32 index);
bool hasKeyData(U32 index) const;
void clear() { mData.clear(); };
LLKeyData getKeyData(U32 index) const;
void resetKeyData(S32 index);
void clear() { mData.clear(); }
// if there any empty LLKeyData in the end of the array, remove them
void trimEmpty();
U32 getDataCount();
private:

View File

@ -196,7 +196,14 @@ LLScrollListText::LLScrollListText(const LLScrollListCell::Params& p)
void LLScrollListText::highlightText(S32 offset, S32 num_chars)
{
mHighlightOffset = offset;
mHighlightCount = num_chars;
mHighlightCount = llmax(0, num_chars);
}
//virtual
void LLScrollListText::setHighlighted(bool highlighted)
{
mHighlightOffset = 0;
mHighlightCount = highlighted ? -1 : 0;
}
//virtual
@ -296,6 +303,7 @@ void LLScrollListText::draw(const LLColor4& color, const LLColor4& highlight_col
if (mHighlightCount > 0)
{
// Highlight text
S32 left = 0;
switch(mFontAlignment)
{
@ -314,11 +322,15 @@ void LLScrollListText::draw(const LLColor4& color, const LLColor4& highlight_col
left + mFont->getWidth(mText.getString(), mHighlightOffset, mHighlightCount) + 1,
1);
mRoundedRectImage->draw(highlight_rect, highlight_color);
/*LLRect highlight_rect(left - 2,
mFont->getLineHeight() + 2,
left + getWidth() + 2,
1);
mRoundedRectImage->draw(highlight_rect, LLColor4::black);*/
}
else if (mHighlightCount < 0)
{
// Highlight whole cell
LLRect highlight_rect(0,
getHeight(),
getWidth() - 1,
-1);
gl_rect_2d(highlight_rect, LLColor4(0.38f, 0.694f, 0.573f, 0.35f));
}
// Try to draw the entire string

View File

@ -103,6 +103,7 @@ public:
virtual BOOL getVisible() const { return TRUE; }
virtual void setWidth(S32 width) { mWidth = width; }
virtual void highlightText(S32 offset, S32 num_chars) {}
virtual void setHighlighted(bool highlighted) {}
virtual BOOL isText() const { return FALSE; }
virtual BOOL needsToolTip() const { return ! mToolTip.empty(); }
virtual void setColor(const LLColor4&) {}
@ -140,6 +141,7 @@ public:
/*virtual*/ const LLSD getValue() const;
/*virtual*/ BOOL getVisible() const;
/*virtual*/ void highlightText(S32 offset, S32 num_chars);
/*virtual*/ void setHighlighted(bool highlighted);
/*virtual*/ void setColor(const LLColor4&);
/*virtual*/ BOOL isText() const;

View File

@ -8274,7 +8274,7 @@
<key>PushToTalkButton</key>
<map>
<key>Comment</key>
<string>Which button or keyboard key is used for push-to-talk</string>
<string>(Obsolete)Which button or keyboard key is used for push-to-talk</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>

View File

@ -1002,20 +1002,15 @@ bool LLAppViewer::init()
gGLManager.getGLInfo(gDebugInfo);
gGLManager.printGLInfoString();
// Load Default bindings
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))
// Load User's bindings
std::string key_bindings_file = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "keys.xml");
if (!gDirUtilp->fileExists(key_bindings_file) || !gViewerKeyboard.loadBindingsXML(key_bindings_file))
{
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))
// Failed to load custom bindings, try default ones
key_bindings_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "keys.xml");
if (!gViewerKeyboard.loadBindingsXML(key_bindings_file))
{
LL_ERRS("InitInfo") << "Unable to open keys.ini" << LL_ENDL;
LL_ERRS("InitInfo") << "Unable to open default key bindings from" << key_bindings_file << LL_ENDL;
}
}

View File

@ -222,7 +222,11 @@ BOOL LLSetKeyBindDialog::postBuild()
//virtual
void LLSetKeyBindDialog::onClose(bool app_quiting)
{
pParent = NULL;
if (pParent)
{
pParent->onCancelKeyBind();
pParent = NULL;
}
LLModalDialog::onClose(app_quiting);
}
@ -269,6 +273,7 @@ BOOL LLSetKeyBindDialog::handleKeyHere(KEY key, MASK mask)
if (pParent)
{
pParent->onSetKeyBind(CLICK_NONE, KEY_NONE, MASK_NONE, false);
pParent = NULL;
}
closeFloater();
return true;
@ -302,6 +307,7 @@ BOOL LLSetKeyBindDialog::handleKeyHere(KEY key, MASK mask)
if (pParent)
{
pParent->onSetKeyBind(CLICK_NONE, key, mask, pCheckBox->getValue().asBoolean());
pParent = NULL;
}
closeFloater();
return result;
@ -332,6 +338,7 @@ BOOL LLSetKeyBindDialog::handleAnyMouseClick(S32 x, S32 y, MASK mask, EMouseClic
if (pParent)
{
pParent->onSetKeyBind(clicktype, KEY_NONE, mask, pCheckBox->getValue().asBoolean());
pParent = NULL;
}
result = TRUE;
closeFloater();
@ -360,6 +367,7 @@ void LLSetKeyBindDialog::onBlank(void* user_data)
if (self->pParent)
{
self->pParent->onSetKeyBind(CLICK_NONE, KEY_NONE, MASK_NONE, false);
self->pParent = NULL;
}
self->closeFloater();
}
@ -372,6 +380,7 @@ void LLSetKeyBindDialog::onDefault(void* user_data)
if (self->pParent)
{
self->pParent->onDefaultKeyBind();
self->pParent = NULL;
}
self->closeFloater();
}
@ -2917,11 +2926,12 @@ LLPanelPreferenceControls::LLPanelPreferenceControls()
mEditingIndex(-1),
mEditingColumn(-1),
mEditingMode(0),
mShowKeyDialog(false)
mShowKeyDialog(false),
mHighlightedCell(NULL)
{
for (U32 i = 0; i < LLKeyConflictHandler::MODE_COUNT; ++i)
for (U32 i = 0; i < LLKeyConflictHandler::MODE_COUNT - 1; ++i)
{
mConflictHandler[i].setLoadMode((LLKeyConflictHandler::EModes)i);
mConflictHandler[i].setLoadMode((LLKeyConflictHandler::ESourceMode)i);
}
}
@ -2949,46 +2959,34 @@ BOOL LLPanelPreferenceControls::postBuild()
// Something of a workaround: cells don't handle clicks, so we catch a click, then process it on hover.
BOOL LLPanelPreferenceControls::handleHover(S32 x, S32 y, MASK mask)
{
/*S32 column = pControlsTable->getColumnIndexFromOffset(x);
LLScrollListItem* item = pControlsTable->hitItem(x, y);
static LLScrollListCell* last_cell = NULL;
if (item && column > 0)
{
LLScrollListCell* cell = item->getColumn(column);
if (cell)
{
cell->highlightText(0, CHAR_MAX);
if (last_cell != NULL && last_cell !=cell)
{
last_cell->highlightText(0, 0);
}
last_cell = cell;
}
}*/
if (mShowKeyDialog)
{
if (mEditingIndex > 0 && mConflictHandler[mEditingMode].canAssignControl((LLKeyConflictHandler::EControlTypes)mEditingIndex))
mShowKeyDialog = false;
if (mEditingIndex > 0
&& mConflictHandler[mEditingMode].canAssignControl((LLKeyConflictHandler::EControlTypes)mEditingIndex))
{
mEditingColumn = pControlsTable->getColumnIndexFromOffset(x);
if (mEditingColumn >0)
LLScrollListItem* item = pControlsTable->getFirstSelected(); // don't use pControlsTable->hitItem(x, y) dur to drift;
if (item)
{
LLSetKeyBindDialog* dialog = LLFloaterReg::showTypedInstance<LLSetKeyBindDialog>("keybind_dialog", LLSD(), TRUE);
if (dialog)
mEditingColumn = pControlsTable->getColumnIndexFromOffset(x);
if (mEditingColumn > 0)
{
/*if (mConflictHandler[mEditingMode].getLoadedMode() == LLKeyConflictHandler::MODE_GENERAL)
{*/
dialog->setParent(this, DEFAULT_KEY_FILTER);
/*}
else
LLScrollListCell* cell = item->getColumn(mEditingColumn);
if (cell)
{
dialog->setParent(this, ALLOW_KEYS | ALLOW_MASK_KEYS);
}*/
LLSetKeyBindDialog* dialog = LLFloaterReg::showTypedInstance<LLSetKeyBindDialog>("keybind_dialog", LLSD(), TRUE);
if (dialog)
{
dialog->setParent(this, DEFAULT_KEY_FILTER);
cell->setHighlighted(true);
mHighlightedCell = cell;
pControlsTable->deselectAllItems();
return TRUE;
}
}
}
}
}
mShowKeyDialog = false;
}
return LLPanelPreference::handleHover(x, y, mask);
}
@ -3038,7 +3036,7 @@ void LLPanelPreferenceControls::addGroupRow(const std::string &icon, S32 index)
void LLPanelPreferenceControls::regenerateControls()
{
mEditingMode = pKeyModeBox->getValue().asInteger();
mConflictHandler[mEditingMode].loadFromSettings((LLKeyConflictHandler::EModes)mEditingMode);
mConflictHandler[mEditingMode].loadFromSettings((LLKeyConflictHandler::ESourceMode)mEditingMode);
populateControlTable();
}
@ -3046,6 +3044,12 @@ void LLPanelPreferenceControls::populateControlTable()
{
pControlsTable->clearRows();
if (mHighlightedCell)
{
mHighlightedCell->setHighlighted(false);
mHighlightedCell = NULL;
}
// todo: subsections need sorting?
std::string label, control_name;
LLScrollListCell::Params cell_params;
@ -3138,20 +3142,50 @@ void LLPanelPreferenceControls::addSeparator()
}
}
void LLPanelPreferenceControls::updateTable()
{
std::vector<LLScrollListItem*> list = pControlsTable->getAllData();
for (S32 i = 0; i < list.size(); ++i)
{
S32 value = list[i]->getValue().asInteger();
if (value > 0)
{
LLKeyConflictHandler::EControlTypes control = (LLKeyConflictHandler::EControlTypes)value;
LLScrollListCell* cell = list[i]->getColumn(1);
cell->setValue(mConflictHandler[mEditingMode].getControlString(control, 0));
cell = list[i]->getColumn(2);
cell->setValue(mConflictHandler[mEditingMode].getControlString(control, 1));
cell = list[i]->getColumn(3);
cell->setValue(mConflictHandler[mEditingMode].getControlString(control, 2));
}
}
if (mHighlightedCell)
{
mHighlightedCell->setHighlighted(false);
mHighlightedCell = NULL;
}
}
void LLPanelPreferenceControls::apply()
{
for (U32 i = 0; i < LLKeyConflictHandler::MODE_COUNT; ++i)
for (U32 i = 0; i < LLKeyConflictHandler::MODE_COUNT - 1; ++i)
{
if (mConflictHandler[i].hasUnsavedChanges())
{
mConflictHandler[i].saveToSettings();
}
}
if (mHighlightedCell)
{
mHighlightedCell->setHighlighted(false);
mHighlightedCell = NULL;
}
}
void LLPanelPreferenceControls::cancel()
{
for (U32 i = 0; i < LLKeyConflictHandler::MODE_COUNT; ++i)
for (U32 i = 0; i < LLKeyConflictHandler::MODE_COUNT - 1; ++i)
{
if (mConflictHandler[i].hasUnsavedChanges())
{
@ -3159,11 +3193,16 @@ void LLPanelPreferenceControls::cancel()
}
}
pControlsTable->clear();
if (mHighlightedCell)
{
mHighlightedCell->setHighlighted(false);
mHighlightedCell = NULL;
}
}
void LLPanelPreferenceControls::saveSettings()
{
for (U32 i = 0; i < LLKeyConflictHandler::MODE_COUNT; ++i)
for (U32 i = 0; i < LLKeyConflictHandler::MODE_COUNT - 1; ++i)
{
if (mConflictHandler[i].hasUnsavedChanges())
{
@ -3176,6 +3215,11 @@ void LLPanelPreferenceControls::saveSettings()
{
regenerateControls();
}
else if (mHighlightedCell)
{
mHighlightedCell->setHighlighted(false);
mHighlightedCell = NULL;
}
}
void LLPanelPreferenceControls::resetDirtyChilds()
@ -3209,6 +3253,12 @@ void LLPanelPreferenceControls::onListCommit()
// use coordinates from hover to calculate cell
mEditingIndex = control;
mShowKeyDialog = true;
if (mHighlightedCell)
{
mHighlightedCell->setHighlighted(false);
mHighlightedCell = NULL;
}
}
void LLPanelPreferenceControls::onModeCommit()
@ -3228,30 +3278,20 @@ void LLPanelPreferenceControls::onSetKeyBind(EMouseClickType click, KEY key, MAS
pControlsTable->deselectAllItems();
pControlsTable->selectByValue(mEditingIndex);
LLScrollListItem *item = pControlsTable->getFirstSelected();
if (item && mEditingColumn > 0)
if ( mEditingColumn > 0)
{
mConflictHandler[mEditingMode].registerControl(control, mEditingColumn - 1, click, key, mask, ignore_mask);
LLScrollListCell *cell = item->getColumn(1);
cell->setValue(mConflictHandler[mEditingMode].getControlString(control, 0));
cell = item->getColumn(2);
cell->setValue(mConflictHandler[mEditingMode].getControlString(control, 1));
cell = item->getColumn(3);
cell->setValue(mConflictHandler[mEditingMode].getControlString(control, 2));
}
populateControlTable();
updateTable();
}
void LLPanelPreferenceControls::onRestoreDefaults()
{
for (U32 i = 0; i < LLKeyConflictHandler::MODE_COUNT; ++i)
for (U32 i = 0; i < LLKeyConflictHandler::MODE_COUNT - 1; ++i)
{
mConflictHandler[mEditingMode].resetToDefaults();
}
populateControlTable();
}
void LLPanelPreferenceControls::onDefaultKeyBind()
@ -3265,16 +3305,20 @@ void LLPanelPreferenceControls::onDefaultKeyBind()
pControlsTable->deselectAllItems();
pControlsTable->selectByValue(mEditingIndex);
LLScrollListItem *item = pControlsTable->getFirstSelected();
if (item)
{
LLScrollListCell *cell = item->getColumn(mEditingColumn);
if (mEditingColumn > 0)
{
mConflictHandler[mEditingMode].resetToDefault(control, mEditingColumn - 1);
cell->setValue(mConflictHandler[mEditingMode].getControlString(control, mEditingColumn - 1));
}
if (mEditingColumn > 0)
{
mConflictHandler[mEditingMode].resetToDefault(control, mEditingColumn - 1);
}
updateTable();
}
void LLPanelPreferenceControls::onCancelKeyBind()
{
if (mHighlightedCell)
{
mHighlightedCell->setHighlighted(false);
mHighlightedCell = NULL;
}
}

View File

@ -46,6 +46,7 @@ class LLPanelDebug;
class LLMessageSystem;
class LLComboBox;
class LLScrollListCtrl;
class LLScrollListCell;
class LLSliderCtrl;
class LLSD;
class LLTextBox;
@ -314,15 +315,18 @@ public:
void onSetKeyBind(EMouseClickType click, KEY key, MASK mask, bool ignore_mask);
void onRestoreDefaults();
void onDefaultKeyBind();
void onCancelKeyBind();
private:
void addGroupRow(const std::string &icon, S32 index);
void regenerateControls();
void populateControlTable();
void addSeparator();
void updateTable();
LLScrollListCtrl* pControlsTable;
LLComboBox *pKeyModeBox;
LLScrollListCell *mHighlightedCell;
LLKeyConflictHandler mConflictHandler[LLKeyConflictHandler::MODE_COUNT];
S32 mEditingIndex;
S32 mEditingColumn;

View File

@ -105,8 +105,8 @@ static const std::string typetostring[LLKeyConflictHandler::CONTROL_NUM_INDICES]
"control_mediacontent",
"toggle_pause_media",
"toggle_enable_media",
"control_voice",
"control_toggle_voice",
"voice_follow_key",
"toggle_voice",
"start_chat",
"start_gesture",
"control_reserved",
@ -167,6 +167,8 @@ static const control_enum_t command_to_key =
{ "toggle_enable_media", LLKeyConflictHandler::CONTROL_ENABLE_MEDIA },
{ "walk_to", LLKeyConflictHandler::CONTROL_MOVETO },
{ "teleport_to", LLKeyConflictHandler::CONTROL_TELEPORTTO },
{ "toggle_voice", LLKeyConflictHandler::CONTROL_TOGGLE_VOICE },
{ "voice_follow_key", LLKeyConflictHandler::CONTROL_VOICE },
};
@ -256,19 +258,9 @@ EMouseClickType mouse_from_string(const std::string& input)
LLKeyConflictHandler::LLKeyConflictHandler()
: mHasUnsavedChanges(false)
{
// todo: assign conflic priorities
// todo: load from keys.xml?
// Thise controls are meant to cause conflicts when user tries to assign same control somewhere else
/*registerTemporaryControl(CONTROL_RESERVED_MENU, CLICK_RIGHT, KEY_NONE, MASK_NONE, 0);
registerTemporaryControl(CONTROL_SHIFT_SELECT, CLICK_LEFT, KEY_NONE, MASK_SHIFT, 0);
registerTemporaryControl(CONTROL_CNTRL_SELECT, CLICK_LEFT, KEY_NONE, MASK_CONTROL, 0);
registerTemporaryControl(CONTROL_DELETE, CLICK_NONE, KEY_DELETE, MASK_NONE, 0);
loadFromSettings();*/
}
LLKeyConflictHandler::LLKeyConflictHandler(EModes mode)
LLKeyConflictHandler::LLKeyConflictHandler(ESourceMode mode)
: mHasUnsavedChanges(false),
mLoadMode(mode)
{
@ -305,16 +297,26 @@ bool LLKeyConflictHandler::canAssignControl(EControlTypes control_type)
return false;
}
void LLKeyConflictHandler::registerControl(EControlTypes control_type, U32 index, EMouseClickType mouse, KEY key, MASK mask, bool ignore_mask)
bool LLKeyConflictHandler::registerControl(EControlTypes control_type, U32 index, EMouseClickType mouse, KEY key, MASK mask, bool ignore_mask)
{
LLKeyConflict &type_data = mControlsMap[control_type];
if (!type_data.mAssignable)
{
LL_ERRS() << "Error in code, user or system should not be able to change certain controls" << LL_ENDL;
}
type_data.mKeyBind.replaceKeyData(mouse, key, mask, ignore_mask, index);
mHasUnsavedChanges = true;
LLKeyData data(mouse, key, mask, ignore_mask);
if (type_data.mKeyBind.getKeyData(index) == data)
{
return true;
}
if (removeConflicts(data, type_data.mConflictMask))
{
type_data.mKeyBind.replaceKeyData(data, index);
mHasUnsavedChanges = true;
return true;
}
// control already in use/blocked
return false;
}
LLKeyData LLKeyConflictHandler::getControl(EControlTypes control_type, U32 index)
@ -391,7 +393,7 @@ void LLKeyConflictHandler::loadFromSettings(const LLViewerKeyboard::KeyMode& ke
}
}
void LLKeyConflictHandler::loadFromSettings(const EModes &load_mode, const std::string &filename, control_map_t *destination)
void LLKeyConflictHandler::loadFromSettings(const ESourceMode &load_mode, const std::string &filename, control_map_t *destination)
{
if (filename.empty())
{
@ -442,7 +444,7 @@ void LLKeyConflictHandler::loadFromSettings(const EModes &load_mode, const std::
}
}
void LLKeyConflictHandler::loadFromSettings(EModes load_mode)
void LLKeyConflictHandler::loadFromSettings(ESourceMode load_mode)
{
mControlsMap.clear();
mDefaultsMap.clear();
@ -571,6 +573,11 @@ void LLKeyConflictHandler::saveToSettings()
control_map_t::iterator end = mControlsMap.end();
for (; iter != end; ++iter)
{
// By default xml have (had) up to 6 elements per function
// eventually it will be cleaned up and UI will only shows 3 per function,
// so make sure to cleanup.
// Also this helps in keeping file small.
iter->second.mKeyBind.trimEmpty();
U32 size = iter->second.mKeyBind.getDataCount();
for (U32 i = 0; i < size; ++i)
{
@ -683,10 +690,16 @@ LLKeyData LLKeyConflictHandler::getDefaultControl(EControlTypes control_type, U3
void LLKeyConflictHandler::resetToDefault(EControlTypes control_type, U32 index)
{
LLKeyData data = getDefaultControl(control_type, index);
mControlsMap[control_type].setKeyData(data, index);
if (data != mControlsMap[control_type].getKeyData(index))
{
// reset controls that might have been switched to our current control
removeConflicts(data, mControlsMap[control_type].mConflictMask);
mControlsMap[control_type].setKeyData(data, index);
}
}
void LLKeyConflictHandler::resetToDefault(EControlTypes control_type)
void LLKeyConflictHandler::resetToDefaultAndResolve(EControlTypes control_type, bool ignore_conflicts)
{
if (mLoadMode == MODE_GENERAL)
{
@ -694,7 +707,15 @@ void LLKeyConflictHandler::resetToDefault(EControlTypes control_type)
LLControlVariablePtr var = gSavedSettings.getControl(name);
if (var)
{
mControlsMap[control_type].mKeyBind = LLKeyBind(var->getDefault());
LLKeyBind bind(var->getDefault());
if (!ignore_conflicts)
{
for (S32 i = 0; i < bind.getDataCount(); ++i)
{
removeConflicts(bind.getKeyData(i), mControlsMap[control_type].mConflictMask);
}
}
mControlsMap[control_type].mKeyBind = bind;
}
else
{
@ -706,6 +727,13 @@ void LLKeyConflictHandler::resetToDefault(EControlTypes control_type)
control_map_t::iterator iter = mDefaultsMap.find(control_type);
if (iter != mDefaultsMap.end())
{
if (!ignore_conflicts)
{
for (S32 i = 0; i < iter->second.mKeyBind.getDataCount(); ++i)
{
removeConflicts(iter->second.mKeyBind.getKeyData(i), mControlsMap[control_type].mConflictMask);
}
}
mControlsMap[control_type].mKeyBind = iter->second.mKeyBind;
}
else
@ -715,7 +743,13 @@ void LLKeyConflictHandler::resetToDefault(EControlTypes control_type)
}
}
void LLKeyConflictHandler::resetToDefaults(EModes mode)
void LLKeyConflictHandler::resetToDefault(EControlTypes control_type)
{
// reset specific binding without ignoring conflicts
resetToDefaultAndResolve(control_type, false);
}
void LLKeyConflictHandler::resetToDefaults(ESourceMode mode)
{
if (mode == MODE_GENERAL)
{
@ -735,7 +769,7 @@ void LLKeyConflictHandler::resetToDefaults(EModes mode)
break;
default:
{
resetToDefault(type);
resetToDefaultAndResolve(type, true);
break;
}
}
@ -785,9 +819,53 @@ void LLKeyConflictHandler::resetKeyboardBindings()
gViewerKeyboard.loadBindingsXML(filename);
}
void LLKeyConflictHandler::generatePlaceholders(EModes load_mode)
void LLKeyConflictHandler::generatePlaceholders(ESourceMode load_mode)
{
// These controls are meant to cause conflicts 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
/*registerTemporaryControl(CONTROL_RESERVED_MENU, CLICK_RIGHT, KEY_NONE, MASK_NONE, 0);
registerTemporaryControl(CONTROL_DELETE, CLICK_NONE, KEY_DELETE, MASK_NONE, 0);*/
}
bool LLKeyConflictHandler::removeConflicts(const LLKeyData &data, const U32 &conlict_mask)
{
if (conlict_mask == CONFLICT_NOTHING)
{
// Can't conflict
return true;
}
std::map<EControlTypes, S32> conflict_list;
control_map_t::iterator cntrl_iter = mControlsMap.begin();
control_map_t::iterator cntrl_end = mControlsMap.end();
for (; cntrl_iter != cntrl_end; ++cntrl_iter)
{
S32 index = cntrl_iter->second.mKeyBind.findKeyData(data);
if (index >= 0
&& cntrl_iter->second.mConflictMask != CONFLICT_NOTHING
&& (cntrl_iter->second.mConflictMask & conlict_mask) != 0)
{
if (cntrl_iter->second.mAssignable)
{
// Potentially we can have multiple conflict flags conflicting
// including unassignable keys.
// So record the conflict and find all others before doing any changes.
// Assume that there is only one conflict per bind
conflict_list[cntrl_iter->first] = index;
}
else
{
return false;
}
}
}
std::map<EControlTypes, S32>::iterator cnflct_iter = conflict_list.begin();
std::map<EControlTypes, S32>::iterator cnflct_end = conflict_list.end();
for (; cnflct_iter != cnflct_end; ++cnflct_iter)
{
mControlsMap[cnflct_iter->first].mKeyBind.resetKeyData(cnflct_iter->second);
}
return true;
}
void LLKeyConflictHandler::registerTemporaryControl(EControlTypes control_type, EMouseClickType mouse, KEY key, MASK mask, U32 conflict_mask)

View File

@ -34,7 +34,7 @@
class LLKeyConflict
{
public:
LLKeyConflict() : mAssignable(true), mConflictMask(0) {} //temporary assignable, don't forget to change once all keys are recorded
LLKeyConflict() : mAssignable(true), mConflictMask(U32_MAX) {} //temporary assignable, don't forget to change once all keys are recorded
LLKeyConflict(bool assignable, U32 conflict_mask)
: mAssignable(assignable), mConflictMask(conflict_mask) {}
LLKeyConflict(const LLKeyBind &bind, bool assignable, U32 conflict_mask)
@ -55,26 +55,20 @@ class LLKeyConflictHandler
{
public:
enum EModes // partially repeats e_keyboard_mode
enum ESourceMode // partially repeats e_keyboard_mode
{
MODE_FIRST_PERSON,
MODE_THIRD_PERSON,
MODE_EDIT,
MODE_EDIT_AVATAR,
MODE_SITTING,
MODE_GENERAL,
MODE_GENERAL, // for settings from saved settings
MODE_COUNT
};
enum EConflictTypes // priority higherst to lowest
{
CONFLICT_LAND = 1,
CONFLICT_OBJECT = 2,
CONFLICT_TOUCH = 4,
CONFLICT_INTERACTIBLE = 8,
CONFLICT_AVATAR = 16,
CONFLICT_ANY = 511
};
const U32 CONFLICT_NOTHING = 0;
// at the moment this just means that key will conflict with everything that is identical
const U32 CONFLICT_ANY = U32_MAX;
// todo, unfortunately will have to remove this and use map/array of strings
enum EControlTypes
@ -142,7 +136,7 @@ public:
CONTROL_MEDIACONTENT, // Group control, for visual representation
CONTROL_PAUSE_MEDIA, // Play pause
CONTROL_ENABLE_MEDIA, // Play stop
CONTROL_VOICE, // Keep pressing for it to be ON
CONTROL_VOICE, // Keep pressing for voice to be ON
CONTROL_TOGGLE_VOICE, // Press once to ON/OFF
CONTROL_START_CHAT, // Press once to ON/OFF
CONTROL_START_GESTURE, // Press once to ON/OFF
@ -158,14 +152,14 @@ public:
// Note: missed selection and edition commands (would be really nice to go through selection via MB4/5 or wheel)
LLKeyConflictHandler();
LLKeyConflictHandler(EModes mode);
LLKeyConflictHandler(ESourceMode mode);
bool canHandleControl(EControlTypes control_type, EMouseClickType mouse_ind, KEY key, MASK mask);
bool canHandleKey(EControlTypes control_type, KEY key, MASK mask);
bool canHandleMouse(EControlTypes control_type, EMouseClickType mouse_ind, MASK mask);
bool canHandleMouse(EControlTypes control_type, S32 mouse_ind, MASK mask); //Just for convinience
bool canAssignControl(EControlTypes control_type);
void registerControl(EControlTypes control_type, U32 data_index, EMouseClickType mouse_ind, KEY key, MASK mask, bool ignore_mask); //todo: return conflicts?
bool registerControl(EControlTypes control_type, U32 data_index, EMouseClickType mouse_ind, KEY key, MASK mask, bool ignore_mask); //todo: return conflicts?
LLKeyData getControl(EControlTypes control_type, U32 data_index);
@ -175,7 +169,7 @@ public:
// Drops any changes loads controls with ones from 'saved settings' or from xml
void loadFromSettings(EModes load_mode);
void loadFromSettings(ESourceMode load_mode);
// Saves settings to 'saved settings' or to xml
void saveToSettings();
@ -190,26 +184,28 @@ public:
void clear();
bool hasUnsavedChanges() { return mHasUnsavedChanges; }
void setLoadMode(EModes mode) { mLoadMode = mode; }
EModes getLoadMode() { return mLoadMode; }
// todo: conflict search
void setLoadMode(ESourceMode mode) { mLoadMode = mode; }
ESourceMode getLoadMode() { return mLoadMode; }
private:
void resetToDefaults(EModes mode);
void resetToDefaultAndResolve(EControlTypes control_type, bool ignore_conflicts);
void resetToDefaults(ESourceMode mode);
// at the moment these kind of control is not savable, but takes part will take part in conflict resolution
void registerTemporaryControl(EControlTypes control_type, EMouseClickType mouse_ind, KEY key, MASK mask, U32 conflict_mask);
typedef std::map<EControlTypes, LLKeyConflict> control_map_t;
void loadFromSettings(const LLViewerKeyboard::KeyMode& keymode, control_map_t *destination);
void loadFromSettings(const EModes &load_mode, const std::string &filename, control_map_t *destination);
void loadFromSettings(const ESourceMode &load_mode, const std::string &filename, control_map_t *destination);
void resetKeyboardBindings();
void generatePlaceholders(EModes load_mode); //E.x. non-assignable values
void generatePlaceholders(ESourceMode load_mode); //E.x. non-assignable values
// returns false in case user is trying to reuse control that can't be reassigned
bool removeConflicts(const LLKeyData &data, const U32 &conlict_mask);
control_map_t mControlsMap;
control_map_t mDefaultsMap;
bool mHasUnsavedChanges;
EModes mLoadMode;
ESourceMode mLoadMode;
};

View File

@ -83,8 +83,8 @@ BOOL LLTool::handleMouseDown(S32 x, S32 y, MASK mask)
LL_INFOS() << "LLTool left mouse down" << LL_ENDL;
}
// by default, didn't handle it
// AGENT_CONTROL_LBUTTON_DOWN is handled by scanMouse() and scanKey()
// LL_INFOS() << "LLTool::handleMouseDown" << LL_ENDL;
gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_DOWN);
return FALSE;
}
@ -95,8 +95,8 @@ BOOL LLTool::handleMouseUp(S32 x, S32 y, MASK mask)
LL_INFOS() << "LLTool left mouse up" << LL_ENDL;
}
// by default, didn't handle it
// AGENT_CONTROL_LBUTTON_UP is handled by scanMouse() and scanKey()
// LL_INFOS() << "LLTool::handleMouseUp" << LL_ENDL;
gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_UP);
return TRUE;
}

View File

@ -537,13 +537,13 @@ void LLToolPie::resetSelection()
mClickAction = 0;
}
void LLToolPie::walkToClickedLocation()
bool LLToolPie::walkToClickedLocation()
{
if (gAgent.getFlying() // don't auto-navigate while flying until that works
|| !gAgentAvatarp
|| gAgentAvatarp->isSitting())
{
return;
return false;
}
LLPickInfo saved_pick = mPick;
@ -557,7 +557,7 @@ void LLToolPie::walkToClickedLocation()
if (mPick.getObject() && mPick.getObject()->isHUDAttachment())
{
mPick = saved_pick;
return;
return false;
}
}
@ -592,6 +592,7 @@ void LLToolPie::walkToClickedLocation()
gAgent.startAutoPilotGlobal(pos, std::string(), NULL, NULL, NULL, 0.f, 0.03f, FALSE);
LLFirstUse::notMoving(false);
showVisualContextMenuEffect();
return true;
}
else
{
@ -601,10 +602,12 @@ void LLToolPie::walkToClickedLocation()
<< ", pick object was " << mPick.mObjectID
<< LL_ENDL;
mPick = saved_pick;
return false;
}
return true;
}
void LLToolPie::teleportToClickedLocation()
bool LLToolPie::teleportToClickedLocation()
{
LLViewerObject* objp = mHoverPick.getObject();
LLViewerObject* parentp = objp ? objp->getRootEdit() : NULL;
@ -620,9 +623,11 @@ void LLToolPie::teleportToClickedLocation()
LLVector3d pos = mHoverPick.mPosGlobal;
pos.mdV[VZ] += gAgentAvatarp->getPelvisToFoot();
gAgent.teleportViaLocationLookAt(pos);
mPick = mHoverPick;
showVisualContextMenuEffect();
return true;
}
mPick = mHoverPick;
showVisualContextMenuEffect();
return false;
}
// When we get object properties after left-clicking on an object

View File

@ -67,8 +67,8 @@ public:
LLViewerObject* getClickActionObject() { return mClickActionObject; }
LLObjectSelection* getLeftClickSelection() { return (LLObjectSelection*)mLeftClickSelection; }
void resetSelection();
void walkToClickedLocation();
void teleportToClickedLocation();
bool walkToClickedLocation();
bool teleportToClickedLocation();
void stopClickToWalk();
static void selectionPropertiesReceived();

View File

@ -26,19 +26,21 @@
#include "llviewerprecompiledheaders.h"
#include "llviewerkeyboard.h"
#include "llappviewer.h"
#include "llfloaterreg.h"
#include "llviewerkeyboard.h"
#include "llmath.h"
#include "llagent.h"
#include "llagentcamera.h"
#include "llfloaterimnearbychat.h"
#include "llviewercontrol.h"
#include "llfocusmgr.h"
#include "llkeybind.h" // LLKeyData
#include "llmorphview.h"
#include "llmoveview.h"
#include "lltoolfocus.h"
#include "lltoolpie.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
#include "llvoavatarself.h"
#include "llfloatercamera.h"
@ -55,21 +57,23 @@ const F32 NUDGE_TIME = 0.25f; // in seconds
const S32 NUDGE_FRAMES = 2;
const F32 ORBIT_NUDGE_RATE = 0.05f; // fraction of normal speed
const LLKeyData agent_control_lbutton(CLICK_LEFT, KEY_NONE, MASK_NONE, true);
struct LLKeyboardActionRegistry
: public LLRegistrySingleton<std::string, boost::function<void (EKeystate keystate)>, LLKeyboardActionRegistry>
: public LLRegistrySingleton<std::string, boost::function<bool (EKeystate keystate)>, LLKeyboardActionRegistry>
{
LLSINGLETON_EMPTY_CTOR(LLKeyboardActionRegistry);
};
LLViewerKeyboard gViewerKeyboard;
void agent_jump( EKeystate s )
bool agent_jump( EKeystate s )
{
static BOOL first_fly_attempt(TRUE);
if (KEYSTATE_UP == s)
{
first_fly_attempt = TRUE;
return;
return true;
}
F32 time = gKeyboard->getCurKeyElapsedTime();
S32 frame_count = ll_round(gKeyboard->getCurKeyElapsedFrameCount());
@ -87,12 +91,14 @@ void agent_jump( EKeystate s )
first_fly_attempt = FALSE;
gAgent.moveUp(1);
}
return true;
}
void agent_push_down( EKeystate s )
bool agent_push_down( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gAgent.moveUp(-1);
return true;
}
static void agent_check_temporary_run(LLAgent::EDoubleTapRunMode mode)
@ -152,11 +158,11 @@ static void agent_push_forwardbackward( EKeystate s, S32 direction, LLAgent::EDo
}
}
void camera_move_forward( EKeystate s );
bool camera_move_forward( EKeystate s );
void agent_push_forward( EKeystate s )
bool agent_push_forward( EKeystate s )
{
if(gAgent.isMovementLocked()) return;
if(gAgent.isMovementLocked()) return true;
//in free camera control mode we need to intercept keyboard events for avatar movements
if (LLFloaterCamera::inFreeCameraMode())
@ -167,13 +173,14 @@ void agent_push_forward( EKeystate s )
{
agent_push_forwardbackward(s, 1, LLAgent::DOUBLETAP_FORWARD);
}
return true;
}
void camera_move_backward( EKeystate s );
bool camera_move_backward( EKeystate s );
void agent_push_backward( EKeystate s )
bool agent_push_backward( EKeystate s )
{
if(gAgent.isMovementLocked()) return;
if(gAgent.isMovementLocked()) return true;
//in free camera control mode we need to intercept keyboard events for avatar movements
if (LLFloaterCamera::inFreeCameraMode())
@ -188,6 +195,7 @@ void agent_push_backward( EKeystate s )
{
agent_push_forwardbackward(s, -1, LLAgent::DOUBLETAP_BACKWARD);
}
return true;
}
static void agent_slide_leftright( EKeystate s, S32 direction, LLAgent::EDoubleTapRunMode mode )
@ -208,31 +216,33 @@ static void agent_slide_leftright( EKeystate s, S32 direction, LLAgent::EDoubleT
}
void agent_slide_left( EKeystate s )
bool agent_slide_left( EKeystate s )
{
if(gAgent.isMovementLocked()) return;
if(gAgent.isMovementLocked()) return true;
agent_slide_leftright(s, 1, LLAgent::DOUBLETAP_SLIDELEFT);
return true;
}
void agent_slide_right( EKeystate s )
bool agent_slide_right( EKeystate s )
{
if(gAgent.isMovementLocked()) return;
if(gAgent.isMovementLocked()) return true;
agent_slide_leftright(s, -1, LLAgent::DOUBLETAP_SLIDERIGHT);
return true;
}
void camera_spin_around_cw( EKeystate s );
bool camera_spin_around_cw( EKeystate s );
void agent_turn_left( EKeystate s )
bool agent_turn_left(EKeystate s)
{
//in free camera control mode we need to intercept keyboard events for avatar movements
if (LLFloaterCamera::inFreeCameraMode())
{
camera_spin_around_cw(s);
return;
return true;
}
if(gAgent.isMovementLocked()) return;
if(gAgent.isMovementLocked()) return false;
if (LLToolCamera::getInstance()->mouseSteerMode())
{
@ -244,25 +254,26 @@ void agent_turn_left( EKeystate s )
{
// Check temporary running. In case user released 'left' key with shift already released.
agent_check_temporary_run(LLAgent::DOUBLETAP_SLIDELEFT);
return;
return true;
}
F32 time = gKeyboard->getCurKeyElapsedTime();
gAgent.moveYaw( LLFloaterMove::getYawRate( time ) );
}
return true;
}
void camera_spin_around_ccw( EKeystate s );
bool camera_spin_around_ccw( EKeystate s );
void agent_turn_right( EKeystate s )
bool agent_turn_right( EKeystate s )
{
//in free camera control mode we need to intercept keyboard events for avatar movements
if (LLFloaterCamera::inFreeCameraMode())
{
camera_spin_around_ccw(s);
return;
return true;
}
if(gAgent.isMovementLocked()) return;
if(gAgent.isMovementLocked()) return false;
if (LLToolCamera::getInstance()->mouseSteerMode())
{
@ -274,35 +285,39 @@ void agent_turn_right( EKeystate s )
{
// Check temporary running. In case user released 'right' key with shift already released.
agent_check_temporary_run(LLAgent::DOUBLETAP_SLIDERIGHT);
return;
return true;
}
F32 time = gKeyboard->getCurKeyElapsedTime();
gAgent.moveYaw( -LLFloaterMove::getYawRate( time ) );
}
return true;
}
void agent_look_up( EKeystate s )
bool agent_look_up( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gAgent.movePitch(-1);
//gAgent.rotate(-2.f * DEG_TO_RAD, gAgent.getFrame().getLeftAxis() );
return true;
}
void agent_look_down( EKeystate s )
bool agent_look_down( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gAgent.movePitch(1);
//gAgent.rotate(2.f * DEG_TO_RAD, gAgent.getFrame().getLeftAxis() );
return true;
}
void agent_toggle_fly( EKeystate s )
bool agent_toggle_fly( EKeystate s )
{
// Only catch the edge
if (KEYSTATE_DOWN == s )
{
LLAgent::toggleFlying();
}
return true;
}
F32 get_orbit_rate()
@ -320,24 +335,26 @@ F32 get_orbit_rate()
}
}
void camera_spin_around_ccw( EKeystate s )
bool camera_spin_around_ccw( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gAgentCamera.unlockView();
gAgentCamera.setOrbitLeftKey( get_orbit_rate() );
return true;
}
void camera_spin_around_cw( EKeystate s )
bool camera_spin_around_cw( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gAgentCamera.unlockView();
gAgentCamera.setOrbitRightKey( get_orbit_rate() );
return true;
}
void camera_spin_around_ccw_sitting( EKeystate s )
bool camera_spin_around_ccw_sitting( EKeystate s )
{
if( KEYSTATE_UP == s && gAgent.mDoubleTapRunMode != LLAgent::DOUBLETAP_SLIDERIGHT ) return;
if( KEYSTATE_UP == s && gAgent.mDoubleTapRunMode != LLAgent::DOUBLETAP_SLIDERIGHT ) return true;
if (gAgent.rotateGrabbed() || gAgentCamera.sitCameraEnabled() || gAgent.getRunning())
{
//send keystrokes, but do not change camera
@ -349,12 +366,13 @@ void camera_spin_around_ccw_sitting( EKeystate s )
gAgentCamera.unlockView();
gAgentCamera.setOrbitLeftKey( get_orbit_rate() );
}
return true;
}
void camera_spin_around_cw_sitting( EKeystate s )
bool camera_spin_around_cw_sitting( EKeystate s )
{
if( KEYSTATE_UP == s && gAgent.mDoubleTapRunMode != LLAgent::DOUBLETAP_SLIDELEFT ) return;
if( KEYSTATE_UP == s && gAgent.mDoubleTapRunMode != LLAgent::DOUBLETAP_SLIDELEFT ) return true;
if (gAgent.rotateGrabbed() || gAgentCamera.sitCameraEnabled() || gAgent.getRunning())
{
//send keystrokes, but do not change camera
@ -366,27 +384,30 @@ void camera_spin_around_cw_sitting( EKeystate s )
gAgentCamera.unlockView();
gAgentCamera.setOrbitRightKey( get_orbit_rate() );
}
return true;
}
void camera_spin_over( EKeystate s )
bool camera_spin_over( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gAgentCamera.unlockView();
gAgentCamera.setOrbitUpKey( get_orbit_rate() );
return true;
}
void camera_spin_under( EKeystate s )
bool camera_spin_under( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gAgentCamera.unlockView();
gAgentCamera.setOrbitDownKey( get_orbit_rate() );
return true;
}
void camera_spin_over_sitting( EKeystate s )
bool camera_spin_over_sitting( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
if (gAgent.upGrabbed() || gAgentCamera.sitCameraEnabled())
{
//send keystrokes, but do not change camera
@ -397,12 +418,13 @@ void camera_spin_over_sitting( EKeystate s )
//change camera but do not send keystrokes
gAgentCamera.setOrbitUpKey( get_orbit_rate() );
}
return true;
}
void camera_spin_under_sitting( EKeystate s )
bool camera_spin_under_sitting( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
if (gAgent.downGrabbed() || gAgentCamera.sitCameraEnabled())
{
//send keystrokes, but do not change camera
@ -413,26 +435,29 @@ void camera_spin_under_sitting( EKeystate s )
//change camera but do not send keystrokes
gAgentCamera.setOrbitDownKey( get_orbit_rate() );
}
return true;
}
void camera_move_forward( EKeystate s )
bool camera_move_forward( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gAgentCamera.unlockView();
gAgentCamera.setOrbitInKey( get_orbit_rate() );
return true;
}
void camera_move_backward( EKeystate s )
bool camera_move_backward( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gAgentCamera.unlockView();
gAgentCamera.setOrbitOutKey( get_orbit_rate() );
return true;
}
void camera_move_forward_sitting( EKeystate s )
bool camera_move_forward_sitting( EKeystate s )
{
if( KEYSTATE_UP == s && gAgent.mDoubleTapRunMode != LLAgent::DOUBLETAP_FORWARD ) return;
if( KEYSTATE_UP == s && gAgent.mDoubleTapRunMode != LLAgent::DOUBLETAP_FORWARD ) return true;
if (gAgent.forwardGrabbed() || gAgentCamera.sitCameraEnabled() || (gAgent.getRunning() && !gAgent.getAlwaysRun()))
{
agent_push_forward(s);
@ -441,12 +466,13 @@ void camera_move_forward_sitting( EKeystate s )
{
gAgentCamera.setOrbitInKey( get_orbit_rate() );
}
return true;
}
void camera_move_backward_sitting( EKeystate s )
bool camera_move_backward_sitting( EKeystate s )
{
if( KEYSTATE_UP == s && gAgent.mDoubleTapRunMode != LLAgent::DOUBLETAP_BACKWARD ) return;
if( KEYSTATE_UP == s && gAgent.mDoubleTapRunMode != LLAgent::DOUBLETAP_BACKWARD ) return true;
if (gAgent.backwardGrabbed() || gAgentCamera.sitCameraEnabled() || (gAgent.getRunning() && !gAgent.getAlwaysRun()))
{
@ -456,139 +482,156 @@ void camera_move_backward_sitting( EKeystate s )
{
gAgentCamera.setOrbitOutKey( get_orbit_rate() );
}
return true;
}
void camera_pan_up( EKeystate s )
bool camera_pan_up( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gAgentCamera.unlockView();
gAgentCamera.setPanUpKey( get_orbit_rate() );
return true;
}
void camera_pan_down( EKeystate s )
bool camera_pan_down( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gAgentCamera.unlockView();
gAgentCamera.setPanDownKey( get_orbit_rate() );
return true;
}
void camera_pan_left( EKeystate s )
bool camera_pan_left( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gAgentCamera.unlockView();
gAgentCamera.setPanLeftKey( get_orbit_rate() );
return true;
}
void camera_pan_right( EKeystate s )
bool camera_pan_right( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gAgentCamera.unlockView();
gAgentCamera.setPanRightKey( get_orbit_rate() );
return true;
}
void camera_pan_in( EKeystate s )
bool camera_pan_in( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gAgentCamera.unlockView();
gAgentCamera.setPanInKey( get_orbit_rate() );
return true;
}
void camera_pan_out( EKeystate s )
bool camera_pan_out( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gAgentCamera.unlockView();
gAgentCamera.setPanOutKey( get_orbit_rate() );
return true;
}
void camera_move_forward_fast( EKeystate s )
bool camera_move_forward_fast( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gAgentCamera.unlockView();
gAgentCamera.setOrbitInKey(2.5f);
return true;
}
void camera_move_backward_fast( EKeystate s )
bool camera_move_backward_fast( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gAgentCamera.unlockView();
gAgentCamera.setOrbitOutKey(2.5f);
return true;
}
void edit_avatar_spin_ccw( EKeystate s )
bool edit_avatar_spin_ccw( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gMorphView->setCameraDrivenByKeys( TRUE );
gAgentCamera.setOrbitLeftKey( get_orbit_rate() );
//gMorphView->orbitLeft( get_orbit_rate() );
return true;
}
void edit_avatar_spin_cw( EKeystate s )
bool edit_avatar_spin_cw( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gMorphView->setCameraDrivenByKeys( TRUE );
gAgentCamera.setOrbitRightKey( get_orbit_rate() );
//gMorphView->orbitRight( get_orbit_rate() );
return true;
}
void edit_avatar_spin_over( EKeystate s )
bool edit_avatar_spin_over( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gMorphView->setCameraDrivenByKeys( TRUE );
gAgentCamera.setOrbitUpKey( get_orbit_rate() );
//gMorphView->orbitUp( get_orbit_rate() );
return true;
}
void edit_avatar_spin_under( EKeystate s )
bool edit_avatar_spin_under( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gMorphView->setCameraDrivenByKeys( TRUE );
gAgentCamera.setOrbitDownKey( get_orbit_rate() );
//gMorphView->orbitDown( get_orbit_rate() );
return true;
}
void edit_avatar_move_forward( EKeystate s )
bool edit_avatar_move_forward( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gMorphView->setCameraDrivenByKeys( TRUE );
gAgentCamera.setOrbitInKey( get_orbit_rate() );
//gMorphView->orbitIn();
return true;
}
void edit_avatar_move_backward( EKeystate s )
bool edit_avatar_move_backward( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
if( KEYSTATE_UP == s ) return true;
gMorphView->setCameraDrivenByKeys( TRUE );
gAgentCamera.setOrbitOutKey( get_orbit_rate() );
//gMorphView->orbitOut();
return true;
}
void stop_moving( EKeystate s )
bool stop_moving( EKeystate s )
{
if( KEYSTATE_DOWN != s ) return;
if( KEYSTATE_DOWN != s ) return true;
// stop agent
gAgent.setControlFlags(AGENT_CONTROL_STOP);
// cancel autopilot
gAgent.stopAutoPilot();
return true;
}
void start_chat( EKeystate s )
bool start_chat( EKeystate s )
{
if (LLAppViewer::instance()->quitRequested())
{
return; // can't talk, gotta go, kthxbye!
return true; // can't talk, gotta go, kthxbye!
}
if (KEYSTATE_DOWN != s) return;
if (KEYSTATE_DOWN != s) return true;
// start chat
LLFloaterIMNearbyChat::startChat(NULL);
return true;
}
void start_gesture( EKeystate s )
bool start_gesture( EKeystate s )
{
LLUICtrl* focus_ctrlp = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
if (KEYSTATE_UP == s &&
@ -605,11 +648,12 @@ void start_gesture( EKeystate s )
LLFloaterIMNearbyChat::startChat(NULL);
}
}
return true;
}
void toggle_run(EKeystate s)
bool toggle_run(EKeystate s)
{
if (KEYSTATE_DOWN != s) return;
if (KEYSTATE_DOWN != s) return true;
bool run = gAgent.getAlwaysRun();
if (run)
{
@ -622,11 +666,12 @@ void toggle_run(EKeystate s)
gAgent.setRunning();
}
gAgent.sendWalkRun(!run);
return true;
}
void toggle_sit(EKeystate s)
bool toggle_sit(EKeystate s)
{
if (KEYSTATE_DOWN != s) return;
if (KEYSTATE_DOWN != s) return true;
if (gAgent.isSitting())
{
gAgent.standUp();
@ -635,33 +680,75 @@ void toggle_sit(EKeystate s)
{
gAgent.sitDown();
}
return true;
}
void toggle_pause_media(EKeystate s) // analogue of play/pause button in top bar
bool toggle_pause_media(EKeystate s) // analogue of play/pause button in top bar
{
if (KEYSTATE_DOWN != s) return;
if (KEYSTATE_DOWN != s) return true;
bool pause = LLViewerMedia::isAnyMediaPlaying();
LLViewerMedia::setAllMediaPaused(pause);
return true;
}
void toggle_enable_media(EKeystate s)
bool toggle_enable_media(EKeystate s)
{
if (KEYSTATE_DOWN != s) return;
if (KEYSTATE_DOWN != s) return true;
bool pause = LLViewerMedia::isAnyMediaPlaying() || LLViewerMedia::isAnyMediaShowing();
LLViewerMedia::setAllMediaEnabled(!pause);
return true;
}
void walk_to(EKeystate s)
bool walk_to(EKeystate s)
{
LL_WARNS() << "processing " << LLSD(s).asString() << LL_ENDL;
if (KEYSTATE_DOWN != s) return;
LLToolPie::getInstance()->walkToClickedLocation();
if (KEYSTATE_DOWN != s) return true;
return LLToolPie::getInstance()->walkToClickedLocation();
}
void teleport_to(EKeystate s)
bool teleport_to(EKeystate s)
{
if (KEYSTATE_DOWN != s) return;
LLToolPie::getInstance()->teleportToClickedLocation();
if (KEYSTATE_DOWN != s) return true;
return LLToolPie::getInstance()->teleportToClickedLocation();
}
bool toggle_voice(EKeystate s)
{
if (KEYSTATE_DOWN != s) return true;
if (!LLAgent::isActionAllowed("speak")) return false;
LLVoiceClient::getInstance()->toggleUserPTTState();
return true;
}
bool voice_follow_key(EKeystate s)
{
if (KEYSTATE_DOWN == s)
{
if (!LLAgent::isActionAllowed("speak")) return false;
LLVoiceClient::getInstance()->setUserPTTState(true);
return true;
}
else if (KEYSTATE_UP == s && LLVoiceClient::getInstance()->getUserPTTState())
{
LLVoiceClient::getInstance()->setUserPTTState(false);
return true;
}
return false;
}
bool agen_control_lbutton_handle(EKeystate s)
{
switch (s)
{
case KEYSTATE_DOWN:
gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_DOWN);
break;
case KEYSTATE_UP:
gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_UP);
break;
default:
break;
}
return true;
}
#define REGISTER_KEYBOARD_ACTION(KEY, ACTION) LLREGISTER_STATIC(LLKeyboardActionRegistry, KEY, ACTION);
@ -711,6 +798,8 @@ REGISTER_KEYBOARD_ACTION("toggle_pause_media", toggle_pause_media);
REGISTER_KEYBOARD_ACTION("toggle_enable_media", toggle_enable_media);
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);
#undef REGISTER_KEYBOARD_ACTION
LLViewerKeyboard::LLViewerKeyboard()
@ -846,7 +935,7 @@ BOOL LLViewerKeyboard::handleKeyUp(KEY translated_key, MASK translated_mask)
BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, const bool ignore, const std::string& function_name)
{
S32 index;
typedef boost::function<void(EKeystate)> function_t;
typedef boost::function<bool(EKeystate)> function_t;
function_t function = NULL;
std::string name;
@ -937,7 +1026,7 @@ BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, c
BOOL LLViewerKeyboard::bindMouse(const S32 mode, const EMouseClickType mouse, const MASK mask, const bool ignore, const std::string& function_name)
{
S32 index;
typedef boost::function<void(EKeystate)> function_t;
typedef boost::function<bool(EKeystate)> function_t;
function_t function = NULL;
function_t* result = LLKeyboardActionRegistry::getValue(function_name);
@ -1107,102 +1196,6 @@ S32 LLViewerKeyboard::loadBindingMode(const LLViewerKeyboard::KeyMode& keymode,
return binding_count;
}
S32 LLViewerKeyboard::loadBindings(const std::string& filename)
{
LLFILE *fp;
const S32 BUFFER_SIZE = 2048;
char buffer[BUFFER_SIZE]; /* Flawfinder: ignore */
// *NOTE: This buffer size is hard coded into scanf() below.
char mode_string[MAX_STRING] = ""; /* Flawfinder: ignore */
char key_string[MAX_STRING] = ""; /* Flawfinder: ignore */
char mask_string[MAX_STRING] = ""; /* Flawfinder: ignore */
char function_string[MAX_STRING] = ""; /* Flawfinder: ignore */
S32 mode = MODE_THIRD_PERSON;
KEY key = 0;
MASK mask = 0;
S32 tokens_read;
S32 binding_count = 0;
S32 line_count = 0;
if(filename.empty())
{
LL_ERRS() << " No filename specified" << LL_ENDL;
return 0;
}
fp = LLFile::fopen(filename, "r");
if (!fp)
{
return 0;
}
while (!feof(fp))
{
line_count++;
if (!fgets(buffer, BUFFER_SIZE, fp))
break;
// skip over comments, blank lines
if (buffer[0] == '#' || buffer[0] == '\n') continue;
// grab the binding strings
tokens_read = sscanf( /* Flawfinder: ignore */
buffer,
"%254s %254s %254s %254s",
mode_string,
key_string,
mask_string,
function_string);
if (tokens_read == EOF)
{
LL_INFOS() << "Unexpected end-of-file at line " << line_count << " of key binding file " << filename << LL_ENDL;
fclose(fp);
return 0;
}
else if (tokens_read < 4)
{
LL_INFOS() << "Can't read line " << line_count << " of key binding file " << filename << LL_ENDL;
continue;
}
// convert mode
if (!modeFromString(mode_string, &mode))
{
LL_INFOS() << "Unknown mode on line " << line_count << " of key binding file " << filename << LL_ENDL;
LL_INFOS() << "Mode must be one of FIRST_PERSON, THIRD_PERSON, EDIT, EDIT_AVATAR" << LL_ENDL;
continue;
}
// convert key
if (!LLKeyboard::keyFromString(key_string, &key))
{
LL_INFOS() << "Can't interpret key on line " << line_count << " of key binding file " << filename << LL_ENDL;
continue;
}
// convert mask
if (!LLKeyboard::maskFromString(mask_string, &mask))
{
LL_INFOS() << "Can't interpret mask on line " << line_count << " of key binding file " << filename << LL_ENDL;
continue;
}
// bind key
if (bindKey(mode, key, mask, false, function_string))
{
binding_count++;
}
}
fclose(fp);
return binding_count;
}
EKeyboardMode LLViewerKeyboard::getMode() const
{
if ( gAgentCamera.cameraMouselook() )
@ -1238,27 +1231,26 @@ bool LLViewerKeyboard::scanKey(const LLKeyboardBinding* binding,
{
if (binding[i].mMask == mask)
{
bool res = false;
if (key_down && !repeat)
{
// ...key went down this frame, call function
binding[i].mFunction( KEYSTATE_DOWN );
res = binding[i].mFunction( KEYSTATE_DOWN );
return true;
}
else if (key_up)
{
// ...key went down this frame, call function
binding[i].mFunction( KEYSTATE_UP );
return true;
res = 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 );
return true;
res = binding[i].mFunction( KEYSTATE_LEVEL );
}//if
// Key+Mask combinations are supposed to be unique, so we won't find anything else
return false;
return res;
}//if
}//if
}//for
@ -1266,7 +1258,7 @@ bool LLViewerKeyboard::scanKey(const LLKeyboardBinding* binding,
}
// Called from scanKeyboard.
void LLViewerKeyboard::scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level) const
bool LLViewerKeyboard::scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level) const
{
if (LLApp::isExiting())
{
@ -1279,17 +1271,31 @@ void LLViewerKeyboard::scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_lev
if (mKeyHandledByUI[key])
{
return;
return false;
}
// don't process key down on repeated keys
BOOL repeat = gKeyboard->getKeyRepeated(key);
if (scanKey(mKeyBindings[mode], mKeyBindingCount[mode], key, mask, key_down, key_up, key_level, repeat))
bool res = scanKey(mKeyBindings[mode], mKeyBindingCount[mode], key, mask, key_down, key_up, key_level, repeat);
if (!res)
{
// Nothing found, try ignore list
scanKey(mKeyIgnoreMask[mode], mKeyIgnoreMaskCount[mode], key, MASK_NONE, key_down, key_up, key_level, repeat);
res = scanKey(mKeyIgnoreMask[mode], mKeyIgnoreMaskCount[mode], key, MASK_NONE, key_down, key_up, key_level, repeat);
}
if (!res && agent_control_lbutton.canHandle(CLICK_NONE, key, mask))
{
if (key_down && !repeat)
{
res = agen_control_lbutton_handle(KEYSTATE_DOWN);
}
if (key_up)
{
res = agen_control_lbutton_handle(KEYSTATE_UP);
}
}
return res;
}
BOOL LLViewerKeyboard::handleMouse(LLWindow *window_impl, LLCoordGL pos, MASK mask, EMouseClickType clicktype, BOOL down)
@ -1370,23 +1376,30 @@ bool LLViewerKeyboard::scanMouse(const LLMouseBinding *binding, S32 binding_coun
{
if (binding[i].mMouse == mouse && binding[i].mMask == mask)
{
bool res = false;
switch (state)
{
case MOUSE_STATE_DOWN:
res = binding[i].mFunction(KEYSTATE_DOWN);
break;
case MOUSE_STATE_CLICK:
binding[i].mFunction(KEYSTATE_DOWN);
// Button went down and up in scope of single frame
// might not work best with some functions,
// but some function need specific states specifically
res = binding[i].mFunction(KEYSTATE_DOWN);
res |= binding[i].mFunction(KEYSTATE_UP);
break;
case MOUSE_STATE_LEVEL:
binding[i].mFunction(KEYSTATE_LEVEL);
res = binding[i].mFunction(KEYSTATE_LEVEL);
break;
case MOUSE_STATE_UP:
binding[i].mFunction(KEYSTATE_UP);
res = binding[i].mFunction(KEYSTATE_UP);
break;
default:
break;
}
// Key+Mask combinations are supposed to be unique, no need to continue
return true;
return res;
}
}
return false;
@ -1403,6 +1416,30 @@ bool LLViewerKeyboard::scanMouse(EMouseClickType click, EMouseState state) const
{
res = scanMouse(mMouseIgnoreMask[mode], mMouseIgnoreMaskCount[mode], click, MASK_NONE, 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))
{
switch (state)
{
case MOUSE_STATE_DOWN:
agen_control_lbutton_handle(KEYSTATE_DOWN);
res = true;
break;
case MOUSE_STATE_CLICK:
// might not work best with some functions,
// but some function need specific states too specifically
agen_control_lbutton_handle(KEYSTATE_DOWN);
agen_control_lbutton_handle(KEYSTATE_UP);
res = true;
break;
case MOUSE_STATE_UP:
agen_control_lbutton_handle(KEYSTATE_UP);
res = true;
break;
default:
break;
}
}
return res;
}
@ -1415,7 +1452,7 @@ void LLViewerKeyboard::scanMouse()
scanMouse((EMouseClickType)i, mMouseLevel[i]);
if (mMouseLevel[i] == MOUSE_STATE_DOWN)
{
// mouse doesn't support 'continued' state like keyboard does, so after handling, switch to LEVEL
// mouse doesn't support 'continued' state, so after handling, switch to LEVEL
mMouseLevel[i] = MOUSE_STATE_LEVEL;
}
else if (mMouseLevel[i] == MOUSE_STATE_UP || mMouseLevel[i] == MOUSE_STATE_CLICK)

View File

@ -115,14 +115,16 @@ public:
BOOL handleKey(KEY key, MASK mask, BOOL repeated);
BOOL handleKeyUp(KEY key, MASK mask);
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() const;
BOOL modeFromString(const std::string& string, S32 *mode) const; // False on failure
BOOL mouseFromString(const std::string& string, EMouseClickType *mode) const;// False on failure
void scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level) const;
bool scanKey(KEY key,
BOOL key_down,
BOOL key_up,
BOOL key_level) const;
// handleMouse() records state, scanMouse() goes through states, scanMouse(click) processes individual saved states after UI is done with them
BOOL handleMouse(LLWindow *window_impl, LLCoordGL pos, MASK mask, EMouseClickType clicktype, BOOL down);
@ -163,6 +165,10 @@ private:
// 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];

View File

@ -934,8 +934,6 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK m
x = ll_round((F32)x / mDisplayScale.mV[VX]);
y = ll_round((F32)y / mDisplayScale.mV[VY]);
LLVoiceClient::getInstance()->updateMouseState(clicktype, mask, down);
// only send mouse clicks to UI if UI is visible
if(gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
{
@ -1453,9 +1451,6 @@ void LLViewerWindow::handleFocusLost(LLWindow *window)
BOOL LLViewerWindow::handleTranslatedKeyDown(KEY key, MASK mask, BOOL repeated)
{
// Let the voice chat code check for its PTT key. Note that this never affects event processing.
LLVoiceClient::getInstance()->keyDown(key, mask);
if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME)
{
gAgent.clearAFK();
@ -1480,9 +1475,6 @@ BOOL LLViewerWindow::handleTranslatedKeyDown(KEY key, MASK mask, BOOL repeated)
BOOL LLViewerWindow::handleTranslatedKeyUp(KEY key, MASK mask)
{
// Let the voice chat code check for its PTT key. Note that this never affects event processing.
LLVoiceClient::getInstance()->keyUp(key, mask);
// Let the inspect tool code check for ALT key to set LLToolSelectRect active instead LLToolCamera
LLToolCompInspect * tool_inspectp = LLToolCompInspect::getInstance();
if (LLToolMgr::getInstance()->getCurrentTool() == tool_inspectp)

View File

@ -200,8 +200,6 @@ 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");
@ -637,32 +635,6 @@ bool LLVoiceClient::getPTTIsToggle()
return mPTTIsToggle;
}
void LLVoiceClient::setPTTKey(std::string &key)
{
// Value is stored as text for readability
if(key == "MiddleMouse")
{
mPTTMouseButton = CLICK_MIDDLE;
}
else if(key == "MouseButton4")
{
mPTTMouseButton = CLICK_BUTTON4;
}
else if (key == "MouseButton5")
{
mPTTMouseButton = CLICK_BUTTON5;
}
else
{
mPTTMouseButton = 0;
if(!LLKeyboard::keyFromString(key, &mPTTKey))
{
// If the call failed, don't match any key.
key = KEY_NONE;
}
}
}
void LLVoiceClient::inputUserControlState(bool down)
{
if(mPTTIsToggle)
@ -683,48 +655,6 @@ void LLVoiceClient::toggleUserPTTState(void)
setUserPTTState(!getUserPTTState());
}
void LLVoiceClient::keyDown(KEY key, MASK mask)
{
if (gKeyboard->getKeyRepeated(key))
{
// ignore auto-repeat keys
return;
}
//
/*static LLCachedControl<LLSD> key_bind(gSavedSettings, "control_toggle_voice");
LLKeyBind bind(key_bind);
if (LLAgent::isActionAllowed("speak") && bind().canHandleKey(key, mask))
{
bool down = gKeyboard->getKeyDown(mPTTKey);
if (down)
{
inputUserControlState(down);
}
}*/
}
void LLVoiceClient::keyUp(KEY key, MASK mask)
{
/*static LLCachedControl<LLKeyBind> key_bind(gSavedSettings, "control_toggle_voice");
if (key_bind().canHandleKey(key, mask))
{
bool down = gKeyboard->getKeyDown(mPTTKey);
if (!down)
{
inputUserControlState(down);
}
}*/
}
void LLVoiceClient::updateMouseState(S32 click, MASK mask, bool down)
{
/*static LLCachedControl<LLKeyBind> mouse_bind(gSavedSettings, "control_toggle_voice");
if (mouse_bind().canHandleMouse((EMouseClickType)click, mask))
{
inputUserControlState(down);
}*/
}
//-------------------------------------------
// nearby speaker accessors

View File

@ -408,16 +408,10 @@ public:
void setUsePTT(bool usePTT);
void setPTTIsToggle(bool PTTIsToggle);
bool getPTTIsToggle();
void setPTTKey(std::string &key);
void updateMicMuteLogic();
BOOL lipSyncEnabled();
// PTT key triggering
void keyDown(KEY key, MASK mask);
void keyUp(KEY key, MASK mask);
void updateMouseState(S32 click, MASK mask, bool down);
boost::signals2::connection MicroChangedCallback(const micro_changed_signal_t::slot_type& cb ) { return mMicroChangedSignal.connect(cb); }

View File

@ -274,10 +274,6 @@
label="Sitting"
name="sitting"
value="4"/>
<combo_box.item
label="General"
name="general"
value="5"/>
</combo_box>
<button
@ -301,6 +297,7 @@
right="-3"
can_sort="false"
multi_select="false"
bg_selected_color="Transparent"
name="controls_list">
<scroll_list.columns
relative_width="0.34"