[Libreoffice-commits] core.git: vcl/unx

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Tue May 18 11:40:29 UTC 2021


 vcl/unx/gtk3/gtkinst.cxx |   90 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 90 insertions(+)

New commits:
commit 6f954416bbbf11293d3dc91e534e1b41c4157325
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Tue May 18 11:29:16 2021 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Tue May 18 13:39:47 2021 +0200

    gtk4: adapt to new focus controller
    
    Change-Id: I94949f674f98dad218636e191cee11c0fe2bc4d7
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/115733
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 41aa2ee6d9ea..0a5d191e3833 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -2128,12 +2128,22 @@ protected:
     bool IsFirstFreeze() const { return m_nFreezeCount == 0; }
     bool IsLastThaw() const { return m_nFreezeCount == 1; }
 
+#if GTK_CHECK_VERSION(4, 0, 0)
+    static void signalFocusIn(GtkEventControllerFocus*, gpointer widget)
+    {
+        GtkInstanceWidget* pThis = static_cast<GtkInstanceWidget*>(widget);
+        SolarMutexGuard aGuard;
+        pThis->signal_focus_in();
+    }
+#else
     static gboolean signalFocusIn(GtkWidget*, GdkEvent*, gpointer widget)
     {
         GtkInstanceWidget* pThis = static_cast<GtkInstanceWidget*>(widget);
+        SolarMutexGuard aGuard;
         pThis->signal_focus_in();
         return false;
     }
+#endif
 
     void signal_focus_in()
     {
@@ -2157,6 +2167,14 @@ protected:
         return m_aMnemonicActivateHdl.Call(*this);
     }
 
+#if GTK_CHECK_VERSION(4, 0, 0)
+    static void signalFocusOut(GtkEventControllerFocus*, gpointer widget)
+    {
+        GtkInstanceWidget* pThis = static_cast<GtkInstanceWidget*>(widget);
+        SolarMutexGuard aGuard;
+        pThis->signal_focus_in();
+    }
+#else
     static gboolean signalFocusOut(GtkWidget*, GdkEvent*, gpointer widget)
     {
         GtkInstanceWidget* pThis = static_cast<GtkInstanceWidget*>(widget);
@@ -2164,6 +2182,7 @@ protected:
         pThis->signal_focus_out();
         return false;
     }
+#endif
 
 #if !GTK_CHECK_VERSION(4, 0, 0)
     void launch_drag_cancel(GdkDragContext* context)
@@ -2305,6 +2324,10 @@ private:
     gulong m_nDragDataDeleteignalId;
     gulong m_nDragGetSignalId;
 
+#if GTK_CHECK_VERSION(4, 0, 0)
+    GtkEventController* m_pFocusController;
+#endif
+
     rtl::Reference<GtkInstDropTarget> m_xDropTarget;
     rtl::Reference<GtkInstDragSource> m_xDragSource;
 
@@ -2709,6 +2732,9 @@ public:
         , m_nDragFailedSignalId(0)
         , m_nDragDataDeleteignalId(0)
         , m_nDragGetSignalId(0)
+#if GTK_CHECK_VERSION(4, 0, 0)
+        , m_pFocusController(nullptr)
+#endif
     {
         if (!bTakeOwnership)
             g_object_ref(m_pWidget);
@@ -3209,10 +3235,30 @@ public:
         return GTK_WINDOW(widget_get_root(m_pWidget));
     }
 
+#if GTK_CHECK_VERSION(4, 0, 0)
+    GtkEventController* get_focus_controller()
+    {
+        if (!m_pFocusController)
+        {
+            gtk_widget_set_focusable(m_pWidget, true);
+            m_pFocusController = gtk_event_controller_focus_new();
+            gtk_widget_add_controller(m_pWidget, m_pFocusController);
+        }
+        return m_pFocusController;
+    }
+#endif
+
     virtual void connect_focus_in(const Link<Widget&, void>& rLink) override
     {
         if (!m_nFocusInSignalId)
+        {
+#if GTK_CHECK_VERSION(4, 0, 0)
+            m_nFocusInSignalId = g_signal_connect(get_focus_controller(), "enter", G_CALLBACK(signalFocusIn), this);
+#else
             m_nFocusInSignalId = g_signal_connect(m_pWidget, "focus-in-event", G_CALLBACK(signalFocusIn), this);
+#endif
+        }
+
         weld::Widget::connect_focus_in(rLink);
     }
 
@@ -3226,7 +3272,13 @@ public:
     virtual void connect_focus_out(const Link<Widget&, void>& rLink) override
     {
         if (!m_nFocusOutSignalId)
+        {
+#if GTK_CHECK_VERSION(4, 0, 0)
+            m_nFocusOutSignalId = g_signal_connect(get_focus_controller(), "leave", G_CALLBACK(signalFocusOut), this);
+#else
             m_nFocusOutSignalId = g_signal_connect(m_pWidget, "focus-out-event", G_CALLBACK(signalFocusOut), this);
+#endif
+        }
         weld::Widget::connect_focus_out(rLink);
     }
 
@@ -3425,12 +3477,25 @@ public:
             g_signal_handler_disconnect(m_pMouseEventBox, m_nEnterSignalId);
         if (m_nButtonReleaseSignalId)
             g_signal_handler_disconnect(m_pMouseEventBox, m_nButtonReleaseSignalId);
+
         if (m_nFocusInSignalId)
+        {
+#if GTK_CHECK_VERSION(4, 0, 0)
+            g_signal_handler_disconnect(get_focus_controller(), m_nFocusInSignalId);
+#else
             g_signal_handler_disconnect(m_pWidget, m_nFocusInSignalId);
+#endif
+        }
         if (m_nMnemonicActivateSignalId)
             g_signal_handler_disconnect(m_pWidget, m_nMnemonicActivateSignalId);
         if (m_nFocusOutSignalId)
+        {
+#if GTK_CHECK_VERSION(4, 0, 0)
+            g_signal_handler_disconnect(get_focus_controller(), m_nFocusOutSignalId);
+#else
             g_signal_handler_disconnect(m_pWidget, m_nFocusOutSignalId);
+#endif
+        }
         if (m_nSizeAllocateSignalId)
             g_signal_handler_disconnect(m_pWidget, m_nSizeAllocateSignalId);
 
@@ -3468,11 +3533,23 @@ public:
     virtual void disable_notify_events()
     {
         if (m_nFocusInSignalId)
+        {
+#if GTK_CHECK_VERSION(4, 0, 0)
+            g_signal_handler_block(get_focus_controller(), m_nFocusInSignalId);
+#else
             g_signal_handler_block(m_pWidget, m_nFocusInSignalId);
+#endif
+        }
         if (m_nMnemonicActivateSignalId)
             g_signal_handler_block(m_pWidget, m_nMnemonicActivateSignalId);
         if (m_nFocusOutSignalId)
+        {
+#if GTK_CHECK_VERSION(4, 0, 0)
+            g_signal_handler_block(get_focus_controller(), m_nFocusOutSignalId);
+#else
             g_signal_handler_block(m_pWidget, m_nFocusOutSignalId);
+#endif
+        }
         if (m_nSizeAllocateSignalId)
             g_signal_handler_block(m_pWidget, m_nSizeAllocateSignalId);
     }
@@ -3482,11 +3559,24 @@ public:
         if (m_nSizeAllocateSignalId)
             g_signal_handler_unblock(m_pWidget, m_nSizeAllocateSignalId);
         if (m_nFocusOutSignalId)
+        {
+#if GTK_CHECK_VERSION(4, 0, 0)
+            g_signal_handler_unblock(get_focus_controller(), m_nFocusOutSignalId);
+#else
             g_signal_handler_unblock(m_pWidget, m_nFocusOutSignalId);
+#endif
+        }
         if (m_nMnemonicActivateSignalId)
             g_signal_handler_unblock(m_pWidget, m_nMnemonicActivateSignalId);
+
         if (m_nFocusInSignalId)
+        {
+#if GTK_CHECK_VERSION(4, 0, 0)
+            g_signal_handler_unblock(get_focus_controller(), m_nFocusInSignalId);
+#else
             g_signal_handler_unblock(m_pWidget, m_nFocusInSignalId);
+#endif
+        }
     }
 
     virtual void help_hierarchy_foreach(const std::function<bool(const OString&)>& func) override;


More information about the Libreoffice-commits mailing list