[SCM] calf/master: Remove the X-dependent logic from knobs - it had some advantages, but I couldn't make it handle "stepped" knobs properly.
js at users.alioth.debian.org
js at users.alioth.debian.org
Tue May 7 15:40:22 UTC 2013
The following commit has been merged in the master branch:
commit ca3ccb2c656578d71166246eb79dc902bb25f116
Author: Krzysztof Foltman <wdev at foltman.com>
Date: Sat Sep 18 14:39:50 2010 +0100
Remove the X-dependent logic from knobs - it had some advantages, but I couldn't make it handle "stepped" knobs properly.
diff --git a/src/calf/custom_ctl.h b/src/calf/custom_ctl.h
index 831c12f..28dc0c6 100644
--- a/src/calf/custom_ctl.h
+++ b/src/calf/custom_ctl.h
@@ -115,7 +115,7 @@ struct CalfKnob
GtkRange parent;
int knob_type;
int knob_size;
- double start_x, start_y, start_value, last_y, last_x;
+ double start_x, start_y, last_y, start_value;
double last_dz;
};
diff --git a/src/custom_ctl.cpp b/src/custom_ctl.cpp
index ba08288..cee78f4 100644
--- a/src/custom_ctl.cpp
+++ b/src/custom_ctl.cpp
@@ -927,7 +927,7 @@ calf_knob_button_press (GtkWidget *widget, GdkEventButton *event)
gtk_widget_grab_focus(widget);
gtk_grab_add(widget);
self->start_x = event->x;
- self->start_y = event->y;
+ self->last_y = self->start_y = event->y;
self->start_value = gtk_range_get_value(GTK_RANGE(widget));
return TRUE;
@@ -951,23 +951,21 @@ static inline float endless(float value)
return fmod(1.f - fmod(1.f - value, 1.f), 1.f);
}
-static inline float deadzone(GtkWidget *widget, float value, float incr, float scale)
+static inline float deadzone(GtkWidget *widget, float value, float incr)
{
- CalfKnob *self = CALF_KNOB(widget);
- float dz = 20 / scale;
- if(self->last_dz < 0.f) {
- self -> last_dz = value + incr;
- } else if (self->last_dz > 1.f) {
- self->last_dz = 1.f;
- } else {
- self->last_dz += incr;
- }
- if(self->last_dz > 0.5 + dz) {
- return std::min(0.5 + (self->last_dz - 0.5 - dz) * 0.5 / (0.5 - dz), (double)1);
- }
- if(self->last_dz < 0.5 - dz) {
- return std::max(self->last_dz * 0.5 / (0.5 - dz), (double)0);
- }
+ // map to dead zone
+ float ov = value;
+ if (ov > 0.5)
+ ov = 0.1 + ov;
+ if (ov < 0.5)
+ ov = ov - 0.1;
+
+ float nv = ov + incr;
+
+ if (nv > 0.6)
+ return nv - 0.1;
+ if (nv < 0.4)
+ return nv + 0.1;
return 0.5;
}
@@ -982,24 +980,22 @@ calf_knob_pointer_motion (GtkWidget *widget, GdkEventMotion *event)
if (GTK_WIDGET_HAS_GRAB(widget))
{
- float sens = 1 + fabs(event->x - self->start_x) / 10;
if (self->knob_type == 3)
{
- gtk_range_set_value(GTK_RANGE(widget), endless(gtk_range_get_value(GTK_RANGE(widget)) - (event->y - self->last_y) / (scale * sens)));
+ gtk_range_set_value(GTK_RANGE(widget), endless(self->start_value - (event->y - self->start_y) / scale));
}
else
if (self->knob_type == 1)
{
- gtk_range_set_value(GTK_RANGE(widget), deadzone(GTK_WIDGET(widget), gtk_range_get_value(GTK_RANGE(widget)), -(event->y - self->last_y) / (scale * sens), (scale * sens)));
+ gtk_range_set_value(GTK_RANGE(widget), deadzone(GTK_WIDGET(widget), self->start_value, -(event->y - self->start_y) / scale));
}
else
{
- gtk_range_set_value(GTK_RANGE(widget), gtk_range_get_value(GTK_RANGE(widget)) - (event->y - self->last_y) / (scale * sens));
+ gtk_range_set_value(GTK_RANGE(widget), self->start_value - (event->y - self->start_y) / scale);
}
moved = TRUE;
}
self->last_y = event->y;
- self->last_x = event->x;
return moved;
}
--
calf audio plugins packaging
More information about the pkg-multimedia-commits
mailing list