From 45b1b6ff3b030c0372f1efff2baad989b02725a9 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Wed, 3 Aug 2011 16:04:45 -0400 Subject: CHOP-763: Remove redundant KEY string names from llwindowlistener.cpp. A couple of the lookup tables in llwindowlistener.cpp essentially duplicated LLKeyboard::keyFromString() and maskFromString(). Remove those tables and use LLKeyboard lookup methods instead. --- indra/llwindow/llwindowlistener.cpp | 135 +++++++++--------------------------- 1 file changed, 31 insertions(+), 104 deletions(-) (limited to 'indra/llwindow') diff --git a/indra/llwindow/llwindowlistener.cpp b/indra/llwindow/llwindowlistener.cpp index 91b99d83c6..006aaa75e7 100644 --- a/indra/llwindow/llwindowlistener.cpp +++ b/indra/llwindow/llwindowlistener.cpp @@ -41,10 +41,10 @@ LLWindowListener::LLWindowListener(LLWindowCallbacks *window, const KeyboardGett std::string keySomething = "Given [\"keysym\"], [\"keycode\"] or [\"char\"], inject the specified "; std::string keyExplain = - "(integer keycode values, or keysym \"XXXX\" from any KEY_XXXX, in\n" - "http://hg.secondlife.com/viewer-development/src/tip/indra/llcommon/indra_constants.h )"; + "(integer keycode values, or keysym string from any addKeyName() call in\n" + "http://hg.secondlife.com/viewer-development/src/tip/indra/llwindow/llkeyboard.cpp )"; std::string mask = - "Specify optional [\"mask\"] as an array containing any of \"CONTROL\", \"ALT\",\n" + "Specify optional [\"mask\"] as an array containing any of \"CTL\", \"ALT\",\n" "\"SHIFT\" or \"MAC_CONTROL\"; the corresponding modifier bits will be combined\n" "to form the mask used with the event."; @@ -104,118 +104,41 @@ protected: } }; -// for WhichKeysym. KeyProxy is like the typedef KEY, except that KeyProxy() -// (default-constructed) is guaranteed to have the value KEY_NONE. -class KeyProxy +// helper for getMask() +static MASK lookupMask_(const std::string& maskname) { -public: - KeyProxy(KEY k): mKey(k) {} - KeyProxy(): mKey(KEY_NONE) {} - operator KEY() const { return mKey; } - -private: - KEY mKey; -}; - -struct WhichKeysym: public StringLookup -{ - WhichKeysym(): StringLookup("keysym") + // It's unclear to me whether MASK_MAC_CONTROL is important, but it's not + // supported by maskFromString(). Handle that specially. + if (maskname == "MAC_CONTROL") { - add("RETURN", KEY_RETURN); - add("LEFT", KEY_LEFT); - add("RIGHT", KEY_RIGHT); - add("UP", KEY_UP); - add("DOWN", KEY_DOWN); - add("ESCAPE", KEY_ESCAPE); - add("BACKSPACE", KEY_BACKSPACE); - add("DELETE", KEY_DELETE); - add("SHIFT", KEY_SHIFT); - add("CONTROL", KEY_CONTROL); - add("ALT", KEY_ALT); - add("HOME", KEY_HOME); - add("END", KEY_END); - add("PAGE_UP", KEY_PAGE_UP); - add("PAGE_DOWN", KEY_PAGE_DOWN); - add("HYPHEN", KEY_HYPHEN); - add("EQUALS", KEY_EQUALS); - add("INSERT", KEY_INSERT); - add("CAPSLOCK", KEY_CAPSLOCK); - add("TAB", KEY_TAB); - add("ADD", KEY_ADD); - add("SUBTRACT", KEY_SUBTRACT); - add("MULTIPLY", KEY_MULTIPLY); - add("DIVIDE", KEY_DIVIDE); - add("F1", KEY_F1); - add("F2", KEY_F2); - add("F3", KEY_F3); - add("F4", KEY_F4); - add("F5", KEY_F5); - add("F6", KEY_F6); - add("F7", KEY_F7); - add("F8", KEY_F8); - add("F9", KEY_F9); - add("F10", KEY_F10); - add("F11", KEY_F11); - add("F12", KEY_F12); - - add("PAD_UP", KEY_PAD_UP); - add("PAD_DOWN", KEY_PAD_DOWN); - add("PAD_LEFT", KEY_PAD_LEFT); - add("PAD_RIGHT", KEY_PAD_RIGHT); - add("PAD_HOME", KEY_PAD_HOME); - add("PAD_END", KEY_PAD_END); - add("PAD_PGUP", KEY_PAD_PGUP); - add("PAD_PGDN", KEY_PAD_PGDN); - add("PAD_CENTER", KEY_PAD_CENTER); // the 5 in the middle - add("PAD_INS", KEY_PAD_INS); - add("PAD_DEL", KEY_PAD_DEL); - add("PAD_RETURN", KEY_PAD_RETURN); - add("PAD_ADD", KEY_PAD_ADD); // not used - add("PAD_SUBTRACT", KEY_PAD_SUBTRACT); // not used - add("PAD_MULTIPLY", KEY_PAD_MULTIPLY); // not used - add("PAD_DIVIDE", KEY_PAD_DIVIDE); // not used - - add("BUTTON0", KEY_BUTTON0); - add("BUTTON1", KEY_BUTTON1); - add("BUTTON2", KEY_BUTTON2); - add("BUTTON3", KEY_BUTTON3); - add("BUTTON4", KEY_BUTTON4); - add("BUTTON5", KEY_BUTTON5); - add("BUTTON6", KEY_BUTTON6); - add("BUTTON7", KEY_BUTTON7); - add("BUTTON8", KEY_BUTTON8); - add("BUTTON9", KEY_BUTTON9); - add("BUTTON10", KEY_BUTTON10); - add("BUTTON11", KEY_BUTTON11); - add("BUTTON12", KEY_BUTTON12); - add("BUTTON13", KEY_BUTTON13); - add("BUTTON14", KEY_BUTTON14); - add("BUTTON15", KEY_BUTTON15); + return MASK_MAC_CONTROL; } -}; -static WhichKeysym keysyms; - -struct WhichMask: public StringLookup -{ - WhichMask(): StringLookup("shift mask") + else { - add("NONE", MASK_NONE); - add("CONTROL", MASK_CONTROL); // Mapped to cmd on Macs - add("ALT", MASK_ALT); - add("SHIFT", MASK_SHIFT); - add("MAC_CONTROL", MASK_MAC_CONTROL); // Un-mapped Ctrl key on Macs, not used on Windows + // In case of lookup failure, return MASK_NONE, which won't affect our + // caller's OR. + MASK mask(MASK_NONE); + LLKeyboard::maskFromString(maskname, &mask); + return mask; } -}; -static WhichMask masks; +} static MASK getMask(const LLSD& event) { - MASK mask(MASK_NONE); LLSD masknames(event["mask"]); + if (! masknames.isArray()) + { + // If event["mask"] is a single string, perform normal lookup on it. + return lookupMask_(masknames); + } + + // Here event["mask"] is an array of mask-name strings. OR together their + // corresponding bits. + MASK mask(MASK_NONE); for (LLSD::array_const_iterator ai(masknames.beginArray()), aend(masknames.endArray()); ai != aend; ++ai) { - mask |= masks.lookup(*ai); + mask |= lookupMask_(*ai); } return mask; } @@ -224,7 +147,11 @@ static KEY getKEY(const LLSD& event) { if (event.has("keysym")) { - return keysyms.lookup(event["keysym"]); + // Initialize to KEY_NONE; that way we can ignore the bool return from + // keyFromString() and, in the lookup-fail case, simply return KEY_NONE. + KEY key(KEY_NONE); + LLKeyboard::keyFromString(event["keysym"], &key); + return key; } else if (event.has("keycode")) { -- cgit v1.2.3 From 79f14b7febf512e96a7d63eff8e6db895a7e72cf Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 25 Aug 2011 14:54:38 -0400 Subject: CHOP-763: Move llwindowlistener.{h,cpp} from llwindow to newview. Instantiate LLWindowListener on LLViewerWindow instead of on LLWindow. This permits LLWindowListener to use machinery from llui, e.g. LLUI::resolvePath(). Document planned new ["path"], ["reply"] params to "keyDown", "keyUp", "mouseDown", "mouseUp", "mouseMove" operations; document relationship between ["path"] and ["x"] and ["y"]. NEW PARAMS NOT YET IMPLEMENTED. --- indra/llwindow/CMakeLists.txt | 2 - indra/llwindow/llwindow.cpp | 9 -- indra/llwindow/llwindow.h | 2 - indra/llwindow/llwindowlistener.cpp | 234 ------------------------------------ indra/llwindow/llwindowlistener.h | 55 --------- 5 files changed, 302 deletions(-) delete mode 100644 indra/llwindow/llwindowlistener.cpp delete mode 100644 indra/llwindow/llwindowlistener.h (limited to 'indra/llwindow') diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt index 3d89867bc1..341bddfffd 100644 --- a/indra/llwindow/CMakeLists.txt +++ b/indra/llwindow/CMakeLists.txt @@ -38,7 +38,6 @@ set(llwindow_SOURCE_FILES llkeyboardheadless.cpp llwindowheadless.cpp llwindowcallbacks.cpp - llwindowlistener.cpp ) set(llwindow_HEADER_FILES @@ -48,7 +47,6 @@ set(llwindow_HEADER_FILES llkeyboardheadless.h llwindowheadless.h llwindowcallbacks.h - llwindowlistener.h ) set(viewer_SOURCE_FILES diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp index 71a5df910d..dc3a1099b1 100644 --- a/indra/llwindow/llwindow.cpp +++ b/indra/llwindow/llwindow.cpp @@ -41,8 +41,6 @@ #include "llkeyboard.h" #include "linked_lists.h" #include "llwindowcallbacks.h" -#include "llwindowlistener.h" -#include // @@ -118,17 +116,10 @@ LLWindow::LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags) mFlags(flags), mHighSurrogate(0) { - // gKeyboard is still NULL, so it doesn't do LLWindowListener any good to - // pass its value right now. Instead, pass it a nullary function that - // will, when we later need it, return the value of gKeyboard. - // boost::lambda::var() constructs such a functor on the fly. - mListener = new LLWindowListener(callbacks, boost::lambda::var(gKeyboard)); } LLWindow::~LLWindow() { - delete mListener; - mListener = NULL; } //virtual diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index 6bdc01ae88..e8a86a1880 100644 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -36,7 +36,6 @@ class LLSplashScreen; class LLPreeditor; class LLWindowCallbacks; -class LLWindowListener; // Refer to llwindow_test in test/common/llwindow for usage example @@ -189,7 +188,6 @@ protected: BOOL mHideCursorPermanent; U32 mFlags; U16 mHighSurrogate; - LLWindowListener* mListener; // Handle a UTF-16 encoding unit received from keyboard. // Converting the series of UTF-16 encoding units to UTF-32 data, diff --git a/indra/llwindow/llwindowlistener.cpp b/indra/llwindow/llwindowlistener.cpp deleted file mode 100644 index 006aaa75e7..0000000000 --- a/indra/llwindow/llwindowlistener.cpp +++ /dev/null @@ -1,234 +0,0 @@ -/** - * @file llwindowlistener.cpp - * @brief EventAPI interface for injecting input into LLWindow - * - * $LicenseInfo:firstyear=2001&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$ - */ - -#include "linden_common.h" - -#include "llwindowlistener.h" - -#include "llcoord.h" -#include "llkeyboard.h" -#include "llwindowcallbacks.h" -#include - -LLWindowListener::LLWindowListener(LLWindowCallbacks *window, const KeyboardGetter& kbgetter) - : LLEventAPI("LLWindow", "Inject input events into the LLWindow instance"), - mWindow(window), - mKbGetter(kbgetter) -{ - std::string keySomething = - "Given [\"keysym\"], [\"keycode\"] or [\"char\"], inject the specified "; - std::string keyExplain = - "(integer keycode values, or keysym string from any addKeyName() call in\n" - "http://hg.secondlife.com/viewer-development/src/tip/indra/llwindow/llkeyboard.cpp )"; - std::string mask = - "Specify optional [\"mask\"] as an array containing any of \"CTL\", \"ALT\",\n" - "\"SHIFT\" or \"MAC_CONTROL\"; the corresponding modifier bits will be combined\n" - "to form the mask used with the event."; - - std::string mouseSomething = - "Given [\"button\"], [\"x\"] and [\"y\"], inject the given mouse "; - std::string mouseExplain = - "(button values \"LEFT\", \"MIDDLE\", \"RIGHT\")"; - - add("keyDown", - keySomething + "keypress event.\n" + keyExplain + '\n' + mask, - &LLWindowListener::keyDown); - add("keyUp", - keySomething + "key release event.\n" + keyExplain + '\n' + mask, - &LLWindowListener::keyUp); - add("mouseDown", - mouseSomething + "click event.\n" + mouseExplain + '\n' + mask, - &LLWindowListener::mouseDown); - add("mouseUp", - mouseSomething + "release event.\n" + mouseExplain + '\n' + mask, - &LLWindowListener::mouseUp); - add("mouseMove", - std::string("Given [\"x\"] and [\"y\"], inject the given mouse movement event.\n") + - mask, - &LLWindowListener::mouseMove); - add("mouseScroll", - "Given an integer number of [\"clicks\"], inject the given mouse scroll event.\n" - "(positive clicks moves downward through typical content)", - &LLWindowListener::mouseScroll); -} - -template -class StringLookup -{ -private: - std::string mDesc; - typedef std::map Map; - Map mMap; - -public: - StringLookup(const std::string& desc): mDesc(desc) {} - - MAPPED lookup(const typename Map::key_type& key) const - { - typename Map::const_iterator found = mMap.find(key); - if (found == mMap.end()) - { - LL_WARNS("LLWindowListener") << "Unknown " << mDesc << " '" << key << "'" << LL_ENDL; - return MAPPED(); - } - return found->second; - } - -protected: - void add(const typename Map::key_type& key, const typename Map::mapped_type& value) - { - mMap.insert(typename Map::value_type(key, value)); - } -}; - -// helper for getMask() -static MASK lookupMask_(const std::string& maskname) -{ - // It's unclear to me whether MASK_MAC_CONTROL is important, but it's not - // supported by maskFromString(). Handle that specially. - if (maskname == "MAC_CONTROL") - { - return MASK_MAC_CONTROL; - } - else - { - // In case of lookup failure, return MASK_NONE, which won't affect our - // caller's OR. - MASK mask(MASK_NONE); - LLKeyboard::maskFromString(maskname, &mask); - return mask; - } -} - -static MASK getMask(const LLSD& event) -{ - LLSD masknames(event["mask"]); - if (! masknames.isArray()) - { - // If event["mask"] is a single string, perform normal lookup on it. - return lookupMask_(masknames); - } - - // Here event["mask"] is an array of mask-name strings. OR together their - // corresponding bits. - MASK mask(MASK_NONE); - for (LLSD::array_const_iterator ai(masknames.beginArray()), aend(masknames.endArray()); - ai != aend; ++ai) - { - mask |= lookupMask_(*ai); - } - return mask; -} - -static KEY getKEY(const LLSD& event) -{ - if (event.has("keysym")) - { - // Initialize to KEY_NONE; that way we can ignore the bool return from - // keyFromString() and, in the lookup-fail case, simply return KEY_NONE. - KEY key(KEY_NONE); - LLKeyboard::keyFromString(event["keysym"], &key); - return key; - } - else if (event.has("keycode")) - { - return KEY(event["keycode"].asInteger()); - } - else - { - return KEY(event["char"].asString()[0]); - } -} - -void LLWindowListener::keyDown(LLSD const & evt) -{ - mKbGetter()->handleTranslatedKeyDown(getKEY(evt), getMask(evt)); -} - -void LLWindowListener::keyUp(LLSD const & evt) -{ - mKbGetter()->handleTranslatedKeyUp(getKEY(evt), getMask(evt)); -} - -// for WhichButton -typedef BOOL (LLWindowCallbacks::*MouseFunc)(LLWindow *, LLCoordGL, MASK); -struct Actions -{ - Actions(const MouseFunc& d, const MouseFunc& u): down(d), up(u), valid(true) {} - Actions(): valid(false) {} - MouseFunc down, up; - bool valid; -}; - -struct WhichButton: public StringLookup -{ - WhichButton(): StringLookup("mouse button") - { - add("LEFT", Actions(&LLWindowCallbacks::handleMouseDown, - &LLWindowCallbacks::handleMouseUp)); - add("RIGHT", Actions(&LLWindowCallbacks::handleRightMouseDown, - &LLWindowCallbacks::handleRightMouseUp)); - add("MIDDLE", Actions(&LLWindowCallbacks::handleMiddleMouseDown, - &LLWindowCallbacks::handleMiddleMouseUp)); - } -}; -static WhichButton buttons; - -static LLCoordGL getPos(const LLSD& event) -{ - return LLCoordGL(event["x"].asInteger(), event["y"].asInteger()); -} - -void LLWindowListener::mouseDown(LLSD const & evt) -{ - Actions actions(buttons.lookup(evt["button"])); - if (actions.valid) - { - (mWindow->*(actions.down))(NULL, getPos(evt), getMask(evt)); - } -} - -void LLWindowListener::mouseUp(LLSD const & evt) -{ - Actions actions(buttons.lookup(evt["button"])); - if (actions.valid) - { - (mWindow->*(actions.up))(NULL, getPos(evt), getMask(evt)); - } -} - -void LLWindowListener::mouseMove(LLSD const & evt) -{ - mWindow->handleMouseMove(NULL, getPos(evt), getMask(evt)); -} - -void LLWindowListener::mouseScroll(LLSD const & evt) -{ - S32 clicks = evt["clicks"].asInteger(); - - mWindow->handleScrollWheel(NULL, clicks); -} - diff --git a/indra/llwindow/llwindowlistener.h b/indra/llwindow/llwindowlistener.h deleted file mode 100644 index 74e577ff93..0000000000 --- a/indra/llwindow/llwindowlistener.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @file llwindowlistener.h - * @brief EventAPI interface for injecting input into LLWindow - * - * $LicenseInfo:firstyear=2001&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_LLWINDOWLISTENER_H -#define LL_LLWINDOWLISTENER_H - -#include "lleventapi.h" -#include - -class LLKeyboard; -class LLWindowCallbacks; - -class LLWindowListener : public LLEventAPI -{ -public: - typedef boost::function KeyboardGetter; - LLWindowListener(LLWindowCallbacks * window, const KeyboardGetter& kbgetter); - - void keyDown(LLSD const & evt); - void keyUp(LLSD const & evt); - void mouseDown(LLSD const & evt); - void mouseUp(LLSD const & evt); - void mouseMove(LLSD const & evt); - void mouseScroll(LLSD const & evt); - -private: - LLWindowCallbacks * mWindow; - KeyboardGetter mKbGetter; -}; - - -#endif // LL_LLWINDOWLISTENER_H -- cgit v1.2.3