diff --git a/src/Fl_Dial.cxx b/src/Fl_Dial.cxx index e8c5eaf..fdef33d 100644 --- a/src/Fl_Dial.cxx +++ b/src/Fl_Dial.cxx @@ -110,36 +110,20 @@ Fl_Dial::handle ( int m ) { if ( this != Fl::belowmouse() ) return 0; - - int steps = 16; - - if ( Fl::event_ctrl() ) - steps = 128; - - float step = fabs( maximum() - minimum() ) / (float)steps; - - float d = ((float)Fl::event_dy()) * step; - - double v = value() + d; - + if (Fl::e_dy==0) + return 0; + + const int steps = Fl::event_ctrl() ? 128 : 16; + + const float step = fabs( maximum() - minimum() ) / (float)steps; + + int dy = Fl::e_dy; + + /* slider is in 'upside down' configuration, invert meaning of mousewheel */ if ( maximum() > minimum() ) - { - if ( v < minimum() ) - v = minimum(); - else if ( v > maximum() ) - v = maximum(); - } - else - { - if ( v > minimum() ) - v = minimum(); - else if ( v < maximum() ) - v = maximum(); - } - - value( v ); - do_callback(); - + dy = 0 - dy; + + handle_drag(clamp(value() + step * dy)); return 1; } } diff --git a/src/Fl_Slider.cxx b/src/Fl_Slider.cxx index 160e8c5..862a0da 100644 --- a/src/Fl_Slider.cxx +++ b/src/Fl_Slider.cxx @@ -350,6 +350,26 @@ int Fl_Slider::handle(int event, int X, int Y, int W, int H) { case FL_ENTER : case FL_LEAVE : return 1; + case FL_MOUSEWHEEL : + { + if ( this != Fl::belowmouse() ) + return 0; + if (Fl::e_dy==0) + return 0; + + const int steps = Fl::event_ctrl() ? 128 : 16; + + const float step = fabs( maximum() - minimum() ) / (float)steps; + + int dy = Fl::e_dy; + + /* slider is in 'upside down' configuration, invert meaning of mousewheel */ + if ( minimum() > maximum() ) + dy = 0 - dy; + + handle_drag(clamp(value() + step * dy)); + return 1; + } default: return 0; }