diff options
Diffstat (limited to 'vcl/unx/gtk3/gtk3gtkinst.cxx')
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 131 |
1 files changed, 101 insertions, 30 deletions
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index 0d72b7cd41c7..2f0966fb6e40 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -2956,7 +2956,9 @@ private: GtkScrolledWindow* m_pScrolledWindow; GtkWidget *m_pOrigViewport; GtkAdjustment* m_pVAdjustment; + GtkAdjustment* m_pHAdjustment; gulong m_nVAdjustChangedSignalId; + gulong m_nHAdjustChangedSignalId; static void signalVAdjustValueChanged(GtkAdjustment*, gpointer widget) { @@ -2965,69 +2967,83 @@ private: pThis->signal_vadjustment_changed(); } + static void signalHAdjustValueChanged(GtkAdjustment*, gpointer widget) + { + GtkInstanceScrolledWindow* pThis = static_cast<GtkInstanceScrolledWindow*>(widget); + SolarMutexGuard aGuard; + pThis->signal_hadjustment_changed(); + } + public: GtkInstanceScrolledWindow(GtkScrolledWindow* pScrolledWindow, bool bTakeOwnership) : GtkInstanceContainer(GTK_CONTAINER(pScrolledWindow), bTakeOwnership) , m_pScrolledWindow(pScrolledWindow) , m_pOrigViewport(nullptr) , m_pVAdjustment(gtk_scrolled_window_get_vadjustment(m_pScrolledWindow)) + , m_pHAdjustment(gtk_scrolled_window_get_hadjustment(m_pScrolledWindow)) , m_nVAdjustChangedSignalId(g_signal_connect(m_pVAdjustment, "value-changed", G_CALLBACK(signalVAdjustValueChanged), this)) + , m_nHAdjustChangedSignalId(g_signal_connect(m_pHAdjustment, "value-changed", G_CALLBACK(signalHAdjustValueChanged), this)) { } - virtual void vadjustment_configure(int value, int lower, int upper, + virtual void set_user_managed_scrolling() override + { + disable_notify_events(); + //remove the original viewport and replace it with our bodged one which + //doesn't do any scrolling and expects its child to figure it out somehow + assert(!m_pOrigViewport); + GtkWidget *pViewport = gtk_bin_get_child(GTK_BIN(m_pScrolledWindow)); + assert(GTK_IS_VIEWPORT(pViewport)); + GtkWidget *pChild = gtk_bin_get_child(GTK_BIN(pViewport)); + g_object_ref(pChild); + gtk_container_remove(GTK_CONTAINER(pViewport), pChild); + g_object_ref(pViewport); + gtk_container_remove(GTK_CONTAINER(m_pScrolledWindow), pViewport); + GtkWidget* pNewViewport = GTK_WIDGET(g_object_new(crippled_viewport_get_type(), nullptr)); + gtk_widget_show(pNewViewport); + gtk_container_add(GTK_CONTAINER(m_pScrolledWindow), pNewViewport); + gtk_container_add(GTK_CONTAINER(pNewViewport), pChild); + g_object_unref(pChild); + m_pOrigViewport = pViewport; + enable_notify_events(); + } + + virtual void hadjustment_configure(int value, int lower, int upper, int step_increment, int page_increment, int page_size) override { disable_notify_events(); - gtk_adjustment_configure(m_pVAdjustment, value, lower, upper, step_increment, page_increment, page_size); + gtk_adjustment_configure(m_pHAdjustment, value, lower, upper, step_increment, page_increment, page_size); enable_notify_events(); } - virtual int vadjustment_get_value() const override + virtual int hadjustment_get_value() const override { - return gtk_adjustment_get_value(m_pVAdjustment); + return gtk_adjustment_get_value(m_pHAdjustment); } - virtual void vadjustment_set_value(int value) override + virtual void hadjustment_set_value(int value) override { disable_notify_events(); - gtk_adjustment_set_value(m_pVAdjustment, value); + gtk_adjustment_set_value(m_pHAdjustment, value); enable_notify_events(); } - virtual int vadjustment_get_upper() const override + virtual int hadjustment_get_upper() const override { - return gtk_adjustment_get_upper(m_pVAdjustment); + return gtk_adjustment_get_upper(m_pHAdjustment); } - virtual void vadjustment_set_upper(int upper) override + virtual void hadjustment_set_upper(int upper) override { disable_notify_events(); - gtk_adjustment_set_upper(m_pVAdjustment, upper); + gtk_adjustment_set_upper(m_pHAdjustment, upper); enable_notify_events(); } - virtual void set_user_managed_scrolling() override + virtual int hadjustment_get_page_size() const override { - disable_notify_events(); - //remove the original viewport and replace it with our bodged one which - //doesn't do any scrolling and expects its child to figure it out somehow - assert(!m_pOrigViewport); - GtkWidget *pViewport = gtk_bin_get_child(GTK_BIN(m_pScrolledWindow)); - assert(GTK_IS_VIEWPORT(pViewport)); - GtkWidget *pChild = gtk_bin_get_child(GTK_BIN(pViewport)); - g_object_ref(pChild); - gtk_container_remove(GTK_CONTAINER(pViewport), pChild); - g_object_ref(pViewport); - gtk_container_remove(GTK_CONTAINER(m_pScrolledWindow), pViewport); - GtkWidget* pNewViewport = GTK_WIDGET(g_object_new(crippled_viewport_get_type(), nullptr)); - gtk_widget_show(pNewViewport); - gtk_container_add(GTK_CONTAINER(m_pScrolledWindow), pNewViewport); - gtk_container_add(GTK_CONTAINER(pNewViewport), pChild); - g_object_unref(pChild); - m_pOrigViewport = pViewport; - enable_notify_events(); + return gtk_adjustment_get_page_size(m_pHAdjustment); } virtual void set_hpolicy(VclPolicyType eHPolicy) override @@ -3044,6 +3060,51 @@ public: return GtkToVcl(eGtkHPolicy); } + virtual int get_hscroll_height() const override + { + if (gtk_scrolled_window_get_overlay_scrolling(m_pScrolledWindow)) + return 0; + return gtk_widget_get_allocated_height(gtk_scrolled_window_get_hscrollbar(m_pScrolledWindow)); + } + + virtual void vadjustment_configure(int value, int lower, int upper, + int step_increment, int page_increment, + int page_size) override + { + disable_notify_events(); + gtk_adjustment_configure(m_pVAdjustment, value, lower, upper, step_increment, page_increment, page_size); + enable_notify_events(); + } + + virtual int vadjustment_get_value() const override + { + return gtk_adjustment_get_value(m_pVAdjustment); + } + + virtual void vadjustment_set_value(int value) override + { + disable_notify_events(); + gtk_adjustment_set_value(m_pVAdjustment, value); + enable_notify_events(); + } + + virtual int vadjustment_get_upper() const override + { + return gtk_adjustment_get_upper(m_pVAdjustment); + } + + virtual void vadjustment_set_upper(int upper) override + { + disable_notify_events(); + gtk_adjustment_set_upper(m_pVAdjustment, upper); + enable_notify_events(); + } + + virtual int vadjustment_get_page_size() const override + { + return gtk_adjustment_get_page_size(m_pVAdjustment); + } + virtual void set_vpolicy(VclPolicyType eVPolicy) override { GtkPolicyType eGtkHPolicy; @@ -3062,7 +3123,7 @@ public: { if (gtk_scrolled_window_get_overlay_scrolling(m_pScrolledWindow)) return 0; - return gtk_widget_get_allocated_width(GTK_WIDGET(m_pScrolledWindow)); + return gtk_widget_get_allocated_width(gtk_scrolled_window_get_vscrollbar(m_pScrolledWindow)); } virtual void disable_notify_events() override @@ -6851,6 +6912,16 @@ public: enable_notify_events(); } + virtual void set_entry_max_length(int nChars) override + { + GtkWidget* pChild = gtk_bin_get_child(GTK_BIN(m_pComboBox)); + assert(pChild && GTK_IS_ENTRY(pChild)); + GtkEntry* pEntry = GTK_ENTRY(pChild); + disable_notify_events(); + gtk_entry_set_max_length(pEntry, nChars); + enable_notify_events(); + } + virtual void select_entry_region(int nStartPos, int nEndPos) override { GtkWidget* pChild = gtk_bin_get_child(GTK_BIN(m_pComboBox)); |