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().master
parent
7590704e0e
commit
fae9c8fe86
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
Loading…
Reference in New Issue