Passing keyboard input
Focusing a WebView
Any time you interact with a WebView (with a keyboard or mouse),
you should first make sure the WebView is focused by calling
WebView::focus. If you forget to do this, textboxes
may not behave correctly (e.g., text carets and selection
indicators may not display).
Similarly, to remove focus from a WebView, you should call
WebView::unfocus.
Passing keyboard events to a WebView
To pass keyboard input to a WebView, you will generally need to
create a WebKeyboardEvent and then pass it to your
WebView by calling WebView::injectKeyboardEvent. There
are a couple of ways to create a WebKeyboardEvent, depending on
your platform and input library:
Creating a WebKeyboardEvent from a MSG on Windows
If you are using a native Windows message loop to handle input in your application, you can create a WebKeyboardEvent directly from a MSG structure. Here's an example:
MSG msg;
while(PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE))
{
switch(msg.message)
{
case WM_KEYDOWN:
case WM_KEYUP:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
case WM_CHAR:
case WM_IMECHAR:
case WM_SYSCHAR:
{
Awesomium::WebKeyboardEvent keyEvent(msg.message, msg.wParam, msg.lParam);
myWebView->injectKeyboardEvent(keyEvent);
break;
}
default:
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
Creating a WebKeyboardEvent from an NSEvent on Mac OSX
If you're using Cocoa to manage your event-handling in your Mac
OSX application, you can create a WebKeyboardEvent directly from an
NSEvent with an event type of
NSKeyDown, NSKeyUp, or
NSFlagsChanged.
See this article for help handling key events in Cocoa.
Creating a WebKeyboardEvent from an SDL event
Here's a bit of utility code that generates a WebKeyboardEvent directly from an SDL Key Event and injects it into a certain WebView:
// Forward declaration, defined below
int getWebKeyFromSDLKey(SDLKey key);
/**
* This utility function generates a WebKeyboardEvent directly from an SDL
* Key Event and injects it into a certain WebView.
*
* @param webView The WebView that will receive the event.
* @param event The SDL Event (of type SDL_KEYDOWN or SDL_KEYUP).
*/
void injectSDLKeyEvent(Awesomium::WebView* webView, const SDL_Event& event)
{
if(!(event.type == SDL_KEYDOWN || event.type == SDL_KEYUP))
return;
Awesomium::WebKeyboardEvent keyEvent;
keyEvent.type = event.type == SDL_KEYDOWN?
Awesomium::WebKeyboardEvent::TYPE_KEY_DOWN :
Awesomium::WebKeyboardEvent::TYPE_KEY_UP;
char* buf = new char[20];
keyEvent.virtualKeyCode = getWebKeyFromSDLKey(event.key.keysym.sym);
Awesomium::getKeyIdentifierFromVirtualKeyCode(keyEvent.virtualKeyCode,
&buf);
strcpy(keyEvent.keyIdentifier, buf);
delete[] buf;
keyEvent.modifiers = 0;
if(event.key.keysym.mod & KMOD_LALT || event.key.keysym.mod & KMOD_RALT)
keyEvent.modifiers |= Awesomium::WebKeyboardEvent::MOD_ALT_KEY;
if(event.key.keysym.mod & KMOD_LCTRL || event.key.keysym.mod & KMOD_RCTRL)
keyEvent.modifiers |= Awesomium::WebKeyboardEvent::MOD_CONTROL_KEY;
if(event.key.keysym.mod & KMOD_LMETA || event.key.keysym.mod & KMOD_RMETA)
keyEvent.modifiers |= Awesomium::WebKeyboardEvent::MOD_META_KEY;
if(event.key.keysym.mod & KMOD_LSHIFT || event.key.keysym.mod & KMOD_RSHIFT)
keyEvent.modifiers |= Awesomium::WebKeyboardEvent::MOD_SHIFT_KEY;
if(event.key.keysym.mod & KMOD_NUM)
keyEvent.modifiers |= Awesomium::WebKeyboardEvent::MOD_IS_KEYPAD;
keyEvent.nativeKeyCode = event.key.keysym.scancode;
if(event.type == SDL_KEYUP)
{
webView->injectKeyboardEvent(keyEvent);
}
else
{
unsigned int chr;
if((event.key.keysym.unicode & 0xFF80) == 0)
chr = event.key.keysym.unicode & 0x7F;
else
chr = event.key.keysym.unicode;
keyEvent.text[0] = chr;
keyEvent.unmodifiedText[0] = chr;
webView->injectKeyboardEvent(keyEvent);
if(chr)
{
keyEvent.type = Awesomium::WebKeyboardEvent::TYPE_CHAR;
keyEvent.virtualKeyCode = chr;
keyEvent.nativeKeyCode = chr;
webView->injectKeyboardEvent(keyEvent);
}
}
}
// A helper macro, used in 'getWebKeyFromSDLKey'
#define mapKey(a, b) case SDLK_##a: return Awesomium::KeyCodes::AK_##b;
// Translates an SDLKey virtual key code to an Awesomium key code
int getWebKeyFromSDLKey(SDLKey key)
{
switch(key)
{
mapKey(BACKSPACE, BACK)
mapKey(TAB, TAB)
mapKey(CLEAR, CLEAR)
mapKey(RETURN, RETURN)
mapKey(PAUSE, PAUSE)
mapKey(ESCAPE, ESCAPE)
mapKey(SPACE, SPACE)
mapKey(EXCLAIM, 1)
mapKey(QUOTEDBL, 2)
mapKey(HASH, 3)
mapKey(DOLLAR, 4)
mapKey(AMPERSAND, 7)
mapKey(QUOTE, OEM_7)
mapKey(LEFTPAREN, 9)
mapKey(RIGHTPAREN, 0)
mapKey(ASTERISK, 8)
mapKey(PLUS, OEM_PLUS)
mapKey(COMMA, OEM_COMMA)
mapKey(MINUS, OEM_MINUS)
mapKey(PERIOD, OEM_PERIOD)
mapKey(SLASH, OEM_2)
mapKey(0, 0)
mapKey(1, 1)
mapKey(2, 2)
mapKey(3, 3)
mapKey(4, 4)
mapKey(5, 5)
mapKey(6, 6)
mapKey(7, 7)
mapKey(8, 8)
mapKey(9, 9)
mapKey(COLON, OEM_1)
mapKey(SEMICOLON, OEM_1)
mapKey(LESS, OEM_COMMA)
mapKey(EQUALS, OEM_PLUS)
mapKey(GREATER, OEM_PERIOD)
mapKey(QUESTION, OEM_2)
mapKey(AT, 2)
mapKey(LEFTBRACKET, OEM_4)
mapKey(BACKSLASH, OEM_5)
mapKey(RIGHTBRACKET, OEM_6)
mapKey(CARET, 6)
mapKey(UNDERSCORE, OEM_MINUS)
mapKey(BACKQUOTE, OEM_3)
mapKey(a, A)
mapKey(b, B)
mapKey(c, C)
mapKey(d, D)
mapKey(e, E)
mapKey(f, F)
mapKey(g, G)
mapKey(h, H)
mapKey(i, I)
mapKey(j, J)
mapKey(k, K)
mapKey(l, L)
mapKey(m, M)
mapKey(n, N)
mapKey(o, O)
mapKey(p, P)
mapKey(q, Q)
mapKey(r, R)
mapKey(s, S)
mapKey(t, T)
mapKey(u, U)
mapKey(v, V)
mapKey(w, W)
mapKey(x, X)
mapKey(y, Y)
mapKey(z, Z)
mapKey(DELETE, DELETE)
mapKey(KP0, NUMPAD0)
mapKey(KP1, NUMPAD1)
mapKey(KP2, NUMPAD2)
mapKey(KP3, NUMPAD3)
mapKey(KP4, NUMPAD4)
mapKey(KP5, NUMPAD5)
mapKey(KP6, NUMPAD6)
mapKey(KP7, NUMPAD7)
mapKey(KP8, NUMPAD8)
mapKey(KP9, NUMPAD9)
mapKey(KP_PERIOD, DECIMAL)
mapKey(KP_DIVIDE, DIVIDE)
mapKey(KP_MULTIPLY, MULTIPLY)
mapKey(KP_MINUS, SUBTRACT)
mapKey(KP_PLUS, ADD)
mapKey(KP_ENTER, SEPARATOR)
mapKey(KP_EQUALS, UNKNOWN)
mapKey(UP, UP)
mapKey(DOWN, DOWN)
mapKey(RIGHT, RIGHT)
mapKey(LEFT, LEFT)
mapKey(INSERT, INSERT)
mapKey(HOME, HOME)
mapKey(END, END)
mapKey(PAGEUP, PRIOR)
mapKey(PAGEDOWN, NEXT)
mapKey(F1, F1)
mapKey(F2, F2)
mapKey(F3, F3)
mapKey(F4, F4)
mapKey(F5, F5)
mapKey(F6, F6)
mapKey(F7, F7)
mapKey(F8, F8)
mapKey(F9, F9)
mapKey(F10, F10)
mapKey(F11, F11)
mapKey(F12, F12)
mapKey(F13, F13)
mapKey(F14, F14)
mapKey(F15, F15)
mapKey(NUMLOCK, NUMLOCK)
mapKey(CAPSLOCK, CAPITAL)
mapKey(SCROLLOCK, SCROLL)
mapKey(RSHIFT, RSHIFT)
mapKey(LSHIFT, LSHIFT)
mapKey(RCTRL, RCONTROL)
mapKey(LCTRL, LCONTROL)
mapKey(RALT, RMENU)
mapKey(LALT, LMENU)
mapKey(RMETA, LWIN)
mapKey(LMETA, RWIN)
mapKey(LSUPER, LWIN)
mapKey(RSUPER, RWIN)
mapKey(MODE, MODECHANGE)
mapKey(COMPOSE, ACCEPT)
mapKey(HELP, HELP)
mapKey(PRINT, SNAPSHOT)
mapKey(SYSREQ, EXECUTE)
default: return Awesomium::KeyCodes::AK_UNKNOWN;
}
}
Creating a WebKeyboardEvent from some other event
Similar to the SDL-based example above, you will need to create
an empty WebKeyboardEvent and initialize its members yourself. See
WebKeyboardEvent.h for more information.