diff options
| author | Monroe Linden <monroe@lindenlab.com> | 2010-01-18 17:58:12 -0800 | 
|---|---|---|
| committer | Monroe Linden <monroe@lindenlab.com> | 2010-01-18 17:58:12 -0800 | 
| commit | fae9c8fe864278b20dfdb7caae3fbc50c779947b (patch) | |
| tree | b85532991ef5ec3d87769aeab053c52918e36089 /indra | |
| parent | 7590704e0e93b48f897c47dba07916efebd95274 (diff) | |
Added getNativeKeyData() function to LLWindow and LLWindowMacOSX.
Added an LLSD argument to LLPluginClassMedia::keyEvent() and LLPluginClassMedia::textInput() which contains the native key data.
Made LLViewerMediaImpl retrieve the native key data and pass it to keyEvent and textInput.
Added a native_key_data parameter to the text_event and key_event messages.
Made the webkit plugin extract the native_key_data parameter and pass it to the internal keyEvent() and unicodeInput() functions.
Fixed LLMediaPluginTest to match function signature change to LLPluginClassMedia::keyEvent().
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llplugin/llpluginclassmedia.cpp | 6 | ||||
| -rw-r--r-- | indra/llplugin/llpluginclassmedia.h | 4 | ||||
| -rw-r--r-- | indra/llwindow/llwindow.h | 4 | ||||
| -rw-r--r-- | indra/llwindow/llwindowmacosx.cpp | 69 | ||||
| -rw-r--r-- | indra/llwindow/llwindowmacosx.h | 5 | ||||
| -rw-r--r-- | indra/media_plugins/webkit/media_plugin_webkit.cpp | 14 | ||||
| -rw-r--r-- | indra/newview/llviewermedia.cpp | 12 | ||||
| -rw-r--r-- | indra/test_apps/llplugintest/llmediaplugintest.cpp | 4 | 
8 files changed, 103 insertions, 15 deletions
| diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index 3d2eaed5c5..609e198db2 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -469,7 +469,7 @@ void LLPluginClassMedia::mouseEvent(EMouseEventType type, int button, int x, int  	sendMessage(message);  } -bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifiers) +bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data)  {  	bool result = true; @@ -526,6 +526,7 @@ bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifie  		message.setValueS32("key", key_code);  		message.setValue("modifiers", translateModifiers(modifiers)); +		message.setValueLLSD("native_key_data", native_key_data);  		sendMessage(message);  	} @@ -544,12 +545,13 @@ void LLPluginClassMedia::scrollEvent(int x, int y, MASK modifiers)  	sendMessage(message);  } -bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers) +bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers, LLSD native_key_data)  {  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "text_event");  	message.setValue("text", text);  	message.setValue("modifiers", translateModifiers(modifiers)); +	message.setValueLLSD("native_key_data", native_key_data);  	sendMessage(message); diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index ebb9099576..58e91fa0b4 100644 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -114,12 +114,12 @@ public:  		KEY_EVENT_REPEAT  	}EKeyEventType; -	bool keyEvent(EKeyEventType type, int key_code, MASK modifiers); +	bool keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data);  	void scrollEvent(int x, int y, MASK modifiers);  	// Text may be unicode (utf8 encoded) -	bool textInput(const std::string &text, MASK modifiers); +	bool textInput(const std::string &text, MASK modifiers, LLSD native_key_data);  	void loadURI(const std::string &uri); diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index 127dbf45e0..55b221e716 100644 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -37,6 +37,7 @@  #include "llcoord.h"  #include "llstring.h"  #include "llcursortypes.h" +#include "llsd.h"  class LLSplashScreen;  class LLPreeditor; @@ -162,6 +163,9 @@ public:  	virtual void spawnWebBrowser(const std::string& escaped_url) {};  	static std::vector<std::string> getDynamicFallbackFontList(); +	 +	// Provide native key event data +	virtual LLSD getNativeKeyData() { return LLSD::emptyMap(); }  protected:  	LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags); diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index ed62faece6..84105ef126 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -260,6 +260,7 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,  	mTSMScriptCode = 0;  	mTSMLangCode = 0;  	mPreeditor = NULL; +	mRawKeyEvent = NULL;  	mFSAASamples = fsaa_samples;  	mForceRebuild = FALSE; @@ -2135,10 +2136,11 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e  				{  					UInt32 modifiers = 0; +  					// First, process the raw event.  					{ -						EventRef rawEvent; - +						EventRef rawEvent = NULL; +						  						// Get the original event and extract the modifier keys, so we can ignore command-key events.  						if (GetEventParameter(event, kEventParamTextInputSendKeyboardEvent, typeEventRef, NULL, sizeof(rawEvent), NULL, &rawEvent) == noErr)  						{ @@ -2147,6 +2149,9 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e  							// and call this function recursively to handle the raw key event.  							eventHandler (myHandler, rawEvent); +							 +							// save the raw event until we're done processing the unicode input as well. +							mRawKeyEvent = rawEvent;  						}  					} @@ -2200,6 +2205,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e  						delete[] buffer;  					} +					mRawKeyEvent = NULL;  					result = err;  				}  				break; @@ -2274,6 +2280,9 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e  			GetEventParameter (event, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &keyCode);  			GetEventParameter (event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers); +			// save the raw event so getNativeKeyData can use it. +			mRawKeyEvent = event; +  			//			printf("key event, key code = 0x%08x, char code = 0x%02x (%c), modifiers = 0x%08x\n", keyCode, charCode, (char)charCode, modifiers);  			//			fflush(stdout); @@ -2369,6 +2378,8 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e  				result = eventNotHandledErr;  				break;  			} +			 +			mRawKeyEvent = NULL;  		}  		break; @@ -3201,6 +3212,60 @@ void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url)  	}  } +LLSD LLWindowMacOSX::getNativeKeyData() +{ +	LLSD result = LLSD::emptyMap(); +	 +	if(mRawKeyEvent) +	{ +		char char_code = 0; +		UInt32 key_code = 0; +		UInt32 modifiers = 0; +		UInt32 keyboard_type = 0; +		 +		GetEventParameter (mRawKeyEvent, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &char_code); +		GetEventParameter (mRawKeyEvent, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &key_code); +		GetEventParameter (mRawKeyEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers); +		GetEventParameter (mRawKeyEvent, kEventParamKeyboardType, typeUInt32, NULL, sizeof(UInt32), NULL, &keyboard_type); + +		result["char_code"] = (S32)char_code; +		result["key_code"] = (S32)key_code; +		result["modifiers"] = (S32)modifiers; +		result["keyboard_type"] = (S32)keyboard_type; +		 +#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! +		std::string unicode; +		OSStatus err = noErr; +		EventParamType actualType = typeUTF8Text; +		UInt32 actualSize = 0; +		char *buffer = NULL; +		 +		err = GetEventParameter (mRawKeyEvent, kEventParamKeyUnicodes, typeUTF8Text, &actualType, 0, &actualSize, NULL); +		if(err == noErr) +		{ +			// allocate a buffer and get the actual data. +			buffer = new char[actualSize]; +			err = GetEventParameter (mRawKeyEvent, kEventParamKeyUnicodes, typeUTF8Text, &actualType, actualSize, &actualSize, buffer); +			if(err == noErr) +			{ +				unicode.assign(buffer, actualSize); +			} +			delete[] buffer; +		} +		 +		result["unicode"] = unicode; +#endif + +	} + + +	lldebugs << "native key data is: " << result << llendl; +	 +	return result; +} +  BOOL LLWindowMacOSX::dialogColorPicker( F32 *r, F32 *g, F32 *b)  { diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index fbfa07fab4..7f27c64712 100644 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -119,6 +119,10 @@ public:  	static std::vector<std::string> getDynamicFallbackFontList(); +	// Provide native key event data +	/*virtual*/ LLSD getNativeKeyData(); + +  protected:  	LLWindowMacOSX(LLWindowCallbacks* callbacks,  		const std::string& title, const std::string& name, int x, int y, int width, int height, U32 flags, @@ -208,6 +212,7 @@ protected:  	friend class LLWindowManager;  	static WindowRef sMediaWindow; +	EventRef 	mRawKeyEvent;  }; diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index 084cdd9561..3248f1dab5 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -464,7 +464,7 @@ private:  	////////////////////////////////////////////////////////////////////////////////  	// -	void keyEvent(LLQtWebKit::EKeyEvent key_event, int key, LLQtWebKit::EKeyboardModifier modifiers) +	void keyEvent(LLQtWebKit::EKeyEvent key_event, int key, LLQtWebKit::EKeyboardModifier modifiers, LLSD native_key_data = LLSD::emptyMap())  	{  		int llqt_key; @@ -515,6 +515,8 @@ private:  		}  //		std::cerr << "keypress, original code = 0x" << std::hex << key << ", converted code = 0x" << std::hex << llqt_key << std::dec << std::endl; + +		std::cerr << "key event " << (int)key_event << ", native_key_data = " << native_key_data << std::endl;  		if(llqt_key != 0)  		{ @@ -526,10 +528,12 @@ private:  	////////////////////////////////////////////////////////////////////////////////  	// -	void unicodeInput( const std::string &utf8str, LLQtWebKit::EKeyboardModifier modifiers) +	void unicodeInput( const std::string &utf8str, LLQtWebKit::EKeyboardModifier modifiers, LLSD native_key_data = LLSD::emptyMap())  	{  		LLWString wstr = utf8str_to_wstring(utf8str); +		std::cerr << "unicode input, native_key_data = " << native_key_data << std::endl; +		  		unsigned int i;  		for(i=0; i < wstr.size(); i++)  		{ @@ -843,6 +847,7 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  				std::string event = message_in.getValue("event");  				S32 key = message_in.getValueS32("key");  				std::string modifiers = message_in.getValue("modifiers"); +				LLSD native_key_data = message_in.getValueLLSD("native_key_data");  				// Treat unknown events as key-up for safety.  				LLQtWebKit::EKeyEvent key_event = LLQtWebKit::KE_KEY_UP; @@ -855,14 +860,15 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  					key_event = LLQtWebKit::KE_KEY_REPEAT;  				} -				keyEvent(key_event, key, decodeModifiers(modifiers)); +				keyEvent(key_event, key, decodeModifiers(modifiers), native_key_data);  			}  			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)); +				unicodeInput(text, decodeModifiers(modifiers), native_key_data);  			}  			if(message_name == "edit_cut")  			{ diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index ef596f9297..86fbecf4fa 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -57,6 +57,7 @@  #include "llkeyboard.h"  #include "llmutelist.h"  //#include "llfirstuse.h" +#include "llwindow.h"  #include <boost/bind.hpp>	// for SkinFolder listener  #include <boost/signals2.hpp> @@ -1824,9 +1825,12 @@ bool LLViewerMediaImpl::handleKeyHere(KEY key, MASK mask)  		if(!result)  		{ -			result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_DOWN ,key, mask); +			 +			LLSD native_key_data = gViewerWindow->getWindow()->getNativeKeyData(); +			 +			result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_DOWN ,key, mask, native_key_data);  			// Since the viewer internal event dispatching doesn't give us key-up events, simulate one here. -			(void)mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_UP ,key, mask); +			(void)mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_UP ,key, mask, native_key_data);  		}  	} @@ -1844,7 +1848,9 @@ bool LLViewerMediaImpl::handleUnicodeCharHere(llwchar uni_char)  		if (uni_char >= 32 // discard 'control' characters  			&& uni_char != 127) // SDL thinks this is 'delete' - yuck.  		{ -			mMediaSource->textInput(wstring_to_utf8str(LLWString(1, uni_char)), gKeyboard->currentMask(FALSE)); +			LLSD native_key_data = gViewerWindow->getWindow()->getNativeKeyData(); +			 +			mMediaSource->textInput(wstring_to_utf8str(LLWString(1, uni_char)), gKeyboard->currentMask(FALSE), native_key_data);  		}  	} diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp index d183aac208..0ff53f3e00 100644 --- a/indra/test_apps/llplugintest/llmediaplugintest.cpp +++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp @@ -1169,8 +1169,8 @@ void LLMediaPluginTest::keyboard( int key )  		exit( 0 );  	}; -	mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_DOWN, key, 0 ); -	mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_UP, key, 0 ); +	mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_DOWN, key, 0 , LLSD()); +	mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_UP, key, 0, LLSD());  };  //////////////////////////////////////////////////////////////////////////////// | 
