summaryrefslogtreecommitdiffstats
path: root/src/port.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2013-02-03 22:29:15 +0000
committerDavid Robillard <d@drobilla.net>2013-02-03 22:29:15 +0000
commit6ddaa0260c4749aa6c0395000381d7df0bd3feb1 (patch)
tree00024d5d970317292355b663383b43d151c6757b /src/port.c
parent39b748a4836d6220922867eae0dd5339792033ab (diff)
downloadganv-6ddaa0260c4749aa6c0395000381d7df0bd3feb1.tar.gz
ganv-6ddaa0260c4749aa6c0395000381d7df0bd3feb1.tar.bz2
ganv-6ddaa0260c4749aa6c0395000381d7df0bd3feb1.zip
Port control performance improvements (further improvement for #879).
Only request a redraw, not a full update, where appropriate. Use a raw double instead of GVariant for port control-changed signal. git-svn-id: http://svn.drobilla.net/lad/trunk/ganv@5045 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/port.c')
-rw-r--r--src/port.c90
1 files changed, 48 insertions, 42 deletions
diff --git a/src/port.c b/src/port.c
index 5780571..3bc300e 100644
--- a/src/port.c
+++ b/src/port.c
@@ -354,7 +354,7 @@ ganv_port_class_init(GanvPortClass* klass)
NULL, NULL,
NULL,
G_TYPE_NONE, 1,
- G_TYPE_VARIANT);
+ G_TYPE_DOUBLE);
object_class->destroy = ganv_port_destroy;
@@ -497,26 +497,6 @@ ganv_port_set_value_label(GanvPort* port,
}
}
-void
-ganv_port_set_control_is_toggle(GanvPort* port,
- gboolean is_toggle)
-{
- if (port->impl->control) {
- port->impl->control->is_toggle = is_toggle;
- ganv_port_set_control_value(port, port->impl->control->value);
- }
-}
-
-void
-ganv_port_set_control_is_integer(GanvPort* port,
- gboolean is_integer)
-{
- if (port->impl->control) {
- port->impl->control->is_integer = is_integer;
- ganv_port_set_control_value(port, lrintf(port->impl->control->value));
- }
-}
-
static void
ganv_port_update_control_slider(GanvPort* port,
float value)
@@ -526,6 +506,7 @@ ganv_port_update_control_slider(GanvPort* port,
return;
}
+ // Clamp to toggle or integer value if applicable
if (impl->control->is_toggle) {
if (value != 0.0f) {
value = impl->control->max;
@@ -536,43 +517,51 @@ ganv_port_update_control_slider(GanvPort* port,
value = lrintf(value);
}
+ // Clamp to range
if (value < impl->control->min) {
- impl->control->min = value;
+ value = impl->control->min;
}
if (value > impl->control->max) {
- impl->control->max = value;
- }
-
- if (impl->control->max == impl->control->min) {
- impl->control->max = impl->control->min + 1.0f;
- }
-
- const int inf = isinf(value);
- if (inf == -1) {
- value = impl->control->min;
- } else if (inf == 1) {
value = impl->control->max;
}
+
+ if (value == impl->control->value) {
+ return; // No change, do nothing
+ }
const double w = (value - impl->control->min)
/ (impl->control->max - impl->control->min)
* ganv_box_get_width(&port->box);
if (isnan(w)) {
- return;
+ return; // Shouldn't happen, but ignore crazy values
}
+ // Redraw port
+ impl->control->value = value;
ganv_box_set_width(impl->control->rect, MAX(0.0, w - 1.0));
+ ganv_box_request_redraw(
+ GANV_ITEM(port), &GANV_BOX(port)->impl->coords, FALSE);
+}
- if (impl->control->value != value) {
- GVariant* gvar = g_variant_ref_sink(g_variant_new_double(value));
- g_signal_emit(port, port_signals[PORT_VALUE_CHANGED], 0, gvar, NULL);
- g_variant_unref(gvar);
+void
+ganv_port_set_control_is_toggle(GanvPort* port,
+ gboolean is_toggle)
+{
+ if (port->impl->control) {
+ port->impl->control->is_toggle = is_toggle;
+ ganv_port_update_control_slider(port, port->impl->control->value);
}
+}
- impl->control->value = value;
-
- ganv_item_request_update(GANV_ITEM(port));
+void
+ganv_port_set_control_is_integer(GanvPort* port,
+ gboolean is_integer)
+{
+ if (port->impl->control) {
+ port->impl->control->is_integer = is_integer;
+ ganv_port_update_control_slider(port, lrintf(port->impl->control->value));
+ }
}
void
@@ -585,16 +574,30 @@ ganv_port_set_control_value(GanvPort* port,
ganv_port_set_value_label(
port, (const char*)((value == 0.0f) ? check_off : check_on));
}
-
ganv_port_update_control_slider(port, value);
}
void
+ganv_port_set_control_value_internal(GanvPort* port,
+ float value)
+{
+ // Update slider
+ ganv_port_set_control_value(port, value);
+
+ // Fire signal to notify user value has changed
+ const double dvalue = value;
+ g_signal_emit(port, port_signals[PORT_VALUE_CHANGED], 0, dvalue, NULL);
+}
+
+void
ganv_port_set_control_min(GanvPort* port,
float min)
{
if (port->impl->control) {
port->impl->control->min = min;
+ if (port->impl->control->max < min) {
+ port->impl->control->max = min;
+ }
ganv_port_update_control_slider(port, port->impl->control->value);
}
}
@@ -605,6 +608,9 @@ ganv_port_set_control_max(GanvPort* port,
{
if (port->impl->control) {
port->impl->control->max = max;
+ if (port->impl->control->min > max) {
+ port->impl->control->min = max;
+ }
ganv_port_update_control_slider(port, port->impl->control->value);
}
}