#include "wx/math.h"
#include "wx/gtk/private.h"
-//-----------------------------------------------------------------------------
-// idle system
-//-----------------------------------------------------------------------------
-
-extern void wxapp_install_idle_handler();
-extern bool g_isIdle;
-
//-----------------------------------------------------------------------------
// data
//-----------------------------------------------------------------------------
static void
ProcessScrollEvent(wxSlider *win, wxEventType evtType, double dvalue)
{
- int orient = win->GetWindowStyleFlag() & wxSL_VERTICAL ? wxVERTICAL
- : wxHORIZONTAL;
+ const int orient = win->HasFlag(wxSL_VERTICAL) ? wxVERTICAL
+ : wxHORIZONTAL;
- int value = (int)(dvalue < 0 ? dvalue - 0.5 : dvalue + 0.5);
- wxScrollEvent event( evtType, win->GetId(), value, orient );
- event.SetEventObject( win );
- win->GetEventHandler()->ProcessEvent( event );
+ const int value = (int)(dvalue < 0 ? dvalue - 0.5 : dvalue + 0.5);
+ // if we have any "special" event (i.e. the value changed by a line or a
+ // page), send this specific event first
+ if ( evtType != wxEVT_NULL )
+ {
+ wxScrollEvent event( evtType, win->GetId(), value, orient );
+ event.SetEventObject( win );
+ win->GetEventHandler()->ProcessEvent( event );
+ }
+
+ // but, in any case, except if we're dragging the slider (and so the change
+ // is not definitive), send a generic "changed" event
if ( evtType != wxEVT_SCROLL_THUMBTRACK )
{
- wxScrollEvent event2(wxEVT_SCROLL_CHANGED, win->GetId(), value, orient);
- event2.SetEventObject( win );
- win->GetEventHandler()->ProcessEvent( event2 );
+ wxScrollEvent event(wxEVT_SCROLL_CHANGED, win->GetId(), value, orient);
+ event.SetEventObject( win );
+ win->GetEventHandler()->ProcessEvent( event );
}
- wxCommandEvent cevent( wxEVT_COMMAND_SLIDER_UPDATED, win->GetId() );
- cevent.SetEventObject( win );
- cevent.SetInt( value );
- win->GetEventHandler()->ProcessEvent( cevent );
+ // and also generate a command event for compatibility
+ wxCommandEvent event( wxEVT_COMMAND_SLIDER_UPDATED, win->GetId() );
+ event.SetEventObject( win );
+ event.SetInt( value );
+ win->GetEventHandler()->ProcessEvent( event );
}
//-----------------------------------------------------------------------------
extern "C" {
static void gtk_slider_callback( GtkAdjustment *adjust,
- SCROLLBAR_CBACK_ARG
wxSlider *win )
{
if (g_isIdle) wxapp_install_idle_handler();
evtType = wxEVT_SCROLL_TOP;
else if ( AreSameAdjustValues(adjust->value, adjust->upper) )
evtType = wxEVT_SCROLL_BOTTOM;
+ else
+ evtType = wxEVT_NULL; // wxEVT_SCROLL_CHANGED will still be generated
ProcessScrollEvent(win, evtType, dvalue);