summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2021-06-28 09:17:46 +0100
committerCaolán McNamara <caolanm@redhat.com>2021-06-28 12:35:39 +0200
commit15ee306cda425323cb2d58bd88f84686ebc8848c (patch)
tree6a1546be8bb9fabf2530b7513b4c8f0ad78a9cf4
parentf8f0e4067b09d1d8b5aebc7b28db3b7565606b27 (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.cxx38
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" &&