commit 518b125835bf3dfd068189334ffb193142de82bf from: Tobias Heider date: Mon Feb 16 23:40:03 2026 UTC Correctly set initial device and cleanup design commit - a03dec105e0a4daf41a71e912d7e88183384ba73 commit + 518b125835bf3dfd068189334ffb193142de82bf blob - 7dcf1a1aa8611b492a475b0429daf2f92034cff9 blob + 30f4d10fc468f13a572aaf08e5f8d59c8474007f --- ctlitem.c +++ ctlitem.c @@ -187,13 +187,18 @@ siomixer_ctl_item_to_widget(gpointer o, gpointer user_ gtk_widget_set_vexpand(gscale, TRUE); gtk_scale_set_draw_value(GTK_SCALE(gscale), TRUE); gtk_scale_set_format_value_func(GTK_SCALE(gscale), _format_percent, NULL, NULL); - gtk_widget_set_size_request(gscale, -1, 100); + gtk_widget_set_size_request(gscale, -1, 150); g_signal_connect(item, "notify::level", G_CALLBACK(_on_scale_value_changed), item); GtkAdjustment *a = gtk_range_get_adjustment(GTK_RANGE(gscale)); item->binding = g_object_bind_property(item, "level", a, "value", G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL); + gtk_box_append(GTK_BOX(box), gscale); + gtk_widget_set_margin_top(box, 5); + gtk_widget_set_margin_start(box, 10); + gtk_widget_set_margin_bottom(box, 10); + gtk_widget_set_margin_end(box, 5); free(label); free(group); blob - 9d5f9cf215218bfe88579e043a8e8eee844f6a68 blob + c7adf557a74cccb9218581c748d7f8a7aa2b5584 --- siomixer.c +++ siomixer.c @@ -50,6 +50,8 @@ struct info *firstent(struct info *, char *); struct info *nextent(struct info *, int); void ondesc(void *, struct sioctl_desc *, int); void onctl(void *, unsigned, unsigned); +static GtkWidget *build_dropdown(void); +static void activate (GtkApplication *, gpointer); /* * register a new knob/button, called from the poll() loop. this may be @@ -206,25 +208,18 @@ _on_selected_changed(GObject *obj, GParamSpec *pspec, sioctl_setval(s.hdl, siomixer_ctl_item_get_addr(item), 1); } -static void -activate (GtkApplication *app, gpointer user_data) +static GtkWidget * +build_dropdown(void) { - GtkWidget *window; - GtkWidget *vbox; - GtkWidget *scroll; - GtkWidget *flowbox; - GtkWidget *frame; GtkWidget *hbox; GtkWidget *label; GtkWidget *dropdown; + SiomixerCtlItem *item; + guint i, n_items; - window = gtk_application_window_new (app); - gtk_window_set_title(GTK_WINDOW (window), "Mixer"); - gtk_window_set_default_size(GTK_WINDOW (window), -1, 400); - + /* Device selection */ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); - gtk_widget_set_hexpand(hbox, FALSE); gtk_widget_set_margin_top(hbox, 10); gtk_widget_set_margin_start(hbox, 10); gtk_widget_set_margin_bottom(hbox, 10); @@ -242,33 +237,69 @@ activate (GtkApplication *app, gpointer user_data) GtkFilterListModel *dropdown_filter_model = gtk_filter_list_model_new(G_LIST_MODEL(s.controls), s.dropdownfilter); dropdown = gtk_drop_down_new(G_LIST_MODEL(dropdown_filter_model), NULL); - gtk_widget_set_hexpand(dropdown, FALSE); + gtk_widget_set_hexpand(dropdown, TRUE); gtk_drop_down_set_expression(GTK_DROP_DOWN(dropdown), gtk_property_expression_new(SIOMIXER_TYPE_CTL_ITEM, NULL, "device")); gtk_widget_set_margin_top(dropdown, 5); gtk_widget_set_margin_start(dropdown, 10); gtk_widget_set_margin_bottom(dropdown, 5); gtk_widget_set_margin_end(dropdown, 10); - /* XXX: Find and highlight selected */ - g_signal_connect(dropdown, "notify::selected-item", G_CALLBACK(_on_selected_changed), NULL); gtk_box_append(GTK_BOX(hbox), dropdown); gtk_frame_set_child(GTK_FRAME(frame), hbox); + /* Find and highlight selected */ + n_items = g_list_model_get_n_items(G_LIST_MODEL(dropdown_filter_model)); + for (i = 0; i < n_items; i++) { + item = g_list_model_get_item(G_LIST_MODEL(dropdown_filter_model), i); + if (siomixer_ctl_item_get_level(item) == 1) + break; + } + if (i == n_items) + g_assert("Selected device not found"); + + gtk_drop_down_set_selected(GTK_DROP_DOWN(dropdown), i); + + /* Register callback for update */ + g_signal_connect(dropdown, "notify::selected-item", + G_CALLBACK(_on_selected_changed), NULL); + + return frame; +} + +static void +activate (GtkApplication *app, gpointer user_data) +{ + GtkWidget *window; + GtkWidget *vbox; + GtkWidget *scroll; + GtkWidget *flowbox; + GtkWidget *dropdown; + + window = gtk_application_window_new (app); + gtk_window_set_title(GTK_WINDOW (window), "Mixer"); + gtk_window_set_default_size(GTK_WINDOW (window), 500, 300); + + dropdown = build_dropdown(); + + /* Volume scales */ flowbox = gtk_flow_box_new(); GtkFilterListModel *filter_model = gtk_filter_list_model_new(G_LIST_MODEL(s.controls), s.scalefilter); gtk_flow_box_bind_model(GTK_FLOW_BOX(flowbox), G_LIST_MODEL(filter_model), siomixer_ctl_item_to_widget, NULL, NULL); - gtk_flow_box_set_selection_mode(GTK_FLOW_BOX(flowbox), GTK_SELECTION_NONE); + gtk_widget_set_vexpand(flowbox, TRUE); + gtk_widget_set_halign(flowbox, GTK_ALIGN_CENTER); scroll = gtk_scrolled_window_new(); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(scroll), flowbox); vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10); - gtk_box_append(GTK_BOX(vbox), frame); + gtk_box_append(GTK_BOX(vbox), dropdown); gtk_box_append(GTK_BOX(vbox), scroll); - gtk_widget_set_size_request(vbox, -1, 400); + gtk_widget_set_size_request(vbox, 500, 300); gtk_window_set_child(GTK_WINDOW(window), vbox); gtk_window_present(GTK_WINDOW (window));