From b12cf6696348520556cf70f96e0562776479fe70 Mon Sep 17 00:00:00 2001 From: andreykproductengine Date: Fri, 27 Sep 2019 15:25:47 +0300 Subject: SL-6109 Small reorganisation --- indra/newview/llviewerinput.h | 193 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 indra/newview/llviewerinput.h (limited to 'indra/newview/llviewerinput.h') diff --git a/indra/newview/llviewerinput.h b/indra/newview/llviewerinput.h new file mode 100644 index 0000000000..d18a61eaf0 --- /dev/null +++ b/indra/newview/llviewerinput.h @@ -0,0 +1,193 @@ +/** + * @file llviewerinput.h + * @brief LLViewerInput class header file + * + * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLVIEWERINPUT_H +#define LL_LLVIEWERINPUT_H + +#include "llkeyboard.h" // For EKeystate +#include "llinitparam.h" + +const S32 MAX_NAMED_FUNCTIONS = 100; +const S32 MAX_KEY_BINDINGS = 128; // was 60 + +class LLNamedFunction +{ +public: + LLNamedFunction() : mFunction(NULL) { }; + ~LLNamedFunction() { }; + + std::string mName; + LLKeyFunc mFunction; +}; + +class LLKeyboardBinding +{ +public: + KEY mKey; + MASK mMask; + bool mIgnoreMask; // whether CTRL/ALT/SHIFT should be checked + + LLKeyFunc mFunction; +}; + +class LLMouseBinding +{ +public: + EMouseClickType mMouse; + MASK mMask; + bool mIgnoreMask; // whether CTRL/ALT/SHIFT should be checked + + LLKeyFunc mFunction; +}; + + +typedef enum e_keyboard_mode +{ + MODE_FIRST_PERSON, + MODE_THIRD_PERSON, + MODE_EDIT, + MODE_EDIT_AVATAR, + MODE_SITTING, + MODE_COUNT +} EKeyboardMode; + +class LLWindow; + +void bind_keyboard_functions(); + +class LLViewerInput +{ +public: + struct KeyBinding : public LLInitParam::Block + { + Mandatory key, + mask, + command; + Optional mouse; // Note, not mandatory for the sake of backward campatibility + Optional ignore; + + KeyBinding(); + }; + + struct KeyMode : public LLInitParam::Block + { + Multiple bindings; + + KeyMode(); + }; + + struct Keys : public LLInitParam::Block + { + Optional first_person, + third_person, + edit, + sitting, + edit_avatar; + + Keys(); + }; + + LLViewerInput(); + + BOOL handleKey(KEY key, MASK mask, BOOL repeated); + BOOL handleKeyUp(KEY key, MASK mask); + + 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 + + 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); + void scanMouse(); + +private: + bool scanKey(const LLKeyboardBinding* binding, + S32 binding_count, + KEY key, + MASK mask, + BOOL key_down, + BOOL key_up, + BOOL key_level, + bool repeat) const; + + enum EMouseState + { + MOUSE_STATE_DOWN, // key down this frame + MOUSE_STATE_CLICK, // key went up and down in scope of same frame + MOUSE_STATE_LEVEL, // clicked again fast, or never released + MOUSE_STATE_UP, // went up this frame + MOUSE_STATE_SILENT // notified about 'up', do not notify again + }; + bool scanMouse(EMouseClickType click, EMouseState state) const; + bool scanMouse(const 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); + 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]; + + typedef std::map key_remap_t; + key_remap_t mRemapKeys[MODE_COUNT]; + std::set mKeysSkippedByUI; + BOOL mKeyHandledByUI[KEY_COUNT]; // key processed successfully by UI + + // This is indentical to what llkeyboard does (mKeyRepeated, mKeyLevel, mKeyDown e t c), + // just instead of remembering individually as bools, we record state as enum + EMouseState mMouseLevel[CLICK_COUNT]; // records of key state +}; + +extern LLViewerInput gViewerInput; + +#endif // LL_LLVIEWERINPUT_H -- cgit v1.2.3 From e211372923bed31e632bc9825913d3d57cdc2d52 Mon Sep 17 00:00:00 2001 From: andreykproductengine Date: Thu, 3 Oct 2019 22:45:29 +0300 Subject: SL-6109 Remade 'ignore' list processing, renamed and reformed keybindings --- indra/newview/llviewerinput.h | 28 +++++++--------------------- 1 file changed, 7 insertions(+), 21 deletions(-) (limited to 'indra/newview/llviewerinput.h') 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 key, mask, command; - Optional mouse; // Note, not mandatory for the sake of backward campatibility - Optional ignore; + Optional 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 &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 &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 mKeyBindings[MODE_COUNT]; + std::vector mMouseBindings[MODE_COUNT]; typedef std::map key_remap_t; key_remap_t mRemapKeys[MODE_COUNT]; -- cgit v1.2.3 From 73a1877ff0abcba46f66ef55440274119427723b Mon Sep 17 00:00:00 2001 From: andreykproductengine Date: Thu, 7 Nov 2019 20:09:25 +0200 Subject: SL-6109 - Edit mode appears to be obsolete and is not used, cleaned up - Improved ability to set defaults - Improved some labels - Made buttons bigger to accomodate languages with longer descriptions - Added ability to assign key for all modes simultaneously --- indra/newview/llviewerinput.h | 2 -- 1 file changed, 2 deletions(-) (limited to 'indra/newview/llviewerinput.h') diff --git a/indra/newview/llviewerinput.h b/indra/newview/llviewerinput.h index b7124a54b2..eff42600fd 100644 --- a/indra/newview/llviewerinput.h +++ b/indra/newview/llviewerinput.h @@ -65,7 +65,6 @@ typedef enum e_keyboard_mode { MODE_FIRST_PERSON, MODE_THIRD_PERSON, - MODE_EDIT, MODE_EDIT_AVATAR, MODE_SITTING, MODE_COUNT @@ -99,7 +98,6 @@ public: { Optional first_person, third_person, - edit, sitting, edit_avatar; -- cgit v1.2.3 From 708fdb4e67393dbf03a0e0c82608d62f1868926a Mon Sep 17 00:00:00 2001 From: andreykproductengine Date: Tue, 12 Nov 2019 14:08:01 +0200 Subject: SL-6109 Mouse localization support --- indra/newview/llviewerinput.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indra/newview/llviewerinput.h') diff --git a/indra/newview/llviewerinput.h b/indra/newview/llviewerinput.h index eff42600fd..1fe55bd585 100644 --- a/indra/newview/llviewerinput.h +++ b/indra/newview/llviewerinput.h @@ -112,8 +112,8 @@ public: 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 + static BOOL modeFromString(const std::string& string, S32 *mode); // False on failure + static BOOL mouseFromString(const std::string& string, EMouseClickType *mode);// False on failure bool scanKey(KEY key, BOOL key_down, -- cgit v1.2.3 From 4de5f6a8533174696211fab8952adc7001357ba4 Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Thu, 3 Dec 2020 17:10:50 +0200 Subject: SL-14455 FIXED Drag ground to turn is still active when Single click on land is set to No action --- indra/newview/llviewerinput.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'indra/newview/llviewerinput.h') diff --git a/indra/newview/llviewerinput.h b/indra/newview/llviewerinput.h index 1fe55bd585..281a209896 100644 --- a/indra/newview/llviewerinput.h +++ b/indra/newview/llviewerinput.h @@ -124,6 +124,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 = MASK_NONE, const S32 mode = MODE_THIRD_PERSON); + private: bool scanKey(const std::vector &binding, S32 binding_count, -- cgit v1.2.3