43 #ifdef HAVE_SYS_STAT_H
58 static int auto_uncheck_needed = 0;
59 static GtkWidget* auto_uncheck_widget = NULL;
60 static int* auto_uncheck_attr = NULL;
61 static GtkWidget** all_widgets = NULL;
66 if (auto_uncheck_needed && auto_uncheck_widget != NULL && auto_uncheck_attr != NULL) {
68 auto_uncheck_needed = 0;
71 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auto_uncheck_widget), 0);
74 *auto_uncheck_attr = 0;
77 auto_uncheck_needed = 1;
83 set_flag_cb(GtkToggleButton* button, gboolean* flag) {
86 *flag = gtk_toggle_button_get_active(button);
92 if (auto_uncheck_widget == GTK_WIDGET(button)) {
94 for (i = 1; i < n_widgets; i++) {
95 gtk_widget_set_sensitive(all_widgets[i], f);
104 intspinner_changed_cb(GtkWidget* spin_button, gpointer data) {
107 *ival = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin_button));
113 dblspinner_changed_cb(GtkWidget* spin_button, gpointer data) {
116 *dval = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin_button));
122 entry_changed_cb(GtkEntry* entry,
char** str) {
125 s = gtk_entry_get_text(entry);
136 enum_changed_cb(GtkWidget* combo_box,
int* val) {
139 active = gtk_combo_box_get_active(GTK_COMBO_BOX(combo_box));
149 GtkWidget* box,
const gchar* category_header, gint header_pad, gint box_pad, gboolean pack_start,
152 GtkWidget *vbox, *vbox1, *hbox, *label;
155 vbox = gtk_vbox_new(FALSE, 0);
157 gtk_box_pack_start(GTK_BOX(box), vbox, FALSE, FALSE, 0);
159 gtk_box_pack_end(GTK_BOX(box), vbox, FALSE, FALSE, 0);
161 if (category_header) {
162 label = gtk_label_new(NULL);
163 s = g_strconcat(
"<span weight=\"bold\">", category_header,
"</span>", NULL);
164 gtk_label_set_markup(GTK_LABEL(label), s);
165 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
166 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, header_pad);
170 hbox = gtk_hbox_new(FALSE, 0);
171 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
172 label = gtk_label_new(
" ");
173 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
174 vbox1 = gtk_vbox_new(FALSE, box_pad);
175 gtk_box_pack_start(GTK_BOX(hbox), vbox1, TRUE, TRUE, 0);
178 label = gtk_label_new(
"");
179 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
188 GtkWidget* box, GtkWidget** spin_button, gfloat value, gfloat low, gfloat high, gfloat step0, gfloat step1,
189 gint digits, gint width,
void (*cb_func)(), gpointer data, gboolean right_align, gchar*
string
191 GtkWidget * hbox = NULL, *label, *spin_but;
196 hbox = gtk_hbox_new(FALSE, 0);
197 gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 2);
200 adj = (GtkAdjustment*)gtk_adjustment_new(value, low, high, step0, step1, 0.0);
201 spin_but = gtk_spin_button_new(adj, 0.5, digits);
203 *spin_button = spin_but;
205 gtk_widget_set_size_request(spin_but, width, -1);
206 spin = GTK_SPIN_BUTTON(spin_but);
207 gtk_spin_button_set_numeric(spin, TRUE);
209 data = (gpointer)spin;
211 g_signal_connect(G_OBJECT(spin_but),
"value_changed", G_CALLBACK(cb_func), data);
213 if (right_align &&
string) {
214 label = gtk_label_new(
string);
215 gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
216 gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 2);
218 gtk_box_pack_start(GTK_BOX(box), spin_but, FALSE, FALSE, 2);
219 if (!right_align &&
string) {
220 label = gtk_label_new(
string);
221 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
222 gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 2);
230 ghid_check_button_connected(
231 GtkWidget* box, GtkWidget** button, gboolean active, gboolean pack_start, gboolean expand, gboolean fill, gint pad,
232 void (*cb_func)(), gpointer data, gchar*
string
238 b = gtk_check_button_new_with_label(
string);
239 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b), active);
240 if (box && pack_start)
241 gtk_box_pack_start(GTK_BOX(box), b, expand, fill, pad);
242 else if (box && !pack_start)
243 gtk_box_pack_end(GTK_BOX(box), b, expand, fill, pad);
246 gtk_signal_connect(GTK_OBJECT(b),
"clicked", GTK_SIGNAL_FUNC(cb_func), data);
260 attribute_interface_dialog(
261 gerbv_HID_Attribute* attrs,
int n_attrs, gerbv_HID_Attr_Val* results,
const char* title,
const char* descr
263 GtkWidget * dialog, *main_vbox, *vbox, *vbox1, *hbox, *entry;
269 int set_auto_uncheck = 0;
277 if (all_widgets != NULL)
280 all_widgets = (GtkWidget**)malloc(n_widgets *
sizeof(GtkWidget*));
281 if (all_widgets == NULL) {
282 fprintf(stderr,
"%s(): malloc failed for an array of size %d\n", __FUNCTION__, n_widgets);
286 dprintf(
"%s(%p, %d, %p, \"%s\", \"%s\")\n", __FUNCTION__, attrs, n_attrs, results, title, descr);
288 auto_uncheck_needed = 0;
289 auto_uncheck_widget = NULL;
290 auto_uncheck_attr = NULL;
292 tips = gtk_tooltips_new();
294 dialog = gtk_dialog_new_with_buttons(
295 title, GTK_WINDOW(screen.win.topLevelWindow), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
296 GTK_STOCK_CANCEL, GTK_RESPONSE_NONE, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL
298 gtk_window_set_wmclass(GTK_WINDOW(dialog),
"gerbv_attribute_editor", _(
"gerbv"));
300 main_vbox = gtk_vbox_new(FALSE, 6);
301 gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 6);
302 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), main_vbox);
304 vbox = ghid_category_vbox(main_vbox, descr != NULL ? descr :
"", 4, 2, TRUE, TRUE);
313 for (j = 0; j < n_attrs; j++) {
314 dprintf(
"%s(): adding attribute #%d\n", __func__, j);
315 switch (attrs[j].type) {
317 widget = gtk_label_new(_(attrs[j].name));
318 gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, FALSE, 0);
319 gtk_tooltips_set_tip(tips, widget, _(attrs[j].help_text), NULL);
323 hbox = gtk_hbox_new(FALSE, 4);
324 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
332 hbox, &widget, attrs[j].default_val.int_value, attrs[j].min_val, attrs[j].max_val, 1.0, 1.0, 0, 0,
333 intspinner_changed_cb, &(attrs[j].default_val.int_value), FALSE, NULL
336 gtk_tooltips_set_tip(tips, widget, _(attrs[j].help_text), NULL);
337 all_widgets[j] = widget;
339 widget = gtk_label_new(_(attrs[j].name));
340 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
344 hbox = gtk_hbox_new(FALSE, 4);
345 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
353 hbox, &widget, attrs[j].default_val.real_value, attrs[j].min_val, attrs[j].max_val, 0.01, 0.01, 3,
354 0, dblspinner_changed_cb, &(attrs[j].default_val.real_value), FALSE, NULL
357 gtk_tooltips_set_tip(tips, widget, _(attrs[j].help_text), NULL);
358 all_widgets[j] = widget;
360 widget = gtk_label_new(_(attrs[j].name));
361 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
365 hbox = gtk_hbox_new(FALSE, 4);
366 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
368 entry = gtk_entry_new();
369 gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 0);
370 gtk_entry_set_text(GTK_ENTRY(entry), attrs[j].default_val.str_value);
371 gtk_tooltips_set_tip(tips, entry, _(attrs[j].help_text), NULL);
373 G_OBJECT(entry),
"changed", G_CALLBACK(entry_changed_cb), &(attrs[j].default_val.str_value)
375 all_widgets[j] = entry;
377 widget = gtk_label_new(_(attrs[j].name));
378 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
383 ghid_check_button_connected(
384 vbox, &widget, attrs[j].default_val.int_value, TRUE, FALSE, FALSE, 0, set_flag_cb,
385 &(attrs[j].default_val.int_value), _(attrs[j].name)
387 gtk_tooltips_set_tip(tips, widget, _(attrs[j].help_text), NULL);
403 if (j == 0 && strcmp(attrs[j].name,
"autodetect") == 0) {
404 set_auto_uncheck = 1;
405 auto_uncheck_widget = widget;
406 auto_uncheck_attr = &(attrs[j].default_val.int_value);
412 if (attrs[j].default_val.int_value)
415 all_widgets[j] = widget;
420 hbox = gtk_hbox_new(FALSE, 4);
421 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
427 widget = gtk_event_box_new();
428 gtk_tooltips_set_tip(tips, widget, _(attrs[j].help_text), NULL);
429 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
431 combo = gtk_combo_box_new_text();
432 gtk_container_add(GTK_CONTAINER(widget), combo);
434 G_OBJECT(combo),
"changed", G_CALLBACK(enum_changed_cb), &(attrs[j].default_val.int_value)
442 while (attrs[j].enumerations[i]) {
443 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _(attrs[j].enumerations[i]));
446 gtk_combo_box_set_active(GTK_COMBO_BOX(combo), attrs[j].default_val.int_value);
447 all_widgets[j] = combo;
449 widget = gtk_label_new(_(attrs[j].name));
450 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
453 case HID_Mixed: dprintf(
"HID_Mixed\n");
break;
456 vbox1 = ghid_category_vbox(vbox, _(attrs[j].name), 4, 2, TRUE, TRUE);
457 entry = gtk_entry_new();
458 gtk_box_pack_start(GTK_BOX(vbox1), entry, FALSE, FALSE, 0);
459 gtk_entry_set_text(GTK_ENTRY(entry), attrs[j].default_val.str_value);
461 G_OBJECT(entry),
"changed", G_CALLBACK(entry_changed_cb), &(attrs[j].default_val.str_value)
464 gtk_tooltips_set_tip(tips, entry, _(attrs[j].help_text), NULL);
465 all_widgets[j] = entry;
468 default: fprintf(stderr, _(
"%s: unknown type of HID attribute\n"), __FUNCTION__);
break;
472 gtk_widget_show_all(dialog);
473 auto_uncheck_needed = set_auto_uncheck;
480 for (j = 1; j < n_widgets; j++) {
481 gtk_widget_set_sensitive(all_widgets[j], sen);
483 if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) {
485 for (i = 0; i < n_attrs; i++) {
486 results[i] = attrs[i].default_val;
487 if (results[i].str_value)
488 results[i].str_value = strdup(results[i].str_value);
494 gtk_widget_destroy(dialog);
Dynamic GUI window creation header info.
The main header file for the libgerbv library.
Header info for common structs and functions used for the GUI application.