summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2019-01-28 13:12:00 +0000
committerCaolán McNamara <caolanm@redhat.com>2019-02-04 22:37:06 +0100
commit336feec6b0bef15bd3a234c63d63ad8d869a3374 (patch)
tree0fcdc82b8367b915a29292a093bb3c2dcaed2d80 /vcl
parentf8bef86cc88e99b32e223b2bd675959c6d8e46ad (diff)
Resolves: tdf#122930 paper tray is to update on focus-in
which adds the problem that GtkComboBox doesn't send a focus-in, but its toggle does, to find and use that instead Change-Id: I18d46511bf2e6997539a8413f574a94b24b4583f Reviewed-on: https://gerrit.libreoffice.org/67136 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx53
1 files changed, 48 insertions, 5 deletions
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index bd221af10cdb..384f1d411e4d 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -1183,11 +1183,6 @@ class GtkInstanceWidget : public virtual weld::Widget
{
protected:
GtkWidget* m_pWidget;
-private:
- bool m_bTakeOwnership;
- gulong m_nFocusInSignalId;
- gulong m_nFocusOutSignalId;
- gulong m_nKeyPressSignalId;
static void signalFocusIn(GtkWidget*, GdkEvent*, gpointer widget)
{
@@ -1203,6 +1198,12 @@ private:
pThis->signal_focus_out();
}
+private:
+ bool m_bTakeOwnership;
+ gulong m_nFocusInSignalId;
+ gulong m_nFocusOutSignalId;
+ gulong m_nKeyPressSignalId;
+
static gboolean signalKeyPress(GtkWidget*, GdkEventKey* pEvent, gpointer)
{
// #i1820# use locale specific decimal separator
@@ -4486,8 +4487,11 @@ class GtkInstanceComboBoxText : public GtkInstanceContainer, public virtual weld
{
private:
GtkComboBoxText* m_pComboBoxText;
+ GtkWidget* m_pToggleButton;
std::unique_ptr<comphelper::string::NaturalStringSorter> m_xSorter;
gboolean m_bPopupActive;
+ gulong m_nToggleFocusInSignalId;
+ gulong m_nToggleFocusOutSignalId;
gulong m_nChangedSignalId;
gulong m_nPopupShownSignalId;
gulong m_nEntryActivateSignalId;
@@ -4594,11 +4598,25 @@ private:
g_object_unref(pCompletion);
}
+ static void find_toggle_button(GtkWidget *pWidget, gpointer user_data)
+ {
+ if (g_strcmp0(gtk_widget_get_name(pWidget), "GtkToggleButton") == 0)
+ {
+ GtkWidget **ppToggleButton = static_cast<GtkWidget**>(user_data);
+ *ppToggleButton = pWidget;
+ }
+ else if (GTK_IS_CONTAINER(pWidget))
+ gtk_container_forall(GTK_CONTAINER(pWidget), find_toggle_button, user_data);
+ }
+
public:
GtkInstanceComboBoxText(GtkComboBoxText* pComboBoxText, bool bTakeOwnership)
: GtkInstanceContainer(GTK_CONTAINER(pComboBoxText), bTakeOwnership)
, m_pComboBoxText(pComboBoxText)
+ , m_pToggleButton(nullptr)
, m_bPopupActive(false)
+ , m_nToggleFocusInSignalId(0)
+ , m_nToggleFocusOutSignalId(0)
, m_nChangedSignalId(g_signal_connect(m_pComboBoxText, "changed", G_CALLBACK(signalChanged), this))
, m_nPopupShownSignalId(g_signal_connect(m_pComboBoxText, "notify::popup-shown", G_CALLBACK(signalPopupShown), this))
{
@@ -4616,6 +4634,8 @@ public:
}
else
m_nEntryActivateSignalId = 0;
+
+ find_toggle_button(GTK_WIDGET(m_pComboBoxText), &m_pToggleButton);
}
virtual int get_active() const override
@@ -4787,6 +4807,10 @@ public:
{
if (GtkEntry* pEntry = get_entry())
g_signal_handler_block(pEntry, m_nEntryActivateSignalId);
+ if (m_nToggleFocusInSignalId)
+ g_signal_handler_block(m_pToggleButton, m_nToggleFocusInSignalId);
+ if (m_nToggleFocusOutSignalId)
+ g_signal_handler_block(m_pToggleButton, m_nToggleFocusOutSignalId);
g_signal_handler_block(m_pComboBoxText, m_nChangedSignalId);
g_signal_handler_block(m_pComboBoxText, m_nPopupShownSignalId);
GtkInstanceContainer::disable_notify_events();
@@ -4797,6 +4821,10 @@ public:
GtkInstanceContainer::enable_notify_events();
g_signal_handler_unblock(m_pComboBoxText, m_nPopupShownSignalId);
g_signal_handler_unblock(m_pComboBoxText, m_nChangedSignalId);
+ if (m_nToggleFocusInSignalId)
+ g_signal_handler_unblock(m_pToggleButton, m_nToggleFocusInSignalId);
+ if (m_nToggleFocusOutSignalId)
+ g_signal_handler_unblock(m_pToggleButton, m_nToggleFocusOutSignalId);
if (GtkEntry* pEntry = get_entry())
g_signal_handler_unblock(pEntry, m_nEntryActivateSignalId);
}
@@ -4823,10 +4851,25 @@ public:
GtkInstanceContainer::thaw();
}
+ virtual void connect_focus_in(const Link<Widget&, void>& rLink) override
+ {
+ m_nToggleFocusInSignalId = g_signal_connect(m_pToggleButton, "focus-in-event", G_CALLBACK(signalFocusIn), this);
+ weld::Widget::connect_focus_in(rLink);
+ }
+
+ virtual void connect_focus_out(const Link<Widget&, void>& rLink) override
+ {
+ m_nToggleFocusOutSignalId = g_signal_connect(m_pToggleButton, "focus-out-event", G_CALLBACK(signalFocusOut), this);
+ weld::Widget::connect_focus_out(rLink);
+ }
virtual ~GtkInstanceComboBoxText() override
{
if (GtkEntry* pEntry = get_entry())
g_signal_handler_disconnect(pEntry, m_nEntryActivateSignalId);
+ if (m_nToggleFocusInSignalId)
+ g_signal_handler_disconnect(m_pToggleButton, m_nToggleFocusInSignalId);
+ if (m_nToggleFocusOutSignalId)
+ g_signal_handler_disconnect(m_pToggleButton, m_nToggleFocusOutSignalId);
g_signal_handler_disconnect(m_pComboBoxText, m_nChangedSignalId);
g_signal_handler_disconnect(m_pComboBoxText, m_nPopupShownSignalId);
}