43 #ifdef HAVE_SYS_STAT_H
55 #define DPRINTF(...) do { if (DEBUG) printf(__VA_ARGS__); } while (0)
57 static int auto_uncheck_needed = 0;
58 static GtkWidget * auto_uncheck_widget = NULL;
59 static int * auto_uncheck_attr = NULL;
60 static GtkWidget ** all_widgets = NULL;
63 static void clear_auto()
65 if( auto_uncheck_needed && auto_uncheck_widget != NULL && auto_uncheck_attr != NULL) {
67 auto_uncheck_needed = 0;
70 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (auto_uncheck_widget), 0);
73 *auto_uncheck_attr = 0;
76 auto_uncheck_needed = 1;
82 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)
108 *ival = gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin_button));
114 dblspinner_changed_cb (GtkWidget * spin_button, gpointer data)
118 *dval = gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin_button));
124 entry_changed_cb (GtkEntry * entry,
char **str)
128 s = gtk_entry_get_text (entry);
139 enum_changed_cb (GtkWidget * combo_box,
int *val)
143 active = gtk_combo_box_get_active (GTK_COMBO_BOX (combo_box));
152 ghid_category_vbox (GtkWidget * box,
const gchar * category_header,
154 gint box_pad, gboolean pack_start, gboolean bottom_pad)
156 GtkWidget *vbox, *vbox1, *hbox, *label;
159 vbox = gtk_vbox_new (FALSE, 0);
161 gtk_box_pack_start (GTK_BOX (box), vbox, FALSE, FALSE, 0);
163 gtk_box_pack_end (GTK_BOX (box), vbox, FALSE, FALSE, 0);
167 label = gtk_label_new (NULL);
168 s = g_strconcat (
"<span weight=\"bold\">", category_header,
170 gtk_label_set_markup (GTK_LABEL (label), s);
171 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
172 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, header_pad);
176 hbox = gtk_hbox_new (FALSE, 0);
177 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
178 label = gtk_label_new (
" ");
179 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
180 vbox1 = gtk_vbox_new (FALSE, box_pad);
181 gtk_box_pack_start (GTK_BOX (hbox), vbox1, TRUE, TRUE, 0);
185 label = gtk_label_new (
"");
186 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
194 ghid_spin_button (GtkWidget * box, GtkWidget ** spin_button, gfloat value,
195 gfloat low, gfloat high, gfloat step0, gfloat step1,
196 gint digits, gint width,
197 void (*cb_func) (GtkWidget*,
void *), gpointer data, gboolean right_align,
200 GtkWidget *hbox = NULL, *label, *spin_but;
206 hbox = gtk_hbox_new (FALSE, 0);
207 gtk_box_pack_start (GTK_BOX (box), hbox, FALSE, FALSE, 2);
210 adj = (GtkAdjustment *) gtk_adjustment_new (value,
211 low, high, step0, step1, 0.0);
212 spin_but = gtk_spin_button_new (adj, 0.5, digits);
214 *spin_button = spin_but;
216 gtk_widget_set_size_request (spin_but, width, -1);
217 spin = GTK_SPIN_BUTTON (spin_but);
218 gtk_spin_button_set_numeric (spin, TRUE);
220 data = (gpointer) spin;
222 g_signal_connect (G_OBJECT (spin_but),
"value_changed",
223 G_CALLBACK (cb_func), data);
226 if (right_align &&
string)
228 label = gtk_label_new (
string);
229 gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
230 gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 2);
232 gtk_box_pack_start (GTK_BOX (box), spin_but, FALSE, FALSE, 2);
233 if (!right_align &&
string)
235 label = gtk_label_new (
string);
236 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
237 gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 2);
245 ghid_check_button_connected (GtkWidget * box,
252 void (*cb_func) (GtkToggleButton*, gboolean*),
253 gpointer data, gchar *
string)
259 b = gtk_check_button_new_with_label (
string);
260 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b), active);
261 if (box && pack_start)
262 gtk_box_pack_start (GTK_BOX (box), b, expand, fill, pad);
263 else if (box && !pack_start)
264 gtk_box_pack_end (GTK_BOX (box), b, expand, fill, pad);
267 gtk_signal_connect (GTK_OBJECT (b),
"clicked",
268 GTK_SIGNAL_FUNC (cb_func), data);
282 attribute_interface_dialog (gerbv_HID_Attribute * attrs,
283 int n_attrs, gerbv_HID_Attr_Val * results,
287 GtkWidget *dialog, *main_vbox, *vbox, *vbox1, *hbox, *entry;
288 GtkWidget *combo = NULL;
289 GtkWidget *widget = NULL;
291 GtkTooltips *tips = NULL;
293 int set_auto_uncheck = 0;
301 if (all_widgets != NULL)
304 all_widgets = (GtkWidget **) malloc (n_widgets *
sizeof(GtkWidget *));
305 if (all_widgets == NULL) {
306 fprintf (stderr,
"%s(): malloc failed for an array of size %d\n", __FUNCTION__, n_widgets);
310 DPRINTF(
"%s(%p, %d, %p, \"%s\", \"%s\")\n", __FUNCTION__, attrs, n_attrs, results, title, descr);
312 auto_uncheck_needed = 0;
313 auto_uncheck_widget = NULL;
314 auto_uncheck_attr = NULL;
316 tips = gtk_tooltips_new ();
318 dialog = gtk_dialog_new_with_buttons (title,
319 GTK_WINDOW (screen.win.topLevelWindow),
321 | GTK_DIALOG_DESTROY_WITH_PARENT,
322 GTK_STOCK_CANCEL, GTK_RESPONSE_NONE,
323 GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
324 gtk_window_set_wmclass (GTK_WINDOW (dialog),
"gerbv_attribute_editor", _(
"gerbv"));
326 main_vbox = gtk_vbox_new (FALSE, 6);
327 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 6);
328 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), main_vbox);
330 vbox = ghid_category_vbox (main_vbox, descr != NULL ? descr :
"",
340 for (j = 0; j < n_attrs; j++)
342 DPRINTF(
"%s(): adding attribute #%d\n", __func__, j);
343 switch (attrs[j].type)
346 widget = gtk_label_new (_(attrs[j].name));
347 gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
348 gtk_tooltips_set_tip (tips, widget, _(attrs[j].help_text), NULL);
352 hbox = gtk_hbox_new (FALSE, 4);
353 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
360 ghid_spin_button (hbox, &widget, attrs[j].default_val.int_value,
361 attrs[j].min_val, attrs[j].max_val, 1.0, 1.0, 0, 0,
362 intspinner_changed_cb,
363 &(attrs[j].default_val.int_value), FALSE, NULL);
365 gtk_tooltips_set_tip (tips, widget, _(attrs[j].help_text), NULL);
366 all_widgets[j] = widget;
368 widget = gtk_label_new (_(attrs[j].name));
369 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
373 hbox = gtk_hbox_new (FALSE, 4);
374 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
381 ghid_spin_button (hbox, &widget, attrs[j].default_val.real_value,
382 attrs[j].min_val, attrs[j].max_val, 0.01, 0.01, 3,
384 dblspinner_changed_cb,
385 &(attrs[j].default_val.real_value), FALSE, NULL);
387 gtk_tooltips_set_tip (tips, widget, _(attrs[j].help_text), NULL);
388 all_widgets[j] = widget;
390 widget = gtk_label_new (_(attrs[j].name));
391 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
395 hbox = gtk_hbox_new (FALSE, 4);
396 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
398 entry = gtk_entry_new ();
399 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
400 gtk_entry_set_text (GTK_ENTRY (entry),
401 attrs[j].default_val.str_value);
402 gtk_tooltips_set_tip (tips, entry, _(attrs[j].help_text), NULL);
403 g_signal_connect (G_OBJECT (entry),
"changed",
404 G_CALLBACK (entry_changed_cb),
405 &(attrs[j].default_val.str_value));
406 all_widgets[j] = entry;
408 widget = gtk_label_new (_(attrs[j].name));
409 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
414 ghid_check_button_connected (vbox, &widget,
415 attrs[j].default_val.int_value,
416 TRUE, FALSE, FALSE, 0, set_flag_cb,
417 &(attrs[j].default_val.int_value),
419 gtk_tooltips_set_tip (tips, widget, _(attrs[j].help_text), NULL);
435 if (j == 0 && strcmp(attrs[j].name,
"autodetect") == 0) {
436 set_auto_uncheck = 1;
437 auto_uncheck_widget = widget;
438 auto_uncheck_attr = &(attrs[j].default_val.int_value);
444 if (attrs[j].default_val.int_value)
447 all_widgets[j] = widget;
452 hbox = gtk_hbox_new (FALSE, 4);
453 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
459 widget = gtk_event_box_new ();
460 gtk_tooltips_set_tip (tips, widget, _(attrs[j].help_text), NULL);
461 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
463 combo = gtk_combo_box_new_text ();
464 gtk_container_add (GTK_CONTAINER (widget), combo);
465 g_signal_connect (G_OBJECT (combo),
"changed",
466 G_CALLBACK (enum_changed_cb),
467 &(attrs[j].default_val.int_value));
475 while (attrs[j].enumerations[i])
477 gtk_combo_box_append_text (GTK_COMBO_BOX (combo),
478 _(attrs[j].enumerations[i]));
481 gtk_combo_box_set_active (GTK_COMBO_BOX (combo),
482 attrs[j].default_val.int_value);
483 all_widgets[j] = combo;
485 widget = gtk_label_new (_(attrs[j].name));
486 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
490 DPRINTF(
"HID_Mixed\n");
494 vbox1 = ghid_category_vbox (vbox, _(attrs[j].name), 4, 2, TRUE, TRUE);
495 entry = gtk_entry_new ();
496 gtk_box_pack_start (GTK_BOX (vbox1), entry, FALSE, FALSE, 0);
497 gtk_entry_set_text (GTK_ENTRY (entry),
498 attrs[j].default_val.str_value);
499 g_signal_connect (G_OBJECT (entry),
"changed",
500 G_CALLBACK (entry_changed_cb),
501 &(attrs[j].default_val.str_value));
503 gtk_tooltips_set_tip (tips, entry, _(attrs[j].help_text), NULL);
504 all_widgets[j] = entry;
508 fprintf (stderr, _(
"%s: unknown type of HID attribute\n"), __FUNCTION__);
514 gtk_widget_show_all (dialog);
515 auto_uncheck_needed = set_auto_uncheck;
522 for (j = 1; j < n_widgets ; j++) {
523 gtk_widget_set_sensitive (all_widgets[j], sen);
525 if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK)
528 for (i = 0; i < n_attrs; i++)
530 results[i] = attrs[i].default_val;
531 if (results[i].str_value)
532 results[i].str_value = strdup (results[i].str_value);
539 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.