+wxSlider::~wxSlider()
+{
+ if (m_scale && m_scale != m_widget)
+ GTKDisconnect(m_scale);
+}
+
+bool wxSlider::Create(wxWindow *parent,
+ wxWindowID id,
+ int value,
+ int minValue,
+ int maxValue,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxValidator& validator,
+ const wxString& name)
+{
+ m_pos = value;
+ m_scrollEventType = GTK_SCROLL_NONE;
+ m_needThumbRelease = false;
+ m_blockScrollEvent = false;
+
+ if (!PreCreation( parent, pos, size ) ||
+ !CreateBase( parent, id, pos, size, style, validator, name ))
+ {
+ wxFAIL_MSG( wxT("wxSlider creation failed") );
+ return false;
+ }
+
+ const bool isVertical = (style & wxSL_VERTICAL) != 0;
+ m_scale = gtk_scale_new(GtkOrientation(isVertical), NULL);
+
+ if (style & wxSL_MIN_MAX_LABELS)
+ {
+ gtk_widget_show( m_scale );
+
+ m_widget = gtk_box_new(GtkOrientation(!isVertical), 0);
+ gtk_box_pack_start(GTK_BOX(m_widget), m_scale, true, true, 0);
+
+ GtkWidget* box = gtk_box_new(GtkOrientation(isVertical), 0);
+ gtk_widget_show(box);
+ gtk_box_pack_start(GTK_BOX(m_widget), box, true, true, 0);
+
+ m_minLabel = gtk_label_new(NULL);
+ gtk_widget_show( m_minLabel );
+ gtk_box_pack_start(GTK_BOX(box), m_minLabel, false, false, 0);
+
+ // expanding empty space between the min/max labels
+ GtkWidget *space = gtk_label_new(NULL);
+ gtk_widget_show( space );
+ gtk_box_pack_start(GTK_BOX(box), space, true, false, 0);
+
+ m_maxLabel = gtk_label_new(NULL);
+ gtk_widget_show( m_maxLabel );
+ gtk_box_pack_end(GTK_BOX(box), m_maxLabel, false, false, 0);
+ }
+ else
+ {
+ m_widget = m_scale;
+ m_maxLabel = NULL;
+ m_minLabel = NULL;
+ }
+ g_object_ref(m_widget);
+
+ const bool showValueLabel = (style & wxSL_VALUE_LABEL) != 0;
+ gtk_scale_set_draw_value(GTK_SCALE (m_scale), showValueLabel );
+ if ( showValueLabel )
+ {
+ // position the label appropriately: notice that wxSL_DIRECTION flags
+ // specify the position of the ticks, not label, under MSW and so the
+ // label is on the opposite side
+ GtkPositionType posLabel;
+ if ( style & wxSL_VERTICAL )
+ {
+ if ( style & wxSL_LEFT )
+ posLabel = GTK_POS_RIGHT;
+ else // if ( style & wxSL_RIGHT ) -- this is also the default
+ posLabel = GTK_POS_LEFT;
+ }
+ else // horizontal slider
+ {
+ if ( style & wxSL_TOP )
+ posLabel = GTK_POS_BOTTOM;
+ else // if ( style & wxSL_BOTTOM) -- this is again the default
+ posLabel = GTK_POS_TOP;
+ }
+
+ gtk_scale_set_value_pos( GTK_SCALE(m_scale), posLabel );
+ }
+
+ // Keep full precision in position value
+ gtk_scale_set_digits(GTK_SCALE (m_scale), -1);
+
+ if (style & wxSL_INVERSE)
+ gtk_range_set_inverted( GTK_RANGE(m_scale), TRUE );
+
+ g_signal_connect(m_scale, "button_press_event", G_CALLBACK(gtk_button_press_event), this);
+ g_signal_connect(m_scale, "button_release_event", G_CALLBACK(gtk_button_release_event), this);
+ g_signal_connect(m_scale, "move_slider", G_CALLBACK(gtk_move_slider), this);
+ g_signal_connect(m_scale, "format_value", G_CALLBACK(gtk_format_value), NULL);
+ g_signal_connect(m_scale, "value_changed", G_CALLBACK(gtk_value_changed), this);
+ gulong handler_id = g_signal_connect(m_scale, "event_after", G_CALLBACK(gtk_event_after), this);
+ g_signal_handler_block(m_scale, handler_id);
+
+ SetRange( minValue, maxValue );
+
+ // don't call the public SetValue() as it won't do anything unless the
+ // value really changed
+ GTKSetValue( value );
+
+ m_parent->DoAddChild( this );
+
+ PostCreation(size);
+
+ return true;
+}
+
+void wxSlider::GTKDisableEvents()