X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=goptions.c;h=f7ba3038fafe1e7a9007394542f6d75160ed8278;hp=ebb5c2d692bc4f2b0ea28a5d3d70870bd0f8a4a9;hb=4fbcd659ecc502d19f31e86359d32cb51324a110;hpb=231edf61f9dd7ead3943454f25dde01c5863cfdb diff --git a/goptions.c b/goptions.c index ebb5c2d6..f7ba3038 100644 --- a/goptions.c +++ b/goptions.c @@ -39,6 +39,13 @@ struct gopt_str { GtkWidget *entry; }; +struct gopt_str_val { + struct gopt gopt; + GtkWidget *spin; + GtkWidget *combo; + unsigned int maxindex; +}; + #define GOPT_RANGE_SPIN 4 struct gopt_range { @@ -166,12 +173,13 @@ static struct gopt *gopt_new_str_store(struct fio_option *o, const char *text, if (text) gtk_entry_set_text(GTK_ENTRY(s->entry), text); gtk_entry_set_editable(GTK_ENTRY(s->entry), 1); - s->gopt.sig_handler = g_signal_connect(GTK_OBJECT(s->entry), "changed", G_CALLBACK(gopt_str_changed), s); - g_signal_connect(GTK_OBJECT(s->entry), "destroy", G_CALLBACK(gopt_str_destroy), s); if (o->def) gtk_entry_set_text(GTK_ENTRY(s->entry), o->def); + s->gopt.sig_handler = g_signal_connect(GTK_OBJECT(s->entry), "changed", G_CALLBACK(gopt_str_changed), s); + g_signal_connect(GTK_OBJECT(s->entry), "destroy", G_CALLBACK(gopt_str_destroy), s); + gtk_box_pack_start(GTK_BOX(s->gopt.box), s->entry, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(s->gopt.box), label, FALSE, FALSE, 0); o->gui_data = s; @@ -211,7 +219,6 @@ static struct gopt_combo *__gopt_new_combo(struct fio_option *o, c->combo = gtk_combo_box_new_text(); gopt_mark_index(&c->gopt, idx); - c->gopt.sig_handler = g_signal_connect(GTK_OBJECT(c->combo), "changed", G_CALLBACK(gopt_combo_changed), c); g_signal_connect(GTK_OBJECT(c->combo), "destroy", G_CALLBACK(gopt_combo_destroy), c); gtk_box_pack_start(GTK_BOX(c->gopt.box), c->combo, FALSE, FALSE, 0); @@ -224,16 +231,16 @@ static struct gopt_combo *__gopt_new_combo(struct fio_option *o, static struct gopt *gopt_new_combo_str(struct fio_option *o, const char *text, unsigned int idx) { - struct gopt_combo *combo; + struct gopt_combo *c; struct value_pair *vp; int i, active = 0; - combo = __gopt_new_combo(o, idx); + c = __gopt_new_combo(o, idx); i = 0; vp = &o->posval[0]; while (vp->ival) { - gtk_combo_box_append_text(GTK_COMBO_BOX(combo->combo), vp->ival); + gtk_combo_box_append_text(GTK_COMBO_BOX(c->combo), vp->ival); if (o->def && !strcmp(vp->ival, o->def)) active = i; if (text && !strcmp(vp->ival, text)) @@ -242,31 +249,33 @@ static struct gopt *gopt_new_combo_str(struct fio_option *o, const char *text, i++; } - gtk_combo_box_set_active(GTK_COMBO_BOX(combo->combo), active); - return &combo->gopt; + gtk_combo_box_set_active(GTK_COMBO_BOX(c->combo), active); + c->gopt.sig_handler = g_signal_connect(GTK_OBJECT(c->combo), "changed", G_CALLBACK(gopt_combo_changed), c); + return &c->gopt; } static struct gopt *gopt_new_combo_int(struct fio_option *o, unsigned int *ip, unsigned int idx) { - struct gopt_combo *combo; + struct gopt_combo *c; struct value_pair *vp; int i, active = 0; - combo = __gopt_new_combo(o, idx); + c = __gopt_new_combo(o, idx); i = 0; vp = &o->posval[0]; while (vp->ival) { - gtk_combo_box_append_text(GTK_COMBO_BOX(combo->combo), vp->ival); + gtk_combo_box_append_text(GTK_COMBO_BOX(c->combo), vp->ival); if (ip && vp->oval == *ip) active = i; vp++; i++; } - gtk_combo_box_set_active(GTK_COMBO_BOX(combo->combo), active); - return &combo->gopt; + gtk_combo_box_set_active(GTK_COMBO_BOX(c->combo), active); + c->gopt.sig_handler = g_signal_connect(GTK_OBJECT(c->combo), "changed", G_CALLBACK(gopt_combo_changed), c); + return &c->gopt; } static struct gopt *gopt_new_str_multi(struct fio_option *o, unsigned int idx) @@ -573,13 +582,99 @@ static struct gopt *gopt_new_int_range(struct fio_option *o, unsigned int **ip, return &r->gopt; } +static void gopt_str_val_destroy(GtkWidget *w, gpointer data) +{ + struct gopt_str_val *g = (struct gopt_str_val *) data; + + free(g); + gtk_widget_destroy(w); +} + +static void gopt_str_val_spin_wrapped(GtkSpinButton *spin, gpointer data) +{ + struct gopt_str_val *g = (struct gopt_str_val *) data; + unsigned int val; + GtkAdjustment *adj; + gint index; + + adj = gtk_spin_button_get_adjustment(spin); + val = gtk_adjustment_get_value(adj); + + /* + * Can't rely on exact value, as fast changes increment >= 1 + */ + if (!val) { + index = gtk_combo_box_get_active(GTK_COMBO_BOX(g->combo)); + if (index + 1 <= g->maxindex) { + val = 1; + gtk_combo_box_set_active(GTK_COMBO_BOX(g->combo), ++index); + } else + val = 1023; + gtk_spin_button_set_value(spin, val); + } else { + index = gtk_combo_box_get_active(GTK_COMBO_BOX(g->combo)); + if (index) { + gtk_combo_box_set_active(GTK_COMBO_BOX(g->combo), --index); + gtk_spin_button_set_value(spin, 1023); + } else + gtk_spin_button_set_value(spin, 0); + } +} + +static struct gopt *gopt_new_str_val(struct fio_option *o, + unsigned long long *p, unsigned int idx) +{ + struct gopt_str_val *g; + const gchar *postfix[] = { "B", "KB", "MB", "GB", "PB", "TB", "" }; + GtkWidget *label; + int i; + + g = malloc(sizeof(*g)); + memset(g, 0, sizeof(*g)); + g->gopt.box = gtk_hbox_new(FALSE, 3); + if (!o->lname) + label = gtk_label_new(o->name); + else + label = gtk_label_new(o->lname); + + g->spin = gtk_spin_button_new_with_range(0.0, 1023.0, 1.0); + gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(g->spin), GTK_UPDATE_IF_VALID); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(g->spin), 0); + gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(g->spin), 1); + gtk_box_pack_start(GTK_BOX(g->gopt.box), g->spin, FALSE, FALSE, 0); + g_signal_connect(G_OBJECT(g->spin), "wrapped", G_CALLBACK(gopt_str_val_spin_wrapped), g); + + g->combo = gtk_combo_box_new_text(); + i = 0; + while (strlen(postfix[i])) { + gtk_combo_box_append_text(GTK_COMBO_BOX(g->combo), postfix[i]); + i++; + } + g->maxindex = i - 1; + gtk_combo_box_set_active(GTK_COMBO_BOX(g->combo), 0); + gtk_box_pack_start(GTK_BOX(g->gopt.box), g->combo, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(g->gopt.box), label, FALSE, FALSE, 3); + + g_signal_connect(G_OBJECT(g->gopt.box), "destroy", G_CALLBACK(gopt_str_val_destroy), g); + o->gui_data = g; + return &g->gopt; +} + static void gopt_add_option(GtkWidget *hbox, struct fio_option *o, unsigned int opt_index, struct thread_options *to) { struct gopt *go = NULL; switch (o->type) { - case FIO_OPT_STR_VAL: + case FIO_OPT_STR_VAL: { + unsigned long long *ullp = NULL; + + if (o->off1) + ullp = td_var(to, o->off1); + + go = gopt_new_str_val(o, ullp, opt_index); + break; + } case FIO_OPT_STR_VAL_TIME: { unsigned long long *ullp = NULL;