#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;
+
+ 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 );
+ }
- int value = (int)(dvalue < 0 ? dvalue - 0.5 : dvalue + 0.5);
- wxScrollEvent event( evtType, win->GetId(), value, orient );
+ // 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 event(wxEVT_SCROLL_CHANGED, win->GetId(), value, orient);
+ event.SetEventObject( win );
+ win->GetEventHandler()->ProcessEvent( event );
+ }
+
+ // 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 );
-
- wxCommandEvent cevent( wxEVT_COMMAND_SLIDER_UPDATED, win->GetId() );
- cevent.SetEventObject( win );
- cevent.SetInt( value );
- win->GetEventHandler()->ProcessEvent( cevent );
}
//-----------------------------------------------------------------------------
extern "C" {
static void gtk_slider_callback( GtkAdjustment *adjust,
- SCROLLBAR_CBACK_ARG
wxSlider *win )
{
if (g_isIdle) wxapp_install_idle_handler();
return;
wxEventType evtType;
-#ifdef __WXGTK20__
if ( win->m_isScrolling )
evtType = wxEVT_SCROLL_THUMBTRACK;
// it could seem that UP/DOWN are inversed but this is what wxMSW does
evtType = wxEVT_SCROLL_TOP;
else if ( AreSameAdjustValues(adjust->value, adjust->upper) )
evtType = wxEVT_SCROLL_BOTTOM;
-#else
- evtType = GtkScrollTypeToWx(GET_SCROLL_TYPE(win->m_widget));
-#endif
+ else
+ evtType = wxEVT_NULL; // wxEVT_SCROLL_CHANGED will still be generated
ProcessScrollEvent(win, evtType, dvalue);
m_adjust = gtk_range_get_adjustment( GTK_RANGE(m_widget) );
-#ifdef __WXGTK20__
if (style & wxSL_INVERSE)
gtk_range_set_inverted( GTK_RANGE(m_widget), TRUE );
-#endif
GtkEnableEvents();
- gtk_signal_connect( GTK_OBJECT(m_widget),
- "button_press_event",
- (GtkSignalFunc)gtk_slider_button_press_callback,
- (gpointer) this );
- gtk_signal_connect( GTK_OBJECT(m_widget),
- "button_release_event",
- (GtkSignalFunc)gtk_slider_button_release_callback,
- (gpointer) this );
+ g_signal_connect (m_widget, "button_press_event",
+ G_CALLBACK (gtk_slider_button_press_callback),
+ this);
+ g_signal_connect (m_widget, "button_release_event",
+ G_CALLBACK (gtk_slider_button_release_callback),
+ this);
SetRange( minValue, maxValue );
SetValue( value );
GtkDisableEvents();
- gtk_signal_emit_by_name( GTK_OBJECT(m_adjust), "value_changed" );
+ g_signal_emit_by_name (m_adjust, "value_changed");
GtkEnableEvents();
}
GtkDisableEvents();
- gtk_signal_emit_by_name( GTK_OBJECT(m_adjust), "changed" );
+ g_signal_emit_by_name (m_adjust, "changed");
GtkEnableEvents();
}
GtkDisableEvents();
- gtk_signal_emit_by_name( GTK_OBJECT(m_adjust), "changed" );
+ g_signal_emit_by_name (m_adjust, "changed");
GtkEnableEvents();
}
GtkDisableEvents();
- gtk_signal_emit_by_name( GTK_OBJECT(m_adjust), "changed" );
+ g_signal_emit_by_name (m_adjust, "changed");
GtkEnableEvents();
}
bool wxSlider::IsOwnGtkWindow( GdkWindow *window )
{
GtkRange *range = GTK_RANGE(m_widget);
-#ifdef __WXGTK20__
return (range->event_window == window);
-#else
- return ( (window == GTK_WIDGET(range)->window)
- || (window == range->trough)
- || (window == range->slider)
- || (window == range->step_forw)
- || (window == range->step_back) );
-#endif
}
void wxSlider::GtkDisableEvents()
{
- gtk_signal_disconnect_by_func( GTK_OBJECT(m_adjust),
- GTK_SIGNAL_FUNC(gtk_slider_callback),
- (gpointer) this );
+ g_signal_handlers_disconnect_by_func (m_adjust,
+ (gpointer) gtk_slider_callback,
+ this);
}
void wxSlider::GtkEnableEvents()
{
- gtk_signal_connect( GTK_OBJECT (m_adjust),
- "value_changed",
- GTK_SIGNAL_FUNC(gtk_slider_callback),
- (gpointer) this );
+ g_signal_connect (m_adjust, "value_changed",
+ G_CALLBACK (gtk_slider_callback), this);
}
// static