43 #ifdef HAVE_SYS_STAT_H
54 #define dprintf if(DEBUG) printf
56 static int auto_uncheck_needed = 0;
57 static GtkWidget * auto_uncheck_widget = NULL;
58 static int * auto_uncheck_attr = NULL;
59 static GtkWidget ** all_widgets = NULL;
62 static void clear_auto()
64 if( auto_uncheck_needed && auto_uncheck_widget != NULL && auto_uncheck_attr != NULL) {
66 auto_uncheck_needed = 0;
69 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (auto_uncheck_widget), 0);
72 *auto_uncheck_attr = 0;
75 auto_uncheck_needed = 1;
81 set_flag_cb (GtkToggleButton * button, gboolean * flag)
85 *flag = gtk_toggle_button_get_active (button);
91 if (auto_uncheck_widget == GTK_WIDGET (button)) {
93 for (i = 1 ; i < n_widgets ; i++) {
94 gtk_widget_set_sensitive (all_widgets[i], f);
103 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)
117 *dval = gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin_button));
123 entry_changed_cb (GtkEntry * entry,
char **str)
127 s = gtk_entry_get_text (entry);
138 enum_changed_cb (GtkWidget * combo_box,
int *val)
142 active = gtk_combo_box_get_active (GTK_COMBO_BOX (combo_box));
151 ghid_category_vbox (GtkWidget * box,
const gchar * category_header,
153 gint box_pad, gboolean pack_start, gboolean bottom_pad)
155 GtkWidget *vbox, *vbox1, *hbox, *label;
158 vbox = gtk_vbox_new (FALSE, 0);
160 gtk_box_pack_start (GTK_BOX (box), vbox, FALSE, FALSE, 0);
162 gtk_box_pack_end (GTK_BOX (box), vbox, FALSE, FALSE, 0);
166 label = gtk_label_new (NULL);
167 s = g_strconcat (
"<span weight=\"bold\">", category_header,
169 gtk_label_set_markup (GTK_LABEL (label), s);
170 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
171 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, header_pad);
175 hbox = gtk_hbox_new (FALSE, 0);
176 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
177 label = gtk_label_new (
" ");
178 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
179 vbox1 = gtk_vbox_new (FALSE, box_pad);
180 gtk_box_pack_start (GTK_BOX (hbox), vbox1, TRUE, TRUE, 0);
184 label = gtk_label_new (
"");
185 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
193 ghid_spin_button (GtkWidget * box, GtkWidget ** spin_button, gfloat value,
194 gfloat low, gfloat high, gfloat step0, gfloat step1,
195 gint digits, gint width,
196 void (*cb_func) (), gpointer data, gboolean right_align,
199 GtkWidget *hbox = NULL, *label, *spin_but;
205 hbox = gtk_hbox_new (FALSE, 0);
206 gtk_box_pack_start (GTK_BOX (box), hbox, FALSE, FALSE, 2);
209 adj = (GtkAdjustment *) gtk_adjustment_new (value,
210 low, high, step0, step1, 0.0);
211 spin_but = gtk_spin_button_new (adj, 0.5, digits);
213 *spin_button = spin_but;
215 gtk_widget_set_size_request (spin_but, width, -1);
216 spin = GTK_SPIN_BUTTON (spin_but);
217 gtk_spin_button_set_numeric (spin, TRUE);
219 data = (gpointer) spin;
221 g_signal_connect (G_OBJECT (spin_but),
"value_changed",
222 G_CALLBACK (cb_func), data);
225 if (right_align &&
string)
227 label = gtk_label_new (
string);
228 gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
229 gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 2);
231 gtk_box_pack_start (GTK_BOX (box), spin_but, FALSE, FALSE, 2);
232 if (!right_align &&
string)
234 label = gtk_label_new (
string);
235 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
236 gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 2);
244 ghid_check_button_connected (GtkWidget * box,
252 gpointer data, gchar *
string)
258 b = gtk_check_button_new_with_label (
string);
259 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b), active);
260 if (box && pack_start)
261 gtk_box_pack_start (GTK_BOX (box), b, expand, fill, pad);
262 else if (box && !pack_start)
263 gtk_box_pack_end (GTK_BOX (box), b, expand, fill, pad);
266 gtk_signal_connect (GTK_OBJECT (b),
"clicked",
267 GTK_SIGNAL_FUNC (cb_func), data);
281 attribute_interface_dialog (gerbv_HID_Attribute * attrs,
282 int n_attrs, gerbv_HID_Attr_Val * results,
286 GtkWidget *dialog, *main_vbox, *vbox, *vbox1, *hbox, *entry;
292 int set_auto_uncheck = 0;
300 if (all_widgets != NULL)
303 all_widgets = (GtkWidget **) malloc (n_widgets *
sizeof(GtkWidget *));
304 if (all_widgets == NULL) {
305 fprintf (stderr, _(
"%s(): malloc failed for an array of size %d\n"), __FUNCTION__, n_widgets);
309 dprintf (
"%s(%p, %d, %p, \"%s\", \"%s\")\n", __FUNCTION__, attrs, n_attrs, results, title, descr);
311 auto_uncheck_needed = 0;
312 auto_uncheck_widget = NULL;
313 auto_uncheck_attr = NULL;
315 tips = gtk_tooltips_new ();
317 dialog = gtk_dialog_new_with_buttons (title,
318 GTK_WINDOW (
screen.win.topLevelWindow),
320 | GTK_DIALOG_DESTROY_WITH_PARENT,
321 GTK_STOCK_CANCEL, GTK_RESPONSE_NONE,
322 GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
323 gtk_window_set_wmclass (GTK_WINDOW (dialog),
"gerbv_attribute_editor", _(
"gerbv"));
325 main_vbox = gtk_vbox_new (FALSE, 6);
326 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 6);
327 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), main_vbox);
329 vbox = ghid_category_vbox (main_vbox, descr != NULL ? descr :
"",
339 for (j = 0; j < n_attrs; j++)
341 dprintf (_(
"%s(): Adding attribute #%d\n"), __FUNCTION__, j);
342 switch (attrs[j].type)
345 widget = gtk_label_new (_(attrs[j].name));
346 gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
347 gtk_tooltips_set_tip (tips, widget, _(attrs[j].help_text), NULL);
351 hbox = gtk_hbox_new (FALSE, 4);
352 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
359 ghid_spin_button (hbox, &widget, attrs[j].default_val.int_value,
360 attrs[j].min_val, attrs[j].max_val, 1.0, 1.0, 0, 0,
361 intspinner_changed_cb,
362 &(attrs[j].default_val.int_value), FALSE, NULL);
364 gtk_tooltips_set_tip (tips, widget, _(attrs[j].help_text), NULL);
365 all_widgets[j] = widget;
367 widget = gtk_label_new (_(attrs[j].name));
368 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
372 hbox = gtk_hbox_new (FALSE, 4);
373 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
380 ghid_spin_button (hbox, &widget, attrs[j].default_val.real_value,
381 attrs[j].min_val, attrs[j].max_val, 0.01, 0.01, 3,
383 dblspinner_changed_cb,
384 &(attrs[j].default_val.real_value), FALSE, NULL);
386 gtk_tooltips_set_tip (tips, widget, _(attrs[j].help_text), NULL);
387 all_widgets[j] = widget;
389 widget = gtk_label_new (_(attrs[j].name));
390 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
394 hbox = gtk_hbox_new (FALSE, 4);
395 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
397 entry = gtk_entry_new ();
398 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
399 gtk_entry_set_text (GTK_ENTRY (entry),
400 attrs[j].default_val.str_value);
401 gtk_tooltips_set_tip (tips, entry, _(attrs[j].help_text), NULL);
402 g_signal_connect (G_OBJECT (entry),
"changed",
403 G_CALLBACK (entry_changed_cb),
404 &(attrs[j].default_val.str_value));
405 all_widgets[j] = entry;
407 widget = gtk_label_new (_(attrs[j].name));
408 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
413 ghid_check_button_connected (vbox, &widget,
414 attrs[j].default_val.int_value,
415 TRUE, FALSE, FALSE, 0, set_flag_cb,
416 &(attrs[j].default_val.int_value),
418 gtk_tooltips_set_tip (tips, widget, _(attrs[j].help_text), NULL);
434 if (j == 0 && strcmp(attrs[j].name,
"autodetect") == 0) {
435 set_auto_uncheck = 1;
436 auto_uncheck_widget = widget;
437 auto_uncheck_attr = &(attrs[j].default_val.int_value);
443 if (attrs[j].default_val.int_value)
446 all_widgets[j] = widget;
451 hbox = gtk_hbox_new (FALSE, 4);
452 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
458 widget = gtk_event_box_new ();
459 gtk_tooltips_set_tip (tips, widget, _(attrs[j].help_text), NULL);
460 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
462 combo = gtk_combo_box_new_text ();
463 gtk_container_add (GTK_CONTAINER (widget), combo);
464 g_signal_connect (G_OBJECT (combo),
"changed",
465 G_CALLBACK (enum_changed_cb),
466 &(attrs[j].default_val.int_value));
474 while (attrs[j].enumerations[i])
476 gtk_combo_box_append_text (GTK_COMBO_BOX (combo),
477 _(attrs[j].enumerations[i]));
480 gtk_combo_box_set_active (GTK_COMBO_BOX (combo),
481 attrs[j].default_val.int_value);
482 all_widgets[j] = combo;
484 widget = gtk_label_new (_(attrs[j].name));
485 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
489 dprintf (
"HID_Mixed\n");
493 vbox1 = ghid_category_vbox (vbox, _(attrs[j].name), 4, 2, TRUE, TRUE);
494 entry = gtk_entry_new ();
495 gtk_box_pack_start (GTK_BOX (vbox1), entry, FALSE, FALSE, 0);
496 gtk_entry_set_text (GTK_ENTRY (entry),
497 attrs[j].default_val.str_value);
498 g_signal_connect (G_OBJECT (entry),
"changed",
499 G_CALLBACK (entry_changed_cb),
500 &(attrs[j].default_val.str_value));
502 gtk_tooltips_set_tip (tips, entry, _(attrs[j].help_text), NULL);
503 all_widgets[j] = entry;
507 fprintf (stderr, _(
"%s: unknown type of HID attribute\n"), __FUNCTION__);
513 gtk_widget_show_all (dialog);
514 auto_uncheck_needed = set_auto_uncheck;
521 for (j = 1; j < n_widgets ; j++) {
522 gtk_widget_set_sensitive (all_widgets[j], sen);
524 if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK)
527 for (i = 0; i < n_attrs; i++)
529 results[i] = attrs[i].default_val;
530 if (results[i].str_value)
531 results[i].str_value = strdup (results[i].str_value);
538 gtk_widget_destroy (dialog);