X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/88413fec06d896eb4499b7e2ecf7940b15ea9175..e3fed5c49ab00309ec63dbf05fd498e658ad81e2:/src/gtk1/scrolbar.cpp diff --git a/src/gtk1/scrolbar.cpp b/src/gtk1/scrolbar.cpp index 5aa22195f8..b8fc5dbf97 100644 --- a/src/gtk1/scrolbar.cpp +++ b/src/gtk1/scrolbar.cpp @@ -1,10 +1,10 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: scrolbar.cpp +// Name: src/gtk/scrolbar.cpp // Purpose: // Author: Robert Roebling // Id: $Id$ // Copyright: (c) 1998 Robert Roebling -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -12,16 +12,17 @@ #pragma implementation "scrolbar.h" #endif -#include "wx/scrolbar.h" +#include "wx/defs.h" #if wxUSE_SCROLLBAR +#include "wx/scrolbar.h" + #include "wx/utils.h" #include -#include -#include +#include "wx/gtk/private.h" //----------------------------------------------------------------------------- // idle system @@ -43,7 +44,11 @@ static const float sensitivity = 0.02; // "value_changed" //----------------------------------------------------------------------------- -static void gtk_scrollbar_callback( GtkAdjustment *adjust, wxScrollBar *win ) +// FIXME: is GtkScrollType really passed to us as 2nd argument? + +static void gtk_scrollbar_callback( GtkAdjustment *adjust, + SCROLLBAR_CBACK_ARG + wxScrollBar *win ) { if (g_isIdle) wxapp_install_idle_handler(); @@ -55,15 +60,10 @@ static void gtk_scrollbar_callback( GtkAdjustment *adjust, wxScrollBar *win ) win->m_oldPos = adjust->value; - GtkRange *range = GTK_RANGE( win->m_widget ); + wxEventType command = GtkScrollTypeToWx(GET_SCROLL_TYPE(win->m_widget)); - 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); + double dvalue = adjust->value; + int value = (int)(dvalue < 0 ? dvalue - 0.5 : dvalue + 0.5); int orient = win->HasFlag(wxSB_VERTICAL) ? wxVERTICAL : wxHORIZONTAL; @@ -82,14 +82,18 @@ static void gtk_scrollbar_callback( GtkAdjustment *adjust, wxScrollBar *win ) // "button_press_event" from slider //----------------------------------------------------------------------------- -static gint gtk_scrollbar_button_press_callback( GtkRange *WXUNUSED(widget), - GdkEventButton *WXUNUSED(gdk_event), +static gint gtk_scrollbar_button_press_callback( GtkRange *widget, + GdkEventButton *gdk_event, wxScrollBar *win ) { if (g_isIdle) wxapp_install_idle_handler(); - win->m_isScrolling = TRUE; // g_blockEventsOnScroll = TRUE; doesn't work in DialogEd + + // FIXME: there is no slider field any more, what was meant here? +#ifndef __WXGTK20__ + win->m_isScrolling = (gdk_event->window == widget->slider); +#endif return FALSE; } @@ -104,20 +108,21 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *WXUNUSED(widget), { if (g_isIdle) wxapp_install_idle_handler(); - wxASSERT( win->m_isScrolling ); - - win->m_isScrolling = FALSE; // g_blockEventsOnScroll = FALSE; - wxEventType command = wxEVT_SCROLL_THUMBTRACK; - int value = (int)ceil(win->m_adjust->value); - int dir = win->HasFlag(wxSB_VERTICAL) ? wxVERTICAL : wxHORIZONTAL; + 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.SetScrolling( FALSE ); - event.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent( event ); + wxScrollEvent event( command, value, dir ); + event.SetEventObject( win ); + win->GetEventHandler()->ProcessEvent( event ); + } + win->m_isScrolling = FALSE; + return FALSE; } @@ -127,7 +132,7 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *WXUNUSED(widget), IMPLEMENT_DYNAMIC_CLASS(wxScrollBar,wxControl) -wxScrollBar::~wxScrollBar(void) +wxScrollBar::~wxScrollBar() { } @@ -142,7 +147,7 @@ bool wxScrollBar::Create(wxWindow *parent, wxWindowID id, !CreateBase( parent, id, pos, size, style, validator, name )) { wxFAIL_MSG( wxT("wxScrollBar creation failed") ); - return FALSE; + return FALSE; } m_oldPos = 0.0; @@ -180,9 +185,10 @@ bool wxScrollBar::Create(wxWindow *parent, wxWindowID id, return TRUE; } -int wxScrollBar::GetThumbPosition(void) const +int wxScrollBar::GetThumbPosition() const { - return (int)(m_adjust->value+0.5); + double val = m_adjust->value; + return (int)(val < 0 ? val - 0.5 : val + 0.5); } int wxScrollBar::GetThumbSize() const @@ -209,7 +215,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, @@ -241,7 +256,7 @@ void wxScrollBar::SetScrollbar( int position, int thumbSize, int range, int page } /* Backward compatibility */ -int wxScrollBar::GetValue(void) const +int wxScrollBar::GetValue() const { return GetThumbPosition(); } @@ -301,11 +316,14 @@ void wxScrollBar::SetViewLength( int viewLength ) 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) ); + return ( (window == GTK_WIDGET(range)->window) +#ifndef __WXGTK20__ + || (window == range->trough) + || (window == range->slider) + || (window == range->step_forw) + || (window == range->step_back) +#endif // GTK+ 1.x + ); } void wxScrollBar::ApplyWidgetStyle()