- const float px_deadzone = 42.f * ui_scale;
-
- if ((val - _zero) * (val - _zero + delta * scale) < 0) {
- /* zero transition */
- const int tozero = (_zero - val) * scale;
- int remain = delta - tozero;
- if (abs (remain) > px_deadzone) {
- /* slow down zero transitions */
- remain += (remain > 0) ? px_deadzone * -.5 : px_deadzone * .5;
- delta = tozero + remain;
- _dead_zone_delta = 0;
- } else {
- c->set_interface(_zero);
- val = _zero;
- _dead_zone_delta = remain / px_deadzone;
+ if (_flags & Detent) {
+ const float px_deadzone = 42.f * ui_scale;
+
+ if ((val - _normal) * (val - _normal + delta * scale) < 0) {
+ /* detent */
+ const int tozero = (_normal - val) * scale;
+ int remain = delta - tozero;
+ if (abs (remain) > px_deadzone) {
+ /* slow down passing the default value */
+ remain += (remain > 0) ? px_deadzone * -.5 : px_deadzone * .5;
+ delta = tozero + remain;
+ _dead_zone_delta = 0;
+ } else {
+ c->set_value (c->normal());
+ _dead_zone_delta = remain / px_deadzone;
+ return true;
+ }
+ }
+
+ if (fabsf (rintf((val - _normal) / scale) + _dead_zone_delta) < 1) {
+ c->set_value (c->normal());
+ _dead_zone_delta += delta / px_deadzone;