vcl/unx/gtk3/gtkinst.cxx | 111 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 97 insertions(+), 14 deletions(-)
New commits: commit 5d5b503c62b975af8435a7b6deb648081b561e60 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Mon Jun 28 10:21:59 2021 +0100 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Mon Jun 28 13:07:00 2021 +0200 gtk4: gtk_grab_add/gtk_grab_remove doesn't exist in gtk4 in the public api anyway, fudge this for now Change-Id: I44fff4e1dffb390664234ace7337c8ffaff6df90 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117997 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index b242c381c34f..b6fbf5eae2d3 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -2669,6 +2669,7 @@ private: gulong m_nDragGetSignalId; #if GTK_CHECK_VERSION(4, 0, 0) + int m_nGrabCount; GtkEventController* m_pFocusController; GtkEventController* m_pClickController; GtkEventController* m_pMotionController; @@ -3220,6 +3221,7 @@ public: , m_nDragDataDeleteignalId(0) , m_nDragGetSignalId(0) #if GTK_CHECK_VERSION(4, 0, 0) + , m_nGrabCount(0) , m_pFocusController(nullptr) , m_pClickController(nullptr) , m_pMotionController(nullptr) @@ -3879,23 +3881,27 @@ public: virtual void grab_add() override { -#if !GTK_CHECK_VERSION(4, 0, 0) +#if GTK_CHECK_VERSION(4, 0, 0) + ++m_nGrabCount; +#else gtk_grab_add(m_pWidget); #endif } virtual bool has_grab() const override { -#if !GTK_CHECK_VERSION(4, 0, 0) - return gtk_widget_has_grab(m_pWidget); +#if GTK_CHECK_VERSION(4, 0, 0) + return m_nGrabCount != 0; #else - return false; + return gtk_widget_has_grab(m_pWidget); #endif } virtual void grab_remove() override { -#if !GTK_CHECK_VERSION(4, 0, 0) +#if GTK_CHECK_VERSION(4, 0, 0) + --m_nGrabCount; +#else gtk_grab_remove(m_pWidget); #endif } commit 2e138cfb208aba034291896149266b2f67c5654c Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Mon Jun 28 09:48:30 2021 +0100 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Mon Jun 28 13:06:45 2021 +0200 gtk4: add key-pressed/key-released support Change-Id: If06e8ce0d351a4761622d3824add29ebe9383210 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117995 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index 50d15d75b943..b242c381c34f 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -2591,12 +2591,16 @@ protected: void localizeDecimalSeparator() { -#if !GTK_CHECK_VERSION(4, 0, 0) // tdf#128867 if localize decimal separator is active we will always // need to be able to change the output of the decimal key press if (!m_nKeyPressSignalId && Application::GetSettings().GetMiscSettings().GetEnableLocalizedDecimalSep()) + { +#if GTK_CHECK_VERSION(4, 0, 0) + m_nKeyPressSignalId = g_signal_connect(get_key_controller(), "key-pressed", G_CALLBACK(signalKeyPressed), this); +#else m_nKeyPressSignalId = g_signal_connect(m_pWidget, "key-press-event", G_CALLBACK(signalKey), this); #endif + } } void ensure_drag_begin_end() @@ -2669,6 +2673,7 @@ private: GtkEventController* m_pClickController; GtkEventController* m_pMotionController; GtkEventController* m_pDragController; + GtkEventController* m_pKeyController; #endif rtl::Reference<GtkInstDropTarget> m_xDropTarget; @@ -2681,12 +2686,28 @@ private: pThis->signal_size_allocate(allocation->width, allocation->height); } -#if !GTK_CHECK_VERSION(4, 0, 0) +#if GTK_CHECK_VERSION(4, 0, 0) + static gboolean signalKeyPressed(GtkEventControllerKey*, guint keyval, guint keycode, GdkModifierType state, gpointer widget) + { + LocalizeDecimalSeparator(keyval); + GtkInstanceWidget* pThis = static_cast<GtkInstanceWidget*>(widget); + return pThis->signal_key_press(keyval, keycode, state); + } + + static gboolean signalKeyReleased(GtkEventControllerKey*, guint keyval, guint keycode, GdkModifierType state, gpointer widget) + { + LocalizeDecimalSeparator(keyval); + GtkInstanceWidget* pThis = static_cast<GtkInstanceWidget*>(widget); + return pThis->signal_key_release(keyval, keycode, state); + } +#else static gboolean signalKey(GtkWidget*, GdkEventKey* pEvent, gpointer widget) { LocalizeDecimalSeparator(pEvent->keyval); GtkInstanceWidget* pThis = static_cast<GtkInstanceWidget*>(widget); - return pThis->signal_key(pEvent); + if (pEvent->type == GDK_KEY_PRESS) + return pThis->signal_key_press(pEvent); + return pThis->signal_key_release(pEvent); } #endif @@ -3203,6 +3224,7 @@ public: , m_pClickController(nullptr) , m_pMotionController(nullptr) , m_pDragController(nullptr) + , m_pKeyController(nullptr) #endif { if (!bTakeOwnership) @@ -3213,19 +3235,27 @@ public: virtual void connect_key_press(const Link<const KeyEvent&, bool>& rLink) override { -#if !GTK_CHECK_VERSION(4, 0, 0) if (!m_nKeyPressSignalId) + { +#if GTK_CHECK_VERSION(4, 0, 0) + m_nKeyPressSignalId = g_signal_connect(get_key_controller(), "key-pressed", G_CALLBACK(signalKeyPressed), this); +#else m_nKeyPressSignalId = g_signal_connect(m_pWidget, "key-press-event", G_CALLBACK(signalKey), this); #endif + } weld::Widget::connect_key_press(rLink); } virtual void connect_key_release(const Link<const KeyEvent&, bool>& rLink) override { -#if !GTK_CHECK_VERSION(4, 0, 0) if (!m_nKeyReleaseSignalId) + { +#if GTK_CHECK_VERSION(4, 0, 0) + m_nKeyReleaseSignalId = g_signal_connect(get_key_controller(), "key-released", G_CALLBACK(signalKeyReleased), this); +#else m_nKeyReleaseSignalId = g_signal_connect(m_pWidget, "key-release-event", G_CALLBACK(signalKey), this); #endif + } weld::Widget::connect_key_release(rLink); } @@ -3745,6 +3775,16 @@ public: return m_pDragController; } + GtkEventController* get_key_controller() + { + if (!m_pKeyController) + { + m_pKeyController = gtk_event_controller_key_new(); + gtk_widget_add_controller(m_pWidget, m_pKeyController); + } + return m_pKeyController; + } + #endif @@ -3795,15 +3835,40 @@ public: m_aSizeAllocateHdl.Call(Size(nWidth, nHeight)); } -#if !GTK_CHECK_VERSION(4, 0, 0) - bool signal_key(const GdkEventKey* pEvent) +#if GTK_CHECK_VERSION(4, 0, 0) + bool signal_key_press(guint keyval, guint keycode, GdkModifierType state) + { + if (m_aKeyPressHdl.IsSet()) + { + SolarMutexGuard aGuard; + return m_aKeyPressHdl.Call(CreateKeyEvent(keyval, keycode, state, 0)); + } + return false; + } + + bool signal_key_release(guint keyval, guint keycode, GdkModifierType state) + { + if (m_aKeyReleaseHdl.IsSet()) + { + SolarMutexGuard aGuard; + return m_aKeyReleaseHdl.Call(CreateKeyEvent(keyval, keycode, state, 0)); + } + return false; + } +#else + bool signal_key_press(const GdkEventKey* pEvent) { - if (pEvent->type == GDK_KEY_PRESS && m_aKeyPressHdl.IsSet()) + if (m_aKeyPressHdl.IsSet()) { SolarMutexGuard aGuard; return m_aKeyPressHdl.Call(GtkToVcl(*pEvent)); } - if (pEvent->type == GDK_KEY_RELEASE && m_aKeyReleaseHdl.IsSet()) + return false; + } + + bool signal_key_release(const GdkEventKey* pEvent) + { + if (m_aKeyReleaseHdl.IsSet()) { SolarMutexGuard aGuard; return m_aKeyReleaseHdl.Call(GtkToVcl(*pEvent)); @@ -3978,9 +4043,21 @@ public: if (m_nDragGetSignalId) g_signal_handler_disconnect(m_pWidget, m_nDragGetSignalId); if (m_nKeyPressSignalId) + { +#if GTK_CHECK_VERSION(4, 0, 0) + g_signal_handler_disconnect(get_key_controller(), m_nKeyPressSignalId); +#else g_signal_handler_disconnect(m_pWidget, m_nKeyPressSignalId); +#endif + } if (m_nKeyReleaseSignalId) + { +#if GTK_CHECK_VERSION(4, 0, 0) + g_signal_handler_disconnect(get_key_controller(), m_nKeyReleaseSignalId); +#else g_signal_handler_disconnect(m_pWidget, m_nKeyReleaseSignalId); +#endif + } if (m_nButtonPressSignalId) { #if GTK_CHECK_VERSION(4, 0, 0) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits