diff options
Diffstat (limited to 'src/jalv_gtk2.c')
-rw-r--r-- | src/jalv_gtk2.c | 52 |
1 files changed, 45 insertions, 7 deletions
diff --git a/src/jalv_gtk2.c b/src/jalv_gtk2.c index eee16ac..5e2da3f 100644 --- a/src/jalv_gtk2.c +++ b/src/jalv_gtk2.c @@ -18,6 +18,8 @@ #include <gtk/gtk.h> +#include "lv2/lv2plug.in/ns/ext/port-props/port-props.h" + #include "jalv_internal.h" static void @@ -248,6 +250,13 @@ slider_changed(GtkRange* range, gpointer data) return FALSE; } +static gboolean +log_slider_changed(GtkRange* range, gpointer data) +{ + ((struct Port*)data)->control = expf(gtk_range_get_value(range)); + return FALSE; +} + static void combo_changed(GtkComboBox* box, gpointer data) { @@ -280,6 +289,12 @@ scale_format(GtkScale* scale, gdouble value, gpointer user_data) g_strdup_printf("%0.*f", gtk_scale_get_digits(scale), value); } +static gchar* +log_scale_format(GtkScale* scale, gdouble value, gpointer user_data) +{ + return g_strdup_printf("%0.6g", exp(gtk_range_get_value(GTK_RANGE(scale)))); +} + static gint dcmp(gconstpointer a, gconstpointer b) { @@ -319,6 +334,24 @@ make_combo(struct Port* port, GHashTable* points, int deft) } static GtkWidget* +make_log_slider(struct Port* port, GHashTable* points, + float min, float max, float deft) +{ + float lmin = logf(min); + float lmax = logf(max); + float ldft = logf(deft); + GtkWidget* slider = gtk_hscale_new_with_range(lmin, lmax, 0.001); + gtk_scale_set_digits(GTK_SCALE(slider), 6); + gtk_range_set_value(GTK_RANGE(slider), ldft); + g_signal_connect(G_OBJECT(slider), + "format-value", G_CALLBACK(log_scale_format), points); + g_signal_connect(G_OBJECT(slider), + "value-changed", G_CALLBACK(log_slider_changed), port); + + return slider; +} + +static GtkWidget* make_slider(struct Port* port, GHashTable* points, bool is_int, float min, float max, float deft) { @@ -354,6 +387,7 @@ build_control_widget(Jalv* jalv, GtkWidget* window) LilvNode* lv2_integer = lilv_new_uri(jalv->world, LV2_CORE__integer); LilvNode* lv2_toggled = lilv_new_uri(jalv->world, LV2_CORE__toggled); LilvNode* lv2_enum = lilv_new_uri(jalv->world, LV2_CORE__enumeration); + LilvNode* lv2_log = lilv_new_uri(jalv->world, LV2_PORT_PROPS__logarithmic); LilvNode* rdfs_comment = lilv_new_uri(jalv->world, LILV_NS_RDFS "comment"); GtkWidget* port_table = gtk_table_new(jalv->num_ports, 2, false); float* defaults = calloc(jalv->num_ports, sizeof(float)); @@ -389,18 +423,22 @@ build_control_widget(Jalv* jalv, GtkWidget* window) } /* Make control */ - GtkWidget* control = NULL; + GtkWidget* control = NULL; + bool is_integer = lilv_port_has_property( + jalv->plugin, port, lv2_integer); if (lilv_port_has_property(jalv->plugin, port, lv2_toggled)) { control = make_toggle(&jalv->ports[i], defaults[i]); } else if (lilv_port_has_property(jalv->plugin, port, lv2_enum) - || (lilv_port_has_property(jalv->plugin, port, lv2_integer) - && points)) { + || (is_integer && points && + (g_hash_table_size(points) + == (unsigned)(maxs[i] - mins[i] + 1)))) { control = make_combo(&jalv->ports[i], points, defaults[i]); + } else if (lilv_port_has_property(jalv->plugin, port, lv2_log)) { + control = make_log_slider(&jalv->ports[i], points, + mins[i], maxs[i], defaults[i]); } else { - control = make_slider( - &jalv->ports[i], points, - lilv_port_has_property(jalv->plugin, port, lv2_integer), - mins[i], maxs[i], defaults[i]); + control = make_slider(&jalv->ports[i], points, is_integer, + mins[i], maxs[i], defaults[i]); } jalv->ports[i].widget = control; |