Commit Diff


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));