Remove widgets from struct alsa_elem and add data to callbacks

Rather than having widget/widget2/widget_callback fields in the struct
alsa_elem, have a list of callbacks and allow private data to be
passed to callbacks.
This commit is contained in:
Geoffrey D. Bennett
2023-12-03 04:53:34 +10:30
parent d56a1d34ff
commit 47034d7901
11 changed files with 222 additions and 126 deletions

View File

@@ -4,18 +4,30 @@
#include "gtkdial.h"
#include "widget-gain.h"
static void gain_changed(GtkWidget *widget, struct alsa_elem *elem) {
int value = gtk_dial_get_value(GTK_DIAL(widget));
struct gain {
struct alsa_elem *elem;
GtkWidget *vbox;
GtkWidget *dial;
GtkWidget *label;
};
alsa_set_elem_value(elem, value);
static void gain_changed(GtkWidget *widget, struct gain *data) {
int value = gtk_dial_get_value(GTK_DIAL(data->dial));
alsa_set_elem_value(data->elem, value);
}
static void gain_updated(struct alsa_elem *elem) {
static void gain_updated(
struct alsa_elem *elem,
void *private
) {
struct gain *data = private;
int is_writable = alsa_get_elem_writable(elem);
gtk_widget_set_sensitive(elem->widget, is_writable);
gtk_widget_set_sensitive(data->dial, is_writable);
int alsa_value = alsa_get_elem_value(elem);
gtk_dial_set_value(GTK_DIAL(elem->widget), alsa_value);
gtk_dial_set_value(GTK_DIAL(data->dial), alsa_value);
char s[20];
float scale = (float)(elem->max_dB - elem->min_dB) /
@@ -28,39 +40,38 @@ static void gain_updated(struct alsa_elem *elem) {
else
snprintf(s, 20, "%.0fdB", value);
gtk_label_set_text(GTK_LABEL(elem->widget2), s);
gtk_label_set_text(GTK_LABEL(data->label), s);
}
//GList *make_gain_alsa_elem(struct alsa_elem *elem) {
GtkWidget *make_gain_alsa_elem(struct alsa_elem *elem) {
GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_widget_set_hexpand(vbox, TRUE);
struct gain *data = g_malloc(sizeof(struct gain));
data->elem = elem;
data->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_widget_set_hexpand(data->vbox, TRUE);
GtkWidget *dial = gtk_dial_new_with_range(
elem->min_val, elem->max_val, 1
);
data->dial = gtk_dial_new_with_range(elem->min_val, elem->max_val, 1);
// calculate 0dB value from min/max dB and min/max value
float scale = (float)(elem->max_dB - elem->min_dB) /
(elem->max_val - elem->min_val);
int zero_db_value = (int)((0 - elem->min_dB) / scale + elem->min_val);
gtk_dial_set_zero_db(GTK_DIAL(dial), zero_db_value);
gtk_dial_set_zero_db(GTK_DIAL(data->dial), zero_db_value);
gtk_widget_set_vexpand(dial, TRUE);
data->label = gtk_label_new(NULL);
gtk_widget_set_vexpand(data->dial, TRUE);
g_signal_connect(
dial, "value-changed", G_CALLBACK(gain_changed), elem
data->dial, "value-changed", G_CALLBACK(gain_changed), data
);
elem->widget = dial;
elem->widget_callback = gain_updated;
GtkWidget *label = gtk_label_new(NULL);
elem->widget2 = label;
alsa_elem_add_callback(elem, gain_updated, data);
gain_updated(elem);
gain_updated(elem, data);
gtk_box_append(GTK_BOX(vbox), dial);
gtk_box_append(GTK_BOX(vbox), label);
gtk_box_append(GTK_BOX(data->vbox), data->dial);
gtk_box_append(GTK_BOX(data->vbox), data->label);
return vbox;
return data->vbox;
}