]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/slider.cpp
Better temporary fix.
[wxWidgets.git] / src / gtk / slider.cpp
index f08fcc5b4905fdb2acdf7476b6d015f26a0ff087..0eeb6b696e405aad89123cec28a4cabdc6523c8a 100644 (file)
@@ -16,6 +16,7 @@
 
 #ifndef WX_PRECOMP
     #include "wx/utils.h"
+    #include "wx/math.h"
 #endif
 
 #include "wx/gtk/private.h"
@@ -129,7 +130,7 @@ gtk_value_changed(GtkRange* range, wxSlider* win)
     if (g_blockEventsOnDrag) return;
 
     GtkAdjustment* adj = range->adjustment;
-    const int pos = int(round(adj->value));
+    const int pos = wxRound(adj->value);
     const double oldPos = win->m_pos;
     win->m_pos = adj->value;
     if (win->m_blockScrollEvent)
@@ -178,7 +179,7 @@ gtk_value_changed(GtkRange* range, wxSlider* win)
     win->m_scrollEventType = GTK_SCROLL_NONE;
 
     // If integral position has changed
-    if (int(round(oldPos)) != pos)
+    if (wxRound(oldPos) != pos)
     {
         wxCHECK_RET(eventType != wxEVT_NULL, _T("Unknown slider scroll event type"));
         ProcessScrollEvent(win, eventType);
@@ -214,27 +215,28 @@ gtk_button_press_event(GtkWidget*, GdkEventButton*, wxSlider* win)
 }
 }
 
-// Single shot idle callback, to generate thumb release event, and
-//  truncate position to integral value.  Idle callback is used
-//  because position cannot be changed from button release event.
+//-----------------------------------------------------------------------------
+// "event_after"
+//-----------------------------------------------------------------------------
+
 extern "C" {
-static gboolean
-idle_thumbrelease(void* data)
+static void
+gtk_event_after(GtkRange* range, GdkEvent* event, wxSlider* win)
 {
-    gdk_threads_enter();
-    wxSlider* win = (wxSlider*)data;
-    win->m_isScrolling = false;
-    if (win->m_needThumbRelease)
+    if (event->type == GDK_BUTTON_RELEASE)
     {
-        win->m_needThumbRelease = false;
-        ProcessScrollEvent(win, wxEVT_SCROLL_THUMBRELEASE);
+        g_signal_handlers_block_by_func(range, (void*)gtk_event_after, win);
+
+        if (win->m_needThumbRelease)
+        {
+            win->m_needThumbRelease = false;
+            ProcessScrollEvent(win, wxEVT_SCROLL_THUMBRELEASE);
+        }
+        // Keep slider at an integral position
+        win->BlockScrollEvent();
+        gtk_range_set_value((GtkRange*)win->m_widget, win->GetValue());
+        win->UnblockScrollEvent();
     }
-    // Keep slider at an integral position
-    win->BlockScrollEvent();
-    gtk_range_set_value((GtkRange*)win->m_widget, win->GetValue());
-    win->UnblockScrollEvent();
-    gdk_threads_leave();
-    return false;
 }
 }
 
@@ -244,12 +246,13 @@ idle_thumbrelease(void* data)
 
 extern "C" {
 static gboolean
-gtk_button_release_event(GtkWidget*, GdkEventButton*, wxSlider* win)
+gtk_button_release_event(GtkRange* range, GdkEventButton*, wxSlider* win)
 {
     win->m_mouseButtonDown = false;
     if (win->m_isScrolling)
     {
-        g_idle_add(idle_thumbrelease, win);
+        win->m_isScrolling = false;
+        g_signal_handlers_unblock_by_func(range, (void*)gtk_event_after, win);
     }
     return false;
 }
@@ -263,7 +266,7 @@ extern "C" {
 static gchar* gtk_format_value(GtkScale*, double value, void*)
 {
     // Format value as nearest integer
-    return g_strdup_printf("%d", int(round(value)));
+    return g_strdup_printf("%d", wxRound(value));
 }
 }
 
@@ -316,6 +319,10 @@ bool wxSlider::Create(wxWindow *parent, wxWindowID id,
     g_signal_connect(m_widget, "move_slider", G_CALLBACK(gtk_move_slider), this);
     g_signal_connect(m_widget, "format_value", G_CALLBACK(gtk_format_value), NULL);
     g_signal_connect(m_widget, "value_changed", G_CALLBACK(gtk_value_changed), this);
+    gulong handler_id;
+    handler_id = g_signal_connect(
+        m_widget, "event_after", G_CALLBACK(gtk_event_after), this);
+    g_signal_handler_block(m_widget, handler_id);
 
     SetRange( minValue, maxValue );
     SetValue( value );
@@ -329,7 +336,7 @@ bool wxSlider::Create(wxWindow *parent, wxWindowID id,
 
 int wxSlider::GetValue() const
 {
-    return int(round(m_pos));
+    return wxRound(m_pos);
 }
 
 void wxSlider::SetValue( int value )