19af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe#include <locale.h>
29af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe#include <malloc.h>
39af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe#include <string.h>
49af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
59af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe#include <glib.h>
69af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe#include <cairo.h>
79af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe#include <gtk/gtk.h>
89af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
99af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe#include "fio.h"
109af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe#include "gfio.h"
119af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe#include "ghelpers.h"
1228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe#include "gerror.h"
139af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe#include "parse.h"
14eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#include "optgroup.h"
159af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
169af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboestruct gopt {
179af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	GtkWidget *box;
189af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	unsigned int opt_index;
199af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	unsigned int opt_type;
208f9e46ab2ce4bfcdb9932e9bf322978474b21502Jens Axboe	gulong sig_handler;
21753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe	struct gopt_job_view *gjv;
22a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	struct flist_head changed_list;
239af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe};
249af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
259af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboestruct gopt_combo {
269af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	struct gopt gopt;
279af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	GtkWidget *combo;
289af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe};
299af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
309af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboestruct gopt_int {
319af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	struct gopt gopt;
3228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	unsigned long long lastval;
339af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	GtkWidget *spin;
349af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe};
359af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
369af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboestruct gopt_bool {
379af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	struct gopt gopt;
389af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	GtkWidget *check;
399af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe};
409af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
419af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboestruct gopt_str {
429af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	struct gopt gopt;
439af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	GtkWidget *entry;
449af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe};
459af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
467fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboestruct gopt_str_val {
477fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	struct gopt gopt;
487fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	GtkWidget *spin;
497fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	GtkWidget *combo;
50481c242ba127069bed993fc7cc79a0889830ab6bJens Axboe	unsigned int maxindex;
517fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe};
527fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe
531da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe#define GOPT_RANGE_SPIN	4
541da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe
559af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboestruct gopt_range {
569af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	struct gopt gopt;
571da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe	GtkWidget *spins[GOPT_RANGE_SPIN];
589af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe};
599af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
607386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboestruct gopt_str_multi {
617386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe	struct gopt gopt;
627386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe	GtkWidget *checks[PARSE_MAX_VP];
637386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe};
647386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe
65a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboeenum {
66a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	GOPT_COMBO_INT = 1,
67a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	GOPT_COMBO_STR,
68a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	GOPT_INT,
69a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	GOPT_BOOL,
70a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	GOPT_STR,
71a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	GOPT_STR_VAL,
72a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	GOPT_RANGE,
73a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	GOPT_STR_MULTI,
74a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe};
75a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
76e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboestruct gopt_frame_widget {
77e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	GtkWidget *vbox[2];
78e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	unsigned int nr;
79e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe};
80753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe
81753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboestruct gopt_job_view {
82753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe	struct gopt_frame_widget g_widgets[__FIO_OPT_G_NR];
83753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe	GtkWidget *vboxes[__FIO_OPT_C_NR];
8428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	struct gopt *gopts[FIO_MAX_OPTS];
8540c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	GtkWidget *dialog;
8628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	GtkWidget *job_combo;
8740c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	struct gfio_client *client;
88a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	struct flist_head changed_list;
89a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	struct thread_options *o;
9028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	int in_job_switch;
91753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe};
92ec0218ff0e7ad3a480a13db33b0e0cd668ef6222Jens Axboe
93c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboestatic GNode *gopt_dep_tree;
94c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboe
95753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboestatic GtkWidget *gopt_get_group_frame(struct gopt_job_view *gjv,
96eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes				       GtkWidget *box, uint64_t groupmask)
97ec0218ff0e7ad3a480a13db33b0e0cd668ef6222Jens Axboe{
98eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	uint64_t mask, group;
99eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	const struct opt_group *og;
100e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	GtkWidget *frame, *hbox;
101e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	struct gopt_frame_widget *gfw;
102e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe
103e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	if (!groupmask)
104e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		return 0;
105e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe
106e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	mask = groupmask;
107e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	og = opt_group_cat_from_mask(&mask);
108e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	if (!og)
109e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		return NULL;
110e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe
111eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	group = ffz64(~groupmask);
112753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe	gfw = &gjv->g_widgets[group];
113e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	if (!gfw->vbox[0]) {
114e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		frame = gtk_frame_new(og->name);
115e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		gtk_box_pack_start(GTK_BOX(box), frame, FALSE, FALSE, 3);
116e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		hbox = gtk_hbox_new(FALSE, 0);
117e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		gtk_container_add(GTK_CONTAINER(frame), hbox);
118e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		gfw->vbox[0] = gtk_vbox_new(TRUE, 5);
119e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		gfw->vbox[1] = gtk_vbox_new(TRUE, 5);
120e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		gtk_box_pack_start(GTK_BOX(hbox), gfw->vbox[0], TRUE, TRUE, 5);
121e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		gtk_box_pack_start(GTK_BOX(hbox), gfw->vbox[1], TRUE, TRUE, 5);
122ec0218ff0e7ad3a480a13db33b0e0cd668ef6222Jens Axboe	}
123e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe
124e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	hbox = gtk_hbox_new(FALSE, 3);
125e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	gtk_box_pack_start(GTK_BOX(gfw->vbox[gfw->nr++ & 1]), hbox, FALSE, FALSE, 5);
126e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	return hbox;
127ec0218ff0e7ad3a480a13db33b0e0cd668ef6222Jens Axboe}
128b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe
129b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe/*
130b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe * Mark children as invisible, if needed.
131b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe */
13219921181dc8e92ce5320fa32fcb385df9c20a350Jens Axboestatic void gopt_set_children_visible(struct gopt_job_view *gjv,
13319921181dc8e92ce5320fa32fcb385df9c20a350Jens Axboe				      struct fio_option *parent,
134231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe				      gboolean visible)
135b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe{
136c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboe	GNode *child, *node;
137b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe
138a4ed77fe07de1ca78cd44a6378dc20a2cd1ce7adJens Axboe	if (parent->hide_on_set)
139a4ed77fe07de1ca78cd44a6378dc20a2cd1ce7adJens Axboe		visible = !visible;
140a4ed77fe07de1ca78cd44a6378dc20a2cd1ce7adJens Axboe
141c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboe	node = g_node_find(gopt_dep_tree, G_IN_ORDER, G_TRAVERSE_ALL, parent);
142c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboe	child = g_node_first_child(node);
143c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboe	while (child) {
144c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboe		struct fio_option *o = child->data;
145c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboe		struct gopt *g = o->gui_data;
14628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		GtkWidget *widget = g->box;
147b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe
148c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboe		/*
149c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboe		 * Recurse into child, if it also has children
150c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboe		 */
151c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboe		if (g_node_n_children(child))
15219921181dc8e92ce5320fa32fcb385df9c20a350Jens Axboe			gopt_set_children_visible(gjv, o, visible);
153b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe
15428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gtk_widget_set_sensitive(widget, visible);
155c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboe		child = g_node_next_sibling(child);
156b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	}
157b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe}
158b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe
159a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboestatic void gopt_mark_index(struct gopt_job_view *gjv, struct gopt *gopt,
160a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe			    unsigned int idx, int type)
161a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe{
162a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	INIT_FLIST_HEAD(&gopt->changed_list);
163a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
16428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	assert(!gjv->gopts[idx]);
165a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gopt->opt_index = idx;
166a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gopt->opt_type = type;
167a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gopt->gjv = gjv;
16828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gjv->gopts[idx] = gopt;
169a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe}
170a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
17128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboestatic void gopt_dialog_update_apply_button(struct gopt_job_view *gjv)
17240c605169e60d32fc321a2f9f465e76cba745489Jens Axboe{
17340c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	GtkDialog *dialog = GTK_DIALOG(gjv->dialog);
17440c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	gboolean set;
17540c605169e60d32fc321a2f9f465e76cba745489Jens Axboe
17640c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	set = !flist_empty(&gjv->changed_list);
17740c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	gtk_dialog_set_response_sensitive(dialog, GTK_RESPONSE_APPLY, set);
17828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
17928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	if (set) {
18028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gtk_widget_set_sensitive(gjv->job_combo, 0);
18128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gtk_widget_set_tooltip_text(gjv->job_combo, "Apply option changes before switching to a new job");
18228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	} else {
18328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gtk_widget_set_sensitive(gjv->job_combo, 1);
18428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gtk_widget_set_tooltip_text(gjv->job_combo, "Change current job");
18528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	}
18640c605169e60d32fc321a2f9f465e76cba745489Jens Axboe}
18740c605169e60d32fc321a2f9f465e76cba745489Jens Axboe
188a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboestatic void gopt_changed(struct gopt *gopt)
189a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe{
190a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	struct gopt_job_view *gjv = gopt->gjv;
191a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
19228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	if (gjv->in_job_switch)
19328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		return;
19428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
195a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	/*
196a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	 * Add to changed list. This also prevents the option from being
197a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	 * freed when the widget is destroyed.
198a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	 */
19940c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	if (flist_empty(&gopt->changed_list)) {
200a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		flist_add_tail(&gopt->changed_list, &gjv->changed_list);
20128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gopt_dialog_update_apply_button(gjv);
20240c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	}
203a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe}
204a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
205b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboestatic void gopt_str_changed(GtkEntry *entry, gpointer data)
206b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe{
207b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	struct gopt_str *s = (struct gopt_str *) data;
208b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	struct fio_option *o = &fio_options[s->gopt.opt_index];
209b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	const gchar *text;
210b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	int set;
211b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe
212a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gopt_changed(&s->gopt);
213a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
214b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	text = gtk_entry_get_text(GTK_ENTRY(s->entry));
215b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	set = strcmp(text, "") != 0;
21619921181dc8e92ce5320fa32fcb385df9c20a350Jens Axboe
21719921181dc8e92ce5320fa32fcb385df9c20a350Jens Axboe	gopt_set_children_visible(s->gopt.gjv, o, set);
218b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe}
219b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe
220231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboestatic void gopt_str_destroy(GtkWidget *w, gpointer data)
221231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe{
222231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe	struct gopt_str *s = (struct gopt_str *) data;
223231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe
224c04942a21e91d73286094daaa943c7950bb6c224Jens Axboe	free(s);
225231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe	gtk_widget_destroy(w);
226231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe}
227231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe
22828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboestatic void gopt_str_store_set_val(struct gopt_str *s, const char *text)
22928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe{
23028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	if (text)
23128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gtk_entry_set_text(GTK_ENTRY(s->entry), text);
23228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe}
23328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
234753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboestatic struct gopt *gopt_new_str_store(struct gopt_job_view *gjv,
235753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe				       struct fio_option *o, const char *text,
236231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe				       unsigned int idx)
2379af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe{
2389af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	struct gopt_str *s;
2399af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	GtkWidget *label;
2409af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
241a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	s = calloc(1, sizeof(*s));
2429af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
2439af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	s->gopt.box = gtk_hbox_new(FALSE, 3);
244e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	if (!o->lname)
245e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		label = gtk_label_new(o->name);
246e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	else
247e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		label = gtk_label_new(o->lname);
2489af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
2499af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	s->entry = gtk_entry_new();
250a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gopt_mark_index(gjv, &s->gopt, idx, GOPT_STR);
251f762cef937f69d6a23127baf47f22e8ffaea4c11Jens Axboe	gtk_editable_set_editable(GTK_EDITABLE(s->entry), 1);
2529af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
25328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	if (text)
25428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gopt_str_store_set_val(s, text);
25528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	else if (o->def)
25628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gopt_str_store_set_val(s, o->def);
2579af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
258a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	s->gopt.sig_handler = g_signal_connect(G_OBJECT(s->entry), "changed", G_CALLBACK(gopt_str_changed), s);
259a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	g_signal_connect(G_OBJECT(s->entry), "destroy", G_CALLBACK(gopt_str_destroy), s);
2604fbcd659ecc502d19f31e86359d32cb51324a110Jens Axboe
2619af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	gtk_box_pack_start(GTK_BOX(s->gopt.box), s->entry, FALSE, FALSE, 0);
262e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	gtk_box_pack_start(GTK_BOX(s->gopt.box), label, FALSE, FALSE, 0);
2639af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	return &s->gopt;
2649af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe}
2659af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
266b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboestatic void gopt_combo_changed(GtkComboBox *box, gpointer data)
2679af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe{
268b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	struct gopt_combo *c = (struct gopt_combo *) data;
269b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	struct fio_option *o = &fio_options[c->gopt.opt_index];
270b2452a433abf78934bcc38ee33ac7892a1297751Jens Axboe	unsigned int index;
271b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe
272a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gopt_changed(&c->gopt);
273a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
274b2452a433abf78934bcc38ee33ac7892a1297751Jens Axboe	index = gtk_combo_box_get_active(GTK_COMBO_BOX(c->combo));
27519921181dc8e92ce5320fa32fcb385df9c20a350Jens Axboe
27619921181dc8e92ce5320fa32fcb385df9c20a350Jens Axboe	gopt_set_children_visible(c->gopt.gjv, o, index);
277b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe}
278b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe
279231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboestatic void gopt_combo_destroy(GtkWidget *w, gpointer data)
280231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe{
281231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe	struct gopt_combo *c = (struct gopt_combo *) data;
282231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe
283c04942a21e91d73286094daaa943c7950bb6c224Jens Axboe	free(c);
284231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe	gtk_widget_destroy(w);
285231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe}
286231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe
287753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboestatic struct gopt_combo *__gopt_new_combo(struct gopt_job_view *gjv,
288753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe					   struct fio_option *o,
289a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe					   unsigned int idx, int type)
290b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe{
291b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	struct gopt_combo *c;
2929af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	GtkWidget *label;
2939af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
294a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	c = calloc(1, sizeof(*c));
2959af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
296b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	c->gopt.box = gtk_hbox_new(FALSE, 3);
297e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	if (!o->lname)
298e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		label = gtk_label_new(o->name);
299e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	else
300e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		label = gtk_label_new(o->lname);
3019af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
302f762cef937f69d6a23127baf47f22e8ffaea4c11Jens Axboe	c->combo = gtk_combo_box_text_new();
303a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gopt_mark_index(gjv, &c->gopt, idx, type);
304a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	g_signal_connect(G_OBJECT(c->combo), "destroy", G_CALLBACK(gopt_combo_destroy), c);
305b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe
306e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	gtk_box_pack_start(GTK_BOX(c->gopt.box), c->combo, FALSE, FALSE, 0);
307e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	gtk_box_pack_start(GTK_BOX(c->gopt.box), label, FALSE, FALSE, 0);
308e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe
309b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	return c;
31039f04336e65ab87c88f39422583d7f39d003240aJens Axboe}
31139f04336e65ab87c88f39422583d7f39d003240aJens Axboe
31228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboestatic void gopt_combo_str_set_val(struct gopt_combo *c, const char *text)
31328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe{
31428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	struct fio_option *o = &fio_options[c->gopt.opt_index];
31528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	struct value_pair *vp;
31628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	int i;
31728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
31828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	i = 0;
31928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	vp = &o->posval[0];
32028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	while (vp->ival) {
32128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		if (!strcmp(vp->ival, text)) {
32228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			gtk_combo_box_set_active(GTK_COMBO_BOX(c->combo), i);
32328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			break;
32428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		}
32528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		vp++;
32628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		i++;
32728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	}
32828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe}
32928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
330753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboestatic struct gopt *gopt_new_combo_str(struct gopt_job_view *gjv,
331753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe				       struct fio_option *o, const char *text,
332231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe				       unsigned int idx)
33339f04336e65ab87c88f39422583d7f39d003240aJens Axboe{
3344fbcd659ecc502d19f31e86359d32cb51324a110Jens Axboe	struct gopt_combo *c;
33539f04336e65ab87c88f39422583d7f39d003240aJens Axboe	struct value_pair *vp;
33639f04336e65ab87c88f39422583d7f39d003240aJens Axboe	int i, active = 0;
33739f04336e65ab87c88f39422583d7f39d003240aJens Axboe
338a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	c = __gopt_new_combo(gjv, o, idx, GOPT_COMBO_STR);
33939f04336e65ab87c88f39422583d7f39d003240aJens Axboe
3409af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	i = 0;
3419af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	vp = &o->posval[0];
3429af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	while (vp->ival) {
343f762cef937f69d6a23127baf47f22e8ffaea4c11Jens Axboe		gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(c->combo), vp->ival);
3449af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		if (o->def && !strcmp(vp->ival, o->def))
3459af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe			active = i;
3469af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		vp++;
3479af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		i++;
3489af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	}
3499af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
3504fbcd659ecc502d19f31e86359d32cb51324a110Jens Axboe	gtk_combo_box_set_active(GTK_COMBO_BOX(c->combo), active);
35128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	if (text)
35228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gopt_combo_str_set_val(c, text);
353a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	c->gopt.sig_handler = g_signal_connect(G_OBJECT(c->combo), "changed", G_CALLBACK(gopt_combo_changed), c);
3544fbcd659ecc502d19f31e86359d32cb51324a110Jens Axboe	return &c->gopt;
3559af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe}
3569af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
35728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboestatic void gopt_combo_int_set_val(struct gopt_combo *c, unsigned int ip)
35828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe{
35928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	struct fio_option *o = &fio_options[c->gopt.opt_index];
36028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	struct value_pair *vp;
36128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	int i;
36228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
36328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	i = 0;
36428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	vp = &o->posval[0];
36528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	while (vp->ival) {
36628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		if (vp->oval == ip) {
36728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			gtk_combo_box_set_active(GTK_COMBO_BOX(c->combo), i);
36828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			break;
36928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		}
37028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		vp++;
37128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		i++;
37228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	}
37328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe}
37428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
375753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboestatic struct gopt *gopt_new_combo_int(struct gopt_job_view *gjv,
376753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe				       struct fio_option *o, unsigned int *ip,
377231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe				       unsigned int idx)
3789af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe{
3794fbcd659ecc502d19f31e86359d32cb51324a110Jens Axboe	struct gopt_combo *c;
38039f04336e65ab87c88f39422583d7f39d003240aJens Axboe	struct value_pair *vp;
38139f04336e65ab87c88f39422583d7f39d003240aJens Axboe	int i, active = 0;
38239f04336e65ab87c88f39422583d7f39d003240aJens Axboe
383a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	c = __gopt_new_combo(gjv, o, idx, GOPT_COMBO_INT);
38439f04336e65ab87c88f39422583d7f39d003240aJens Axboe
38539f04336e65ab87c88f39422583d7f39d003240aJens Axboe	i = 0;
38639f04336e65ab87c88f39422583d7f39d003240aJens Axboe	vp = &o->posval[0];
38739f04336e65ab87c88f39422583d7f39d003240aJens Axboe	while (vp->ival) {
388f762cef937f69d6a23127baf47f22e8ffaea4c11Jens Axboe		gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(c->combo), vp->ival);
38939f04336e65ab87c88f39422583d7f39d003240aJens Axboe		if (ip && vp->oval == *ip)
39039f04336e65ab87c88f39422583d7f39d003240aJens Axboe			active = i;
39139f04336e65ab87c88f39422583d7f39d003240aJens Axboe		vp++;
39239f04336e65ab87c88f39422583d7f39d003240aJens Axboe		i++;
39339f04336e65ab87c88f39422583d7f39d003240aJens Axboe	}
39439f04336e65ab87c88f39422583d7f39d003240aJens Axboe
3954fbcd659ecc502d19f31e86359d32cb51324a110Jens Axboe	gtk_combo_box_set_active(GTK_COMBO_BOX(c->combo), active);
39628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	if (ip)
39728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gopt_combo_int_set_val(c, *ip);
398a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	c->gopt.sig_handler = g_signal_connect(G_OBJECT(c->combo), "changed", G_CALLBACK(gopt_combo_changed), c);
3994fbcd659ecc502d19f31e86359d32cb51324a110Jens Axboe	return &c->gopt;
40039f04336e65ab87c88f39422583d7f39d003240aJens Axboe}
40139f04336e65ab87c88f39422583d7f39d003240aJens Axboe
402a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboestatic void gopt_str_multi_toggled(GtkToggleButton *button, gpointer data)
403a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe{
404a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	struct gopt_str_multi *m = (struct gopt_str_multi *) data;
405a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
406a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gopt_changed(&m->gopt);
407a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe}
408a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
409bb3d3c4d6cdb52f13353d0019b34de59596e5091Jens Axboestatic void gopt_str_multi_destroy(GtkWidget *w, gpointer data)
410bb3d3c4d6cdb52f13353d0019b34de59596e5091Jens Axboe{
411bb3d3c4d6cdb52f13353d0019b34de59596e5091Jens Axboe	struct gopt_str_multi *m = (struct gopt_str_multi *) data;
412bb3d3c4d6cdb52f13353d0019b34de59596e5091Jens Axboe
413bb3d3c4d6cdb52f13353d0019b34de59596e5091Jens Axboe	free(m);
414bb3d3c4d6cdb52f13353d0019b34de59596e5091Jens Axboe	gtk_widget_destroy(w);
415bb3d3c4d6cdb52f13353d0019b34de59596e5091Jens Axboe}
416bb3d3c4d6cdb52f13353d0019b34de59596e5091Jens Axboe
41728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboestatic void gopt_str_multi_set_val(struct gopt_str_multi *m, int val)
41828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe{
41928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe}
42028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
421753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboestatic struct gopt *gopt_new_str_multi(struct gopt_job_view *gjv,
422753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe				       struct fio_option *o, unsigned int idx)
4237386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe{
4247386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe	struct gopt_str_multi *m;
4257386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe	struct value_pair *vp;
4267386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe	GtkWidget *frame, *hbox;
4277386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe	int i;
4287386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe
429a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	m = calloc(1, sizeof(*m));
4307386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe	m->gopt.box = gtk_hbox_new(FALSE, 3);
431a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gopt_mark_index(gjv, &m->gopt, idx, GOPT_STR_MULTI);
4327386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe
4337386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe	if (!o->lname)
4347386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe		frame = gtk_frame_new(o->name);
4357386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe	else
4367386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe		frame = gtk_frame_new(o->lname);
4377386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe	gtk_box_pack_start(GTK_BOX(m->gopt.box), frame, FALSE, FALSE, 3);
4387386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe
4397386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe	hbox = gtk_hbox_new(FALSE, 3);
4407386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe	gtk_container_add(GTK_CONTAINER(frame), hbox);
4417386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe
4427386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe	i = 0;
4437386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe	vp = &o->posval[0];
4447386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe	while (vp->ival) {
4457386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe		m->checks[i] = gtk_check_button_new_with_label(vp->ival);
4467386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe		gtk_widget_set_tooltip_text(m->checks[i], vp->help);
4477386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe		gtk_box_pack_start(GTK_BOX(hbox), m->checks[i], FALSE, FALSE, 3);
448a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		g_signal_connect(G_OBJECT(m->checks[i]), "toggled", G_CALLBACK(gopt_str_multi_toggled), m);
449456fed9b8af36c537632c3351802e6b3aa415962Jens Axboe		vp++;
450456fed9b8af36c537632c3351802e6b3aa415962Jens Axboe		i++;
4517386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe	}
4527386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe
45328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gopt_str_multi_set_val(m, 0);
454bb3d3c4d6cdb52f13353d0019b34de59596e5091Jens Axboe	g_signal_connect(G_OBJECT(m->gopt.box), "destroy", G_CALLBACK(gopt_str_multi_destroy), m);
4557386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe	return &m->gopt;
4567386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe}
4577386d4aec9d105ba1409a7491b4b63aec3c7105bJens Axboe
458b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboestatic void gopt_int_changed(GtkSpinButton *spin, gpointer data)
459b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe{
460b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	struct gopt_int *i = (struct gopt_int *) data;
461b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	struct fio_option *o = &fio_options[i->gopt.opt_index];
46290265353af8dbf1c43804996909777d4c1a5998eJens Axboe	GtkAdjustment *adj;
46390265353af8dbf1c43804996909777d4c1a5998eJens Axboe	int value, delta;
46490265353af8dbf1c43804996909777d4c1a5998eJens Axboe
465a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gopt_changed(&i->gopt);
466a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
46790265353af8dbf1c43804996909777d4c1a5998eJens Axboe	adj = gtk_spin_button_get_adjustment(spin);
46890265353af8dbf1c43804996909777d4c1a5998eJens Axboe	value = gtk_adjustment_get_value(adj);
46990265353af8dbf1c43804996909777d4c1a5998eJens Axboe	delta = value - i->lastval;
47090265353af8dbf1c43804996909777d4c1a5998eJens Axboe	i->lastval = value;
47190265353af8dbf1c43804996909777d4c1a5998eJens Axboe
47290265353af8dbf1c43804996909777d4c1a5998eJens Axboe	if (o->inv_opt) {
473c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboe		struct gopt *b_inv = o->inv_opt->gui_data;
474c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboe		struct gopt_int *i_inv = container_of(b_inv, struct gopt_int, gopt);
47590265353af8dbf1c43804996909777d4c1a5998eJens Axboe		int cur_val;
47690265353af8dbf1c43804996909777d4c1a5998eJens Axboe
477a01a1bc58d096dd593fa458f99f3c6f423c4b69aJens Axboe		assert(o->type == o->inv_opt->type);
478a01a1bc58d096dd593fa458f99f3c6f423c4b69aJens Axboe
47990265353af8dbf1c43804996909777d4c1a5998eJens Axboe		cur_val = gtk_spin_button_get_value(GTK_SPIN_BUTTON(i_inv->spin));
48090265353af8dbf1c43804996909777d4c1a5998eJens Axboe		cur_val -= delta;
4818f9e46ab2ce4bfcdb9932e9bf322978474b21502Jens Axboe		g_signal_handler_block(G_OBJECT(i_inv->spin), i_inv->gopt.sig_handler);
48290265353af8dbf1c43804996909777d4c1a5998eJens Axboe		gtk_spin_button_set_value(GTK_SPIN_BUTTON(i_inv->spin), cur_val);
4838f9e46ab2ce4bfcdb9932e9bf322978474b21502Jens Axboe		g_signal_handler_unblock(G_OBJECT(i_inv->spin), i_inv->gopt.sig_handler);
48490265353af8dbf1c43804996909777d4c1a5998eJens Axboe	}
485b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe}
486b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe
487231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboestatic void gopt_int_destroy(GtkWidget *w, gpointer data)
488231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe{
489231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe	struct gopt_int *i = (struct gopt_int *) data;
490231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe
491c04942a21e91d73286094daaa943c7950bb6c224Jens Axboe	free(i);
492231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe	gtk_widget_destroy(w);
493231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe}
494231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe
49528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboestatic void gopt_int_set_val(struct gopt_int *i, unsigned long long p)
49628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe{
49728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gtk_spin_button_set_value(GTK_SPIN_BUTTON(i->spin), p);
49828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	i->lastval = p;
49928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe}
50028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
501753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboestatic struct gopt_int *__gopt_new_int(struct gopt_job_view *gjv,
502753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe				       struct fio_option *o,
503231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe				       unsigned long long *p, unsigned int idx)
50439f04336e65ab87c88f39422583d7f39d003240aJens Axboe{
50539f04336e65ab87c88f39422583d7f39d003240aJens Axboe	unsigned long long defval;
5069af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	struct gopt_int *i;
50720eb06bd2aef37fa8dd314a110bb81c733115e15Jens Axboe	guint maxval, interval;
5089af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	GtkWidget *label;
5099af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
510a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	i = calloc(1, sizeof(*i));
5119af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	i->gopt.box = gtk_hbox_new(FALSE, 3);
512e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	if (!o->lname)
513e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		label = gtk_label_new(o->name);
514e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	else
515e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		label = gtk_label_new(o->lname);
5169af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
5179af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	maxval = o->maxval;
5189af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	if (!maxval)
51939f04336e65ab87c88f39422583d7f39d003240aJens Axboe		maxval = UINT_MAX;
5209af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
5219af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	defval = 0;
52239f04336e65ab87c88f39422583d7f39d003240aJens Axboe	if (p)
52339f04336e65ab87c88f39422583d7f39d003240aJens Axboe		defval = *p;
52439f04336e65ab87c88f39422583d7f39d003240aJens Axboe	else if (o->def) {
5259af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		long long val;
5269af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
52783ea422a62b8a42b14c362db61c2e7bf53862e80Jens Axboe		check_str_bytes(o->def, &val, o);
5289af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		defval = val;
5299af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	}
5309af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
53120eb06bd2aef37fa8dd314a110bb81c733115e15Jens Axboe	interval = 1.0;
53220eb06bd2aef37fa8dd314a110bb81c733115e15Jens Axboe	if (o->interval)
53320eb06bd2aef37fa8dd314a110bb81c733115e15Jens Axboe		interval = o->interval;
53420eb06bd2aef37fa8dd314a110bb81c733115e15Jens Axboe
53520eb06bd2aef37fa8dd314a110bb81c733115e15Jens Axboe	i->spin = gtk_spin_button_new_with_range(o->minval, maxval, interval);
536a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gopt_mark_index(gjv, &i->gopt, idx, GOPT_INT);
5379af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(i->spin), GTK_UPDATE_IF_VALID);
53828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	if (p)
53928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gopt_int_set_val(i, *p);
54028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	else
54128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gopt_int_set_val(i, defval);
5428f9e46ab2ce4bfcdb9932e9bf322978474b21502Jens Axboe	i->gopt.sig_handler = g_signal_connect(G_OBJECT(i->spin), "value-changed", G_CALLBACK(gopt_int_changed), i);
543231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe	g_signal_connect(G_OBJECT(i->spin), "destroy", G_CALLBACK(gopt_int_destroy), i);
5449af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
5459af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	gtk_box_pack_start(GTK_BOX(i->gopt.box), i->spin, FALSE, FALSE, 0);
546e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	gtk_box_pack_start(GTK_BOX(i->gopt.box), label, FALSE, FALSE, 0);
547b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe
548b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	return i;
5499af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe}
5509af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
551753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboestatic struct gopt *gopt_new_int(struct gopt_job_view *gjv,
552753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe				 struct fio_option *o, unsigned int *ip,
553231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe				 unsigned int idx)
55439f04336e65ab87c88f39422583d7f39d003240aJens Axboe{
55539f04336e65ab87c88f39422583d7f39d003240aJens Axboe	unsigned long long ullp;
556b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	struct gopt_int *i;
55739f04336e65ab87c88f39422583d7f39d003240aJens Axboe
55839f04336e65ab87c88f39422583d7f39d003240aJens Axboe	if (ip) {
55939f04336e65ab87c88f39422583d7f39d003240aJens Axboe		ullp = *ip;
560753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		i = __gopt_new_int(gjv, o, &ullp, idx);
561b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	} else
562753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		i = __gopt_new_int(gjv, o, NULL, idx);
563b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe
564b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	return &i->gopt;
565b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe}
56639f04336e65ab87c88f39422583d7f39d003240aJens Axboe
567753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboestatic struct gopt *gopt_new_ullong(struct gopt_job_view *gjv,
568753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe				    struct fio_option *o, unsigned long long *p,
569b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe				    unsigned int idx)
570b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe{
571b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	struct gopt_int *i;
572b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe
573753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe	i = __gopt_new_int(gjv, o, p, idx);
574b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	return &i->gopt;
57539f04336e65ab87c88f39422583d7f39d003240aJens Axboe}
57639f04336e65ab87c88f39422583d7f39d003240aJens Axboe
577b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboestatic void gopt_bool_toggled(GtkToggleButton *button, gpointer data)
57839f04336e65ab87c88f39422583d7f39d003240aJens Axboe{
579b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	struct gopt_bool *b = (struct gopt_bool *) data;
580b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	struct fio_option *o = &fio_options[b->gopt.opt_index];
581b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	gboolean set;
582b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe
583a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gopt_changed(&b->gopt);
584a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
585b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe	set = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b->check));
586a01a1bc58d096dd593fa458f99f3c6f423c4b69aJens Axboe
587a01a1bc58d096dd593fa458f99f3c6f423c4b69aJens Axboe	if (o->inv_opt) {
588c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboe		struct gopt *g_inv = o->inv_opt->gui_data;
589c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboe		struct gopt_bool *b_inv = container_of(g_inv, struct gopt_bool, gopt);
590a01a1bc58d096dd593fa458f99f3c6f423c4b69aJens Axboe
591a01a1bc58d096dd593fa458f99f3c6f423c4b69aJens Axboe		assert(o->type == o->inv_opt->type);
592a01a1bc58d096dd593fa458f99f3c6f423c4b69aJens Axboe
5938f9e46ab2ce4bfcdb9932e9bf322978474b21502Jens Axboe		g_signal_handler_block(G_OBJECT(b_inv->check), b_inv->gopt.sig_handler);
594a01a1bc58d096dd593fa458f99f3c6f423c4b69aJens Axboe		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b_inv->check), !set);
5958f9e46ab2ce4bfcdb9932e9bf322978474b21502Jens Axboe		g_signal_handler_unblock(G_OBJECT(b_inv->check), b_inv->gopt.sig_handler);
596a01a1bc58d096dd593fa458f99f3c6f423c4b69aJens Axboe	}
597a01a1bc58d096dd593fa458f99f3c6f423c4b69aJens Axboe
59819921181dc8e92ce5320fa32fcb385df9c20a350Jens Axboe	gopt_set_children_visible(b->gopt.gjv, o, set);
59939f04336e65ab87c88f39422583d7f39d003240aJens Axboe}
60039f04336e65ab87c88f39422583d7f39d003240aJens Axboe
601231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboestatic void gopt_bool_destroy(GtkWidget *w, gpointer data)
602231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe{
603231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe	struct gopt_bool *b = (struct gopt_bool *) data;
604231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe
605c04942a21e91d73286094daaa943c7950bb6c224Jens Axboe	free(b);
606231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe	gtk_widget_destroy(w);
607231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe}
608231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe
60928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboestatic void gopt_bool_set_val(struct gopt_bool *b, unsigned int val)
61028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe{
61128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->check), val);
61228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe}
61328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
614753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboestatic struct gopt *gopt_new_bool(struct gopt_job_view *gjv,
615753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe				  struct fio_option *o, unsigned int *val,
616231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe				  unsigned int idx)
6179af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe{
6189af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	struct gopt_bool *b;
6199af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	GtkWidget *label;
6209af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	int defstate = 0;
6219af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
622a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	b = calloc(1, sizeof(*b));
6239af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	b->gopt.box = gtk_hbox_new(FALSE, 3);
624e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	if (!o->lname)
625e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		label = gtk_label_new(o->name);
626e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	else
627e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		label = gtk_label_new(o->lname);
6289af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
6299af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	b->check = gtk_check_button_new();
630a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gopt_mark_index(gjv, &b->gopt, idx, GOPT_BOOL);
63128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	if (o->def && !strcmp(o->def, "1"))
6329af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		defstate = 1;
6339af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
634d872fb4cd001262962bb5c6bbc5ba0e53537e022Jens Axboe	if (o->neg)
635d872fb4cd001262962bb5c6bbc5ba0e53537e022Jens Axboe		defstate = !defstate;
636d872fb4cd001262962bb5c6bbc5ba0e53537e022Jens Axboe
63728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	if (val)
63828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gopt_bool_set_val(b, *val);
63928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	else
64028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->check), defstate);
6418f9e46ab2ce4bfcdb9932e9bf322978474b21502Jens Axboe	b->gopt.sig_handler = g_signal_connect(G_OBJECT(b->check), "toggled", G_CALLBACK(gopt_bool_toggled), b);
642231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe	g_signal_connect(G_OBJECT(b->check), "destroy", G_CALLBACK(gopt_bool_destroy), b);
6439af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
6449af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	gtk_box_pack_start(GTK_BOX(b->gopt.box), b->check, FALSE, FALSE, 0);
645e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	gtk_box_pack_start(GTK_BOX(b->gopt.box), label, FALSE, FALSE, 0);
6469af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	return &b->gopt;
6479af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe}
6489af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
6491da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe/*
6501da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe * These are paired 0/1 and 2/3. 0/2 are min values, 1/3 are max values.
6511da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe * If the max is made smaller than min, adjust min down.
6521da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe * If the min is made larger than max, adjust the max.
6531da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe */
6541da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboestatic void range_value_changed(GtkSpinButton *spin, gpointer data)
6551da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe{
6561da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe	struct gopt_range *r = (struct gopt_range *) data;
6571da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe	int changed = -1, i;
6581da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe	gint val, mval;
6591da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe
660a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gopt_changed(&r->gopt);
661a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
6621da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe	for (i = 0; i < GOPT_RANGE_SPIN; i++) {
6631da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe		if (GTK_SPIN_BUTTON(r->spins[i]) == spin) {
6641da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe			changed = i;
6651da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe			break;
6661da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe		}
6671da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe	}
6681da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe
6691da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe	assert(changed != -1);
6701da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe
6711da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe	/*
6721da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe	 * Min changed
6731da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe	 */
6741da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe	if (changed == 0 || changed == 2) {
6751da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe		GtkWidget *mspin = r->spins[changed + 1];
6761da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe
6771da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe		val = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(r->spins[changed]));
6781da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe		mval = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(mspin));
6791da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe		if (val > mval)
6801da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe			gtk_spin_button_set_value(GTK_SPIN_BUTTON(mspin), val);
6811da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe	} else {
6821da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe		GtkWidget *mspin = r->spins[changed - 1];
6831da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe
6841da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe		val = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(r->spins[changed]));
6851da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe		mval = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(mspin));
6861da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe		if (val < mval)
6871da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe			gtk_spin_button_set_value(GTK_SPIN_BUTTON(mspin), val);
6881da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe	}
6891da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe}
6901da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe
691231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboestatic void gopt_range_destroy(GtkWidget *w, gpointer data)
692231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe{
693231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe	struct gopt_range *r = (struct gopt_range *) data;
694231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe
695c04942a21e91d73286094daaa943c7950bb6c224Jens Axboe	free(r);
696231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe	gtk_widget_destroy(w);
697231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe}
698231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe
69928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboestatic void gopt_int_range_set_val(struct gopt_range *r, unsigned int *vals)
70028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe{
70128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	int i;
70228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
70328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	for (i = 0; i < GOPT_RANGE_SPIN; i++)
70428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gtk_spin_button_set_value(GTK_SPIN_BUTTON(r->spins[i]), vals[i]);
70528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe}
70628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
707753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboestatic struct gopt *gopt_new_int_range(struct gopt_job_view *gjv,
708753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe				       struct fio_option *o, unsigned int **ip,
709b6caa83661e729c8fab46998fc75447dc1a3e06cJens Axboe				       unsigned int idx)
7109af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe{
7119af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	struct gopt_range *r;
7129af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	GtkWidget *label;
71320eb06bd2aef37fa8dd314a110bb81c733115e15Jens Axboe	guint interval;
71428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	unsigned int defvals[GOPT_RANGE_SPIN];
71528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gint maxval;
7169af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	int i;
7179af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
718a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	r = calloc(1, sizeof(*r));
7199af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	r->gopt.box = gtk_hbox_new(FALSE, 3);
720a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gopt_mark_index(gjv, &r->gopt, idx, GOPT_RANGE);
721e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	if (!o->lname)
722e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		label = gtk_label_new(o->name);
723e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	else
724e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		label = gtk_label_new(o->lname);
7259af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
7269af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	maxval = o->maxval;
7279af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	if (!maxval)
7289af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		maxval = INT_MAX;
7299af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
73028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	memset(defvals, 0, sizeof(defvals));
7319af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	if (o->def) {
7329af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		long long val;
7339af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
73483ea422a62b8a42b14c362db61c2e7bf53862e80Jens Axboe		check_str_bytes(o->def, &val, o);
73528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		for (i = 0; i < GOPT_RANGE_SPIN; i++)
73628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			defvals[i] = val;
7379af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	}
7389af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
73920eb06bd2aef37fa8dd314a110bb81c733115e15Jens Axboe	interval = 1.0;
74020eb06bd2aef37fa8dd314a110bb81c733115e15Jens Axboe	if (o->interval)
74120eb06bd2aef37fa8dd314a110bb81c733115e15Jens Axboe		interval = o->interval;
74220eb06bd2aef37fa8dd314a110bb81c733115e15Jens Axboe
7431da10c195aecc96f0c7a18fdc971221d527d6a6aJens Axboe	for (i = 0; i < GOPT_RANGE_SPIN; i++) {
74420eb06bd2aef37fa8dd314a110bb81c733115e15Jens Axboe		r->spins[i] = gtk_spin_button_new_with_range(o->minval, maxval, interval);
7459af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(r->spins[i]), GTK_UPDATE_IF_VALID);
7469af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		gtk_box_pack_start(GTK_BOX(r->gopt.box), r->spins[i], FALSE, FALSE, 0);
7479af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	}
7489af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
74928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	if (ip)
75028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gopt_int_range_set_val(r, *ip);
75128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	else
75228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gopt_int_range_set_val(r, defvals);
75328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
75428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	for (i = 0; i < GOPT_RANGE_SPIN; i++)
75528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		g_signal_connect(G_OBJECT(r->spins[i]), "value-changed", G_CALLBACK(range_value_changed), r);
75628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
757e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe	gtk_box_pack_start(GTK_BOX(r->gopt.box), label, FALSE, FALSE, 0);
758231edf61f9dd7ead3943454f25dde01c5863cfdbJens Axboe	g_signal_connect(G_OBJECT(r->gopt.box), "destroy", G_CALLBACK(gopt_range_destroy), r);
7599af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	return &r->gopt;
7609af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe}
7619af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
7627fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboestatic void gopt_str_val_destroy(GtkWidget *w, gpointer data)
7637fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe{
7647fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	struct gopt_str_val *g = (struct gopt_str_val *) data;
7657fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe
766c04942a21e91d73286094daaa943c7950bb6c224Jens Axboe	free(g);
7677fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	gtk_widget_destroy(w);
7687fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe}
7697fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe
7707fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboestatic void gopt_str_val_spin_wrapped(GtkSpinButton *spin, gpointer data)
7717fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe{
7727fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	struct gopt_str_val *g = (struct gopt_str_val *) data;
7737fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	unsigned int val;
7747fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	GtkAdjustment *adj;
7757fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	gint index;
7767fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe
7777fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	adj = gtk_spin_button_get_adjustment(spin);
7787fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	val = gtk_adjustment_get_value(adj);
7797fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe
7807fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	/*
7817fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	 * Can't rely on exact value, as fast changes increment >= 1
7827fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	 */
7837fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	if (!val) {
7847fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe		index = gtk_combo_box_get_active(GTK_COMBO_BOX(g->combo));
785481c242ba127069bed993fc7cc79a0889830ab6bJens Axboe		if (index + 1 <= g->maxindex) {
786481c242ba127069bed993fc7cc79a0889830ab6bJens Axboe			val = 1;
787481c242ba127069bed993fc7cc79a0889830ab6bJens Axboe			gtk_combo_box_set_active(GTK_COMBO_BOX(g->combo), ++index);
788481c242ba127069bed993fc7cc79a0889830ab6bJens Axboe		} else
789481c242ba127069bed993fc7cc79a0889830ab6bJens Axboe			val = 1023;
7907fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe		gtk_spin_button_set_value(spin, val);
7917fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	} else {
7927fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe		index = gtk_combo_box_get_active(GTK_COMBO_BOX(g->combo));
7937fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe		if (index) {
7947fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe			gtk_combo_box_set_active(GTK_COMBO_BOX(g->combo), --index);
7957fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe			gtk_spin_button_set_value(spin, 1023);
7967fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe		} else
7977fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe			gtk_spin_button_set_value(spin, 0);
7987fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	}
7997fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe}
8007fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe
801a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboestatic void gopt_str_val_changed(GtkSpinButton *spin, gpointer data)
802a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe{
803a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	struct gopt_str_val *g = (struct gopt_str_val *) data;
804a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
805a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gopt_changed(&g->gopt);
806a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe}
807a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
80828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboestatic void gopt_str_val_set_val(struct gopt_str_val *g, unsigned long long val)
80928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe{
81028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	int i = 0;
81128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
81228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	do {
81328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		if (!val || (val % 1024))
81428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			break;
81528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
81628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		i++;
81728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		val /= 1024;
81828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	} while (1);
81928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
82028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gtk_spin_button_set_value(GTK_SPIN_BUTTON(g->spin), val);
82128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gtk_combo_box_set_active(GTK_COMBO_BOX(g->combo), i);
82228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe}
82328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
824753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboestatic struct gopt *gopt_new_str_val(struct gopt_job_view *gjv,
825753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe				     struct fio_option *o,
8267fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe				     unsigned long long *p, unsigned int idx)
8277fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe{
8287fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	struct gopt_str_val *g;
829eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	const gchar *postfix[] = { "B", "KiB", "MiB", "GiB", "PiB", "PiB", "" };
8307fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	GtkWidget *label;
8317fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	int i;
8327fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe
833a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	g = calloc(1, sizeof(*g));
8347fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	g->gopt.box = gtk_hbox_new(FALSE, 3);
8357fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	if (!o->lname)
8367fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe		label = gtk_label_new(o->name);
8377fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	else
8387fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe		label = gtk_label_new(o->lname);
839a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gopt_mark_index(gjv, &g->gopt, idx, GOPT_STR_VAL);
8407fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe
8417fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	g->spin = gtk_spin_button_new_with_range(0.0, 1023.0, 1.0);
8427fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(g->spin), GTK_UPDATE_IF_VALID);
8437fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	gtk_spin_button_set_value(GTK_SPIN_BUTTON(g->spin), 0);
8447fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(g->spin), 1);
8457fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	gtk_box_pack_start(GTK_BOX(g->gopt.box), g->spin, FALSE, FALSE, 0);
8467fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	g_signal_connect(G_OBJECT(g->spin), "wrapped", G_CALLBACK(gopt_str_val_spin_wrapped), g);
847a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	g_signal_connect(G_OBJECT(g->spin), "changed", G_CALLBACK(gopt_str_val_changed), g);
8487fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe
849f762cef937f69d6a23127baf47f22e8ffaea4c11Jens Axboe	g->combo = gtk_combo_box_text_new();
8507fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	i = 0;
8517fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	while (strlen(postfix[i])) {
852f762cef937f69d6a23127baf47f22e8ffaea4c11Jens Axboe		gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(g->combo), postfix[i]);
8537fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe		i++;
8547fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	}
855481c242ba127069bed993fc7cc79a0889830ab6bJens Axboe	g->maxindex = i - 1;
8567fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	gtk_combo_box_set_active(GTK_COMBO_BOX(g->combo), 0);
8577fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	gtk_box_pack_start(GTK_BOX(g->gopt.box), g->combo, FALSE, FALSE, 0);
8587fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	gtk_box_pack_start(GTK_BOX(g->gopt.box), label, FALSE, FALSE, 3);
8597fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe
86028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	if (p)
86128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gopt_str_val_set_val(g, *p);
862a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
863a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	g_signal_connect(G_OBJECT(g->combo), "changed", G_CALLBACK(gopt_str_val_changed), g);
864a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
8657fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	g_signal_connect(G_OBJECT(g->gopt.box), "destroy", G_CALLBACK(gopt_str_val_destroy), g);
8667fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	return &g->gopt;
8677fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe}
8687fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe
86928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboestatic void gopt_set_option(struct gopt_job_view *gjv, struct fio_option *o,
87028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			    struct gopt *gopt, struct thread_options *to)
87128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe{
87228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	switch (o->type) {
87328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	case FIO_OPT_STR_VAL: {
87428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		unsigned long long *ullp = NULL;
87528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		struct gopt_str_val *g;
87628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
87728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		if (o->off1)
878f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe			ullp = td_var(to, o, o->off1);
87928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
88028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		g = container_of(gopt, struct gopt_str_val, gopt);
88128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		if (ullp)
88228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			gopt_str_val_set_val(g, *ullp);
88328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		break;
88428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		}
88528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	case FIO_OPT_STR_VAL_TIME: {
88628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		unsigned long long *ullp = NULL;
88728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		struct gopt_int *i;
88828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
889f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe		if (o->off1)
890f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe			ullp = td_var(to, o, o->off1);
89128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
89228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		i = container_of(gopt, struct gopt_int, gopt);
89328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		if (ullp)
89428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			gopt_int_set_val(i, *ullp);
89528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		break;
89628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		}
897c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe	case FIO_OPT_INT:
898c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe		if (o->posval[0].ival) {
899c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe			unsigned int *ip = NULL;
900c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe			struct gopt_combo *c;
90128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
902f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe			if (o->off1)
903f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe				ip = td_var(to, o, o->off1);
90428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
905c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe			c = container_of(gopt, struct gopt_combo, gopt);
906c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe			if (ip)
907c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe				gopt_combo_int_set_val(c, *ip);
908c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe		} else {
909c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe			unsigned int *ip = NULL;
910c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe			struct gopt_int *i;
911c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe
912f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe			if (o->off1)
913f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe				ip = td_var(to, o, o->off1);
914c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe
915c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe			i = container_of(gopt, struct gopt_int, gopt);
916c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe			if (ip)
917c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe				gopt_int_set_val(i, *ip);
91828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		}
919c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe		break;
92028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	case FIO_OPT_STR_SET:
92128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	case FIO_OPT_BOOL: {
92228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		unsigned int *ip = NULL;
92328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		struct gopt_bool *b;
92428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
925f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe		if (o->off1)
926f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe			ip = td_var(to, o, o->off1);
92728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
92828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		b = container_of(gopt, struct gopt_bool, gopt);
92928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		if (ip)
93028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			gopt_bool_set_val(b, *ip);
93128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		break;
93228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		}
93328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	case FIO_OPT_STR: {
93428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		if (o->posval[0].ival) {
93528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			unsigned int *ip = NULL;
93628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			struct gopt_combo *c;
93728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
938f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe			if (o->off1)
939f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe				ip = td_var(to, o, o->off1);
94028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
94128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			c = container_of(gopt, struct gopt_combo, gopt);
94228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			if (ip)
94328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe				gopt_combo_int_set_val(c, *ip);
94428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		} else {
94528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			struct gopt_str *s;
94628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			char *text = NULL;
94728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
94828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			if (o->off1) {
949f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe				char **p = td_var(to, o, o->off1);
95028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
95128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe				text = *p;
95228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			}
95328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
95428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			s = container_of(gopt, struct gopt_str, gopt);
95528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			gopt_str_store_set_val(s, text);
95628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		}
95728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
95828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		break;
95928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		}
96028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	case FIO_OPT_STR_STORE: {
96128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		struct gopt_combo *c;
96228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		char *text = NULL;
96328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
96428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		if (o->off1) {
965f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe			char **p = td_var(to, o, o->off1);
96628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			text = *p;
96728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		}
96828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
96928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		if (!o->posval[0].ival) {
97028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			struct gopt_str *s;
97128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
97228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			s = container_of(gopt, struct gopt_str, gopt);
97328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			gopt_str_store_set_val(s, text);
97428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			break;
97528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		}
97628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
97728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		c = container_of(gopt, struct gopt_combo, gopt);
97828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		if (text)
97928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			gopt_combo_str_set_val(c, text);
98028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		break;
98128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		}
98228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	case FIO_OPT_STR_MULTI:
98328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		/* HANDLE ME */
98428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		break;
98528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	case FIO_OPT_RANGE: {
98628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		struct gopt_range *r;
987f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe		unsigned int *ip[4] = { td_var(to, o, o->off1),
988f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe					td_var(to, o, o->off2),
989f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe					td_var(to, o, o->off3),
990f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe					td_var(to, o, o->off4) };
99128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
99228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		r = container_of(gopt, struct gopt_range, gopt);
99328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gopt_int_range_set_val(r, *ip);
99428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		break;
99528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		}
99628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	/* still need to handle this one */
99728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	case FIO_OPT_FLOAT_LIST:
99828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		break;
99928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	case FIO_OPT_DEPRECATED:
100028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		break;
100128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	default:
100228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		printf("ignore type %u\n", o->type);
100328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		break;
100428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	}
100528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe}
100628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
1007753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboestatic void gopt_add_option(struct gopt_job_view *gjv, GtkWidget *hbox,
1008753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe			    struct fio_option *o, unsigned int opt_index,
1009753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe			    struct thread_options *to)
10109af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe{
10119af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	struct gopt *go = NULL;
10129af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
10139af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	switch (o->type) {
10147fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe	case FIO_OPT_STR_VAL: {
10157fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe		unsigned long long *ullp = NULL;
10167fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe
1017f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe		if (o->off1)
1018f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe			ullp = td_var(to, o, o->off1);
10197fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe
1020753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		go = gopt_new_str_val(gjv, o, ullp, opt_index);
10217fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe		break;
10227fc35ff7f50137503236f67ca9deeca0c11a536fJens Axboe		}
102339f04336e65ab87c88f39422583d7f39d003240aJens Axboe	case FIO_OPT_STR_VAL_TIME: {
102439f04336e65ab87c88f39422583d7f39d003240aJens Axboe		unsigned long long *ullp = NULL;
102539f04336e65ab87c88f39422583d7f39d003240aJens Axboe
1026f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe		if (o->off1)
1027f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe			ullp = td_var(to, o, o->off1);
1028789f4ccdf725e6da8bde98afd004c31e16241cfdJens Axboe
1029753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		go = gopt_new_ullong(gjv, o, ullp, opt_index);
10309af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		break;
1031789f4ccdf725e6da8bde98afd004c31e16241cfdJens Axboe		}
1032c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe	case FIO_OPT_INT:
1033c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe		if (o->posval[0].ival) {
1034c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe			unsigned int *ip = NULL;
103539f04336e65ab87c88f39422583d7f39d003240aJens Axboe
1036f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe			if (o->off1)
1037f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe				ip = td_var(to, o, o->off1);
103839f04336e65ab87c88f39422583d7f39d003240aJens Axboe
1039c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe			go = gopt_new_combo_int(gjv, o, ip, opt_index);
1040c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe		} else {
1041c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe			unsigned int *ip = NULL;
1042c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe
1043f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe			if (o->off1)
1044f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe				ip = td_var(to, o, o->off1);
1045c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe
1046c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe			go = gopt_new_int(gjv, o, ip, opt_index);
104739f04336e65ab87c88f39422583d7f39d003240aJens Axboe		}
1048c27d66bf53be3d2353ff50f828fa2f793d302d59Jens Axboe		break;
10499af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	case FIO_OPT_STR_SET:
105039f04336e65ab87c88f39422583d7f39d003240aJens Axboe	case FIO_OPT_BOOL: {
105139f04336e65ab87c88f39422583d7f39d003240aJens Axboe		unsigned int *ip = NULL;
105239f04336e65ab87c88f39422583d7f39d003240aJens Axboe
1053f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe		if (o->off1)
1054f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe			ip = td_var(to, o, o->off1);
105539f04336e65ab87c88f39422583d7f39d003240aJens Axboe
1056753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		go = gopt_new_bool(gjv, o, ip, opt_index);
105739f04336e65ab87c88f39422583d7f39d003240aJens Axboe		break;
105839f04336e65ab87c88f39422583d7f39d003240aJens Axboe		}
105939f04336e65ab87c88f39422583d7f39d003240aJens Axboe	case FIO_OPT_STR: {
1060d872fb4cd001262962bb5c6bbc5ba0e53537e022Jens Axboe		if (o->posval[0].ival) {
1061d872fb4cd001262962bb5c6bbc5ba0e53537e022Jens Axboe			unsigned int *ip = NULL;
106239f04336e65ab87c88f39422583d7f39d003240aJens Axboe
1063f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe			if (o->off1)
1064f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe				ip = td_var(to, o, o->off1);
1065d872fb4cd001262962bb5c6bbc5ba0e53537e022Jens Axboe
1066753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe			go = gopt_new_combo_int(gjv, o, ip, opt_index);
1067d872fb4cd001262962bb5c6bbc5ba0e53537e022Jens Axboe		} else {
1068d872fb4cd001262962bb5c6bbc5ba0e53537e022Jens Axboe			/* TODO: usually ->cb, or unsigned int pointer */
1069753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe			go = gopt_new_str_store(gjv, o, NULL, opt_index);
1070d872fb4cd001262962bb5c6bbc5ba0e53537e022Jens Axboe		}
107139f04336e65ab87c88f39422583d7f39d003240aJens Axboe
10729af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		break;
107339f04336e65ab87c88f39422583d7f39d003240aJens Axboe		}
107439f04336e65ab87c88f39422583d7f39d003240aJens Axboe	case FIO_OPT_STR_STORE: {
107539f04336e65ab87c88f39422583d7f39d003240aJens Axboe		char *text = NULL;
107639f04336e65ab87c88f39422583d7f39d003240aJens Axboe
1077d3944493e27d55f66e18781ce1b6071cb91a7eccJens Axboe		if (o->off1) {
1078f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe			char **p = td_var(to, o, o->off1);
107939f04336e65ab87c88f39422583d7f39d003240aJens Axboe			text = *p;
108039f04336e65ab87c88f39422583d7f39d003240aJens Axboe		}
108139f04336e65ab87c88f39422583d7f39d003240aJens Axboe
10829af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		if (!o->posval[0].ival) {
1083753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe			go = gopt_new_str_store(gjv, o, text, opt_index);
10849af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe			break;
10859af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		}
108639f04336e65ab87c88f39422583d7f39d003240aJens Axboe
1087753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		go = gopt_new_combo_str(gjv, o, text, opt_index);
108839f04336e65ab87c88f39422583d7f39d003240aJens Axboe		break;
108939f04336e65ab87c88f39422583d7f39d003240aJens Axboe		}
10909af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	case FIO_OPT_STR_MULTI:
1091753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		go = gopt_new_str_multi(gjv, o, opt_index);
10929af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		break;
109339f04336e65ab87c88f39422583d7f39d003240aJens Axboe	case FIO_OPT_RANGE: {
1094f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe		unsigned int *ip[4] = { td_var(to, o, o->off1),
1095f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe					td_var(to, o, o->off2),
1096f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe					td_var(to, o, o->off3),
1097f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe					td_var(to, o, o->off4) };
109839f04336e65ab87c88f39422583d7f39d003240aJens Axboe
1099753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		go = gopt_new_int_range(gjv, o, ip, opt_index);
11009af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		break;
110139f04336e65ab87c88f39422583d7f39d003240aJens Axboe		}
11029af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	/* still need to handle this one */
11039af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	case FIO_OPT_FLOAT_LIST:
11049af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		break;
11059af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	case FIO_OPT_DEPRECATED:
11069af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		break;
11079af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	default:
11089af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		printf("ignore type %u\n", o->type);
11099af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		break;
11109af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	}
11119af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
11129af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	if (go) {
1113e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		GtkWidget *dest;
1114e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe
11159af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		if (o->help)
11169af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe			gtk_widget_set_tooltip_text(go->box, o->help);
1117e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe
1118c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboe		o->gui_data = go;
1119e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe
1120753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		dest = gopt_get_group_frame(gjv, hbox, o->group);
1121e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		if (!dest)
1122e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe			gtk_box_pack_start(GTK_BOX(hbox), go->box, FALSE, FALSE, 5);
1123e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe		else
1124e8b0e958cd219cabb1154e2b06036863a7d6dbd7Jens Axboe			gtk_box_pack_start(GTK_BOX(dest), go->box, FALSE, FALSE, 5);
11259af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	}
11269af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe}
11279af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
1128753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboestatic void gopt_add_options(struct gopt_job_view *gjv,
1129753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe			     struct thread_options *to)
11309af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe{
11319af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	GtkWidget *hbox = NULL;
11329af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	int i;
11339af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
113490265353af8dbf1c43804996909777d4c1a5998eJens Axboe	/*
113590265353af8dbf1c43804996909777d4c1a5998eJens Axboe	 * First add all options
113690265353af8dbf1c43804996909777d4c1a5998eJens Axboe	 */
11379af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	for (i = 0; fio_options[i].name; i++) {
11389af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		struct fio_option *o = &fio_options[i];
1139eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		uint64_t mask = o->category;
1140eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		const struct opt_group *og;
11419af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
11429af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		while ((og = opt_group_from_mask(&mask)) != NULL) {
1143eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			GtkWidget *vbox = gjv->vboxes[ffz64(~og->mask)];
11449af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
11459af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe			hbox = gtk_hbox_new(FALSE, 3);
11469af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe			gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
1147753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe			gopt_add_option(gjv, hbox, o, i, to);
11489af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		}
11499af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	}
11509af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe}
11519af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
115228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboestatic void gopt_set_options(struct gopt_job_view *gjv,
115328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			     struct thread_options *to)
115428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe{
115528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	int i;
115628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
115728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	for (i = 0; fio_options[i].name; i++) {
115828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		struct fio_option *o = &fio_options[i];
115928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		struct gopt *gopt = gjv->gopts[i];
116028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
116128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gopt_set_option(gjv, o, gopt, to);
116228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	}
116328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe}
116428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
1165753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboestatic GtkWidget *gopt_add_tab(GtkWidget *notebook, const char *name)
11669af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe{
11679af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	GtkWidget *box, *vbox, *scroll;
11689af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
11699af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	scroll = gtk_scrolled_window_new(NULL, NULL);
11709af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	gtk_container_set_border_width(GTK_CONTAINER(scroll), 5);
11719af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
11729af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
11739af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	vbox = gtk_vbox_new(FALSE, 3);
11749af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	box = gtk_hbox_new(FALSE, 0);
11759af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	gtk_box_pack_start(GTK_BOX(vbox), box, FALSE, FALSE, 5);
11769af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroll), vbox);
1177753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), scroll, gtk_label_new(name));
11789af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	return vbox;
11799af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe}
11809af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
1181eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstatic GtkWidget *gopt_add_group_tab(GtkWidget *notebook,
1182eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes				     const struct opt_group *og)
1183753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe{
1184753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe	return gopt_add_tab(notebook, og->name);
1185753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe}
1186753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe
1187753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboestatic void gopt_add_group_tabs(GtkWidget *notebook, struct gopt_job_view *gjv)
11889af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe{
1189eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	const struct opt_group *og;
1190ec0218ff0e7ad3a480a13db33b0e0cd668ef6222Jens Axboe	unsigned int i;
11919af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
1192ec0218ff0e7ad3a480a13db33b0e0cd668ef6222Jens Axboe	i = 0;
11939af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	do {
1194eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		uint64_t mask = (1ULL << i);
11959af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
11969af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		og = opt_group_from_mask(&mask);
11979af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		if (!og)
11989af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe			break;
1199753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		gjv->vboxes[i] = gopt_add_group_tab(notebook, og);
12009af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe		i++;
12019af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	} while (1);
12029af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe}
12039af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
1204a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboestatic void gopt_handle_str_multi_changed(struct gopt_job_view *gjv,
1205a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe					  struct gopt_str_multi *m,
1206a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe					  struct fio_option *o)
1207a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe{
1208f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe	unsigned int *ip = td_var(gjv->o, o, o->off1);
1209456fed9b8af36c537632c3351802e6b3aa415962Jens Axboe	struct value_pair *vp;
1210a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gboolean set;
1211a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	guint val = 0;
1212a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	int i;
1213a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1214a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	i = 0;
1215456fed9b8af36c537632c3351802e6b3aa415962Jens Axboe	vp = &o->posval[0];
1216456fed9b8af36c537632c3351802e6b3aa415962Jens Axboe	while (vp->ival) {
1217a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		if (!m->checks[i])
1218a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe			break;
1219a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		set = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m->checks[i]));
1220a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		if (set) {
1221ebadc0ce34c11b3e0130d5602b18f4ed0e638386Daniel Gollub			if (vp->orval)
1222456fed9b8af36c537632c3351802e6b3aa415962Jens Axboe				val |= vp->oval;
1223a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe			else
1224456fed9b8af36c537632c3351802e6b3aa415962Jens Axboe				val = vp->oval;
1225a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		}
1226a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		i++;
1227456fed9b8af36c537632c3351802e6b3aa415962Jens Axboe		vp++;
1228a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	}
1229a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1230a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	if (o->off1)
1231a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		*ip = val;
1232a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe}
1233a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1234a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboestatic void gopt_handle_range_changed(struct gopt_job_view *gjv,
1235a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe				      struct gopt_range *r,
1236a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe				      struct fio_option *o)
1237a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe{
1238f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe	unsigned int *ip[4] = { td_var(gjv->o, o, o->off1),
1239f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe				td_var(gjv->o, o, o->off2),
1240f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe				td_var(gjv->o, o, o->off3),
1241f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe				td_var(gjv->o, o, o->off4) };
1242a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gint val;
1243a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	int i;
1244a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1245a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	for (i = 0; i < GOPT_RANGE_SPIN; i++) {
1246a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		val = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(r->spins[i]));
1247a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		*ip[i] = val;
1248a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	}
1249a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe}
1250a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1251a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboestatic void gopt_handle_str_val_changed(struct gopt_job_view *gjv,
1252a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe					struct gopt_str_val *s,
1253a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe					struct fio_option *o)
1254a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe{
1255f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe	unsigned long long *ullp = td_var(gjv->o, o, o->off1);
1256a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	GtkAdjustment *adj;
1257a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gint index;
1258a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1259a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	if (!ullp)
1260a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		return;
1261a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1262a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	/*
1263a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	 * Numerical value
1264a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	 */
1265a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	adj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(s->spin));
1266a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	*ullp = gtk_adjustment_get_value(adj);
1267a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1268a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	/*
1269a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	 * Multiplier
1270a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	 */
1271a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	index = gtk_combo_box_get_active(GTK_COMBO_BOX(s->combo));
1272a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	while (index--)
1273a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		*ullp *= 1024ULL;
1274a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe}
1275a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1276a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboestatic void gopt_handle_str_changed(struct gopt_job_view *gjv,
1277a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe				    struct gopt_str *s, struct fio_option *o)
1278a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe{
1279f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe	char **p = td_var(gjv->o, o, o->off1);
1280a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1281a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	if (*p)
1282a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		free(*p);
1283a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1284a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	*p = strdup(gtk_entry_get_text(GTK_ENTRY(s->entry)));
1285a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe}
1286a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1287a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboestatic void gopt_handle_bool_changed(struct gopt_job_view *gjv,
1288a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe				     struct gopt_bool *b, struct fio_option *o)
1289a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe{
1290f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe	unsigned int *ip = td_var(gjv->o, o, o->off1);
1291a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gboolean set;
1292a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1293a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	set = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b->check));
1294a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	*ip = set;
1295a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe}
1296a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1297a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboestatic void gopt_handle_int_changed(struct gopt_job_view *gjv,
1298a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe				    struct gopt_int *i, struct fio_option *o)
1299a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe{
1300f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe	unsigned int *ip = td_var(gjv->o, o, o->off1);
1301a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	GtkAdjustment *adj;
1302a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	guint val;
1303a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1304a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	adj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(i->spin));
1305a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	val = gtk_adjustment_get_value(adj);
1306a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	*ip = val;
1307a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe}
1308a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1309a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboestatic void gopt_handle_combo_str_changed(struct gopt_job_view *gjv,
1310a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe					  struct gopt_combo *c,
1311a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe					  struct fio_option *o)
1312a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe{
1313f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe	char **p = td_var(gjv->o, o, o->off1);
1314a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1315a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	if (*p)
1316a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		free(*p);
1317a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1318f762cef937f69d6a23127baf47f22e8ffaea4c11Jens Axboe	*p = strdup(gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(c->combo)));
1319a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe}
1320a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1321a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboestatic void gopt_handle_combo_int_changed(struct gopt_job_view *gjv,
1322a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe					  struct gopt_combo *c,
1323a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe					  struct fio_option *o)
1324a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe{
1325f0fdbcafc3a62b84250e5ccdcaec47e3ffa93a00Jens Axboe	unsigned int *ip = td_var(gjv->o, o, o->off1);
1326a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gint index;
1327a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1328a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	index = gtk_combo_box_get_active(GTK_COMBO_BOX(c->combo));
1329a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	*ip = o->posval[index].oval;
1330a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe}
1331a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1332a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboestatic void gopt_handle_changed(struct gopt *gopt)
1333a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe{
1334a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	struct fio_option *o = &fio_options[gopt->opt_index];
1335a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	struct gopt_job_view *gjv = gopt->gjv;
1336a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1337a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	switch (gopt->opt_type) {
1338a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	case GOPT_COMBO_INT: {
1339a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		struct gopt_combo *c;
1340a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1341a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		c = container_of(gopt, struct gopt_combo, gopt);
1342a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		gopt_handle_combo_int_changed(gjv, c, o);
1343a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		break;
1344a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		}
1345a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	case GOPT_COMBO_STR: {
1346a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		struct gopt_combo *c;
1347a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1348a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		c = container_of(gopt, struct gopt_combo, gopt);
1349a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		gopt_handle_combo_str_changed(gjv, c, o);
1350a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		break;
1351a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		}
1352a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	case GOPT_INT: {
1353a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		struct gopt_int *i;
1354a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1355a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		i = container_of(gopt, struct gopt_int, gopt);
1356a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		gopt_handle_int_changed(gjv, i, o);
1357a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		break;
1358a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		}
1359a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	case GOPT_BOOL: {
1360a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		struct gopt_bool *b;
1361a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1362a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		b = container_of(gopt, struct gopt_bool, gopt);
1363a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		gopt_handle_bool_changed(gjv, b, o);
1364a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		break;
1365a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		}
1366a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	case GOPT_STR: {
1367a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		struct gopt_str *s;
1368a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1369a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		s = container_of(gopt, struct gopt_str, gopt);
1370a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		gopt_handle_str_changed(gjv, s, o);
1371a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		break;
1372a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		}
1373a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	case GOPT_STR_VAL: {
1374a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		struct gopt_str_val *s;
1375a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1376a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		s = container_of(gopt, struct gopt_str_val, gopt);
1377a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		gopt_handle_str_val_changed(gjv, s, o);
1378a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		break;
1379a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		}
1380a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	case GOPT_RANGE: {
1381a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		struct gopt_range *r;
1382a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1383a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		r = container_of(gopt, struct gopt_range, gopt);
1384a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		gopt_handle_range_changed(gjv, r, o);
1385a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		break;
1386a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		}
1387a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	case GOPT_STR_MULTI: {
1388a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		struct gopt_str_multi *m;
1389a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1390a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		m = container_of(gopt, struct gopt_str_multi, gopt);
1391a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		gopt_handle_str_multi_changed(gjv, m, o);
1392a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		break;
1393a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		}
1394a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	default:
1395cf7cadec891c9e4226f2d93c2014c87a94ebd730Jens Axboe		log_err("gfio: bad option type: %d\n", gopt->opt_type);
1396cf7cadec891c9e4226f2d93c2014c87a94ebd730Jens Axboe		break;
1397a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	}
139828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe}
1399a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
140028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboestatic void gopt_report_update_status(struct gopt_job_view *gjv)
140128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe{
140228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	struct gfio_client *gc = gjv->client;
140328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	char tmp[80];
140428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
140528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	sprintf(tmp, "\nCompleted with error: %d\n", gc->update_job_status);
140628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gfio_report_info(gc->ge->ui, "Update job", tmp);
1407a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe}
1408a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
140940c605169e60d32fc321a2f9f465e76cba745489Jens Axboestatic int gopt_handle_changed_options(struct gopt_job_view *gjv)
1410a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe{
141140c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	struct gfio_client *gc = gjv->client;
141228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	struct flist_head *entry;
141340c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	uint64_t waitid = 0;
1414a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	struct gopt *gopt;
141540c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	int ret;
1416a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
141728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	flist_for_each(entry, &gjv->changed_list) {
141828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gopt = flist_entry(entry, struct gopt, changed_list);
1419a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe		gopt_handle_changed(gopt);
1420a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	}
142140c605169e60d32fc321a2f9f465e76cba745489Jens Axboe
142228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gc->update_job_status = 0;
142328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gc->update_job_done = 0;
142440c605169e60d32fc321a2f9f465e76cba745489Jens Axboe
142540c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	ret = fio_client_update_options(gc->client, gjv->o, &waitid);
142640c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	if (ret)
142728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		goto done;
142828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
142928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	ret = fio_client_wait_for_reply(gc->client, waitid);
143028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	if (ret)
143128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		goto done;
143228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
143328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	assert(gc->update_job_done);
143428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	if (gc->update_job_status)
143528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		goto done;
143628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
143728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	while (!flist_empty(&gjv->changed_list)) {
143812dbd06d3203840c8ebdc4d0a6135a69c4380949Jens Axboe		gopt = flist_first_entry(&gjv->changed_list, struct gopt, changed_list);
143928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		flist_del_init(&gopt->changed_list);
144028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	}
144140c605169e60d32fc321a2f9f465e76cba745489Jens Axboe
144228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboedone:
144328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gopt_dialog_update_apply_button(gjv);
144428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	return ret;
144540c605169e60d32fc321a2f9f465e76cba745489Jens Axboe}
144640c605169e60d32fc321a2f9f465e76cba745489Jens Axboe
144740c605169e60d32fc321a2f9f465e76cba745489Jens Axboestatic gint gopt_dialog_cancel(gint response)
144840c605169e60d32fc321a2f9f465e76cba745489Jens Axboe{
144940c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	switch (response) {
145040c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	case GTK_RESPONSE_NONE:
145140c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	case GTK_RESPONSE_REJECT:
145240c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	case GTK_RESPONSE_DELETE_EVENT:
145340c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	case GTK_RESPONSE_CANCEL:
145440c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	case GTK_RESPONSE_NO:
145540c605169e60d32fc321a2f9f465e76cba745489Jens Axboe		return 1;
145640c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	default:
145740c605169e60d32fc321a2f9f465e76cba745489Jens Axboe		return 0;
145840c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	}
145940c605169e60d32fc321a2f9f465e76cba745489Jens Axboe}
146040c605169e60d32fc321a2f9f465e76cba745489Jens Axboe
146140c605169e60d32fc321a2f9f465e76cba745489Jens Axboestatic gint gopt_dialog_done(gint response)
146240c605169e60d32fc321a2f9f465e76cba745489Jens Axboe{
146340c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	switch (response) {
146440c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	case GTK_RESPONSE_ACCEPT:
146540c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	case GTK_RESPONSE_OK:
146640c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	case GTK_RESPONSE_YES:
146740c605169e60d32fc321a2f9f465e76cba745489Jens Axboe		return 1;
146840c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	default:
146940c605169e60d32fc321a2f9f465e76cba745489Jens Axboe		return 0;
147040c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	}
147140c605169e60d32fc321a2f9f465e76cba745489Jens Axboe}
147240c605169e60d32fc321a2f9f465e76cba745489Jens Axboe
147328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboestatic void gopt_handle_option_dialog(struct gopt_job_view *gjv)
147440c605169e60d32fc321a2f9f465e76cba745489Jens Axboe{
147540c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	gint response;
147640c605169e60d32fc321a2f9f465e76cba745489Jens Axboe
147740c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	do {
147828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		response = gtk_dialog_run(GTK_DIALOG(gjv->dialog));
147940c605169e60d32fc321a2f9f465e76cba745489Jens Axboe
148028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		if (gopt_dialog_cancel(response) ||
148128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		    gopt_dialog_done(response))
148228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			break;
148340c605169e60d32fc321a2f9f465e76cba745489Jens Axboe
148428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		/*
148528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		 * Apply
148628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		 */
148728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gopt_handle_changed_options(gjv);
148828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gopt_report_update_status(gjv);
148940c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	} while (1);
149040c605169e60d32fc321a2f9f465e76cba745489Jens Axboe
149140c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	if (gopt_dialog_cancel(response))
149240c605169e60d32fc321a2f9f465e76cba745489Jens Axboe		return;
149340c605169e60d32fc321a2f9f465e76cba745489Jens Axboe
149428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gopt_handle_changed_options(gjv);
149528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe}
149640c605169e60d32fc321a2f9f465e76cba745489Jens Axboe
149728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboestatic void gopt_job_changed(GtkComboBox *box, gpointer data)
149828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe{
149928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	struct gopt_job_view *gjv = (struct gopt_job_view *) data;
150028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	struct gfio_client_options *gco = NULL;
150128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	struct gfio_client *gc = gjv->client;
150228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	struct flist_head *entry;
150328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gchar *job;
150440c605169e60d32fc321a2f9f465e76cba745489Jens Axboe
150528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	/*
150628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	 * The switch act should be sensitized appropriately, so that we
150728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	 * never get here with modified options.
150828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	 */
150928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	if (!flist_empty(&gjv->changed_list)) {
151028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gfio_report_info(gc->ge->ui, "Internal Error", "Modified options on job switch.\nThat should not be possible!\n");
151128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		return;
151228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	}
151328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
151428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	job = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(gjv->job_combo));
151528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	flist_for_each(entry, &gc->o_list) {
151628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		const char *name;
151728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
151828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gco = flist_entry(entry, struct gfio_client_options, list);
151928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		name = gco->o.name;
152028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		if (!name || !strlen(name))
152128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			name = "Default job";
152228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
152328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		if (!strcmp(name, job))
152428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe			break;
152528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
152628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gco = NULL;
152728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	}
152828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
152928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	if (!gco) {
153028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gfio_report_info(gc->ge->ui, "Internal Error", "Could not find job description.\nThat should not be possible!\n");
153128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		return;
153240c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	}
153328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
153428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gjv->in_job_switch = 1;
153528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gopt_set_options(gjv, &gco->o);
153628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gjv->in_job_switch = 0;
1537a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe}
1538a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1539cf3d824147fe285bba1c93f341f6e44c34aaccd9Jens Axboevoid gopt_get_options_window(GtkWidget *window, struct gfio_client *gc)
15409af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe{
154128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	GtkWidget *dialog, *notebook, *vbox, *topvbox, *combo;
1542cf3d824147fe285bba1c93f341f6e44c34aaccd9Jens Axboe	struct gfio_client_options *gco;
1543753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe	struct flist_head *entry;
1544753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe	struct gopt_job_view *gjv;
15459af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
15469af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	dialog = gtk_dialog_new_with_buttons("Fio options",
15479af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe			GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT,
15489af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe			GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
154940c605169e60d32fc321a2f9f465e76cba745489Jens Axboe			GTK_STOCK_APPLY, GTK_RESPONSE_APPLY,
15509af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe			GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL);
15519af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
155228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	combo = gtk_combo_box_text_new();
1553753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe	flist_for_each(entry, &gc->o_list) {
155428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		struct thread_options *o;
1555753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		const char *name;
15569af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
1557753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		gco = flist_entry(entry, struct gfio_client_options, list);
1558753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		o = &gco->o;
1559753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		name = o->name;
1560753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		if (!name || !strlen(name))
1561753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe			name = "Default job";
15629af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
156328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe		gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), name);
1564753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe	}
156528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0);
156628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
156728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gtk_widget_set_size_request(GTK_WIDGET(dialog), 1024, 768);
156828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
156928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	topvbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
157028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gtk_box_pack_start(GTK_BOX(topvbox), combo, FALSE, FALSE, 5);
157128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
157228db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	vbox = gtk_vbox_new(TRUE, 5);
157328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gtk_box_pack_start(GTK_BOX(topvbox), vbox, TRUE, TRUE, 5);
157428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
157528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	notebook = gtk_notebook_new();
157628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), 1);
157728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gtk_notebook_popup_enable(GTK_NOTEBOOK(notebook));
157828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 5);
157928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
158028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gjv = calloc(1, sizeof(*gjv));
158128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	INIT_FLIST_HEAD(&gjv->changed_list);
158212dbd06d3203840c8ebdc4d0a6135a69c4380949Jens Axboe	gco = flist_first_entry(&gc->o_list, struct gfio_client_options, list);
158328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gjv->o = &gco->o;
158428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gjv->dialog = dialog;
158528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gjv->client = gc;
158628db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gjv->job_combo = combo;
158728db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gopt_add_group_tabs(notebook, gjv);
158828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gopt_add_options(gjv, &gco->o);
158928db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gopt_dialog_update_apply_button(gjv);
159028db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe
159128db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(gopt_job_changed), gjv);
15929af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
15939af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe	gtk_widget_show_all(dialog);
15949af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe
159528db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	gopt_handle_option_dialog(gjv);
1596a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe
1597a3fc0ff4ba5df645974c46ad01ca74f66666155fJens Axboe	gtk_widget_destroy(dialog);
159828db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe	free(gjv);
1599753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe}
1600753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe
1601753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe/*
1602753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe * Build n-ary option dependency tree
1603753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe */
1604753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboevoid gopt_init(void)
1605753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe{
1606753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe	int i;
1607753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe
1608753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe	gopt_dep_tree = g_node_new(NULL);
1609753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe
1610753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe	for (i = 0; fio_options[i].name; i++) {
1611753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		struct fio_option *o = &fio_options[i];
1612753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		GNode *node, *nparent;
1613753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe
1614753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		/*
1615753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		 * Insert node with either the root parent, or an
1616753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		 * option parent.
1617753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		 */
1618753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		node = g_node_new(o);
1619753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		nparent = gopt_dep_tree;
1620753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		if (o->parent) {
1621753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe			struct fio_option *parent;
1622753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe
1623753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe			parent = fio_option_find(o->parent);
1624753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe			nparent = g_node_find(gopt_dep_tree, G_IN_ORDER, G_TRAVERSE_ALL, parent);
1625753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe			if (!nparent) {
1626753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe				log_err("fio: did not find parent %s for opt %s\n", o->name, o->parent);
1627753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe				nparent = gopt_dep_tree;
1628753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe			}
1629753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		}
1630753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe
1631753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe		g_node_insert(nparent, -1, node);
1632753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe	}
1633753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe}
1634753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe
1635753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboevoid gopt_exit(void)
1636753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe{
1637c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboe	g_node_destroy(gopt_dep_tree);
1638c504ee558187d53c76d417b8d6c9617dd05b762bJens Axboe	gopt_dep_tree = NULL;
16399af4a24408ea7d4cea084a4fe214b81145cc36acJens Axboe}
1640