Browse Source

UIWebView keyboard improvements & shortcuts (WIP)

Josh Engebretson 10 years ago
parent
commit
3cc7e54028

+ 104 - 6
Source/AtomicWebView/UIWebView.cpp

@@ -22,6 +22,7 @@
 
 
 #include <Atomic/IO/Log.h>
 #include <Atomic/IO/Log.h>
 #include <Atomic/Input/InputEvents.h>
 #include <Atomic/Input/InputEvents.h>
+#include <Atomic/Input/Input.h>
 #include <Atomic/UI/UIRenderer.h>
 #include <Atomic/UI/UIRenderer.h>
 
 
 #include "WebClient.h"
 #include "WebClient.h"
@@ -142,8 +143,8 @@ UIWebView::UIWebView(Context* context, const String &initialURL) : UIWidget(cont
 
 
     initialURL_ = initialURL;
     initialURL_ = initialURL;
 
 
-    SubscribeToEvent(E_KEYDOWN, HANDLER(UIWebView, HandleKeyDown));
-    SubscribeToEvent(E_KEYUP, HANDLER(UIWebView, HandleKeyUp));
+    //SubscribeToEvent(E_KEYDOWN, HANDLER(UIWebView, HandleKeyDown));
+    //SubscribeToEvent(E_KEYUP, HANDLER(UIWebView, HandleKeyUp));
     SubscribeToEvent(E_TEXTINPUT, HANDLER(UIWebView, HandleTextInput));
     SubscribeToEvent(E_TEXTINPUT, HANDLER(UIWebView, HandleTextInput));
 }
 }
 
 
@@ -166,7 +167,7 @@ void UIWebView::HandleKeyDown(StringHash eventType, VariantMap& eventData)
     int buttons = eventData[KeyDown::P_BUTTONS].GetInt();
     int buttons = eventData[KeyDown::P_BUTTONS].GetInt();
     int qual = eventData[KeyDown::P_QUALIFIERS].GetInt();
     int qual = eventData[KeyDown::P_QUALIFIERS].GetInt();
 
 
-    webClient_->SendKeyEvent(key, false, scanCode, raw, buttons, qual);
+    webClient_->SendKeyEvent(scanCode, qual, false);
 
 
 }
 }
 
 
@@ -181,7 +182,7 @@ void UIWebView::HandleKeyUp(StringHash eventType, VariantMap& eventData)
     int buttons = eventData[KeyUp::P_BUTTONS].GetInt();
     int buttons = eventData[KeyUp::P_BUTTONS].GetInt();
     int qual = eventData[KeyUp::P_QUALIFIERS].GetInt();
     int qual = eventData[KeyUp::P_QUALIFIERS].GetInt();
 
 
-    webClient_->SendKeyEvent(key, true, scanCode, raw, buttons, qual);
+    webClient_->SendKeyEvent(scanCode, qual, true);
 
 
 }
 }
 
 
@@ -196,6 +197,69 @@ void UIWebView::HandleTextInput(StringHash eventType, VariantMap& eventData)
 
 
 }
 }
 
 
+bool UIWebView::HandleKeyEvent(const TBWidgetEvent &ev, bool keyDown)
+{
+    if (!keyDown)
+        return true;
+
+    if (ev.special_key == TB_KEY_UNDEFINED)
+        return true;
+
+    int qual = 0;
+
+    if (ev.modifierkeys & TB_CTRL)
+        qual |= QUAL_CTRL;
+    if (ev.modifierkeys & TB_SHIFT)
+        qual |= QUAL_SHIFT;
+    if (ev.modifierkeys & TB_ALT)
+        qual |= QUAL_ALT;
+
+    int scanCode = SDL_SCANCODE_UNKNOWN;
+
+    switch (ev.special_key)
+    {
+    case TB_KEY_UP:
+        scanCode = SDL_SCANCODE_UP;
+        break;
+    case TB_KEY_DOWN:
+        scanCode = SDL_SCANCODE_DOWN;
+        break;
+    case TB_KEY_RIGHT:
+        scanCode = SDL_SCANCODE_RIGHT;
+        break;
+    case TB_KEY_LEFT:
+        scanCode = SDL_SCANCODE_LEFT;
+        break;
+    case TB_KEY_ENTER:
+        scanCode = SDL_SCANCODE_RETURN;
+        break;
+    case TB_KEY_DELETE:
+    case TB_KEY_BACKSPACE:
+        scanCode = SDL_SCANCODE_BACKSPACE;
+        break;
+    default:
+        break;
+    }
+
+    if (scanCode == SDL_SCANCODE_UNKNOWN)
+        return true;
+
+    webClient_->SendKeyEvent(scanCode, qual, !keyDown);
+
+    return true;
+
+    /*
+    TB_KEY_UNDEFINED = 0,
+    TB_KEY_UP, TB_KEY_DOWN, TB_KEY_LEFT, TB_KEY_RIGHT,
+    TB_KEY_PAGE_UP, TB_KEY_PAGE_DOWN, TB_KEY_HOME, TB_KEY_END,
+    TB_KEY_TAB, TB_KEY_BACKSPACE, TB_KEY_INSERT, TB_KEY_DELETE,
+    TB_KEY_ENTER, TB_KEY_ESC,
+    TB_KEY_F1, TB_KEY_F2, TB_KEY_F3, TB_KEY_F4, TB_KEY_F5, TB_KEY_F6,
+    TB_KEY_F7, TB_KEY_F8, TB_KEY_F9, TB_KEY_F10, TB_KEY_F11, TB_KEY_F12
+    */
+
+}
+
 bool UIWebView::OnEvent(const TBWidgetEvent &ev)
 bool UIWebView::OnEvent(const TBWidgetEvent &ev)
 {
 {
     if (ev.type == EVENT_TYPE_POINTER_DOWN || ev.type == EVENT_TYPE_POINTER_UP)
     if (ev.type == EVENT_TYPE_POINTER_DOWN || ev.type == EVENT_TYPE_POINTER_UP)
@@ -215,11 +279,45 @@ bool UIWebView::OnEvent(const TBWidgetEvent &ev)
     }
     }
     else if (ev.type == EVENT_TYPE_KEY_DOWN)
     else if (ev.type == EVENT_TYPE_KEY_DOWN)
     {
     {
-        return true;
+        return HandleKeyEvent(ev, true);
     }
     }
     else if (ev.type == EVENT_TYPE_KEY_UP)
     else if (ev.type == EVENT_TYPE_KEY_UP)
     {
     {
-        return true;
+        return HandleKeyEvent(ev, false);
+    }
+    else if (ev.type == EVENT_TYPE_SHORTCUT)
+    {
+        if (ev.ref_id == TBIDC("copy"))
+        {
+            webClient_->ShortcutCopy();
+            return true;
+        }
+        else if (ev.ref_id == TBIDC("paste"))
+        {
+            webClient_->ShortcutPaste();
+            return true;
+        }
+        if (ev.ref_id == TBIDC("cut"))
+        {
+            webClient_->ShortcutCut();
+            return true;
+        }
+        else if (ev.ref_id == TBIDC("selectall"))
+        {
+            webClient_->ShortcutSelectAll();
+            return true;
+        }
+        else if (ev.ref_id == TBIDC("undo"))
+        {
+            webClient_->ShortcutUndo();
+            return true;
+        }
+        else if (ev.ref_id == TBIDC("redo"))
+        {
+            webClient_->ShortcutRedo();
+            return true;
+        }
+
     }
     }
 
 
     return UIWidget::OnEvent(ev);
     return UIWidget::OnEvent(ev);

+ 1 - 0
Source/AtomicWebView/UIWebView.h

@@ -51,6 +51,7 @@ public:
 protected:
 protected:
 
 
     bool OnEvent(const tb::TBWidgetEvent &ev);
     bool OnEvent(const tb::TBWidgetEvent &ev);
+    bool HandleKeyEvent(const tb::TBWidgetEvent &ev, bool keyDown);
 
 
 private:
 private:
 
 

+ 83 - 5
Source/AtomicWebView/WebClient.cpp

@@ -248,7 +248,7 @@ void WebClient::SendMouseWheelEvent(int x, int y, unsigned modifier,int deltaX,
 } cef_event_flags_t;
 } cef_event_flags_t;
 
 
 */
 */
-void WebClient::SendKeyEvent(int key, bool keyUp, int scanCode, unsigned raw, int buttons, int qual)
+void WebClient::SendKeyEvent(int scanCode, int qual, bool keyUp)
 {
 {
     if (!d_->browser_.get())
     if (!d_->browser_.get())
         return;
         return;
@@ -256,15 +256,14 @@ void WebClient::SendKeyEvent(int key, bool keyUp, int scanCode, unsigned raw, in
     CefRefPtr<CefBrowserHost> host = d_->browser_->GetHost();
     CefRefPtr<CefBrowserHost> host = d_->browser_->GetHost();
     CefKeyEvent keyEvent;
     CefKeyEvent keyEvent;
 
 
+    if (keyUp)
+        return;
+
     // handle return special
     // handle return special
     if (scanCode == SDL_SCANCODE_RETURN)
     if (scanCode == SDL_SCANCODE_RETURN)
     {
     {
-        if (keyUp)
-            return;
-
         keyEvent.type = KEYEVENT_CHAR;
         keyEvent.type = KEYEVENT_CHAR;
         keyEvent.character = 13;
         keyEvent.character = 13;
-        keyEvent.unmodified_character = 13;
         host->SendKeyEvent(keyEvent);
         host->SendKeyEvent(keyEvent);
         return;
         return;
     }
     }
@@ -305,7 +304,22 @@ void WebClient::SendKeyEvent(int key, bool keyUp, int scanCode, unsigned raw, in
 
 
     keyEvent.type = keyUp ? KEYEVENT_KEYUP : KEYEVENT_KEYDOWN;
     keyEvent.type = keyUp ? KEYEVENT_KEYUP : KEYEVENT_KEYDOWN;
     keyEvent.native_key_code = nativeKeyCode;
     keyEvent.native_key_code = nativeKeyCode;
+
+    host->SendKeyEvent(keyEvent);
+
+#ifdef ATOMIC_PLATFORM_OSX
+    // Send an empty key event on OSX, which seems to fix
+    // keyboard problems on OSX with cefclient
+    // ./cefclient --off-screen-rendering-enabled
+    // return does not work at all on cef client with offscreen
+    // bad interaction with arrow keys (for example here, after
+    // hitting arrow keys, return/text takes a couple presses to register
+    keyEvent.type = keyUp ? KEYEVENT_KEYUP : KEYEVENT_KEYDOWN;
+    keyEvent.modifiers = 0;
+    keyEvent.native_key_code = 0;
     host->SendKeyEvent(keyEvent);
     host->SendKeyEvent(keyEvent);
+#endif
+
 
 
 }
 }
 
 
@@ -323,6 +337,70 @@ void WebClient::SendTextEvent(const String& text, unsigned modifiers)
     host->SendKeyEvent(keyEvent);
     host->SendKeyEvent(keyEvent);
 }
 }
 
 
+void WebClient::ShortcutCut()
+{
+    if (!d_->browser_.get())
+        return;
+
+    d_->browser_->GetFocusedFrame()->Cut();
+
+}
+
+
+void WebClient::ShortcutCopy()
+{
+    if (!d_->browser_.get())
+        return;
+
+    d_->browser_->GetFocusedFrame()->Copy();
+
+}
+
+void WebClient::ShortcutPaste()
+{
+    if (!d_->browser_.get())
+        return;
+
+    d_->browser_->GetFocusedFrame()->Paste();
+
+}
+
+void WebClient::ShortcutSelectAll()
+{
+    if (!d_->browser_.get())
+        return;
+
+    d_->browser_->GetFocusedFrame()->SelectAll();
+
+}
+
+void WebClient::ShortcutUndo()
+{
+    if (!d_->browser_.get())
+        return;
+
+    d_->browser_->GetFocusedFrame()->Undo();
+
+}
+
+void WebClient::ShortcutRedo()
+{
+    if (!d_->browser_.get())
+        return;
+
+    d_->browser_->GetFocusedFrame()->Redo();
+
+}
+
+void WebClient::ShortcutDelete()
+{
+    if (!d_->browser_.get())
+        return;
+
+    d_->browser_->GetFocusedFrame()->Delete();
+
+}
+
 void WebClient::WasResized()
 void WebClient::WasResized()
 {
 {
     if (!d_->browser_.get())
     if (!d_->browser_.get())

+ 9 - 1
Source/AtomicWebView/WebClient.h

@@ -40,7 +40,15 @@ public:
 
 
     void SendTextEvent(const String& text, unsigned modifiers);
     void SendTextEvent(const String& text, unsigned modifiers);
 
 
-    void SendKeyEvent(int key, bool keyUp, int scanCode, unsigned raw, int buttons, int qual);
+    void SendKeyEvent(int scanCode, int qual, bool keyUp);
+
+    void ShortcutCut();
+    void ShortcutCopy();
+    void ShortcutPaste();
+    void ShortcutSelectAll();
+    void ShortcutUndo();
+    void ShortcutRedo();
+    void ShortcutDelete();
 
 
 private:
 private: