X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/828f655fd31ac19d83cf7ec14d0b207e9b254977..79f585d90388128f9d245f7c92d3013b98b9ed14:/src/gtk/scrolbar.cpp diff --git a/src/gtk/scrolbar.cpp b/src/gtk/scrolbar.cpp index 39aba4ce46..5b03e14703 100644 --- a/src/gtk/scrolbar.cpp +++ b/src/gtk/scrolbar.cpp @@ -4,7 +4,7 @@ // Author: Robert Roebling // Id: $Id$ // Copyright: (c) 1998 Robert Roebling -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -13,11 +13,22 @@ #endif #include "wx/scrolbar.h" + +#if wxUSE_SCROLLBAR + #include "wx/utils.h" + #include -#include "gdk/gdk.h" -#include "gtk/gtk.h" +#include +#include + +//----------------------------------------------------------------------------- +// idle system +//----------------------------------------------------------------------------- + +extern void wxapp_install_idle_handler(); +extern bool g_isIdle; //----------------------------------------------------------------------------- // data @@ -26,43 +37,35 @@ extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnScroll; +static const float sensitivity = 0.02; + //----------------------------------------------------------------------------- // "value_changed" //----------------------------------------------------------------------------- -static void gtk_scrollbar_callback( GtkWidget *WXUNUSED(widget), wxScrollBar *win ) +static void gtk_scrollbar_callback( GtkAdjustment *adjust, wxScrollBar *win ) { - if (!win->HasVMT()) return; + if (g_isIdle) wxapp_install_idle_handler(); + + if (!win->m_hasVMT) return; if (g_blockEventsOnDrag) return; - float diff = win->m_adjust->value - win->m_oldPos; - if (fabs(diff) < 0.2) return; - win->m_oldPos = win->m_adjust->value; - - wxEventType command = wxEVT_NULL; - - float line_step = win->m_adjust->step_increment; - float page_step = win->m_adjust->page_increment; - - if (win->m_isScrolling) - { - command = wxEVT_SCROLL_THUMBTRACK; - } - else - { - if (fabs(win->m_adjust->value-win->m_adjust->lower) < 0.2) command = wxEVT_SCROLL_BOTTOM; - else if (fabs(win->m_adjust->value-win->m_adjust->upper) < 0.2) command = wxEVT_SCROLL_TOP; - else if (fabs(diff-line_step) < 0.2) command = wxEVT_SCROLL_LINEDOWN; - else if (fabs(diff+line_step) < 0.2) command = wxEVT_SCROLL_LINEUP; - else if (fabs(diff-page_step) < 0.2) command = wxEVT_SCROLL_PAGEDOWN; - else if (fabs(diff+page_step) < 0.2) command = wxEVT_SCROLL_PAGEUP; - else command = wxEVT_SCROLL_THUMBTRACK; - } + float diff = adjust->value - win->m_oldPos; + if (fabs(diff) < sensitivity) return; + + win->m_oldPos = adjust->value; + + GtkRange *range = GTK_RANGE( win->m_widget ); - int value = (int)(win->m_adjust->value+0.5); + wxEventType command = wxEVT_SCROLL_THUMBTRACK; + if (range->scroll_type == GTK_SCROLL_STEP_BACKWARD) command = wxEVT_SCROLL_LINEUP; + else if (range->scroll_type == GTK_SCROLL_STEP_FORWARD) command = wxEVT_SCROLL_LINEDOWN; + else if (range->scroll_type == GTK_SCROLL_PAGE_BACKWARD) command = wxEVT_SCROLL_PAGEUP; + else if (range->scroll_type == GTK_SCROLL_PAGE_FORWARD) command = wxEVT_SCROLL_PAGEDOWN; + + int value = (int)ceil(adjust->value); - int orient = wxHORIZONTAL; - if (win->GetWindowStyleFlag() & wxSB_VERTICAL == wxSB_VERTICAL) orient = wxVERTICAL; + int orient = win->HasFlag(wxSB_VERTICAL) ? wxVERTICAL : wxHORIZONTAL; wxScrollEvent event( command, win->GetId(), value, orient ); event.SetEventObject( win ); @@ -79,14 +82,17 @@ static void gtk_scrollbar_callback( GtkWidget *WXUNUSED(widget), wxScrollBar *wi // "button_press_event" from slider //----------------------------------------------------------------------------- -static gint gtk_scrollbar_button_press_callback( GtkRange *WXUNUSED(widget), - GdkEventButton *WXUNUSED(gdk_event), - wxScrollBar *win ) +static gint gtk_scrollbar_button_press_callback( GtkRange *widget, + GdkEventButton *gdk_event, + wxScrollBar *win ) { - win->m_isScrolling = TRUE; + if (g_isIdle) wxapp_install_idle_handler(); + // g_blockEventsOnScroll = TRUE; doesn't work in DialogEd + + win->m_isScrolling = (gdk_event->window == widget->slider); - return FALSE; + return FALSE; } //----------------------------------------------------------------------------- @@ -95,13 +101,25 @@ static gint gtk_scrollbar_button_press_callback( GtkRange *WXUNUSED(widget), static gint gtk_scrollbar_button_release_callback( GtkRange *WXUNUSED(widget), GdkEventButton *WXUNUSED(gdk_event), - wxScrollBar *win ) + wxScrollBar *win ) { - win->m_isScrolling = FALSE; + if (g_isIdle) wxapp_install_idle_handler(); + // g_blockEventsOnScroll = FALSE; - gtk_signal_emit_by_name( GTK_OBJECT(win->m_adjust), "value_changed" ); + if (win->m_isScrolling) + { + wxEventType command = wxEVT_SCROLL_THUMBRELEASE; + int value = (int)ceil(win->m_adjust->value); + int dir = win->HasFlag(wxSB_VERTICAL) ? wxVERTICAL : wxHORIZONTAL; + + wxScrollEvent event( command, value, dir ); + event.SetEventObject( win ); + win->GetEventHandler()->ProcessEvent( event ); + } + win->m_isScrolling = FALSE; + return FALSE; } @@ -122,37 +140,38 @@ bool wxScrollBar::Create(wxWindow *parent, wxWindowID id, m_needParent = TRUE; m_acceptsFocus = TRUE; - PreCreation( parent, id, pos, size, style, name ); - - SetValidator( validator ); + if (!PreCreation( parent, pos, size ) || + !CreateBase( parent, id, pos, size, style, validator, name )) + { + wxFAIL_MSG( wxT("wxScrollBar creation failed") ); + return FALSE; + } m_oldPos = 0.0; - if (style & wxSB_VERTICAL == wxSB_VERTICAL) - m_widget = gtk_hscrollbar_new( (GtkAdjustment *) NULL ); - else + if ((style & wxSB_VERTICAL) == wxSB_VERTICAL) m_widget = gtk_vscrollbar_new( (GtkAdjustment *) NULL ); - + else + m_widget = gtk_hscrollbar_new( (GtkAdjustment *) NULL ); + m_adjust = gtk_range_get_adjustment( GTK_RANGE(m_widget) ); gtk_signal_connect( GTK_OBJECT(m_adjust), "value_changed", - (GtkSignalFunc) gtk_scrollbar_callback, - (gpointer) this ); + (GtkSignalFunc) gtk_scrollbar_callback, + (gpointer) this ); gtk_signal_connect( GTK_OBJECT(m_widget), "button_press_event", (GtkSignalFunc)gtk_scrollbar_button_press_callback, - (gpointer) this ); + (gpointer) this ); gtk_signal_connect( GTK_OBJECT(m_widget), "button_release_event", (GtkSignalFunc)gtk_scrollbar_button_release_callback, - (gpointer) this ); + (gpointer) this ); - m_parent->AddChild( this ); - - (m_parent->m_insertCallback)( m_parent, this ); + m_parent->DoAddChild( this ); PostCreation(); @@ -192,7 +211,16 @@ void wxScrollBar::SetThumbPosition( int viewStart ) if (fabs(fpos-m_adjust->value) < 0.2) return; m_adjust->value = fpos; + gtk_signal_disconnect_by_func( GTK_OBJECT(m_adjust), + (GtkSignalFunc) gtk_scrollbar_callback, + (gpointer) this ); + gtk_signal_emit_by_name( GTK_OBJECT(m_adjust), "value_changed" ); + + gtk_signal_connect( GTK_OBJECT(m_adjust), + "value_changed", + (GtkSignalFunc) gtk_scrollbar_callback, + (gpointer) this ); } void wxScrollBar::SetScrollbar( int position, int thumbSize, int range, int pageSize, @@ -286,9 +314,9 @@ bool wxScrollBar::IsOwnGtkWindow( GdkWindow *window ) GtkRange *range = GTK_RANGE(m_widget); return ( (window == GTK_WIDGET(range)->window) || (window == range->trough) || - (window == range->slider) || - (window == range->step_forw) || - (window == range->step_back) ); + (window == range->slider) || + (window == range->step_forw) || + (window == range->step_back) ); } void wxScrollBar::ApplyWidgetStyle() @@ -297,3 +325,4 @@ void wxScrollBar::ApplyWidgetStyle() gtk_widget_set_style( m_widget, m_widgetStyle ); } +#endif