static void gtk_slider_callback( GtkAdjustment *adjust, SCROLLBAR_CBACK_ARG wxSlider *win ) { if (g_isIdle) wxapp_install_idle_handler(); if (!win->m_hasVMT) return; if (g_blockEventsOnDrag) return; const double dvalue = adjust->value; const double diff = dvalue - win->m_oldPos; if ( AreSameAdjustValues(diff, 0) ) return; wxEventType evtType; evtType = GtkScrollTypeToWx(GET_SCROLL_TYPE(win->m_widget)); ProcessScrollEvent(win, evtType, dvalue); win->m_oldPos = dvalue; }
static void gtk_value_changed(GtkRange* range, wxSlider* win) { const double value = gtk_range_get_value(range); const double oldPos = win->m_pos; win->m_pos = value; if (!win->m_hasVMT || g_blockEventsOnDrag) return; if (win->GTKEventsDisabled()) { win->m_scrollEventType = GTK_SCROLL_NONE; return; } wxEventType eventType = wxEVT_NULL; if (win->m_isScrolling) { eventType = wxEVT_SCROLL_THUMBTRACK; } else if (win->m_scrollEventType != GTK_SCROLL_NONE) { // Scroll event from "move-slider" (keyboard) eventType = GtkScrollTypeToWx(win->m_scrollEventType); } else if (win->m_mouseButtonDown) { // Difference from last change event const double diff = value - oldPos; const bool isDown = diff > 0; GtkAdjustment* adj = gtk_range_get_adjustment(range); if (IsScrollIncrement(gtk_adjustment_get_page_increment(adj), diff)) { eventType = isDown ? wxEVT_SCROLL_PAGEDOWN : wxEVT_SCROLL_PAGEUP; } else if (wxIsSameDouble(value, 0)) { eventType = wxEVT_SCROLL_PAGEUP; } else if (wxIsSameDouble(value, gtk_adjustment_get_upper(adj))) { eventType = wxEVT_SCROLL_PAGEDOWN; } else { // Assume track event eventType = wxEVT_SCROLL_THUMBTRACK; // Remember that we're tracking win->m_isScrolling = true; } } win->m_scrollEventType = GTK_SCROLL_NONE; // If integral position has changed if (wxRound(oldPos) != wxRound(value)) { ProcessScrollEvent(win, eventType); win->m_needThumbRelease = eventType == wxEVT_SCROLL_THUMBTRACK; } }