X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/75f661bbc8f9d44f6899aca0fd3afa98224ecf4d..b466e85a7e81db84545bc44c83cbe4ccacd4fe8e:/src/gtk/window.cpp diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index fd3a7b09f2..1df7e83264 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -1547,6 +1547,38 @@ gtk_window_motion_notify_callback( GtkWidget * WXUNUSED(widget), // "scroll_event" (mouse wheel event) //----------------------------------------------------------------------------- +static gboolean +window_scroll_event_hscrollbar(GtkWidget*, GdkEventScroll* gdk_event, wxWindow* win) +{ + if (gdk_event->direction != GDK_SCROLL_LEFT && + gdk_event->direction != GDK_SCROLL_RIGHT) + { + return false; + } + + wxMouseEvent event(wxEVT_MOUSEWHEEL); + InitMouseEvent(win, event, gdk_event); + + GtkRange *range = win->m_scrollBar[wxWindow::ScrollDir_Horz]; + if (!range) return FALSE; + + if (range && GTK_WIDGET_VISIBLE (range)) + { + GtkAdjustment *adj = range->adjustment; + gdouble delta = adj->step_increment * 3; + if (gdk_event->direction == GDK_SCROLL_LEFT) + delta = -delta; + + gdouble new_value = CLAMP (adj->value + delta, adj->lower, adj->upper - adj->page_size); + + gtk_adjustment_set_value (adj, new_value); + + return TRUE; + } + + return FALSE; +} + static gboolean window_scroll_event(GtkWidget*, GdkEventScroll* gdk_event, wxWindow* win) { @@ -1567,7 +1599,27 @@ window_scroll_event(GtkWidget*, GdkEventScroll* gdk_event, wxWindow* win) else event.m_wheelRotation = -120; - return win->GTKProcessEvent(event); + if (win->GTKProcessEvent(event)) + return TRUE; + + GtkRange *range = win->m_scrollBar[wxWindow::ScrollDir_Vert]; + if (!range) return FALSE; + + if (range && GTK_WIDGET_VISIBLE (range)) + { + GtkAdjustment *adj = range->adjustment; + gdouble delta = adj->step_increment * 3; + if (gdk_event->direction == GDK_SCROLL_UP) + delta = -delta; + + gdouble new_value = CLAMP (adj->value + delta, adj->lower, adj->upper - adj->page_size); + + gtk_adjustment_set_value (adj, new_value); + + return TRUE; + } + + return FALSE; } //----------------------------------------------------------------------------- @@ -2356,8 +2408,16 @@ void wxWindowGTK::ConnectWidget( GtkWidget *widget ) G_CALLBACK (gtk_window_button_release_callback), this); g_signal_connect (widget, "motion_notify_event", G_CALLBACK (gtk_window_motion_notify_callback), this); + g_signal_connect (widget, "scroll_event", G_CALLBACK (window_scroll_event), this); + if (m_scrollBar[ScrollDir_Horz]) + g_signal_connect (m_scrollBar[ScrollDir_Horz], "scroll_event", + G_CALLBACK (window_scroll_event_hscrollbar), this); + if (m_scrollBar[ScrollDir_Vert]) + g_signal_connect (m_scrollBar[ScrollDir_Vert], "scroll_event", + G_CALLBACK (window_scroll_event), this); + g_signal_connect (widget, "popup_menu", G_CALLBACK (wxgtk_window_popup_menu_callback), this); g_signal_connect (widget, "enter_notify_event", @@ -2584,17 +2644,43 @@ void wxWindowGTK::DoGetClientSize( int *width, int *height ) const int w = m_width; int h = m_height; - if (m_wxwindow) + if ( m_wxwindow ) { // if window is scrollable, account for scrollbars - for (int i = 0; i < 2 && m_scrollBar[i]; i++) + if ( GTK_IS_SCROLLED_WINDOW(m_widget) ) { - GtkRequisition req; - GtkAdjustment* adj = gtk_range_get_adjustment(m_scrollBar[i]); - // if scrollbar enabled - if (adj->upper > adj->page_size) + GtkPolicyType policy[ScrollDir_Max]; + gtk_scrolled_window_get_policy(GTK_SCROLLED_WINDOW(m_widget), + &policy[ScrollDir_Horz], + &policy[ScrollDir_Vert]); + + for ( int i = 0; i < ScrollDir_Max; i++ ) { - gtk_widget_size_request(GTK_WIDGET(m_scrollBar[i]), &req); + // don't account for the scrollbars we don't have + GtkRange * const range = m_scrollBar[i]; + if ( !range ) + continue; + + // nor for the ones we have but don't current show + switch ( policy[i] ) + { + case GTK_POLICY_NEVER: + // never shown so doesn't take any place + continue; + + case GTK_POLICY_ALWAYS: + // no checks necessary + break; + + case GTK_POLICY_AUTOMATIC: + // may be shown or not, check + GtkAdjustment *adj = gtk_range_get_adjustment(range); + if ( adj->upper <= adj->page_size ) + continue; + } + + GtkRequisition req; + gtk_widget_size_request(GTK_WIDGET(range), &req); if (i == ScrollDir_Horz) h -= req.height; else