]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/slider.cpp
Return NULL from wxWindow::GetCapture() when the capture is being lost.
[wxWidgets.git] / src / gtk / slider.cpp
index a5ed7f8e33c907e5cfa20b5dc191f34e19dc45a2..17d8cf087cec7149cb9368a9299469402cbe2c95 100644 (file)
@@ -2,7 +2,6 @@
 // Name:        src/gtk/slider.cpp
 // Purpose:
 // Author:      Robert Roebling
-// Id:          $Id$
 // Copyright:   (c) 1998 Robert Roebling
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -60,7 +59,7 @@ ProcessScrollEvent(wxSlider *win, wxEventType evtType)
     }
 
     // and also generate a command event for compatibility
-    wxCommandEvent event( wxEVT_COMMAND_SLIDER_UPDATED, win->GetId() );
+    wxCommandEvent event( wxEVT_SLIDER, win->GetId() );
     event.SetEventObject( win );
     event.SetInt( value );
     win->HandleWindowEvent( event );
@@ -129,7 +128,7 @@ gtk_value_changed(GtkRange* range, wxSlider* win)
     const double oldPos = win->m_pos;
     win->m_pos = value;
 
-    if (!win->m_hasVMT || g_blockEventsOnDrag)
+    if (g_blockEventsOnDrag)
         return;
 
     if (win->GTKEventsDisabled())
@@ -275,10 +274,13 @@ static gchar* gtk_format_value(GtkScale*, double value, void*)
 
 wxSlider::wxSlider()
 {
-    m_pos = 0;
-    m_scrollEventType = GTK_SCROLL_NONE;
-    m_needThumbRelease = false;
-    m_blockScrollEvent = false;
+    m_scale = NULL;
+}
+
+wxSlider::~wxSlider()
+{
+    if (m_scale && m_scale != m_widget)
+        GTKDisconnect(m_scale);
 }
 
 bool wxSlider::Create(wxWindow *parent,
@@ -294,6 +296,8 @@ bool wxSlider::Create(wxWindow *parent,
 {
     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 ))
@@ -302,52 +306,32 @@ bool wxSlider::Create(wxWindow *parent,
         return false;
     }
 
-
-    if (style & wxSL_VERTICAL)
-        m_scale = gtk_vscale_new( NULL );
-    else
-        m_scale = gtk_hscale_new( NULL );
-    g_object_ref(m_scale);
+    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 );
 
-        if (style & wxSL_VERTICAL)
-            m_widget = gtk_hbox_new(false, 0);
-        else
-            m_widget = gtk_vbox_new(false, 0);
-        g_object_ref(m_widget);
-        gtk_widget_show( m_widget );
-        gtk_container_add( GTK_CONTAINER(m_widget), m_scale );
-
-        GtkWidget *box;
-        if (style & wxSL_VERTICAL)
-            box = gtk_vbox_new(false,0);
-        else
-            box = gtk_hbox_new(false,0);
-        g_object_ref(box);
+        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_container_add( GTK_CONTAINER(m_widget), box );
+        gtk_box_pack_start(GTK_BOX(m_widget), box, true, true, 0);
 
         m_minLabel = gtk_label_new(NULL);
-        g_object_ref(m_minLabel);
         gtk_widget_show( m_minLabel );
-        gtk_container_add( GTK_CONTAINER(box), m_minLabel );
-        gtk_box_set_child_packing( GTK_BOX(box), m_minLabel, FALSE, FALSE, 0, GTK_PACK_START );
+        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);
-        g_object_ref(space);
         gtk_widget_show( space );
-        gtk_container_add( GTK_CONTAINER(box), space );
-        gtk_box_set_child_packing( GTK_BOX(box), space, TRUE, FALSE, 0, GTK_PACK_START );
+        gtk_box_pack_start(GTK_BOX(box), space, true, false, 0);
 
         m_maxLabel = gtk_label_new(NULL);
-        g_object_ref(m_maxLabel);
         gtk_widget_show( m_maxLabel );
-        gtk_container_add( GTK_CONTAINER(box), m_maxLabel );
-        gtk_box_set_child_packing( GTK_BOX(box), m_maxLabel, FALSE, FALSE, 0, GTK_PACK_END );
+        gtk_box_pack_end(GTK_BOX(box), m_maxLabel, false, false, 0);
     }
     else
     {
@@ -355,6 +339,7 @@ bool wxSlider::Create(wxWindow *parent,
         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 );
@@ -439,6 +424,8 @@ void wxSlider::GTKSetValue(int value)
 {
     GTKDisableEvents();
     gtk_range_set_value(GTK_RANGE (m_scale), value);
+    // GTK only updates value label if handle moves at least 1 pixel
+    gtk_widget_queue_draw(m_scale);
     GTKEnableEvents();
 }
 
@@ -520,14 +507,19 @@ int wxSlider::GetLineSize() const
 
 GdkWindow *wxSlider::GTKGetWindow(wxArrayGdkWindows& WXUNUSED(windows)) const
 {
+#ifdef __WXGTK3__
+    // no access to internal GdkWindows
+    return NULL;
+#else
     return GTK_RANGE(m_scale)->event_window;
+#endif
 }
 
 // static
 wxVisualAttributes
 wxSlider::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
 {
-    return GetDefaultAttributesFromGTKWidget(gtk_vscale_new);
+    return GetDefaultAttributesFromGTKWidget(gtk_scale_new(GTK_ORIENTATION_VERTICAL, NULL));
 }
 
 #endif // wxUSE_SLIDER