Browse Source

Working on keyboard input

Josh Engebretson 10 years ago
parent
commit
c4593d075b

+ 49 - 1
Source/AtomicWebView/UIWebView.cpp

@@ -21,6 +21,7 @@
 //
 
 #include <Atomic/IO/Log.h>
+#include <Atomic/Input/InputEvents.h>
 #include <Atomic/UI/UIRenderer.h>
 
 #include "WebClient.h"
@@ -129,6 +130,7 @@ UIWebView::UIWebView(Context* context, const String &initialURL) : UIWidget(cont
     widget_ = new WebViewWidget();
     widget_->SetDelegate(this);
     widget_->SetGravity(WIDGET_GRAVITY_ALL);
+    widget_->SetIsFocusable(true);
     ((WebViewWidget*)widget_)->webView_ = this;
 
     UI* ui = GetSubsystem<UI>();
@@ -140,6 +142,9 @@ UIWebView::UIWebView(Context* context, const String &initialURL) : UIWidget(cont
 
     initialURL_ = initialURL;
 
+    SubscribeToEvent(E_KEYDOWN, HANDLER(UIWebView, HandleKeyDown));
+    SubscribeToEvent(E_KEYUP, HANDLER(UIWebView, HandleKeyUp));
+    SubscribeToEvent(E_TEXTINPUT, HANDLER(UIWebView, HandleTextInput));
 }
 
 UIWebView::~UIWebView()
@@ -147,6 +152,50 @@ UIWebView::~UIWebView()
 
 }
 
+void UIWebView::HandleKeyDown(StringHash eventType, VariantMap& eventData)
+{
+    if (!widget_ || !widget_->GetIsFocused())
+        return;
+
+    //if (eventData[KeyDown::P_REPEAT].GetBool())
+    //    return;
+
+    int key = eventData[KeyDown::P_KEY].GetInt();
+    int scanCode = eventData[KeyDown::P_SCANCODE].GetInt();
+    unsigned raw = eventData[KeyDown::P_RAW].GetUInt();
+    int buttons = eventData[KeyDown::P_BUTTONS].GetInt();
+    int qual = eventData[KeyDown::P_QUALIFIERS].GetInt();
+
+    webClient_->SendKeyEvent(key, false, scanCode, raw, buttons, qual);
+
+}
+
+void UIWebView::HandleKeyUp(StringHash eventType, VariantMap& eventData)
+{
+    if (!widget_ || !widget_->GetIsFocused())
+        return;
+
+    int key = eventData[KeyUp::P_KEY].GetInt();
+    int scanCode = eventData[KeyUp::P_SCANCODE].GetInt();
+    unsigned raw = eventData[KeyUp::P_RAW].GetUInt();
+    int buttons = eventData[KeyUp::P_BUTTONS].GetInt();
+    int qual = eventData[KeyUp::P_QUALIFIERS].GetInt();
+
+    webClient_->SendKeyEvent(key, true, scanCode, raw, buttons, qual);
+
+}
+
+void UIWebView::HandleTextInput(StringHash eventType, VariantMap& eventData)
+{
+    if (!widget_ || !widget_->GetIsFocused())
+        return;
+
+    String text = eventData[TextInput::P_TEXT].GetString();
+
+    webClient_->SendTextEvent(text, 0);
+
+}
+
 bool UIWebView::OnEvent(const TBWidgetEvent &ev)
 {
     if (ev.type == EVENT_TYPE_POINTER_DOWN || ev.type == EVENT_TYPE_POINTER_UP)
@@ -173,7 +222,6 @@ bool UIWebView::OnEvent(const TBWidgetEvent &ev)
         return true;
     }
 
-
     return UIWidget::OnEvent(ev);
 }
 

+ 4 - 0
Source/AtomicWebView/UIWebView.h

@@ -54,6 +54,10 @@ protected:
 
 private:
 
+    void HandleKeyDown(StringHash eventType, VariantMap& eventData);
+    void HandleKeyUp(StringHash eventType, VariantMap& eventData);
+    void HandleTextInput(StringHash eventType, VariantMap& eventData);
+
     SharedPtr<WebClient> webClient_;
     SharedPtr<WebTexture2D> webTexture_;
 

+ 2 - 15
Source/AtomicWebView/WebBrowserHost.cpp

@@ -50,23 +50,10 @@ WebBrowserHost::WebBrowserHost(Context* context) : Object (context)
 {
     const Vector<String>& arguments = GetArguments();
 
-    const char** _argv { 0 };
-
-    PODVector<const char*> argv;
-    for (unsigned i = 0; i < arguments.Size(); i++)
-        argv.Push(arguments[i].CString());
-
-    CefMainArgs args(arguments.Size(), arguments.Size() ? (char**) &argv[0] : (char **) _argv);
-
-    int result = CefExecuteProcess(args, nullptr, nullptr);
-
-    if (result >= 0)
-    {
-        LOGERROR("CEFExecuteProcess - Error");
-    }
+    const char* _argv[3] = { "", "--enable-media-stream", "--enable-usermedia-screen-capturing" };
+    CefMainArgs args(3, (char**) &_argv);
 
     CefSettings settings;
-
     settings.windowless_rendering_enabled = true;
 
     // If losing OSX system menu, it means we're calling this

+ 93 - 1
Source/AtomicWebView/WebClient.cpp

@@ -9,7 +9,6 @@
 #include <ThirdParty/CEF/include/base/cef_bind.h>
 #include <ThirdParty/CEF/include/wrapper/cef_closure_task.h>
 
-
 #include <Atomic/Core/ProcessUtils.h>
 #include <Atomic/Core/CoreEvents.h>
 #include <Atomic/IO/Log.h>
@@ -20,6 +19,8 @@
 #include "WebBrowserHost.h"
 #include "WebClient.h"
 
+#include "WebKeyboardSDL.h"
+
 namespace Atomic
 {
 
@@ -229,7 +230,98 @@ void WebClient::SendMouseWheelEvent(int x, int y, unsigned modifier,int deltaX,
 
 }
 
+/*
+
+  EVENTFLAG_CAPS_LOCK_ON        = 1 << 0,
+  EVENTFLAG_SHIFT_DOWN          = 1 << 1,
+  EVENTFLAG_CONTROL_DOWN        = 1 << 2,
+  EVENTFLAG_ALT_DOWN            = 1 << 3,
+  EVENTFLAG_LEFT_MOUSE_BUTTON   = 1 << 4,
+  EVENTFLAG_MIDDLE_MOUSE_BUTTON = 1 << 5,
+  EVENTFLAG_RIGHT_MOUSE_BUTTON  = 1 << 6,
+  // Mac OS-X command key.
+  EVENTFLAG_COMMAND_DOWN        = 1 << 7,
+  EVENTFLAG_NUM_LOCK_ON         = 1 << 8,
+  EVENTFLAG_IS_KEY_PAD          = 1 << 9,
+  EVENTFLAG_IS_LEFT             = 1 << 10,
+  EVENTFLAG_IS_RIGHT            = 1 << 11,
+} cef_event_flags_t;
+
+*/
+void WebClient::SendKeyEvent(int key, bool keyUp, int scanCode, unsigned raw, int buttons, int qual)
+{
+    if (!d_->browser_.get())
+        return;
+
+    CefRefPtr<CefBrowserHost> host = d_->browser_->GetHost();
+    CefKeyEvent keyEvent;
+
+    // handle return special
+    if (scanCode == SDL_SCANCODE_RETURN)
+    {
+        if (keyUp)
+            return;
 
+        keyEvent.type = KEYEVENT_CHAR;
+        keyEvent.character = 13;
+        keyEvent.unmodified_character = 13;
+        host->SendKeyEvent(keyEvent);
+        return;
+    }
+
+    unsigned modifiers = EVENTFLAG_NONE;
+
+    if (qual & QUAL_SHIFT)
+        modifiers |= EVENTFLAG_SHIFT_DOWN;
+    if (qual & QUAL_ALT)
+        modifiers |= EVENTFLAG_ALT_DOWN;
+    if (qual & QUAL_CTRL)
+        modifiers |= EVENTFLAG_CONTROL_DOWN;
+
+#ifdef ATOMIC_PLATFORM_OSX
+    Input* input = GetSubsystem<Input>();
+    if (input->GetKeyDown(KEY_LGUI) || input->GetKeyDown(KEY_RGUI))
+    {
+        modifiers |= EVENTFLAG_COMMAND_DOWN;
+    }
+#endif
+
+    keyEvent.modifiers = modifiers;
+
+    int nativeKeyCode = GetNativeKeyFromSDLScanCode(scanCode);
+
+    if (nativeKeyCode == -1)
+        return;
+
+    /*
+    target->type = src->type;
+    target->modifiers = src->modifiers;
+    target->windows_key_code = src->windows_key_code;
+    target->native_key_code = src->native_key_code;
+    target->is_system_key = src->is_system_key;
+    target->character = src->character;
+    target->unmodified_character = src->unmodified_character;
+    */
+
+    keyEvent.type = keyUp ? KEYEVENT_KEYUP : KEYEVENT_KEYDOWN;
+    keyEvent.native_key_code = nativeKeyCode;
+    host->SendKeyEvent(keyEvent);
+
+}
+
+void WebClient::SendTextEvent(const String& text, unsigned modifiers)
+{
+    if (!d_->browser_.get())
+        return;
+
+    CefRefPtr<CefBrowserHost> host = d_->browser_->GetHost();
+
+    CefKeyEvent keyEvent;
+    keyEvent.type = KEYEVENT_CHAR;
+    keyEvent.character = text[0];
+
+    host->SendKeyEvent(keyEvent);
+}
 
 void WebClient::WasResized()
 {

+ 4 - 0
Source/AtomicWebView/WebClient.h

@@ -38,6 +38,10 @@ public:
     void SendMouseMoveEvent(int x, int y, unsigned modifier, bool mouseLeave = false) const;
     void SendMouseWheelEvent(int x, int y, unsigned modifier, int deltaX, int deltaY) const;
 
+    void SendTextEvent(const String& text, unsigned modifiers);
+
+    void SendKeyEvent(int key, bool keyUp, int scanCode, unsigned raw, int buttons, int qual);
+
 private:
 
     void WasResized();

+ 43 - 0
Source/AtomicWebView/WebKeyboardSDL.cpp

@@ -0,0 +1,43 @@
+#include <SDL/include/SDL_keycode.h>
+
+#include "WebKeyboardSDL.h"
+
+namespace Atomic
+{
+
+int GetNativeKeyFromSDLScanCode(int scancode)
+{
+#ifdef ATOMIC_PLATFORM_OSX
+    // see scancodes_darwin.h in the SDL sources
+    if (scancode == SDL_SCANCODE_RETURN)
+        return 36;
+    if (scancode == SDL_SCANCODE_LEFT)
+        return 123;
+    if (scancode == SDL_SCANCODE_RIGHT)
+        return 124;
+    if (scancode == SDL_SCANCODE_DOWN)
+        return 125;
+    if (scancode == SDL_SCANCODE_UP)
+        return 126;
+    if (scancode == SDL_SCANCODE_DELETE)
+        return 117;
+    if (scancode == SDL_SCANCODE_BACKSPACE)
+        return 51;
+    if (scancode == SDL_SCANCODE_RGUI)
+        return 54;
+    if (scancode == SDL_SCANCODE_LGUI)
+        return 55;
+    if (scancode == SDL_SCANCODE_Z)
+        return 6;
+
+    return -1;
+
+#else
+
+    return -1;
+
+#endif
+
+}
+
+}

+ 10 - 0
Source/AtomicWebView/WebKeyboardSDL.h

@@ -0,0 +1,10 @@
+
+#pragma once
+
+namespace Atomic
+{
+
+/// Get the native key for a given scancode, return -1 if unknown
+int GetNativeKeyFromSDLScanCode(int scancode);
+
+}