diff options
author | callum@lindenlab.com <callum@lindenlab.com> | 2017-03-03 15:32:47 -0800 |
---|---|---|
committer | callum@lindenlab.com <callum@lindenlab.com> | 2017-03-03 15:32:47 -0800 |
commit | 398c351371b7f1bacea3b898729a4723acc6f417 (patch) | |
tree | 3e39552816ac55b43fc244f6bd5967e75c03ee5a | |
parent | f49033efcfec6ee0df69c346c8d6e04345d5c87c (diff) |
First pass at osx/macos keyboard events - simple case like google homepage is working
-rw-r--r-- | autobuild.xml | 12 | ||||
-rw-r--r-- | indra/llwindow/llwindowmacosx.cpp | 3 | ||||
-rw-r--r-- | indra/media_plugins/cef/media_plugin_cef.cpp | 122 |
3 files changed, 28 insertions, 109 deletions
diff --git a/autobuild.xml b/autobuild.xml index e7640fd3f9..97d91b1d81 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -526,9 +526,9 @@ <key>archive</key> <map> <key>hash</key> - <string>2c0917457de94e21b9afe3b38a8dda72</string> + <string>76baeea8a3ab3ecc6499e33aa5d91eaa</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/3025/7008/dullahan-1.0.620_3.2704.1434.gec3e9ed-darwin64-503014.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/3041/7098/dullahan-1.0.620_3.2704.1434.gec3e9ed-darwin64-503028.tar.bz2</string> </map> <key>name</key> <string>darwin64</string> @@ -538,9 +538,9 @@ <key>archive</key> <map> <key>hash</key> - <string>e1c08b93444a621b886bd6efa285cc92</string> + <string>2f3f83025fdac8a4da0b1aaac5e97bef</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/3026/7014/dullahan-1.0.620_3.2704.1434.gec3e9ed-windows-503014.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/3039/7067/dullahan-1.0.620_3.2704.1434.gec3e9ed-windows-503028.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -550,9 +550,9 @@ <key>archive</key> <map> <key>hash</key> - <string>3b5a9949a150ebb77f6c065d90d648e0</string> + <string>efed705c568d01e5edefcf12989f288a</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/3027/7020/dullahan-1.0.620_3.2704.1434.gec3e9ed-windows64-503014.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/3040/7072/dullahan-1.0.620_3.2704.1434.gec3e9ed-windows64-503028.tar.bz2</string> </map> <key>name</key> <string>windows64</string> diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index 754306b5d2..d28a7f177f 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -1758,7 +1758,7 @@ void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url, bool async) LLSD LLWindowMacOSX::getNativeKeyData() { LLSD result = LLSD::emptyMap(); -#if 1 + if(mRawKeyEvent) { result["event_type"] = LLSD::Integer(mRawKeyEvent->mEventType); @@ -1768,7 +1768,6 @@ LLSD LLWindowMacOSX::getNativeKeyData() result["event_umodchars"] = (mRawKeyEvent->mEventUnmodChars) ? LLSD(LLSD::Integer(mRawKeyEvent->mEventUnmodChars)) : LLSD(); result["event_isrepeat"] = LLSD::Boolean(mRawKeyEvent->mEventRepeat); } -#endif LL_DEBUGS() << "native key data is: " << result << LL_ENDL; diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp index 33a5f32089..a511c32c73 100644 --- a/indra/media_plugins/cef/media_plugin_cef.cpp +++ b/indra/media_plugins/cef/media_plugin_cef.cpp @@ -29,6 +29,9 @@ #include "linden_common.h" #include "indra_constants.h" // for indra keyboard codes +#include <Carbon/Carbon.h> +#include <CoreServices/CoreServices.h> + #include "llgl.h" #include "llsdutil.h" #include "llplugininstance.h" @@ -39,7 +42,6 @@ #include <functional> #include "dullahan.h" -//#include "volume_catcher.h" //////////////////////////////////////////////////////////////////////////////// // @@ -74,10 +76,8 @@ private: void postDebugMessage(const std::string& msg); void authResponse(LLPluginMessage &message); - dullahan::EKeyboardModifier decodeModifiers(std::string &modifiers); - void deserializeKeyboardData(LLSD native_key_data, uint32_t& native_scan_code, uint32_t& native_virtual_key, uint32_t& native_modifiers); - void keyEvent(dullahan::EKeyEvent key_event, int key, dullahan::EKeyboardModifier modifiers, LLSD native_key_data); - void unicodeInput(const std::string &utf8str, dullahan::EKeyboardModifier modifiers, LLSD native_key_data); + void keyEvent(dullahan::EKeyEvent key_event, LLSD native_key_data); + void unicodeInput(LLSD native_key_data); void checkEditState(); void setVolume(F32 vol); @@ -647,33 +647,15 @@ void MediaPluginCEF::receiveMessage(const char* message_string) } else if (message_name == "text_event") { - std::string text = message_in.getValue("text"); - std::string modifiers = message_in.getValue("modifiers"); LLSD native_key_data = message_in.getValueLLSD("native_key_data"); - - unicodeInput(text, decodeModifiers(modifiers), native_key_data); + unicodeInput(native_key_data); } else if (message_name == "key_event") { #if LL_DARWIN std::string event = message_in.getValue("event"); - S32 key = message_in.getValueS32("key"); LLSD native_key_data = message_in.getValueLLSD("native_key_data"); -#if 0 - if (event == "down") - { - //mCEFLib->keyPress(key, true); - mCEFLib->keyboardEvent(dullahan::KE_KEY_DOWN, (uint32_t)key, 0, dullahan::KM_MODIFIER_NONE, 0, 0, 0); - - } - else if (event == "up") - { - //mCEFLib->keyPress(key, false); - mCEFLib->keyboardEvent(dullahan::KE_KEY_UP, (uint32_t)key, 0, dullahan::KM_MODIFIER_NONE, 0, 0, 0); - } -#else - // Treat unknown events as key-up for safety. dullahan::EKeyEvent key_event = dullahan::KE_KEY_UP; if (event == "down") { @@ -684,9 +666,8 @@ void MediaPluginCEF::receiveMessage(const char* message_string) key_event = dullahan::KE_KEY_REPEAT; } - keyEvent(key_event, key, dullahan::KM_MODIFIER_NONE, native_key_data); + keyEvent(key_event, native_key_data); -#endif #elif LL_WINDOWS std::string event = message_in.getValue("event"); S32 key = message_in.getValueS32("key"); @@ -704,7 +685,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string) key_event = dullahan::KE_KEY_REPEAT; } - keyEvent(key_event, key, decodeModifiers(modifiers), native_key_data); + keyEvent(key_event, native_key_data); #endif } else if (message_name == "enable_media_plugin_debugging") @@ -791,71 +772,20 @@ void MediaPluginCEF::receiveMessage(const char* message_string) } } -dullahan::EKeyboardModifier MediaPluginCEF::decodeModifiers(std::string &modifiers) -{ - int result = 0; - - if (modifiers.find("shift") != std::string::npos) - result |= dullahan::KM_MODIFIER_SHIFT; - - if (modifiers.find("alt") != std::string::npos) - result |= dullahan::KM_MODIFIER_ALT; - - if (modifiers.find("control") != std::string::npos) - result |= dullahan::KM_MODIFIER_CONTROL; - - if (modifiers.find("meta") != std::string::npos) - result |= dullahan::KM_MODIFIER_META; - - return (dullahan::EKeyboardModifier)result; -} - //////////////////////////////////////////////////////////////////////////////// // -void MediaPluginCEF::deserializeKeyboardData(LLSD native_key_data, uint32_t& native_scan_code, uint32_t& native_virtual_key, uint32_t& native_modifiers) +void MediaPluginCEF::keyEvent(dullahan::EKeyEvent key_event, LLSD native_key_data = LLSD::emptyMap()) { - native_scan_code = 0; - native_virtual_key = 0; - native_modifiers = 0; - - if (native_key_data.isMap()) - { #if LL_DARWIN - native_scan_code = (uint32_t)(native_key_data["char_code"].asInteger()); - native_virtual_key = (uint32_t)(native_key_data["key_code"].asInteger()); - native_modifiers = (uint32_t)(native_key_data["modifiers"].asInteger()); -#elif LL_WINDOWS - native_scan_code = (uint32_t)(native_key_data["scan_code"].asInteger()); - native_virtual_key = (uint32_t)(native_key_data["virtual_key"].asInteger()); - // TODO: I don't think we need to do anything with native modifiers here -- please verify -#endif - }; -}; - -//////////////////////////////////////////////////////////////////////////////// -// -void MediaPluginCEF::keyEvent(dullahan::EKeyEvent key_event, int key, dullahan::EKeyboardModifier modifiers_x, LLSD native_key_data = LLSD::emptyMap()) -{ -#if LL_DARWIN - - // if (!native_key_data.has("event_type") || - // !native_key_data.has("event_modifiers") || - // !native_key_data.has("event_keycode") || - // !native_key_data.has("event_isrepeat")) - // return; - - // uint32_t eventType = native_key_data["event_type"].asInteger(); - // if (!eventType) - // return; - // uint32_t eventModifiers = native_key_data["event_modifiers"].asInteger(); - // uint32_t eventKeycode = native_key_data["event_keycode"].asInteger(); - // char eventChars = static_cast<char>(native_key_data["event_chars"].isUndefined() ? 0 : native_key_data["event_chars"].asInteger()); - // char eventUChars = static_cast<char>(native_key_data["event_umodchars"].isUndefined() ? 0 : native_key_data["event_umodchars"].asInteger()); - // bool eventIsRepeat = native_key_data["event_isrepeat"].asBoolean(); - - // mCEFLib->keyboardEventOSX(eventType, eventModifiers, (eventChars) ? &eventChars : NULL, - // (eventUChars) ? &eventUChars : NULL, eventIsRepeat, eventKeycode); - + U32 event_modifiers = native_key_data["event_modifiers"].asInteger(); + U32 event_keycode = native_key_data["event_keycode"].asInteger(); + U32 event_chars = native_key_data["event_chars"].asInteger(); + U32 event_umodchars = native_key_data["event_umodchars"].asInteger(); + bool event_isrepeat = native_key_data["event_isrepeat"].asBoolean(); + + mCEFLib->nativeKeyboardEventOSX(key_event, event_modifiers, + event_keycode, event_chars, + event_umodchars, event_isrepeat); #elif LL_WINDOWS U32 msg = ll_U32_from_sd(native_key_data["msg"]); U32 wparam = ll_U32_from_sd(native_key_data["w_param"]); @@ -865,21 +795,11 @@ void MediaPluginCEF::keyEvent(dullahan::EKeyEvent key_event, int key, dullahan:: #endif }; -void MediaPluginCEF::unicodeInput(const std::string &utf8str, dullahan::EKeyboardModifier modifiers, LLSD native_key_data = LLSD::emptyMap()) +void MediaPluginCEF::unicodeInput(LLSD native_key_data = LLSD::emptyMap()) { #if LL_DARWIN - //mCEFLib->keyPress(utf8str[0], true); - //mCEFLib->keyboardEvent(dullahan::KE_KEY_DOWN, (uint32_t)(utf8str[0]), 0, dullahan::KM_MODIFIER_NONE, 0, 0, 0); - // if (!native_key_data.has("event_chars") || !native_key_data.has("event_umodchars") || - // !native_key_data.has("event_keycode") || !native_key_data.has("event_modifiers")) - // return; - // uint32_t unicodeChar = native_key_data["event_chars"].asInteger(); - // uint32_t unmodifiedChar = native_key_data["event_umodchars"].asInteger(); - // uint32_t keyCode = native_key_data["event_keycode"].asInteger(); - // uint32_t rawmodifiers = native_key_data["event_modifiers"].asInteger(); - - // CP removed to build mCEFLib->injectUnicodeText(unicodeChar, unmodifiedChar, keyCode, rawmodifiers); - + // code to send keys here doesn't seem to be required for Darwin - in fact, + // not having reliable key event type info here means we don't know what to send anyway #elif LL_WINDOWS U32 msg = ll_U32_from_sd(native_key_data["msg"]); U32 wparam = ll_U32_from_sd(native_key_data["w_param"]); |