From 5449ae73b337c026afa93e99a47b670c28c8eb80 Mon Sep 17 00:00:00 2001
From: rider <rider@lindenlab.com>
Date: Sat, 7 Nov 2015 12:09:08 -0800
Subject: MAINT-5754: Finish key modifier experiment.  Still not working.

---
 indra/llwindow/llopenglview-objc.mm          | 24 +++++++++++++++++++++++-
 indra/llwindow/llwindowmacosx.cpp            |  1 +
 indra/media_plugins/cef/media_plugin_cef.cpp | 20 ++++++++++++++++----
 3 files changed, 40 insertions(+), 5 deletions(-)

diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm
index 7bb20240d2..81e90accb7 100644
--- a/indra/llwindow/llopenglview-objc.mm
+++ b/indra/llwindow/llopenglview-objc.mm
@@ -28,6 +28,18 @@
 #include "llwindowmacosx-objc.h"
 #import "llappdelegate-objc.h"
 
+
+
+//---------------------------
+// Coppied from indra_constants.h
+//#include "indra_constats.h"
+const uint32_t MASK_CONTROL =		0x0001;		// Mapped to cmd on Macs
+const uint32_t MASK_ALT =			0x0002;
+const uint32_t MASK_SHIFT =			0x0004;
+//const uint32_t MASK_MAC_CONTROL =	0x0008;		// Un-mapped Ctrl key on Macs, not used on Windows
+
+//---------------------------
+
 @implementation NSScreen (PointConversion)
 
 + (NSScreen *)currentScreenForMouseLocation
@@ -70,7 +82,17 @@ void extractKeyDataFromEvent (NSEvent *theEvent, NativeKeyEventData * eventData)
     }
     eventData->mKeyEvent = NativeKeyEventData::KEYUNKNOWN;
     eventData->mKeyCode = [theEvent keyCode];
-    eventData->mKeyModifiers = [theEvent modifierFlags];
+
+    unsigned int modifiers = [theEvent modifierFlags];
+    
+    if (modifiers & (NSAlphaShiftKeyMask | NSShiftKeyMask))
+        modifiers |= MASK_SHIFT;
+    if (modifiers & NSAlternateKeyMask)
+        modifiers |= MASK_ALT;
+    if (modifiers & NSControlKeyMask)
+        modifiers |= MASK_CONTROL;
+    
+    eventData->mKeyModifiers = modifiers;
     eventData->mScanCode = [theEvent keyCode ];
     eventData->mKeyboardType = 0;
 }
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index 2a104c1877..7bc5d263e4 100755
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -1733,6 +1733,7 @@ LLSD LLWindowMacOSX::getNativeKeyData()
 		result["modifiers"] = (S32)(mRawKeyEvent->mKeyModifiers);
 		result["keyboard_type"] = (S32)(mRawKeyEvent->mKeyboardType);
 
+        
 #if 0
 		// This causes trouble for control characters -- apparently character codes less than 32 (escape, control-A, etc)
 		// cause llsd serialization to create XML that the llsd deserializer won't parse!
diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp
index d653aaace9..7d60c1a5ed 100644
--- a/indra/media_plugins/cef/media_plugin_cef.cpp
+++ b/indra/media_plugins/cef/media_plugin_cef.cpp
@@ -720,7 +720,7 @@ void MediaPluginCEF::deserializeKeyboardData(LLSD native_key_data, uint32_t& nat
 
 ////////////////////////////////////////////////////////////////////////////////
 //
-void MediaPluginCEF::keyEvent(LLCEFLib::EKeyEvent key_event, int key, LLCEFLib::EKeyboardModifier modifiers, LLSD native_key_data = LLSD::emptyMap())
+void MediaPluginCEF::keyEvent(LLCEFLib::EKeyEvent key_event, int key, LLCEFLib::EKeyboardModifier modifiers_x, LLSD native_key_data = LLSD::emptyMap())
 {
 #if LL_DARWIN
 	std::string utf8_text;
@@ -729,14 +729,23 @@ void MediaPluginCEF::keyEvent(LLCEFLib::EKeyEvent key_event, int key, LLCEFLib::
     uint32_t native_scan_code = native_key_data["scan_code"].asInteger();
     uint32_t native_virtual_key = native_key_data["key_code"].asInteger();
     uint32_t native_modifiers = native_key_data["modifiers"].asInteger();
-
-    
     
 	if (key < 128)
 	{
 		utf8_text = (char)native_virtual_key;
 	}
     
+    unsigned int modifers = LLCEFLib::KM_MODIFIER_NONE;
+
+    if (native_modifiers & (MASK_CONTROL | MASK_MAC_CONTROL))
+        modifers |= LLCEFLib::KM_MODIFIER_CONTROL;
+    if (native_modifiers & MASK_SHIFT)
+        modifers |= LLCEFLib::KM_MODIFIER_SHIFT;
+    if (native_modifiers & MASK_ALT)
+        modifers |= LLCEFLib::KM_MODIFIER_ALT;
+
+    //modifers |= LLCEFLib::KM_MODIFIER_META;
+    
 	switch ((KEY)key)
     
 	{
@@ -750,7 +759,10 @@ void MediaPluginCEF::keyEvent(LLCEFLib::EKeyEvent key_event, int key, LLCEFLib::
 		break;
 	}
 
-	mLLCEFLib->keyboardEvent(key_event, native_char_code, utf8_text.c_str(), native_modifiers, native_scan_code, native_virtual_key, native_modifiers);
+	mLLCEFLib->keyboardEvent(key_event, native_char_code, utf8_text.c_str(),
+            static_cast<LLCEFLib::EKeyboardModifier>(modifers),
+            native_scan_code, native_virtual_key, native_modifiers);
+    
 #elif LL_WINDOWS
 	U32 msg = ll_U32_from_sd(native_key_data["msg"]);
 	U32 wparam = ll_U32_from_sd(native_key_data["w_param"]);
-- 
cgit v1.2.3