diff options
author | Caolán McNamara <caolanm@redhat.com> | 2021-06-28 09:17:46 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2021-06-28 12:35:39 +0200 |
commit | 15ee306cda425323cb2d58bd88f84686ebc8848c (patch) | |
tree | 6a1546be8bb9fabf2530b7513b4c8f0ad78a9cf4 | |
parent | f8f0e4067b09d1d8b5aebc7b28db3b7565606b27 (diff) |
gtk4: implement focus in/out for IMHandler
Change-Id: Id8183b18622a26c0b61c3165b364ecc1d3e3e5bc
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117994
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r-- | vcl/unx/gtk3/gtkinst.cxx | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index 036fca44169c..50d15d75b943 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -16608,6 +16608,9 @@ class IMHandler { private: GtkInstanceDrawingArea* m_pArea; +#if GTK_CHECK_VERSION(4, 0, 0) + GtkEventController* m_pFocusController; +#endif GtkIMContext* m_pIMContext; OUString m_sPreeditText; gulong m_nFocusInSignalId; @@ -16618,10 +16621,21 @@ public: IMHandler(GtkInstanceDrawingArea* pArea) : m_pArea(pArea) , m_pIMContext(gtk_im_multicontext_new()) - , m_nFocusInSignalId(g_signal_connect(m_pArea->getWidget(), "focus-in-event", G_CALLBACK(signalFocusIn), this)) - , m_nFocusOutSignalId(g_signal_connect(m_pArea->getWidget(), "focus-out-event", G_CALLBACK(signalFocusOut), this)) , m_bExtTextInput(false) { + GtkWidget* pWidget = m_pArea->getWidget(); + +#if GTK_CHECK_VERSION(4, 0, 0) + m_pFocusController = gtk_event_controller_focus_new(); + gtk_widget_add_controller(pWidget, m_pFocusController); + + m_nFocusInSignalId = g_signal_connect(m_pFocusController, "enter", G_CALLBACK(signalFocusIn), this); + m_nFocusOutSignalId = g_signal_connect(m_pFocusController, "leave", G_CALLBACK(signalFocusOut), this); +#else + m_nFocusInSignalId = g_signal_connect(pWidget, "focus-in-event", G_CALLBACK(signalFocusIn), this); + m_nFocusOutSignalId = g_signal_connect(pWidget, "focus-out-event", G_CALLBACK(signalFocusOut), this); +#endif + g_signal_connect(m_pIMContext, "preedit-start", G_CALLBACK(signalIMPreeditStart), this); g_signal_connect(m_pIMContext, "preedit-end", G_CALLBACK(signalIMPreeditEnd), this); g_signal_connect(m_pIMContext, "commit", G_CALLBACK(signalIMCommit), this); @@ -16629,7 +16643,6 @@ public: g_signal_connect(m_pIMContext, "retrieve-surrounding", G_CALLBACK(signalIMRetrieveSurrounding), this); g_signal_connect(m_pIMContext, "delete-surrounding", G_CALLBACK(signalIMDeleteSurrounding), this); - GtkWidget* pWidget = m_pArea->getWidget(); if (!gtk_widget_get_realized(pWidget)) gtk_widget_realize(pWidget); im_context_set_client_widget(m_pIMContext, pWidget); @@ -16645,26 +16658,43 @@ public: gtk_im_context_focus_out(m_pIMContext); } +#if GTK_CHECK_VERSION(4, 0, 0) + static void signalFocusIn(GtkEventControllerFocus*, gpointer im_handler) +#else static gboolean signalFocusIn(GtkWidget*, GdkEvent*, gpointer im_handler) +#endif { IMHandler* pThis = static_cast<IMHandler*>(im_handler); pThis->signalFocus(true); +#if !GTK_CHECK_VERSION(4, 0, 0) return false; +#endif } +#if GTK_CHECK_VERSION(4, 0, 0) + static void signalFocusOut(GtkEventControllerFocus*, gpointer im_handler) +#else static gboolean signalFocusOut(GtkWidget*, GdkEvent*, gpointer im_handler) +#endif { IMHandler* pThis = static_cast<IMHandler*>(im_handler); pThis->signalFocus(false); +#if !GTK_CHECK_VERSION(4, 0, 0) return false; +#endif } ~IMHandler() { EndExtTextInput(); +#if GTK_CHECK_VERSION(4, 0, 0) + g_signal_handler_disconnect(m_pFocusController, m_nFocusOutSignalId); + g_signal_handler_disconnect(m_pFocusController, m_nFocusInSignalId); +#else g_signal_handler_disconnect(m_pArea->getWidget(), m_nFocusOutSignalId); g_signal_handler_disconnect(m_pArea->getWidget(), m_nFocusInSignalId); +#endif if (gtk_widget_has_focus(m_pArea->getWidget())) gtk_im_context_focus_out(m_pIMContext); @@ -22144,6 +22174,8 @@ weld::Builder* GtkInstance::CreateBuilder(weld::Widget* pParent, const OUString& rUIFile != "modules/scalc/ui/formatcellsdialog.ui" && rUIFile != "modules/scalc/ui/goalseekdlg.ui" && rUIFile != "modules/scalc/ui/groupdialog.ui" && + rUIFile != "modules/scalc/ui/headerfootercontent.ui" && + rUIFile != "modules/scalc/ui/headerfooterdialog.ui" && rUIFile != "modules/scalc/ui/inputstringdialog.ui" && rUIFile != "modules/scalc/ui/insertname.ui" && rUIFile != "modules/scalc/ui/insertcells.ui" && |