From 84a533baf8b18e2ee3907a52ddec69e91a0bf084 Mon Sep 17 00:00:00 2001 From: Quentin Quadrat Date: Sun, 21 Apr 2024 16:44:35 +0200 Subject: [PATCH] WIP Adding copy/paste commands #52 AFAIK pasting inside a Godot input text makes the application freezing. --- addons/gdcef/demos/2D/CEF.gd | 14 ++++ addons/gdcef/gdcef/src/browser_io.cpp | 7 ++ addons/gdcef/gdcef/src/gdbrowser.cpp | 96 +++++++++++++++++++++++++++ addons/gdcef/gdcef/src/gdbrowser.hpp | 31 +++++++++ 4 files changed, 148 insertions(+) diff --git a/addons/gdcef/demos/2D/CEF.gd b/addons/gdcef/demos/2D/CEF.gd index ce02ee0..80b89c4 100644 --- a/addons/gdcef/demos/2D/CEF.gd +++ b/addons/gdcef/demos/2D/CEF.gd @@ -272,6 +272,20 @@ func _input(event): if event.keycode == KEY_S: # Will call the callback 'on_html_content_requested' current_browser.request_html_content() + # FIXME copy()/paste() inside a Godot text entry will freeze the application + # https://github.com/chromiumembedded/cef/issues/3117 + #if event.keycode == KEY_C: + # current_browser.copy() + #elif event.keycode == KEY_V: + # current_browser.paste() + #elif event.keycode == KEY_X: + # current_browser.cut() + #elif event.keycode == KEY_DELETE: + # current_browser.delete() + #elif event.keycode == KEY_Z: + # current_browser.undo() + #elif event.shift_pressed && event.keycode == KEY_Z: + # current_browser.redo() else: current_browser.set_key_pressed( event.unicode if event.unicode != 0 else event.keycode, diff --git a/addons/gdcef/gdcef/src/browser_io.cpp b/addons/gdcef/gdcef/src/browser_io.cpp index cd50416..caaad25 100644 --- a/addons/gdcef/gdcef/src/browser_io.cpp +++ b/addons/gdcef/gdcef/src/browser_io.cpp @@ -76,6 +76,13 @@ void GDBrowserView::leftMouseDown() evt.modifiers = m_mouse_event_modifiers; m_browser->GetHost()->SendMouseClickEvent(evt, btn, false, m_left_click_count); + + // Copy selected text + // FIXME https://github.com/chromiumembedded/cef/issues/3117 + //if ((m_left_click_count > 1) && m_browser->GetMainFrame()) + //{ + // m_browser->GetMainFrame()->Copy(); + //} } //------------------------------------------------------------------------------ diff --git a/addons/gdcef/gdcef/src/gdbrowser.cpp b/addons/gdcef/gdcef/src/gdbrowser.cpp index b40f9db..959dfa7 100644 --- a/addons/gdcef/gdcef/src/gdbrowser.cpp +++ b/addons/gdcef/gdcef/src/gdbrowser.cpp @@ -82,6 +82,10 @@ void GDBrowserView::_bind_methods() ClassDB::bind_method(D_METHOD("is_loaded"), &GDBrowserView::loaded); ClassDB::bind_method(D_METHOD("reload"), &GDBrowserView::reload); ClassDB::bind_method(D_METHOD("stop_loading"), &GDBrowserView::stopLoading); + ClassDB::bind_method(D_METHOD("copy"), &GDBrowserView::copy); + ClassDB::bind_method(D_METHOD("paste"), &GDBrowserView::paste); + ClassDB::bind_method(D_METHOD("undo"), &GDBrowserView::undo); + ClassDB::bind_method(D_METHOD("redo"), &GDBrowserView::redo); ClassDB::bind_method(D_METHOD("request_html_content"), &GDBrowserView::requestHtmlContent); ClassDB::bind_method(D_METHOD("execute_javascript"), &GDBrowserView::executeJavaScript); ClassDB::bind_method(D_METHOD("has_previous_page"), &GDBrowserView::canNavigateBackward); @@ -383,6 +387,98 @@ void GDBrowserView::stopLoading() m_browser->StopLoad(); } +//------------------------------------------------------------------------------ +// FIXME https://github.com/chromiumembedded/cef/issues/3117 +void GDBrowserView::copy() const +{ + BROWSER_DEBUG(); + + if (m_browser && m_browser->GetMainFrame()) + { + m_browser->GetMainFrame()->Copy(); + } + else + { + BROWSER_ERROR("copy failed"); + } +} + +//------------------------------------------------------------------------------ +// FIXME https://github.com/chromiumembedded/cef/issues/3117 +void GDBrowserView::paste() const +{ + BROWSER_DEBUG(); + + if (m_browser && m_browser->GetMainFrame()) + { + m_browser->GetMainFrame()->Paste(); + } + else + { + BROWSER_ERROR("paste failed"); + } +} + +//------------------------------------------------------------------------------ +void GDBrowserView::cut() const +{ + BROWSER_DEBUG(); + + if (m_browser && m_browser->GetMainFrame()) + { + m_browser->GetMainFrame()->Cut(); + } + else + { + BROWSER_ERROR("cut failed"); + } +} + +//------------------------------------------------------------------------------ +void GDBrowserView::delete_() const +{ + BROWSER_DEBUG(); + + if (m_browser && m_browser->GetMainFrame()) + { + m_browser->GetMainFrame()->Delete(); + } + else + { + BROWSER_ERROR("delete failed"); + } +} + +//------------------------------------------------------------------------------ +void GDBrowserView::undo() const +{ + BROWSER_DEBUG(); + + if (m_browser && m_browser->GetMainFrame()) + { + m_browser->GetMainFrame()->Undo(); + } + else + { + BROWSER_ERROR("undo failed"); + } +} + +//------------------------------------------------------------------------------ +void GDBrowserView::redo() const +{ + BROWSER_DEBUG(); + + if (m_browser && m_browser->GetMainFrame()) + { + m_browser->GetMainFrame()->Redo(); + } + else + { + BROWSER_ERROR("redo failed"); + } +} + //------------------------------------------------------------------------------ void GDBrowserView::requestHtmlContent() { diff --git a/addons/gdcef/gdcef/src/gdbrowser.hpp b/addons/gdcef/gdcef/src/gdbrowser.hpp index 137d15d..e8ef4b3 100644 --- a/addons/gdcef/gdcef/src/gdbrowser.hpp +++ b/addons/gdcef/gdcef/src/gdbrowser.hpp @@ -333,6 +333,37 @@ class GDBrowserView : public godot::Node // ------------------------------------------------------------------------- bool reload() const; + // ------------------------------------------------------------------------- + //! \brief Execute copy the selected text in the clipboard. + // ------------------------------------------------------------------------- + void copy() const; + + // ------------------------------------------------------------------------- + //! \brief Execute the paste from the clipboard content. + //! FIXME https://github.com/chromiumembedded/cef/issues/3117 + // ------------------------------------------------------------------------- + void paste() const; + + // ------------------------------------------------------------------------- + //! \brief Execute cut the selected text. + // ------------------------------------------------------------------------- + void cut() const; + + // ------------------------------------------------------------------------- + //! \brief Execute cut the selected text. + // ------------------------------------------------------------------------- + void delete_() const; + + // ------------------------------------------------------------------------- + //! \brief Undo action. + // ------------------------------------------------------------------------- + void undo() const; + + // ------------------------------------------------------------------------- + //! \brief Redo action. + // ------------------------------------------------------------------------- + void redo() const; + // ------------------------------------------------------------------------- //! \brief Request the HTML content of the page. The result is given by the //! Godot callback