gerbv  2.6A
interface.c
Go to the documentation of this file.
1 /*
2  * gEDA - GNU Electronic Design Automation
3  * This file is a part of gerbv.
4  *
5  * Copyright (C) 2000-2003 Stefan Petersen (spe@stacken.kth.se)
6  *
7  * $Id$
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.s
13  *
14  * This program is distributed in the hope that it toowill be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA
22  */
23 
29 #ifdef HAVE_CONFIG_H
30 # include <config.h>
31 #endif
32 
33 #ifdef HAVE_STDLIB_H
34 #include <stdlib.h>
35 #endif
36 
37 #include <sys/types.h>
38 #include <sys/stat.h>
39 #include <unistd.h>
40 #include <string.h>
41 #include <stdio.h>
42 #include <math.h>
43 
44 #include <gdk/gdkkeysyms.h>
45 #include <gtk/gtk.h>
46 
47 #include "common.h"
48 #include "gerbv.h"
49 #include "main.h"
50 #include "callbacks.h"
51 #include "interface.h"
52 #include "render.h"
53 
54 #include "draw-gdk.h"
55 #include "draw.h"
56 
57 #include "gerbv_icon.h"
58 #include "icons.h"
59 extern gerbv_render_info_t screenRenderInfo;
60 
61 #define WIN_TITLE N_("Gerbv -- gEDA's Gerber Viewer")
62 
63 #define dprintf if(DEBUG) printf
64 
65 /* ---------------------------------------------- */
66 void
67 rename_main_window(char const* filename, GtkWidget *main_win)
68 {
69  GString *win_title=g_string_new(NULL);
70  static GtkWidget *win=NULL;
71 
72  if( main_win != NULL )
73  win = main_win;
74 
75  g_assert(win != NULL);
76 
77  g_string_printf (win_title, _("%s version %s: %s"), _(WIN_TITLE), VERSION, filename);
78  gtk_window_set_title(GTK_WINDOW(win), win_title->str);
79  g_string_free(win_title,TRUE);
80 }
81 
82 /* ---------------------------------------------- */
83 void
84 set_window_icon (GtkWidget * this_window)
85 {
86  GdkPixmap *pixmap;
87  GdkBitmap *mask;
88 
89  pixmap = gdk_pixmap_create_from_xpm_d (this_window->window, &mask,
90  &this_window->style->bg[GTK_STATE_NORMAL], gerbv_icon_xpm);
91  gdk_window_set_icon (this_window->window, NULL, pixmap, mask);
92 
93  return;
94 }
95 
96 /* ---------------------------------------------- */
97 void
98 interface_load_accels (void)
99 {
100  gchar *accel_map_filename = g_build_filename (g_get_home_dir(), GERBV_ACCELS_RELPATH, NULL);
101  if (accel_map_filename) {
102  gtk_accel_map_load (accel_map_filename);
103  g_free (accel_map_filename);
104  }
105 }
106 
107 /* ---------------------------------------------- */
108 void
109 interface_save_accels (void)
110 {
111  gchar *accel_map_filename = g_build_filename (g_get_home_dir(), GERBV_ACCELS_RELPATH, NULL);
112  if (accel_map_filename) {
113  gtk_accel_map_save (accel_map_filename);
114  g_free (accel_map_filename);
115  }
116 }
117 
118 /* ---------------------------------------------- */
119 void
120 interface_create_gui (int req_width, int req_height)
121 {
122  GtkStockItem stock;
123 
124  GtkWidget *mainWindow;
125  GtkWidget *vbox1;
126  GtkWidget *menubar1;
127 
128  GtkWidget *menuitem_file;
129  GtkWidget *menuitem_file_menu;
130  GtkWidget *new;
131  GtkWidget *open_project;
132  GtkWidget *open_layer;
133  GtkWidget *revert;
134  GtkWidget *save;
135  GtkWidget *save_as;
136  GtkWidget *save_layer;
137  GtkWidget *save_as_layer;
138  GtkWidget *separatormenuitem1;
139  GtkWidget *menuitem_file_export;
140  GtkWidget *menuitem_file_export_menu;
141  GtkWidget *png;
142  GtkWidget *pdf;
143  GtkWidget *svg;
144  GtkWidget *postscript;
145  GtkWidget *rs274x,*drill,*rs274xm,*drillm;
146 
147  GtkWidget *separator1;
148 #if GTK_CHECK_VERSION(2,10,0)
149  GtkWidget *print;
150  GtkWidget *separator2;
151 #endif
152  GtkWidget *quit;
153 
154  GtkWidget *menuitem_edit;
155  GtkWidget *menuitem_edit_menu;
156  GtkWidget *properties_selected;
157  GtkWidget *delete_selected;
158  GtkWidget *menuitem_view;
159  GtkWidget *menuitem_view_menu;
160  GtkWidget *view_fullscreen;
161  GtkWidget *show_toolbar;
162  GtkWidget *show_sidepane;
163  GtkWidget *separator3;
164  GtkWidget *toggle_layer_visibility_item1;
165  GtkWidget *toggle_layer_visibility_item2;
166  GtkWidget *toggle_layer_visibility_item3;
167  GtkWidget *toggle_layer_visibility_item4;
168  GtkWidget *toggle_layer_visibility_item5;
169  GtkWidget *toggle_layer_visibility_item6;
170  GtkWidget *toggle_layer_visibility_item7;
171  GtkWidget *toggle_layer_visibility_item8;
172  GtkWidget *toggle_layer_visibility_item9;
173  GtkWidget *toggle_layer_visibility_item10;
174  GtkWidget *separator4;
175  GtkWidget *zoom_in;
176  GtkWidget *zoom_out;
177  GtkWidget *fit_to_window;
178  GtkWidget *separator5;
179  GtkWidget *backgroundColor;
180  GtkWidget *menuitem_view_render, *menuitem_view_render_menu;
181  GSList *menu_view_render_group;
182  GtkWidget *render_fast, *render_fast_xor, *render_normal, *render_hq;
183  GtkWidget *menuitem_view_unit, *menuitem_view_unit_menu;
184  GSList *menu_view_unit_group;
185  GtkWidget *unit_mil, *unit_mm, *unit_in;
186  GtkWidget *menuitem_layer;
187  GtkWidget *menuitem_layer_menu;
188  GtkWidget *layer_visibility;
189  GtkWidget *layer_visibility_all_on;
190  GtkWidget *layer_visibility_all_off;
191  GtkWidget *layer_invert;
192  GtkWidget *layer_color;
193  GtkWidget *layer_reload;
194  GtkWidget *separator6;
195  GtkWidget *layer_edit;
196  GtkWidget *layer_format;
197  GtkWidget *separator7;
198  GtkWidget *layer_up;
199  GtkWidget *layer_down;
200  GtkWidget *layer_remove;
201  GtkWidget *menuitem_analyze;
202  GtkWidget *menuitem_analyze_menu;
203  GtkWidget *analyze_active_gerbers;
204  GtkWidget *analyze_active_drill;
205  GtkWidget *analyze_benchmark;
206  /*GtkWidget *control_gerber_options;*/
207  GtkWidget *menuitem_tools;
208  GtkWidget *menuitem_tools_menu;
209  GtkWidget *toggletoolbutton_pointer;
210  GtkWidget *pointer_tool;
211  GdkPixbuf *pointerpixbuf;
212  GtkWidget *pointerimage;
213  GtkWidget *pan_tool;
214  GtkWidget *zoom_tool;
215  GtkWidget *measure_tool;
216  GtkWidget *menuitem_help;
217  GtkWidget *layer_visibility_menu;
218  GtkWidget *layer_visibility_main_menu;
219  GtkWidget *menuitem_help_menu;
220  /*GtkWidget *online_manual;*/
221  GtkWidget *about;
222  GtkWidget *bugs_menuitem;
223  GtkWidget *image34;
224  GtkWidget *toolbar_hbox;
225  GtkWidget *handlebox;
226  GtkWidget *button_toolbar;
227  /*GtkIconSize tmp_toolbar_icon_size;*/
228  GtkWidget *toolbutton_new;
229  GtkWidget *toolbutton_open;
230  GtkWidget *toolbutton_revert;
231  GtkWidget *toolbutton_save;
232  GtkWidget *separatortoolitem1;
233 #if GTK_CHECK_VERSION(2,10,0)
234  GtkWidget *toolbutton_print;
235  GtkWidget *separatortoolitem2;
236 #endif
237  GtkWidget *toolbutton_zoom_in;
238  GtkWidget *toolbutton_zoom_out;
239  GtkWidget *toolbutton_zoom_fit;
240  /* Implement these tool buttons later when we have icons */
241 /* GtkWidget *separatortoolitem3; */
242 /* GtkWidget *toolbutton_analyze; */
243 /* GtkWidget *toolbutton_validate;*/
244 /* GtkWidget *toolbutton_control; */
245  GtkWidget *separatortoolitem4;
246  GtkWidget *toggletoolbutton_pan;
247  GtkWidget *toggletoolbutton_zoom;
248  GtkWidget *toggletoolbutton_measure;
249  GtkWidget *hpaned1;
250  GtkWidget *sidepane_vbox;
251  GtkWidget *sidepane_notebook;
252  GtkWidget *vbox10;
253  GtkWidget *hbox4;
254  GtkWidget *label1;
255  GtkWidget *render_combobox;
256  GtkWidget *scrolledwindow1;
257  GtkWidget *hbox1;
258  GtkWidget *button4;
259  GtkWidget *image8;
260  GtkWidget *button5;
261  GtkWidget *image9;
262  GtkWidget *button6;
263  GtkWidget *image10;
264  GtkWidget *button7;
265  GtkWidget *image11;
266  GtkWidget *Layer_label;
267  GtkWidget *vbox11;
268  GtkWidget *messages_scrolledwindow;
269  GtkWidget *message_textview;
270  GtkWidget *clear_messages_button;
271  GtkWidget *Message_label;
272  GtkWidget *vbox2;
273  GtkWidget *main_view_table;
274  GtkWidget *hRuler;
275  GtkWidget *vRuler;
276  GtkWidget *hbox5;
277  GtkWidget *statusbar_label_left;
278  GtkWidget *statusUnitComboBox;
279  GtkWidget *statusbar_label_right;
280  GtkWidget *drawingarea, *hAdjustment, *vAdjustment, *hScrollbar, *vScrollbar;
281 
282  GtkAccelGroup *accel_group;
283  GtkTooltips *tooltips;
284 
285  /* Inline icons */
286  GdkPixbuf *zoompixbuf;
287  GtkWidget *zoomimage;
288  GdkPixbuf *measurepixbuf;
289  GtkWidget *measureimage;
290  GdkPixbuf *movepixbuf;
291  GtkWidget *moveimage;
292 
293  GtkWidget *tempImage;
294 
295  pointerpixbuf = gdk_pixbuf_new_from_inline(-1, pointer, FALSE, NULL);
296  movepixbuf = gdk_pixbuf_new_from_inline(-1, move, FALSE, NULL);
297  zoompixbuf = gdk_pixbuf_new_from_inline(-1, lzoom, FALSE, NULL);
298  measurepixbuf = gdk_pixbuf_new_from_inline(-1, ruler, FALSE, NULL);
299 
300  tooltips = gtk_tooltips_new();
301  accel_group = gtk_accel_group_new ();
302 
303  mainWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
304  gtk_window_set_title (GTK_WINDOW (mainWindow), _(WIN_TITLE));
305 
306  vbox1 = gtk_vbox_new (FALSE, 0);
307  gtk_container_add (GTK_CONTAINER (mainWindow), vbox1);
308 
309  menubar1 = gtk_menu_bar_new ();
310  gtk_box_pack_start (GTK_BOX (vbox1), menubar1, FALSE, FALSE, 0);
311 
312  /* --- File menu --- */
313  menuitem_file = gtk_menu_item_new_with_mnemonic (_("_File"));
314  gtk_container_add (GTK_CONTAINER (menubar1), menuitem_file);
315 
316  /* File menu items dealing with a gerbv project. */
317  menuitem_file_menu = gtk_menu_new ();
318  gtk_menu_set_accel_group (GTK_MENU(menuitem_file_menu), accel_group);
319  gtk_menu_set_accel_path (GTK_MENU(menuitem_file_menu), ACCEL_FILE);
320  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_file), menuitem_file_menu);
321 
322  new = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, NULL);
323  SET_ACCELS_FROM_STOCK (new, GTK_STOCK_NEW, ACCEL_FILE_NEW);
324  gtk_tooltips_set_tip (tooltips, new, _("Close all layers and start a new project"), NULL);
325  gtk_container_add (GTK_CONTAINER (menuitem_file_menu), new);
326 
327  open_project = gtk_image_menu_item_new_with_mnemonic (_("_Open project..."));
328  gtk_container_add (GTK_CONTAINER (menuitem_file_menu), open_project);
329  gtk_tooltips_set_tip (tooltips, open_project, _("Open an existing Gerbv project"), NULL);
330  tempImage = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU);
331  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (open_project), tempImage);
332 
333  save = gtk_image_menu_item_new_with_mnemonic (_("Save project"));
334  screen.win.curFileMenuItem1 = save;
335  gtk_tooltips_set_tip (tooltips, save, _("Save the current project"), NULL);
336  tempImage = gtk_image_new_from_stock (GTK_STOCK_SAVE, GTK_ICON_SIZE_MENU);
337  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (save), tempImage);
338  gtk_container_add (GTK_CONTAINER (menuitem_file_menu), save);
339 
340  save_as = gtk_image_menu_item_new_with_mnemonic (_("Save project as..."));
341  screen.win.curFileMenuItem2 = save_as;
342  gtk_tooltips_set_tip (tooltips, save_as, _("Save the current project to a new file"), NULL);
343  tempImage = gtk_image_new_from_stock (GTK_STOCK_SAVE_AS, GTK_ICON_SIZE_MENU);
344  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (save_as), tempImage);
345  gtk_container_add (GTK_CONTAINER (menuitem_file_menu), save_as);
346 
347  revert = gtk_image_menu_item_new_from_stock (GTK_STOCK_REVERT_TO_SAVED, NULL);
348  screen.win.curFileMenuItem3 = revert;
349  SET_ACCELS_FROM_STOCK (revert, GTK_STOCK_REVERT_TO_SAVED, ACCEL_FILE_REVERT);
350  gtk_tooltips_set_tip (tooltips, revert, _("Reload all layers"), NULL);
351  gtk_container_add (GTK_CONTAINER (menuitem_file_menu), revert);
352 
353  /* File menu items dealing individual layers. */
354  separator1 = gtk_separator_menu_item_new ();
355  gtk_container_add (GTK_CONTAINER (menuitem_file_menu), separator1);
356  gtk_widget_set_sensitive (separator1, FALSE);
357 
358  open_layer = gtk_menu_item_new_with_mnemonic (_("Open _layer(s)..."));
359  SET_ACCELS (open_layer, ACCEL_FILE_OPEN_LAYER);
360  gtk_container_add (GTK_CONTAINER (menuitem_file_menu), open_layer);
361  gtk_tooltips_set_tip (tooltips, open_layer, _("Open Gerber, drill, or pick and place file(s)"), NULL);
362 
363  save_layer = gtk_menu_item_new_with_mnemonic (_("_Save active layer"));
364  screen.win.curFileMenuItem4 = save_layer;
365  gtk_tooltips_set_tip (tooltips, save_layer, _("Save the active layer"), NULL);
366  SET_ACCELS (save_layer, ACCEL_FILE_SAVE_LAYER);
367  gtk_container_add (GTK_CONTAINER (menuitem_file_menu), save_layer);
368 
369  save_as_layer = gtk_menu_item_new_with_mnemonic (_("Save active layer _as..."));
370  screen.win.curFileMenuItem5 = save_as_layer;
371  gtk_tooltips_set_tip (tooltips, save_as_layer, _("Save the active layer to a new file"), NULL);
372  SET_ACCELS (save_as_layer, ACCEL_FILE_SAVE_LAYER_AS);
373  gtk_container_add (GTK_CONTAINER (menuitem_file_menu), save_as_layer);
374 
375  /* File menu items dealing with exporting different types of files. */
376  separatormenuitem1 = gtk_separator_menu_item_new ();
377  gtk_container_add (GTK_CONTAINER (menuitem_file_menu), separatormenuitem1);
378  gtk_widget_set_sensitive (separatormenuitem1, FALSE);
379 
380  menuitem_file_export = gtk_menu_item_new_with_mnemonic (_("_Export"));
381  screen.win.curFileMenuItem6 = menuitem_file_export;
382  gtk_tooltips_set_tip (tooltips, menuitem_file_export, _("Export all visible layers to a new format"), NULL);
383  gtk_container_add (GTK_CONTAINER (menuitem_file_menu), menuitem_file_export);
384 
385  menuitem_file_export_menu = gtk_menu_new ();
386  gtk_menu_set_accel_group (GTK_MENU(menuitem_file_export_menu), accel_group);
387  gtk_menu_set_accel_path (GTK_MENU(menuitem_file_export_menu), ACCEL_FILE_EXPORT);
388  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_file_export), menuitem_file_export_menu);
389 
390  png = gtk_menu_item_new_with_mnemonic (_("P_NG..."));
391  gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu), png);
392  gtk_tooltips_set_tip (tooltips, png, _("Export project to a PNG file..."), NULL);
393 
394  pdf = gtk_menu_item_new_with_mnemonic (_("P_DF..."));
395  gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu), pdf);
396  gtk_tooltips_set_tip (tooltips, pdf, _("Export project to a PDF file..."), NULL);
397 
398  svg = gtk_menu_item_new_with_mnemonic (_("_SVG..."));
399  gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu), svg);
400  gtk_tooltips_set_tip (tooltips, svg, _("Export project to a SVG file"), NULL);
401 
402  postscript = gtk_menu_item_new_with_mnemonic (_("_PostScript..."));
403  gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu), postscript);
404  gtk_tooltips_set_tip (tooltips, postscript, _("Export project to a PostScript file"), NULL);
405 
406  rs274x = gtk_menu_item_new_with_mnemonic (_("RS-274X (_Gerber)..."));
407  gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu), rs274x);
408  gtk_tooltips_set_tip (tooltips, rs274x, _("Export layer to a RS-274X (Gerber) file"), NULL);
409 
410  drill = gtk_menu_item_new_with_mnemonic (_("_Excellon drill..."));
411  gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu), drill);
412  gtk_tooltips_set_tip (tooltips, drill, _("Export layer to an Excellon drill file"), NULL);
413 
414  rs274xm = gtk_menu_item_new_with_mnemonic (_("RS-274X Merge (Gerber)..."));
415  gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu), rs274xm);
416  gtk_tooltips_set_tip (tooltips, rs274xm, _("Export (merge visible gerber layers) to a RS-274X (Gerber) file"), NULL);
417 
418  drillm = gtk_menu_item_new_with_mnemonic (_("Excellon drill Merge..."));
419  gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu), drillm);
420  gtk_tooltips_set_tip (tooltips, drillm, _("Export (merge visible drill layers) to an Excellon drill file"), NULL);
421 
422  /* File menu items dealing with printing and quitting. */
423  separator1 = gtk_separator_menu_item_new ();
424  gtk_container_add (GTK_CONTAINER (menuitem_file_menu), separator1);
425  gtk_widget_set_sensitive (separator1, FALSE);
426 
427 #if GTK_CHECK_VERSION(2,10,0)
428  if (gtk_stock_lookup(GTK_STOCK_PRINT, &stock)) {
429  gchar new[] = N_("_Print...");
430  stock.label = _(new);
431  gtk_stock_add(&stock, 1);
432  }
433 
434  print = gtk_image_menu_item_new_from_stock (GTK_STOCK_PRINT, NULL);
435  screen.win.curFileMenuItem7 = print;
436  SET_ACCELS_FROM_STOCK (print, GTK_STOCK_PRINT, ACCEL_FILE_PRINT);
437  gtk_tooltips_set_tip (tooltips, print, _("Print the visible layers"), NULL);
438  gtk_container_add (GTK_CONTAINER (menuitem_file_menu), print);
439 
440  separator2 = gtk_separator_menu_item_new ();
441  gtk_container_add (GTK_CONTAINER (menuitem_file_menu), separator2);
442  gtk_widget_set_sensitive (separator2, FALSE);
443 #endif
444  quit = gtk_image_menu_item_new_from_stock (GTK_STOCK_QUIT, NULL);
445  SET_ACCELS_FROM_STOCK (quit, GTK_STOCK_QUIT, ACCEL_FILE_QUIT);
446  gtk_tooltips_set_tip (tooltips, quit, _("Quit Gerbv"), NULL);
447  gtk_container_add (GTK_CONTAINER (menuitem_file_menu), quit);
448 
449  /* --- Next menu item (Edit) --- */
450  menuitem_edit = gtk_menu_item_new_with_mnemonic (_("_Edit"));
451  screen.win.curEditMenuItem = menuitem_edit;
452  gtk_container_add (GTK_CONTAINER (menubar1), menuitem_edit);
453 
454  menuitem_edit_menu = gtk_menu_new ();
455  gtk_menu_set_accel_group (GTK_MENU(menuitem_edit_menu), accel_group);
456  gtk_menu_set_accel_path (GTK_MENU(menuitem_edit_menu), ACCEL_EDIT);
457  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_edit), menuitem_edit_menu);
458 
459  properties_selected = gtk_image_menu_item_new_with_mnemonic (_("Display _properties of selected object(s)"));
460  SET_ACCELS_FROM_STOCK (properties_selected, GTK_STOCK_PROPERTIES, ACCEL_EDIT_PROPERTIES);
461  gtk_tooltips_set_tip (tooltips, properties_selected, _("Examine the properties of the selected object"), NULL);
462  tempImage = gtk_image_new_from_stock (GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_MENU);
463  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (properties_selected), tempImage);
464  gtk_container_add (GTK_CONTAINER (menuitem_edit_menu), properties_selected);
465 
466  delete_selected = gtk_image_menu_item_new_with_mnemonic (_("_Delete selected object(s)"));
467  SET_ACCELS_FROM_STOCK (delete_selected, GTK_STOCK_REMOVE, ACCEL_EDIT_DELETE);
468  gtk_tooltips_set_tip (tooltips, delete_selected, _("Delete selected objects"), NULL);
469  tempImage = gtk_image_new_from_stock (GTK_STOCK_DELETE, GTK_ICON_SIZE_MENU);
470  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (delete_selected), tempImage);
471  gtk_container_add (GTK_CONTAINER (menuitem_edit_menu), delete_selected);
472 
473 #if 0
474  /* Include these after they are coded. */
475  tempMenuItem = gtk_image_menu_item_new_with_label (_("Edit object properties"));
476  gtk_menu_shell_append ((GtkMenuShell *)screen.win.drawWindowPopupMenu, tempMenuItem);
477  gtk_tooltips_set_tip (tooltips, tempMenuItem, _("Edit the properties of the selected object"), NULL);
478  g_signal_connect ((gpointer) tempMenuItem, "activate",
479  G_CALLBACK (callbacks_edit_object_properties_clicked), NULL);
480 
481  tempMenuItem = gtk_image_menu_item_new_with_label (_("Move object(s)"));
482  gtk_menu_shell_append ((GtkMenuShell *)screen.win.drawWindowPopupMenu, tempMenuItem);
483  gtk_tooltips_set_tip (tooltips, tempMenuItem, _("Move the selected object(s)"),NULL);
484  g_signal_connect ((gpointer) tempMenuItem, "activate",
485  G_CALLBACK (callbacks_move_objects_clicked), NULL);
486 
487  tempMenuItem = gtk_image_menu_item_new_with_label (_("Reduce area"));
488  gtk_menu_shell_append ((GtkMenuShell *)screen.win.drawWindowPopupMenu, tempMenuItem);
489  gtk_tooltips_set_tip (tooltips, tempMenuItem, _("Reduce the area of the object (e.g. to prevent component floating)"),NULL);
490  g_signal_connect ((gpointer) tempMenuItem, "activate",
491  G_CALLBACK (callbacks_reduce_object_area_clicked), NULL);
492 #endif
493 
494  /* Use the "Edit" menu as right click popup menu for the drawing area */
495  screen.win.drawWindowPopupMenu = menuitem_edit_menu;
496 
497  /* --- Next menu item (View) --- */
498  menuitem_view = gtk_menu_item_new_with_mnemonic (_("_View"));
499  gtk_container_add (GTK_CONTAINER (menubar1), menuitem_view);
500 
501  menuitem_view_menu = gtk_menu_new ();
502  gtk_menu_set_accel_group (GTK_MENU(menuitem_view_menu), accel_group);
503  gtk_menu_set_accel_path (GTK_MENU(menuitem_view_menu), ACCEL_VIEW);
504  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_view), menuitem_view_menu);
505 
506  view_fullscreen = gtk_check_menu_item_new_with_mnemonic (_("Fullscr_een"));
507  gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_fullscreen), FALSE);
508  gtk_tooltips_set_tip (tooltips, view_fullscreen, _("Toggle between fullscreen and normal view"), NULL);
509  SET_ACCELS (view_fullscreen, ACCEL_VIEW_FULLSCREEN);
510  gtk_container_add (GTK_CONTAINER (menuitem_view_menu), view_fullscreen);
511 
512  show_toolbar = gtk_check_menu_item_new_with_mnemonic (_("Show _Toolbar"));
513  gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (show_toolbar), TRUE);
514  gtk_tooltips_set_tip (tooltips, show_toolbar, _("Toggle visibility of the toolbar"), NULL);
515  SET_ACCELS (show_toolbar, ACCEL_VIEW_TOOLBAR);
516  gtk_container_add (GTK_CONTAINER (menuitem_view_menu), show_toolbar);
517 
518  show_sidepane = gtk_check_menu_item_new_with_mnemonic (_("Show _Sidepane"));
519  gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (show_sidepane), TRUE);
520  gtk_tooltips_set_tip (tooltips, show_sidepane, _("Toggle visibility of the sidepane"), NULL);
521  SET_ACCELS (show_sidepane, ACCEL_VIEW_SIDEPANE);
522  gtk_container_add (GTK_CONTAINER (menuitem_view_menu), show_sidepane);
523 
524  separator3 = gtk_separator_menu_item_new ();
525  gtk_widget_set_sensitive (separator3, FALSE);
526  gtk_container_add (GTK_CONTAINER (menuitem_view_menu), separator3);
527 
528  layer_visibility_main_menu = gtk_menu_item_new_with_mnemonic (_("Toggle layer _visibility"));
529  gtk_container_add (GTK_CONTAINER (menuitem_view_menu), layer_visibility_main_menu);
530 
531  layer_visibility_menu = gtk_menu_new ();
532  gtk_menu_set_accel_group (GTK_MENU(layer_visibility_menu), accel_group);
533  gtk_menu_set_accel_path (GTK_MENU(layer_visibility_menu), ACCEL_VIEW_VIS);
534  gtk_menu_item_set_submenu (GTK_MENU_ITEM (layer_visibility_main_menu), layer_visibility_menu);
535 
536  toggle_layer_visibility_item1 = gtk_menu_item_new_with_label (_("Toggle visibility of layer 1"));
537  SET_ACCELS (toggle_layer_visibility_item1, ACCEL_VIEW_VIS_LAYER1);
538  gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item1);
539 
540  toggle_layer_visibility_item2 = gtk_menu_item_new_with_label (_("Toggle visibility of layer 2"));
541  SET_ACCELS (toggle_layer_visibility_item2, ACCEL_VIEW_VIS_LAYER2);
542  gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item2);
543 
544  toggle_layer_visibility_item3 = gtk_menu_item_new_with_label (_("Toggle visibility of layer 3"));
545  SET_ACCELS (toggle_layer_visibility_item3, ACCEL_VIEW_VIS_LAYER3);
546  gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item3);
547 
548  toggle_layer_visibility_item4 = gtk_menu_item_new_with_label (_("Toggle visibility of layer 4"));
549  SET_ACCELS (toggle_layer_visibility_item4, ACCEL_VIEW_VIS_LAYER4);
550  gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item4);
551 
552  toggle_layer_visibility_item5 = gtk_menu_item_new_with_label (_("Toggle visibility of layer 5"));
553  SET_ACCELS (toggle_layer_visibility_item5, ACCEL_VIEW_VIS_LAYER5);
554  gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item5);
555 
556  toggle_layer_visibility_item6 = gtk_menu_item_new_with_label (_("Toggle visibility of layer 6"));
557  SET_ACCELS (toggle_layer_visibility_item6, ACCEL_VIEW_VIS_LAYER6);
558  gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item6);
559 
560  toggle_layer_visibility_item7 = gtk_menu_item_new_with_label (_("Toggle visibility of layer 7"));
561  SET_ACCELS (toggle_layer_visibility_item7, ACCEL_VIEW_VIS_LAYER7);
562  gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item7);
563 
564  toggle_layer_visibility_item8 = gtk_menu_item_new_with_label (_("Toggle visibility of layer 8"));
565  SET_ACCELS (toggle_layer_visibility_item8, ACCEL_VIEW_VIS_LAYER8);
566  gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item8);
567 
568  toggle_layer_visibility_item9 = gtk_menu_item_new_with_label (_("Toggle visibility of layer 9"));
569  SET_ACCELS (toggle_layer_visibility_item9, ACCEL_VIEW_VIS_LAYER9);
570  gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item9);
571 
572  toggle_layer_visibility_item10 = gtk_menu_item_new_with_label (_("Toggle visibility of layer 10"));
573  SET_ACCELS (toggle_layer_visibility_item10, ACCEL_VIEW_VIS_LAYER10);
574  gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item10);
575 
576  separator4 = gtk_separator_menu_item_new ();
577  gtk_widget_set_sensitive (separator4, FALSE);
578  gtk_container_add (GTK_CONTAINER (menuitem_view_menu), separator4);
579 
580  zoom_in = gtk_image_menu_item_new_from_stock (GTK_STOCK_ZOOM_IN, NULL);
581  SET_ACCELS_FROM_STOCK (zoom_in, GTK_STOCK_ZOOM_IN, ACCEL_VIEW_ZOOM_IN);
582  gtk_tooltips_set_tip (tooltips, zoom_in, _("Zoom in"), NULL);
583  gtk_container_add (GTK_CONTAINER (menuitem_view_menu), zoom_in);
584 
585  zoom_out = gtk_image_menu_item_new_from_stock (GTK_STOCK_ZOOM_OUT, NULL);
586  SET_ACCELS_FROM_STOCK (zoom_out, GTK_STOCK_ZOOM_OUT, ACCEL_VIEW_ZOOM_OUT);
587  gtk_tooltips_set_tip (tooltips, zoom_out, _("Zoom out"), NULL);
588  gtk_container_add (GTK_CONTAINER (menuitem_view_menu), zoom_out);
589 
590  fit_to_window = gtk_image_menu_item_new_from_stock (GTK_STOCK_ZOOM_FIT, NULL);
591  gtk_tooltips_set_tip (tooltips, fit_to_window, _("Zoom to fit all visible layers in the window"), NULL);
592  SET_ACCELS_FROM_STOCK (fit_to_window, GTK_STOCK_ZOOM_FIT, ACCEL_VIEW_ZOOM_FIT);
593  gtk_container_add (GTK_CONTAINER (menuitem_view_menu), fit_to_window);
594 
595  separator5 = gtk_separator_menu_item_new ();
596  gtk_container_add (GTK_CONTAINER (menuitem_view_menu), separator5);
597  gtk_widget_set_sensitive (separator5, FALSE);
598 
599  backgroundColor = gtk_image_menu_item_new_with_mnemonic (_("Change background color"));
600  gtk_tooltips_set_tip (tooltips, backgroundColor, _("Change the background color"), NULL);
601  tempImage = gtk_image_new_from_stock (GTK_STOCK_SELECT_COLOR, GTK_ICON_SIZE_MENU);
602  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (backgroundColor), tempImage);
603  gtk_container_add (GTK_CONTAINER (menuitem_view_menu), backgroundColor);
604 
605  { // rendering submenu
606  menuitem_view_render = gtk_menu_item_new_with_mnemonic (_("_Rendering"));
607  gtk_container_add (GTK_CONTAINER (menuitem_view_menu), menuitem_view_render);
608 
609  menuitem_view_render_menu = gtk_menu_new ();
610  gtk_menu_set_accel_group (GTK_MENU(menuitem_view_render_menu), accel_group);
611  gtk_menu_set_accel_path (GTK_MENU(menuitem_view_render_menu), ACCEL_VIEW_RENDER);
612  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_view_render), menuitem_view_render_menu);
613 
614  menu_view_render_group = NULL;
615 
616  render_fast = gtk_radio_menu_item_new_with_mnemonic (menu_view_render_group, _("_Fast"));
617  menu_view_render_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (render_fast));
618  gtk_container_add (GTK_CONTAINER (menuitem_view_render_menu), render_fast);
619 
620  render_fast_xor = gtk_radio_menu_item_new_with_mnemonic (menu_view_render_group, _("Fast (_XOR)"));
621  menu_view_render_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (render_fast_xor));
622  gtk_container_add (GTK_CONTAINER (menuitem_view_render_menu), render_fast_xor);
623 
624  render_normal = gtk_radio_menu_item_new_with_mnemonic (menu_view_render_group, _("_Normal"));
625  menu_view_render_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (render_normal));
626  gtk_container_add (GTK_CONTAINER (menuitem_view_render_menu), render_normal);
627 
628  render_hq = gtk_radio_menu_item_new_with_mnemonic (menu_view_render_group, _("High _Quality"));
629  menu_view_render_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (render_hq));
630  gtk_container_add (GTK_CONTAINER (menuitem_view_render_menu), render_hq);
631 
632  screen.win.menu_view_render_group = malloc(4*sizeof(GtkWidget *));
633  if(screen.win.menu_view_render_group == NULL)
634  GERB_FATAL_ERROR(_("malloc for rendering type synchronization failed.\n"));
635 
636  screen.win.menu_view_render_group[GERBV_RENDER_TYPE_GDK] = GTK_CHECK_MENU_ITEM(render_fast);
637  screen.win.menu_view_render_group[GERBV_RENDER_TYPE_GDK_XOR] = GTK_CHECK_MENU_ITEM(render_fast_xor);
638  screen.win.menu_view_render_group[GERBV_RENDER_TYPE_CAIRO_NORMAL] = GTK_CHECK_MENU_ITEM(render_normal);
639  screen.win.menu_view_render_group[GERBV_RENDER_TYPE_CAIRO_HIGH_QUALITY] = GTK_CHECK_MENU_ITEM(render_hq);
640  }
641 
642  { // units submenu
643  gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (render_fast), TRUE);
644 
645  menuitem_view_unit = gtk_menu_item_new_with_mnemonic (_("U_nits"));
646  gtk_container_add (GTK_CONTAINER (menuitem_view_menu), menuitem_view_unit);
647 
648  menuitem_view_unit_menu = gtk_menu_new ();
649  gtk_menu_set_accel_group (GTK_MENU(menuitem_view_unit_menu), accel_group);
650  gtk_menu_set_accel_path (GTK_MENU(menuitem_view_unit_menu), ACCEL_VIEW_UNITS);
651  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_view_unit), menuitem_view_unit_menu);
652 
653  menu_view_unit_group = NULL;
654 
655  unit_mil = gtk_radio_menu_item_new_with_mnemonic (menu_view_unit_group, _("mi_l"));
656  menu_view_unit_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (unit_mil));
657  gtk_container_add (GTK_CONTAINER (menuitem_view_unit_menu), unit_mil);
658 
659  unit_mm = gtk_radio_menu_item_new_with_mnemonic (menu_view_unit_group, _("_mm"));
660  menu_view_unit_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (unit_mm));
661  gtk_container_add (GTK_CONTAINER (menuitem_view_unit_menu), unit_mm);
662 
663  unit_in = gtk_radio_menu_item_new_with_mnemonic (menu_view_unit_group, _("_in"));
664  menu_view_unit_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (unit_in));
665  gtk_container_add (GTK_CONTAINER (menuitem_view_unit_menu), unit_in);
666 
667  screen.win.menu_view_unit_group = malloc(3*sizeof(GtkWidget *));
668  if(screen.win.menu_view_unit_group == NULL)
669  GERB_FATAL_ERROR(_("malloc for display unit synchronization failed.\n"));
670 
671  screen.win.menu_view_unit_group[GERBV_MILS] = GTK_CHECK_MENU_ITEM(unit_mil);
672  screen.win.menu_view_unit_group[GERBV_MMS] = GTK_CHECK_MENU_ITEM(unit_mm);
673  screen.win.menu_view_unit_group[GERBV_INS] = GTK_CHECK_MENU_ITEM(unit_in);
674  }
675 
676  /* --- Next menu item (Current Layer) --- */
677  menuitem_layer = gtk_menu_item_new_with_mnemonic (_("_Layer"));
678  gtk_container_add (GTK_CONTAINER (menubar1), menuitem_layer);
679 
680  menuitem_layer_menu = gtk_menu_new ();
681  gtk_menu_set_accel_group (GTK_MENU (menuitem_layer_menu), accel_group);
682  gtk_menu_set_accel_path (GTK_MENU (menuitem_layer_menu), ACCEL_LAYER);
683  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_layer), menuitem_layer_menu);
684 
685  layer_visibility = gtk_menu_item_new_with_mnemonic (_("Toggle _visibility"));
686  gtk_tooltips_set_tip (tooltips, layer_visibility, _("Toggles the visibility of the layer currently selected in the sidepane"), NULL);
687  gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_visibility);
688 
689  layer_visibility_all_on = gtk_image_menu_item_new_with_mnemonic (_("All o_n"));
690  gtk_tooltips_set_tip (tooltips, layer_visibility_all_on, _("Turn on visibility of all layers"), NULL);
691  tempImage = gtk_image_new_from_stock (GTK_STOCK_YES, GTK_ICON_SIZE_MENU);
692  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (layer_visibility_all_on), tempImage);
693  gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_visibility_all_on);
694 
695  layer_visibility_all_off = gtk_image_menu_item_new_with_mnemonic (_("All _off"));
696  gtk_tooltips_set_tip (tooltips, layer_visibility_all_off, _("Turn off visibility of all layers"), NULL);
697  tempImage = gtk_image_new_from_stock (GTK_STOCK_NO, GTK_ICON_SIZE_MENU);
698  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (layer_visibility_all_off), tempImage);
699  gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_visibility_all_off);
700 
701  layer_invert = gtk_menu_item_new_with_mnemonic (_("_Invert color"));
702  gtk_tooltips_set_tip (tooltips, layer_invert, _("Invert the display polarity of the layer currently selected in the sidepane"), NULL);
703  gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_invert);
704 
705  layer_color = gtk_image_menu_item_new_with_mnemonic (_("_Change color"));
706  SET_ACCELS (layer_color, ACCEL_LAYER_COLOR);
707  gtk_tooltips_set_tip (tooltips, layer_color, _("Change the display color of the layer currently selected in the sidepane"), NULL);
708  tempImage = gtk_image_new_from_stock (GTK_STOCK_SELECT_COLOR, GTK_ICON_SIZE_MENU);
709  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (layer_color), tempImage);
710  gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_color);
711 
712  separator6 = gtk_separator_menu_item_new ();
713  gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), separator6);
714 
715  layer_reload = gtk_image_menu_item_new_with_mnemonic (_("_Reload layer"));
716  gtk_tooltips_set_tip (tooltips, layer_reload, _("Reload the layer from disk"), NULL);
717  tempImage = gtk_image_new_from_stock (GTK_STOCK_REVERT_TO_SAVED, GTK_ICON_SIZE_MENU);
718  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (layer_reload), tempImage);
719  gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_reload);
720 
721  layer_edit = gtk_image_menu_item_new_with_mnemonic (_("_Edit layer"));
722  gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_edit);
723  gtk_tooltips_set_tip (tooltips, layer_edit, _("Translate, scale, rotate, or mirror the layer currently selected in the sidepane"), NULL);
724  tempImage = gtk_image_new_from_stock (GTK_STOCK_EDIT, GTK_ICON_SIZE_MENU);
725  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (layer_edit), tempImage);
726 
727  layer_format = gtk_image_menu_item_new_with_mnemonic (_("Edit file _format"));
728  gtk_tooltips_set_tip (tooltips, layer_format, _("View and edit the numerical format used to parse this layer currently selected in the sidepane"), NULL);
729  tempImage = gtk_image_new_from_stock (GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU);
730  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (layer_format), tempImage);
731  gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_format);
732 
733  separator7 = gtk_separator_menu_item_new ();
734  gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), separator7);
735 
736  layer_up = gtk_image_menu_item_new_with_mnemonic (_("Move u_p"));
737  gtk_tooltips_set_tip (tooltips, layer_up, _("Move the layer currently selected in the sidepane one step up"), NULL);
738  tempImage = gtk_image_new_from_stock (GTK_STOCK_GO_UP, GTK_ICON_SIZE_MENU);
739  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (layer_up), tempImage);
740  SET_ACCELS (layer_up, ACCEL_LAYER_UP);
741  gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_up);
742 
743  layer_down = gtk_image_menu_item_new_with_mnemonic (_("Move dow_n"));
744  gtk_tooltips_set_tip (tooltips, layer_down, _("Move the layer currently selected in the sidepane one step down"), NULL);
745  tempImage = gtk_image_new_from_stock (GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_MENU);
746  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (layer_down), tempImage);
747  SET_ACCELS (layer_down, ACCEL_LAYER_DOWN);
748  gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_down);
749 
750  layer_remove = gtk_image_menu_item_new_with_mnemonic (_("_Delete"));
751  gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_remove);
752  gtk_tooltips_set_tip (tooltips, layer_remove, _("Remove the layer currently selected in the sidepane"), NULL);
753  tempImage = gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU);
754  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (layer_remove), tempImage);
755 
756  /* The callbacks need this reference to grey the layer menu out, if there are none loaded. */
757  screen.win.curLayerMenuItem = menuitem_layer;
758 
759  /* Use the "Current Layer" menu as right click popup menu for layer tree */
760  screen.win.layerTreePopupMenu = menuitem_layer_menu;
761 
762  /* --- Next menu item (Analyze) --- */
763  menuitem_analyze = gtk_menu_item_new_with_mnemonic (_("_Analyze"));
764  screen.win.curAnalyzeMenuItem = menuitem_analyze;
765  gtk_container_add (GTK_CONTAINER (menubar1), menuitem_analyze);
766 
767  menuitem_analyze_menu = gtk_menu_new ();
768  gtk_menu_set_accel_group (GTK_MENU(menuitem_analyze_menu), accel_group);
769  gtk_menu_set_accel_path (GTK_MENU(menuitem_analyze_menu), ACCEL_ANAL);
770  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_analyze), menuitem_analyze_menu);
771 
772  analyze_active_gerbers = gtk_menu_item_new_with_mnemonic (_("Analyze visible _Gerber layers"));
773  gtk_tooltips_set_tip (tooltips, analyze_active_gerbers,
774  _("Examine a detailed anaylsis of the contents of all visible Gerber layers"), NULL);
775  gtk_container_add (GTK_CONTAINER (menuitem_analyze_menu), analyze_active_gerbers);
776 
777  analyze_active_drill = gtk_menu_item_new_with_mnemonic (_("Analyze visible _drill layers"));
778  gtk_tooltips_set_tip (tooltips, analyze_active_drill,
779  _("Examine a detailed anaylsis of the contents of all visible drill layers"), NULL);
780  gtk_container_add (GTK_CONTAINER (menuitem_analyze_menu), analyze_active_drill);
781 
782  analyze_benchmark = gtk_menu_item_new_with_mnemonic (_("_Benchmark (1 min)"));
783  gtk_tooltips_set_tip (tooltips, analyze_benchmark,
784  _("Benchmark different rendering methods. Will make the application unresponsive for 1 minute!"), NULL);
785  gtk_container_add (GTK_CONTAINER (menuitem_analyze_menu), analyze_benchmark);
786 
787 
788  /* Wait and add in for 2.1??
789  control_gerber_options = gtk_menu_item_new_with_mnemonic (_("Control Gerber options..."));
790  gtk_tooltips_set_tip (tooltips, control_gerber_options, _("Set which Gerber features should be displayed"), NULL);
791  gtk_container_add (GTK_CONTAINER (menuitem_analyze_menu), control_gerber_options);
792  */
793  menuitem_tools = gtk_menu_item_new_with_mnemonic (_("_Tools"));
794  gtk_container_add (GTK_CONTAINER (menubar1), menuitem_tools);
795 
796  menuitem_tools_menu = gtk_menu_new ();
797  gtk_menu_set_accel_group (GTK_MENU(menuitem_tools_menu), accel_group);
798  gtk_menu_set_accel_path (GTK_MENU(menuitem_tools_menu), ACCEL_TOOLS);
799  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_tools), menuitem_tools_menu);
800  pointer_tool = gtk_image_menu_item_new_with_mnemonic (_("_Pointer Tool"));
801  tempImage = gtk_image_new_from_pixbuf (pointerpixbuf);
802  gtk_image_menu_item_set_image ((GtkImageMenuItem *)pointer_tool, tempImage);
803  SET_ACCELS (pointer_tool, ACCEL_TOOLS_POINTER);
804  gtk_container_add (GTK_CONTAINER (menuitem_tools_menu), pointer_tool);
805  gtk_tooltips_set_tip (tooltips, pointer_tool, _("Select objects on the screen"), NULL);
806  pan_tool = gtk_image_menu_item_new_with_mnemonic (_("Pa_n Tool"));
807  tempImage = gtk_image_new_from_pixbuf (movepixbuf);
808  gtk_image_menu_item_set_image ((GtkImageMenuItem *)pan_tool, tempImage);
809  SET_ACCELS (pan_tool, ACCEL_TOOLS_PAN);
810  gtk_container_add (GTK_CONTAINER (menuitem_tools_menu), pan_tool);
811  gtk_tooltips_set_tip (tooltips, pan_tool, _("Pan by left clicking and dragging"), NULL);
812 
813  zoom_tool = gtk_image_menu_item_new_with_mnemonic (_("_Zoom Tool"));
814  tempImage = gtk_image_new_from_pixbuf (zoompixbuf);
815  gtk_image_menu_item_set_image ((GtkImageMenuItem *)zoom_tool, tempImage);
816  SET_ACCELS (zoom_tool, ACCEL_TOOLS_ZOOM);
817  gtk_container_add (GTK_CONTAINER (menuitem_tools_menu), zoom_tool);
818  gtk_tooltips_set_tip (tooltips, zoom_tool, _("Zoom by left clicking or dragging"), NULL);
819 
820  measure_tool = gtk_image_menu_item_new_with_mnemonic (_("_Measure Tool"));
821  tempImage = gtk_image_new_from_pixbuf (measurepixbuf);
822  gtk_image_menu_item_set_image ((GtkImageMenuItem *)measure_tool, tempImage);
823  SET_ACCELS (measure_tool, ACCEL_TOOLS_MEASURE);
824  gtk_container_add (GTK_CONTAINER (menuitem_tools_menu), measure_tool);
825  gtk_tooltips_set_tip (tooltips, measure_tool, _("Measure distances on the screen"), NULL);
826 
827  menuitem_help = gtk_menu_item_new_with_mnemonic (_("_Help"));
828  gtk_container_add (GTK_CONTAINER (menubar1), menuitem_help);
829 
830  menuitem_help_menu = gtk_menu_new ();
831  gtk_menu_set_accel_group (GTK_MENU(menuitem_help_menu), accel_group);
832  gtk_menu_set_accel_path (GTK_MENU(menuitem_help_menu), ACCEL_HELP);
833  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_help), menuitem_help_menu);
834 
835  /* Not ready for 2.0
836  online_manual = gtk_menu_item_new_with_mnemonic (_("_Online Manual..."));
837  gtk_container_add (GTK_CONTAINER (menuitem_help_menu), online_manual);
838  gtk_tooltips_set_tip (tooltips, online_manual, _("View the online help documentation"), NULL);
839  */
840 
841  about = gtk_image_menu_item_new_with_mnemonic (_("_About Gerbv..."));
842  gtk_container_add (GTK_CONTAINER (menuitem_help_menu), about);
843  gtk_tooltips_set_tip (tooltips, about, _("View information about gerbv"), NULL);
844  image34 = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_MENU);
845  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (about), image34);
846 
847  bugs_menuitem = gtk_image_menu_item_new_with_mnemonic (_("Known _bugs in this version..."));
848  tempImage = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_MENU);
849  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (bugs_menuitem), tempImage);
850  gtk_tooltips_set_tip (tooltips, bugs_menuitem, _("View list of known gerbv bugs"), NULL);
851  gtk_container_add (GTK_CONTAINER (menuitem_help_menu), bugs_menuitem);
852 
853  /* Create toolbar (button bar) beneath main menu */
854  toolbar_hbox = gtk_hbox_new (FALSE, 0);
855  gtk_box_pack_start (GTK_BOX (vbox1), toolbar_hbox, FALSE, FALSE, 0);
856 
857  handlebox = gtk_handle_box_new ();
858 
859  gtk_box_pack_start (GTK_BOX (toolbar_hbox), handlebox, TRUE, TRUE, 0);
860 
861  button_toolbar = gtk_toolbar_new ();
862  gtk_widget_set_size_request (button_toolbar, 500, -1);
863  gtk_container_add (GTK_CONTAINER (handlebox), button_toolbar);
864  gtk_toolbar_set_style (GTK_TOOLBAR (button_toolbar), GTK_TOOLBAR_ICONS);
865  /*tmp_toolbar_icon_size = gtk_toolbar_get_icon_size (GTK_TOOLBAR (button_toolbar));*/
866 
867  toolbutton_new = (GtkWidget*) gtk_tool_button_new_from_stock (GTK_STOCK_NEW);
868  gtk_tooltips_set_tip (tooltips, toolbutton_new, _("Close all layers and start a new project"), NULL);
869  gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_new);
870 
871  toolbutton_open = (GtkWidget*) gtk_tool_button_new_from_stock (GTK_STOCK_OPEN);
872  gtk_tooltips_set_tip (tooltips, toolbutton_open, _("Open a previously saved gerbv project"), NULL);
873  gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_open);
874 
875  toolbutton_revert = (GtkWidget*) gtk_tool_button_new_from_stock (GTK_STOCK_REVERT_TO_SAVED);
876  gtk_tooltips_set_tip (tooltips, toolbutton_revert, _("Reload all layers in project"), NULL);
877  gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_revert);
878 
879  toolbutton_save = (GtkWidget*) gtk_tool_button_new_from_stock (GTK_STOCK_SAVE);
880  gtk_tooltips_set_tip (tooltips, toolbutton_save, _("Save the current project"), NULL);
881  gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_save);
882 
883  separatortoolitem1 = (GtkWidget*) gtk_separator_tool_item_new ();
884  gtk_container_add (GTK_CONTAINER (button_toolbar), separatortoolitem1);
885 #if GTK_CHECK_VERSION(2,10,0)
886  toolbutton_print = (GtkWidget*) gtk_tool_button_new_from_stock (GTK_STOCK_PRINT);
887  gtk_tooltips_set_tip (tooltips, toolbutton_print, _("Print the visible layers"), NULL);
888  gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_print);
889 
890  separatortoolitem2 = (GtkWidget*) gtk_separator_tool_item_new ();
891  gtk_container_add (GTK_CONTAINER (button_toolbar), separatortoolitem2);
892 #endif
893  toolbutton_zoom_in = (GtkWidget*) gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_IN);
894  gtk_tooltips_set_tip (tooltips, toolbutton_zoom_in, _("Zoom in"), NULL);
895  gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_zoom_in);
896 
897  toolbutton_zoom_out = (GtkWidget*) gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_OUT);
898  gtk_tooltips_set_tip (tooltips, toolbutton_zoom_out, _("Zoom out"), NULL);
899  gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_zoom_out);
900 
901  toolbutton_zoom_fit = (GtkWidget*) gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_FIT);
902  gtk_tooltips_set_tip (tooltips, toolbutton_zoom_fit, _("Zoom to fit all visible layers in the window"), NULL);
903  gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_zoom_fit);
904 
905 /* Turn these on later when we have icons for these buttons */
906 /*
907  separatortoolitem3 = (GtkWidget*) gtk_separator_tool_item_new ();
908  gtk_container_add (GTK_CONTAINER (button_toolbar), separatortoolitem3);
909 
910  toolbutton_analyze = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-apply");
911  gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_analyze);
912 
913  toolbutton_validate = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-apply");
914  gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_validate);
915 
916  toolbutton_control = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-apply");
917  gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_control);
918 */
919 
920  separatortoolitem4 = (GtkWidget*) gtk_separator_tool_item_new ();
921  gtk_container_add (GTK_CONTAINER (button_toolbar), separatortoolitem4);
922  toggletoolbutton_pointer = (GtkWidget*) gtk_toggle_tool_button_new();
923  pointerimage = gtk_image_new_from_pixbuf(pointerpixbuf);
924  gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(toggletoolbutton_pointer),
925  pointerimage);
926  gtk_tooltips_set_tip (tooltips, toggletoolbutton_pointer, _("Select objects on the screen"), NULL);
927  gtk_container_add (GTK_CONTAINER (button_toolbar), toggletoolbutton_pointer);
928  toggletoolbutton_pan = (GtkWidget*) gtk_toggle_tool_button_new();
929  moveimage = gtk_image_new_from_pixbuf(movepixbuf);
930  gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(toggletoolbutton_pan),
931  moveimage);
932  gtk_tooltips_set_tip (tooltips, toggletoolbutton_pan, _("Pan by left clicking and dragging"), NULL);
933  gtk_container_add (GTK_CONTAINER (button_toolbar), toggletoolbutton_pan);
934 
935 
936  toggletoolbutton_zoom = (GtkWidget*) gtk_toggle_tool_button_new();
937  zoomimage = gtk_image_new_from_pixbuf(zoompixbuf);
938  gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(toggletoolbutton_zoom),
939  zoomimage);
940  gtk_tooltips_set_tip (tooltips, toggletoolbutton_zoom, _("Zoom by left clicking or dragging"), NULL);
941  gtk_container_add (GTK_CONTAINER (button_toolbar), toggletoolbutton_zoom);
942 
943  toggletoolbutton_measure = (GtkWidget*) gtk_toggle_tool_button_new();
944  measureimage = gtk_image_new_from_pixbuf(measurepixbuf);
945  gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(toggletoolbutton_measure),
946  measureimage);
947  gtk_tooltips_set_tip (tooltips, toggletoolbutton_measure, _("Measure distances on the screen"), NULL);
948  gtk_container_add (GTK_CONTAINER (button_toolbar), toggletoolbutton_measure);
949 
950  hpaned1 = gtk_hpaned_new ();
951  gtk_box_pack_start (GTK_BOX (vbox1), hpaned1, TRUE, TRUE, 0);
952  gtk_paned_set_position (GTK_PANED (hpaned1), 225);
953 
954  sidepane_vbox = gtk_vbox_new (FALSE, 0);
955  gtk_widget_set_size_request (sidepane_vbox, 150, -1);
956 
957  gtk_paned_pack1 (GTK_PANED (hpaned1), sidepane_vbox, TRUE, FALSE);
958  gtk_container_set_border_width (GTK_CONTAINER (sidepane_vbox), 5);
959 
960  sidepane_notebook = gtk_notebook_new ();
961  gtk_widget_set_size_request (sidepane_notebook, 100, -1);
962  gtk_box_pack_start (GTK_BOX (sidepane_vbox), sidepane_notebook, TRUE, TRUE, 0);
963 
964  vbox10 = gtk_vbox_new (FALSE, 3);
965  gtk_container_add (GTK_CONTAINER (sidepane_notebook), vbox10);
966  gtk_widget_set_size_request (vbox10, 82, -1);
967  gtk_container_set_border_width (GTK_CONTAINER (vbox10), 4);
968 
969  hbox4 = gtk_hbox_new (FALSE, 0);
970  gtk_box_pack_start (GTK_BOX (vbox10), hbox4, FALSE, FALSE, 0);
971 
972  label1 = gtk_label_new (_("Rendering: "));
973  gtk_box_pack_start (GTK_BOX (hbox4), label1, FALSE, FALSE, 0);
974 
975  render_combobox = gtk_combo_box_new_text ();
976  gtk_box_pack_start (GTK_BOX (hbox4), render_combobox, TRUE, TRUE, 0);
977 
978  gtk_combo_box_append_text (GTK_COMBO_BOX (render_combobox), _("Fast"));
979  gtk_combo_box_append_text (GTK_COMBO_BOX (render_combobox), _("Fast, with XOR"));
980  gtk_combo_box_append_text (GTK_COMBO_BOX (render_combobox), _("Normal"));
981  gtk_combo_box_append_text (GTK_COMBO_BOX (render_combobox), _("High quality"));
982  if (screenRenderInfo.renderType < GERBV_RENDER_TYPE_MAX)
983  gtk_combo_box_set_active (GTK_COMBO_BOX (render_combobox), screenRenderInfo.renderType);
984 
985  scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
986  gtk_box_pack_start (GTK_BOX (vbox10), scrolledwindow1, TRUE, TRUE, 0);
987  gtk_container_set_border_width (GTK_CONTAINER (scrolledwindow1), 2);
988  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1),
989  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
990  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow1),
991  GTK_SHADOW_IN);
992 
993  hbox1 = gtk_hbox_new (TRUE, 0);
994  gtk_box_pack_start (GTK_BOX (vbox10), hbox1, FALSE, FALSE, 0);
995 
996  button4 = gtk_button_new ();
997  gtk_box_pack_start (GTK_BOX (hbox1), button4, FALSE, TRUE, 0);
998 
999  image8 = gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_BUTTON);
1000  gtk_container_add (GTK_CONTAINER (button4), image8);
1001  gtk_tooltips_set_tip (tooltips, button4, _("Open Gerber, drill, or pick and place file(s)"), NULL);
1002 
1003  button5 = gtk_button_new ();
1004  gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, TRUE, 0);
1005 
1006  image9 = gtk_image_new_from_stock (GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_BUTTON);
1007  gtk_container_add (GTK_CONTAINER (button5), image9);
1008  gtk_tooltips_set_tip (tooltips, button5, _("Move the layer currently selected in the sidepane one step down"), NULL);
1009 
1010  button6 = gtk_button_new ();
1011  gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, TRUE, 0);
1012 
1013  image10 = gtk_image_new_from_stock (GTK_STOCK_GO_UP, GTK_ICON_SIZE_BUTTON);
1014  gtk_container_add (GTK_CONTAINER (button6), image10);
1015  gtk_tooltips_set_tip (tooltips, button6, _("Move the layer currently selected in the sidepane one step up"), NULL);
1016 
1017  button7 = gtk_button_new ();
1018  gtk_box_pack_start (GTK_BOX (hbox1), button7, FALSE, TRUE, 0);
1019 
1020  image11 = gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_BUTTON);
1021  gtk_container_add (GTK_CONTAINER (button7), image11);
1022  gtk_tooltips_set_tip (tooltips, button7, _("Remove the layer currently selected in the sidepane"), NULL);
1023 
1024  Layer_label = gtk_label_new (_("Layers"));
1025  gtk_notebook_set_tab_label (GTK_NOTEBOOK (sidepane_notebook),
1026  gtk_notebook_get_nth_page (GTK_NOTEBOOK (sidepane_notebook), 0),
1027  Layer_label);
1028 
1029  vbox11 = gtk_vbox_new (FALSE, 2);
1030  gtk_container_add (GTK_CONTAINER (sidepane_notebook), vbox11);
1031  gtk_container_set_border_width (GTK_CONTAINER (vbox11), 3);
1032 
1033  messages_scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
1034  gtk_box_pack_start (GTK_BOX (vbox11), messages_scrolledwindow, TRUE, TRUE, 0);
1035  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (messages_scrolledwindow),
1036  GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
1037 
1038  message_textview = gtk_text_view_new ();
1039  gtk_container_add (GTK_CONTAINER (messages_scrolledwindow), message_textview);
1040  gtk_text_view_set_editable (GTK_TEXT_VIEW (message_textview), FALSE);
1041  gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (message_textview), GTK_WRAP_WORD);
1042  gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (message_textview), FALSE);
1043 
1044  clear_messages_button = gtk_button_new_from_stock (GTK_STOCK_CLEAR);
1045  gtk_tooltips_set_tip (tooltips, clear_messages_button,
1046  _("Clear all messages and accumulated sum"), NULL);
1047  gtk_box_pack_start (GTK_BOX (vbox11), clear_messages_button, FALSE, FALSE, 0);
1048 
1049  Message_label = gtk_label_new (_("Messages"));
1050  gtk_notebook_set_tab_label (GTK_NOTEBOOK (sidepane_notebook),
1051  gtk_notebook_get_nth_page (GTK_NOTEBOOK (sidepane_notebook), 1),
1052  Message_label);
1053 
1054  vbox2 = gtk_vbox_new (FALSE, 4);
1055  gtk_paned_pack2 (GTK_PANED (hpaned1), vbox2, TRUE, FALSE);
1056  gtk_container_set_border_width (GTK_CONTAINER (vbox2), 4);
1057 
1058  main_view_table = gtk_table_new (3, 3, FALSE);
1059  gtk_box_pack_start (GTK_BOX (vbox2), main_view_table, TRUE, TRUE, 0);
1060 
1061  hRuler = gtk_hruler_new ();
1062  gtk_table_attach (GTK_TABLE (main_view_table), hRuler, 1, 2, 0, 1,
1063  (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1064  (GtkAttachOptions) (GTK_FILL), 0, 0);
1065  gtk_ruler_set_range (GTK_RULER (hRuler), 0, 100, 8.56051, 1000);
1066 
1067  vRuler = gtk_vruler_new ();
1068  gtk_table_attach (GTK_TABLE (main_view_table), vRuler, 0, 1, 1, 2,
1069  (GtkAttachOptions) (GTK_FILL),
1070  (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
1071  gtk_ruler_set_range (GTK_RULER (vRuler), 0, 100, 8.37341, 1000);
1072 
1073  drawingarea = gtk_drawing_area_new();
1074  gtk_table_attach (GTK_TABLE (main_view_table), drawingarea, 1, 2, 1, 2,
1075  (GtkAttachOptions) (GTK_FILL),
1076  (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
1077 
1078  hAdjustment = (GtkWidget *) gtk_adjustment_new (0.0, -1000.0, 1000.0, 1000.0, 1000.0, 500.0);
1079  vAdjustment = (GtkWidget *) gtk_adjustment_new (0.0, -1000.0, 1000.0, 1000.0, 1000.0, 500.0);
1080 
1081  hScrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (hAdjustment));
1082  gtk_table_attach (GTK_TABLE (main_view_table), hScrollbar, 1, 2, 2, 3,
1083  (GtkAttachOptions) (GTK_FILL),
1084  (GtkAttachOptions) (GTK_FILL), 0, 0);
1085 
1086  vScrollbar = gtk_vscrollbar_new (GTK_ADJUSTMENT (vAdjustment));
1087  gtk_table_attach (GTK_TABLE (main_view_table), vScrollbar, 2, 3, 1, 2,
1088  (GtkAttachOptions) (GTK_FILL),
1089  (GtkAttachOptions) (GTK_FILL), 0, 0);
1090 
1091  hbox5 = gtk_hbox_new (FALSE, 10);
1092  gtk_box_pack_start (GTK_BOX (vbox2), hbox5, FALSE, FALSE, 0);
1093 
1094  statusbar_label_left = gtk_label_new ("( 0.0, 0.0 )");
1095  gtk_box_pack_start (GTK_BOX (hbox5), statusbar_label_left, FALSE, FALSE, 0);
1096  gtk_widget_set_size_request (statusbar_label_left, 130, -1);
1097  gtk_label_set_justify ((GtkLabel *) statusbar_label_left, GTK_JUSTIFY_RIGHT);
1098 
1099  statusUnitComboBox = gtk_combo_box_new_text ();
1100  gtk_box_pack_start (GTK_BOX (hbox5), statusUnitComboBox, FALSE, FALSE, 0);
1101  gtk_combo_box_append_text (GTK_COMBO_BOX (statusUnitComboBox), _("mil"));
1102  gtk_combo_box_append_text (GTK_COMBO_BOX (statusUnitComboBox), _("mm"));
1103  gtk_combo_box_append_text (GTK_COMBO_BOX (statusUnitComboBox), _("in"));
1104 
1105  statusbar_label_right = gtk_label_new ("");
1106  gtk_box_pack_start (GTK_BOX (hbox5), statusbar_label_right, TRUE, TRUE, 0);
1107  gtk_label_set_ellipsize ((GtkLabel *)statusbar_label_right, PANGO_ELLIPSIZE_END);
1108  gtk_misc_set_alignment (GTK_MISC (statusbar_label_right), 0, 0.5);
1109 
1110 
1111 
1112  /*
1113  * Connect signals to widgets
1114  */
1115 
1116  /* --- File menu --- */
1117  g_signal_connect ((gpointer) new, "activate",
1118  G_CALLBACK (callbacks_new_activate),
1119  NULL);
1120  g_signal_connect ((gpointer) open_project, "activate",
1121  G_CALLBACK (callbacks_open_project_activate),
1122  NULL);
1123  g_signal_connect ((gpointer) open_layer, "activate",
1124  G_CALLBACK (callbacks_open_layer_activate),
1125  NULL);
1126  g_signal_connect ((gpointer) revert, "activate",
1127  G_CALLBACK (callbacks_revert_activate),
1128  NULL);
1129  g_signal_connect ((gpointer) save_layer, "activate",
1130  G_CALLBACK (callbacks_save_layer_activate),
1131  NULL);
1132  g_signal_connect ((gpointer) save_as_layer, "activate",
1133  G_CALLBACK (callbacks_generic_save_activate),
1134  (gpointer) CALLBACKS_SAVE_LAYER_AS);
1135  g_signal_connect ((gpointer) save, "activate",
1136  G_CALLBACK (callbacks_save_project_activate),
1137  NULL);
1138  g_signal_connect ((gpointer) save_as, "activate",
1139  G_CALLBACK (callbacks_generic_save_activate),
1140  (gpointer) CALLBACKS_SAVE_PROJECT_AS);
1141  g_signal_connect ((gpointer) png, "activate",
1142  G_CALLBACK (callbacks_generic_save_activate),
1143  (gpointer) CALLBACKS_SAVE_FILE_PNG);
1144 
1145  g_signal_connect ((gpointer) pdf, "activate",
1146  G_CALLBACK (callbacks_generic_save_activate),
1147  (gpointer) CALLBACKS_SAVE_FILE_PDF);
1148  g_signal_connect ((gpointer) svg, "activate",
1149  G_CALLBACK (callbacks_generic_save_activate),
1150  (gpointer) CALLBACKS_SAVE_FILE_SVG);
1151  g_signal_connect ((gpointer) postscript, "activate",
1152  G_CALLBACK (callbacks_generic_save_activate),
1153  (gpointer) CALLBACKS_SAVE_FILE_PS);
1154  g_signal_connect ((gpointer) rs274x, "activate",
1155  G_CALLBACK (callbacks_generic_save_activate),
1156  (gpointer) CALLBACKS_SAVE_FILE_RS274X);
1157  g_signal_connect ((gpointer) drill, "activate",
1158  G_CALLBACK (callbacks_generic_save_activate),
1159  (gpointer) CALLBACKS_SAVE_FILE_DRILL);
1160  g_signal_connect ((gpointer) rs274xm, "activate",
1161  G_CALLBACK (callbacks_generic_save_activate),
1162  (gpointer) CALLBACKS_SAVE_FILE_RS274XM);
1163  g_signal_connect ((gpointer) drillm, "activate",
1164  G_CALLBACK (callbacks_generic_save_activate),
1165  (gpointer) CALLBACKS_SAVE_FILE_DRILLM);
1166 
1167 #if GTK_CHECK_VERSION(2,10,0)
1168  g_signal_connect ((gpointer) print, "activate",
1169  G_CALLBACK (callbacks_print_activate),
1170  NULL);
1171 #endif
1172  g_signal_connect ((gpointer) quit, "activate",
1173  G_CALLBACK (callbacks_quit_activate),
1174  NULL);
1175 
1176  /* --- Edit menu --- */
1177  g_signal_connect ((gpointer) delete_selected, "activate",
1178  G_CALLBACK (callbacks_delete_objects_clicked),
1179  NULL);
1180  g_signal_connect ((gpointer) properties_selected, "activate",
1181  G_CALLBACK (callbacks_display_object_properties_clicked),
1182  NULL);
1183 
1184  /* --- View menu --- */
1185  g_signal_connect ((gpointer) view_fullscreen, "activate",
1186  G_CALLBACK (callbacks_fullscreen_toggled),
1187  GINT_TO_POINTER(0));
1188  g_signal_connect ((gpointer) show_toolbar, "toggled",
1189  G_CALLBACK (callbacks_show_toolbar_toggled),
1190  toolbar_hbox);
1191  g_signal_connect ((gpointer) show_sidepane, "toggled",
1192  G_CALLBACK (callbacks_show_sidepane_toggled),
1193  sidepane_vbox);
1194  g_signal_connect ((gpointer) toggle_layer_visibility_item1, "activate",
1196  GINT_TO_POINTER(0));
1197  g_signal_connect ((gpointer) toggle_layer_visibility_item2, "activate",
1199  GINT_TO_POINTER(1));
1200  g_signal_connect ((gpointer) toggle_layer_visibility_item3, "activate",
1202  GINT_TO_POINTER(2));
1203  g_signal_connect ((gpointer) toggle_layer_visibility_item4, "activate",
1205  GINT_TO_POINTER(3));
1206  g_signal_connect ((gpointer) toggle_layer_visibility_item5, "activate",
1208  GINT_TO_POINTER(4));
1209  g_signal_connect ((gpointer) toggle_layer_visibility_item6, "activate",
1211  GINT_TO_POINTER(5));
1212  g_signal_connect ((gpointer) toggle_layer_visibility_item7, "activate",
1214  GINT_TO_POINTER(6));
1215  g_signal_connect ((gpointer) toggle_layer_visibility_item8, "activate",
1217  GINT_TO_POINTER(7));
1218  g_signal_connect ((gpointer) toggle_layer_visibility_item9, "activate",
1220  GINT_TO_POINTER(8));
1221  g_signal_connect ((gpointer) toggle_layer_visibility_item10, "activate",
1223  GINT_TO_POINTER(9));
1224  g_signal_connect ((gpointer) zoom_in, "activate",
1225  G_CALLBACK (callbacks_zoom_in_activate),
1226  NULL);
1227  g_signal_connect ((gpointer) zoom_out, "activate",
1228  G_CALLBACK (callbacks_zoom_out_activate),
1229  NULL);
1230  g_signal_connect ((gpointer) fit_to_window, "activate",
1231  G_CALLBACK (callbacks_fit_to_window_activate),
1232  NULL);
1233  g_signal_connect ((gpointer) backgroundColor, "activate",
1234  G_CALLBACK (callbacks_change_background_color_clicked),
1235  NULL);
1236  g_signal_connect ((gpointer) unit_mil, "activate",
1237  G_CALLBACK (callbacks_viewmenu_units_changed),
1238  GINT_TO_POINTER(GERBV_MILS));
1239  g_signal_connect ((gpointer) unit_mm, "activate",
1240  G_CALLBACK (callbacks_viewmenu_units_changed),
1241  GINT_TO_POINTER(GERBV_MMS));
1242  g_signal_connect ((gpointer) unit_in, "activate",
1243  G_CALLBACK (callbacks_viewmenu_units_changed),
1244  GINT_TO_POINTER(GERBV_INS));
1245 
1246  /* --- Current Layer menu --- */
1247  g_signal_connect ((gpointer) layer_visibility, "activate",
1249  GINT_TO_POINTER (LAYER_SELECTED));
1250  g_signal_connect ((gpointer) layer_visibility_all_on, "activate",
1252  GINT_TO_POINTER (LAYER_ALL_ON));
1253  g_signal_connect ((gpointer) layer_visibility_all_off, "activate",
1255  GINT_TO_POINTER (LAYER_ALL_OFF));
1256  g_signal_connect ((gpointer) layer_invert, "activate", G_CALLBACK (callbacks_invert_layer_clicked), NULL);
1257  g_signal_connect ((gpointer) layer_color, "activate", G_CALLBACK (callbacks_change_layer_color_clicked), NULL);
1258  g_signal_connect ((gpointer) layer_reload, "activate", G_CALLBACK (callbacks_reload_layer_clicked), NULL);
1259  g_signal_connect ((gpointer) layer_edit, "activate", G_CALLBACK (callbacks_change_layer_edit_clicked), NULL);
1260  g_signal_connect ((gpointer) layer_format, "activate", G_CALLBACK (callbacks_change_layer_format_clicked), NULL);
1261  g_signal_connect ((gpointer) layer_remove, "activate", G_CALLBACK (callbacks_remove_layer_button_clicked), NULL);
1262  g_signal_connect ((gpointer) layer_up, "activate", G_CALLBACK (callbacks_move_layer_up_menu_activate), NULL);
1263  g_signal_connect ((gpointer) layer_down, "activate", G_CALLBACK (callbacks_move_layer_down_menu_activate), NULL);
1264 
1265  /* --- Analyze menu --- */
1266  g_signal_connect ((gpointer) analyze_active_gerbers, "activate",
1268  NULL);
1269  g_signal_connect ((gpointer) analyze_active_drill, "activate",
1271  NULL);
1272  g_signal_connect ((gpointer) analyze_benchmark, "activate",
1273  G_CALLBACK (callbacks_benchmark_clicked),
1274  NULL);
1275 
1276 
1277  /* Wait for 2.1
1278  g_signal_connect ((gpointer) control_gerber_options, "activate",
1279  G_CALLBACK (callbacks_control_gerber_options_activate),
1280  NULL);
1281  */
1282 
1283  /* --- Tools menu --- */
1284  g_signal_connect ((gpointer) pointer_tool, "activate",
1285  G_CALLBACK (callbacks_change_tool), (gpointer) 0);
1286  g_signal_connect ((gpointer) pan_tool, "activate",
1287  G_CALLBACK (callbacks_change_tool), (gpointer) 1);
1288  g_signal_connect ((gpointer) zoom_tool, "activate",
1289  G_CALLBACK (callbacks_change_tool), (gpointer) 2);
1290  g_signal_connect ((gpointer) measure_tool, "activate",
1291  G_CALLBACK (callbacks_change_tool), (gpointer) 3);
1292 
1293  /* --- Help menu --- */
1294  /*
1295  g_signal_connect ((gpointer) online_manual, "activate",
1296  G_CALLBACK (callbacks_online_manual_activate),
1297  NULL);
1298  */
1299  g_signal_connect ((gpointer) about, "activate",
1300  G_CALLBACK (callbacks_about_activate),
1301  NULL);
1302 
1303  g_signal_connect ((gpointer) bugs_menuitem, "activate",
1304  G_CALLBACK (callbacks_bugs_activate),
1305  NULL);
1306 
1307  /* End of Glade generated code */
1308  g_signal_connect ((gpointer) toolbutton_new, "clicked",
1309  G_CALLBACK (callbacks_new_activate),
1310  NULL);
1311  g_signal_connect ((gpointer) toolbutton_save, "clicked",
1312  G_CALLBACK (callbacks_save_project_activate),
1313  NULL);
1314  g_signal_connect ((gpointer) toolbutton_open, "clicked",
1315  G_CALLBACK (callbacks_open_project_activate),
1316  NULL);
1317  g_signal_connect ((gpointer) toolbutton_revert, "clicked",
1318  G_CALLBACK (callbacks_revert_activate),
1319  NULL);
1320  g_signal_connect ((gpointer) clear_messages_button, "clicked",
1321  G_CALLBACK (callbacks_clear_messages_button_clicked),
1322  NULL);
1323 #if GTK_CHECK_VERSION(2,10,0)
1324  g_signal_connect ((gpointer) toolbutton_print, "clicked",
1325  G_CALLBACK (callbacks_print_activate),
1326  NULL);
1327 #endif
1328  g_signal_connect ((gpointer) toolbutton_zoom_in, "clicked",
1329  G_CALLBACK (callbacks_zoom_in_activate),
1330  NULL);
1331  g_signal_connect ((gpointer) toolbutton_zoom_out, "clicked",
1332  G_CALLBACK (callbacks_zoom_out_activate),
1333  NULL);
1334  g_signal_connect ((gpointer) toolbutton_zoom_fit, "clicked",
1335  G_CALLBACK (callbacks_fit_to_window_activate),
1336  NULL);
1337  g_signal_connect ((gpointer) toggletoolbutton_pointer, "clicked",
1338  G_CALLBACK (callbacks_change_tool), (gpointer) 0);
1339  g_signal_connect ((gpointer) toggletoolbutton_pan, "clicked",
1340  G_CALLBACK (callbacks_change_tool), (gpointer) 1);
1341  g_signal_connect ((gpointer) toggletoolbutton_zoom, "clicked",
1342  G_CALLBACK (callbacks_change_tool), (gpointer) 2);
1343  g_signal_connect ((gpointer) toggletoolbutton_measure, "clicked",
1344  G_CALLBACK (callbacks_change_tool), (gpointer) 3);
1345 
1346  g_signal_connect ((gpointer) statusUnitComboBox, "changed",
1347  G_CALLBACK (callbacks_statusbar_unit_combo_box_changed),
1348  NULL);
1349 
1350  g_signal_connect ((gpointer) button4, "clicked",
1351  G_CALLBACK (callbacks_add_layer_button_clicked), NULL);
1352  g_signal_connect ((gpointer) button7, "clicked",
1353  G_CALLBACK (callbacks_remove_layer_button_clicked), NULL);
1354  g_signal_connect ((gpointer) button5, "clicked",
1355  G_CALLBACK (callbacks_move_layer_down_button_clicked), NULL);
1356  g_signal_connect ((gpointer) button6, "clicked",
1357  G_CALLBACK (callbacks_move_layer_up_button_clicked), NULL);
1358 
1359  g_signal_connect ((gpointer) hAdjustment, "value-changed",
1360  G_CALLBACK (callbacks_hadjustment_value_changed), NULL);
1361  g_signal_connect ((gpointer) vAdjustment, "value-changed",
1362  G_CALLBACK (callbacks_vadjustment_value_changed), NULL);
1363  g_signal_connect ((gpointer) hScrollbar, "button-press-event",
1364  G_CALLBACK (callbacks_scrollbar_button_pressed), NULL);
1365  g_signal_connect ((gpointer) hScrollbar, "button-release-event",
1366  G_CALLBACK (callbacks_scrollbar_button_released), NULL);
1367  g_signal_connect ((gpointer) vScrollbar, "button-press-event",
1368  G_CALLBACK (callbacks_scrollbar_button_pressed), NULL);
1369  g_signal_connect ((gpointer) vScrollbar, "button-release-event",
1370  G_CALLBACK (callbacks_scrollbar_button_released), NULL);
1371 
1372 
1373  if (screen.unit == GERBV_MILS)
1374  gtk_combo_box_set_active (GTK_COMBO_BOX (statusUnitComboBox), 0);
1375  else if (screen.unit == GERBV_MMS)
1376  gtk_combo_box_set_active (GTK_COMBO_BOX (statusUnitComboBox), 1);
1377  else
1378  gtk_combo_box_set_active (GTK_COMBO_BOX (statusUnitComboBox), 2);
1379 
1380  gint width, height;
1381 
1382  gtk_window_add_accel_group (GTK_WINDOW (mainWindow), accel_group);
1383 
1384  GtkListStore *list_store;
1385 
1386  list_store = gtk_list_store_new (4, G_TYPE_BOOLEAN,
1387  GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING);
1388 
1389  GtkWidget *tree;
1390 
1391  tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
1392  GtkCellRenderer *renderer;
1393  GtkTreeViewColumn *column;
1394 
1395  renderer = gtk_cell_renderer_toggle_new ();
1396  column = gtk_tree_view_column_new_with_attributes ("Visible",
1397  renderer,
1398  "active", 0,
1399  NULL);
1400  gtk_tree_view_column_set_min_width ((GtkTreeViewColumn *)column,25);
1401  gtk_signal_connect(GTK_OBJECT(renderer), "toggled",
1402  GTK_SIGNAL_FUNC(callbacks_layer_tree_visibility_button_toggled), NULL);
1403  gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1404 
1405  renderer = gtk_cell_renderer_pixbuf_new ();
1406  column = gtk_tree_view_column_new_with_attributes ("Color",
1407  renderer,
1408  "pixbuf", 1, NULL);
1409  gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1410 
1411  renderer = gtk_cell_renderer_text_new ();
1412  g_object_set (G_OBJECT (renderer), "foreground", "red", "xalign", 0.5,
1413  "family", "Times", "size-points", 12.0, NULL);
1414  column = gtk_tree_view_column_new_with_attributes ("Modified",
1415  renderer,
1416  "text", 3,
1417  NULL);
1418  gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1419  gtk_tree_view_column_set_min_width ((GtkTreeViewColumn *)column,20);
1420 
1421  renderer = gtk_cell_renderer_text_new ();
1422  column = gtk_tree_view_column_new_with_attributes ("Name",
1423  renderer,
1424  "markup", 2,
1425  NULL);
1426  gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1427 
1428  gtk_tree_view_set_headers_visible ((GtkTreeView *)tree, FALSE);
1429  gtk_signal_connect(GTK_OBJECT(tree), "key-press-event",
1430  GTK_SIGNAL_FUNC(callbacks_layer_tree_key_press), NULL);
1431  gtk_signal_connect(GTK_OBJECT(tree), "button-press-event",
1432  GTK_SIGNAL_FUNC(callbacks_layer_tree_button_press), NULL);
1433  gtk_container_add (GTK_CONTAINER (scrolledwindow1), tree);
1434 
1435  GtkTreeSelection *selection;
1436  selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
1437  gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
1438  gtk_tree_view_set_enable_search (GTK_TREE_VIEW (tree), FALSE);
1439  gtk_tree_view_set_reorderable (GTK_TREE_VIEW (tree), TRUE);
1440 
1441  g_signal_connect (G_OBJECT(list_store), "row-inserted",
1442  G_CALLBACK (callbacks_layer_tree_row_inserted), NULL);
1443  /* steal the focus to the tree to make sure none of the buttons are focused */
1444  gtk_widget_grab_focus (tree);
1445  /*
1446  * Connect all events on drawing area
1447  */
1448  gtk_signal_connect(GTK_OBJECT(drawingarea), "expose_event",
1449  GTK_SIGNAL_FUNC(callbacks_drawingarea_expose_event), NULL);
1450  gtk_signal_connect(GTK_OBJECT(drawingarea),"configure_event",
1451  GTK_SIGNAL_FUNC(callbacks_drawingarea_configure_event), NULL);
1452  gtk_signal_connect(GTK_OBJECT(drawingarea), "motion_notify_event",
1453  GTK_SIGNAL_FUNC(callbacks_drawingarea_motion_notify_event), NULL);
1454  gtk_signal_connect(GTK_OBJECT(drawingarea), "button_press_event",
1455  GTK_SIGNAL_FUNC(callbacks_drawingarea_button_press_event), NULL);
1456  gtk_signal_connect(GTK_OBJECT(drawingarea), "button_release_event",
1457  GTK_SIGNAL_FUNC(callbacks_drawingarea_button_release_event), NULL);
1458  gtk_signal_connect_after(GTK_OBJECT(mainWindow), "key_press_event",
1459  GTK_SIGNAL_FUNC(callbacks_window_key_press_event), NULL);
1460  gtk_signal_connect_after(GTK_OBJECT(mainWindow), "key_release_event",
1461  GTK_SIGNAL_FUNC(callbacks_window_key_release_event), NULL);
1462  gtk_signal_connect_after(GTK_OBJECT(mainWindow), "scroll_event",
1463  GTK_SIGNAL_FUNC(callbacks_window_scroll_event), NULL);
1464  gtk_signal_connect_after(GTK_OBJECT(mainWindow), "delete_event",
1465  GTK_SIGNAL_FUNC(callbacks_quit_activate), NULL);
1466 
1467  gtk_widget_set_events(drawingarea, GDK_EXPOSURE_MASK
1468  | GDK_LEAVE_NOTIFY_MASK
1469  | GDK_ENTER_NOTIFY_MASK
1470  | GDK_BUTTON_PRESS_MASK
1471  | GDK_BUTTON_RELEASE_MASK
1472  | GDK_KEY_PRESS_MASK
1473  | GDK_KEY_RELEASE_MASK
1474  | GDK_POINTER_MOTION_MASK
1475  | GDK_POINTER_MOTION_HINT_MASK
1476  | GDK_SCROLL_MASK
1477  );
1478 
1479  /*
1480  * Setup some GTK+ defaults.
1481  * These should really be somewhere else.
1482  */
1483  GdkColor zoom_outline_color = {0, 50000, 50000, 50000};
1484  GdkColor dist_measure_color = {0, 60000, 30000, 65000};
1485  GdkColor selection_color = {0, 65000, 65000, 65000};
1486 
1487  screen.zoom_outline_color = zoom_outline_color;
1488  screen.dist_measure_color = dist_measure_color;
1489  screen.selection_color = selection_color;
1490 
1491  screen.length_sum = 0;
1492 
1493  screen.drawing_area = drawingarea;
1494  screen.win.hAdjustment = hAdjustment;
1495  screen.win.vAdjustment = vAdjustment;
1496  screen.win.hRuler = hRuler;
1497  screen.win.vRuler = vRuler;
1498  screen.win.sidepane_notebook = sidepane_notebook;
1499  screen.win.sidepaneRenderComboBox = GTK_COMBO_BOX(render_combobox);
1500  screen.win.toolButtonPointer = toggletoolbutton_pointer;
1501  screen.win.toolButtonPan = toggletoolbutton_pan;
1502  screen.win.toolButtonZoom = toggletoolbutton_zoom;
1503  screen.win.toolButtonMeasure = toggletoolbutton_measure;
1504 
1505  /* make sure tooltips show on gtk <2.12 systems */
1506  gtk_tooltips_enable (tooltips);
1507  /*
1508  * Good defaults according to Ales. Gives aspect ratio of 1.3333...
1509  */
1510  if ((req_width != -1) && (req_height != -1)) {
1511  width = req_width;
1512  height = req_height;
1513  }
1514  else {
1515  GdkScreen *screen;
1516  int nmonitors;
1517 
1518  screen = gdk_screen_get_default();
1519  nmonitors = gdk_screen_get_n_monitors(screen);
1520 
1521  width = gdk_screen_get_width(screen) * 3/4 / nmonitors;
1522  height = gdk_screen_get_height(screen) * 3/4 / nmonitors;
1523  }
1524 
1525  gtk_window_set_default_size((GtkWindow *)mainWindow, width, height);
1526 
1527  GtkSettings* gtksettings = gtk_settings_get_default ();
1528  g_object_set (G_OBJECT(gtksettings), "gtk-can-change-accels", TRUE, NULL);
1529  interface_load_accels ();
1530  gtk_widget_show_all (mainWindow);
1531  screen.win.topLevelWindow = mainWindow;
1532  screen.win.messageTextView = message_textview;
1533  screen.win.statusMessageLeft = statusbar_label_left;
1534  screen.win.statusMessageRight = statusbar_label_right;
1535  screen.win.statusUnitComboBox = statusUnitComboBox;
1536  screen.win.layerTree = tree;
1537  screen.win.treeIsUpdating = FALSE;
1538 
1539  screen.selectionInfo.selectedNodeArray = g_array_new (FALSE,
1540  FALSE, sizeof(gerbv_selection_item_t));
1541  callbacks_change_tool (NULL, (gpointer) 0);
1542  rename_main_window("",mainWindow);
1543 
1544  set_window_icon (mainWindow);
1545  callbacks_update_layer_tree ();
1546 
1547  /* Set GTK error log handler */
1548  g_log_set_handler (NULL,
1549  G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION | G_LOG_LEVEL_MASK,
1550  callbacks_handle_log_messages, NULL);
1551 
1552  /* Output temporary stored log messages */
1553  extern GArray *log_array_tmp;
1554  struct log_struct log_item;
1555  int i;
1556 
1557  for (i = 0; i < log_array_tmp->len; i++) {
1558  log_item = g_array_index (log_array_tmp, struct log_struct, i);
1559  callbacks_handle_log_messages (log_item.domain, log_item.level,
1560  log_item.message, NULL);
1561  g_free(log_item.domain);
1562  g_free(log_item.message);
1563  }
1564  g_array_free (log_array_tmp, TRUE);
1565 
1566  /* connect this signals as late as possible to avoid triggering them before
1567  the gui is drawn */
1568  g_signal_connect ((gpointer) render_fast, "activate",
1569  G_CALLBACK (callbacks_viewmenu_rendertype_changed),
1570  GINT_TO_POINTER(GERBV_RENDER_TYPE_GDK));
1571  g_signal_connect ((gpointer) render_fast_xor, "activate",
1572  G_CALLBACK (callbacks_viewmenu_rendertype_changed),
1573  GINT_TO_POINTER(GERBV_RENDER_TYPE_GDK_XOR));
1574  g_signal_connect ((gpointer) render_normal, "activate",
1575  G_CALLBACK (callbacks_viewmenu_rendertype_changed),
1576  GINT_TO_POINTER(GERBV_RENDER_TYPE_CAIRO_NORMAL));
1577  g_signal_connect ((gpointer) render_hq, "activate",
1578  G_CALLBACK (callbacks_viewmenu_rendertype_changed),
1579  GINT_TO_POINTER(GERBV_RENDER_TYPE_CAIRO_HIGH_QUALITY));
1580  g_signal_connect ((gpointer) render_combobox, "changed",
1581  G_CALLBACK (callbacks_sidepane_render_type_combo_box_changed),
1582  NULL);
1583  gtk_main();
1584  interface_save_accels ();
1585 }
1586 
1587 /* ---------------------------------------------------- */
1588 void
1589 interface_set_render_type (int t)
1590 {
1591  if (t >= GERBV_RENDER_TYPE_MAX)
1592  return;
1593 
1594  screenRenderInfo.renderType = t;
1595 
1596  /* make sure the interface is already up before calling
1597  * gtk_combo_box_set_active()
1598  */
1599  if (!screen.win.sidepaneRenderComboBox)
1600  return;
1601 
1602  gtk_combo_box_set_active (GTK_COMBO_BOX (screen.win.sidepaneRenderComboBox), t);
1603  gtk_check_menu_item_set_active (screen.win.menu_view_render_group[t], TRUE);
1604 }
1605 
1606 /* ---------------------------------------------------- */
1615 gboolean
1616 interface_get_alert_dialog_response (gchar *primaryText, gchar *secondaryText,
1617  gboolean show_checkbox, gboolean *ask_to_show_again )
1618  /* This fcn returns TRUE if the user presses the OK button,
1619  otherwise it returns FALSE. */
1620 {
1621  /* Set show_checkbox = TRUE to show "do not show this again" checkbox. */
1622  /* Point ask_to_show_again to the variable to set to not show the checkbox. */
1623  GtkWidget *dialog1;
1624  GtkWidget *dialog_vbox1;
1625  GtkWidget *hbox1;
1626  GtkWidget *image1;
1627  GtkWidget *label1;
1628  GtkWidget *checkbox=NULL;
1629  GtkWidget *dialog_action_area1;
1630  GtkWidget *cancelbutton1;
1631  GtkWidget *okbutton1;
1632  gboolean returnVal = FALSE;
1633 
1634  dialog1 = gtk_dialog_new ();
1635  gtk_container_set_border_width (GTK_CONTAINER (dialog1), 6);
1636  gtk_window_set_resizable (GTK_WINDOW (dialog1), FALSE);
1637  gtk_window_set_type_hint (GTK_WINDOW (dialog1), GDK_WINDOW_TYPE_HINT_DIALOG);
1638  gtk_dialog_set_has_separator (GTK_DIALOG (dialog1), FALSE);
1639 
1640  dialog_vbox1 = GTK_DIALOG (dialog1)->vbox;
1641 
1642  hbox1 = gtk_hbox_new (FALSE, 12);
1643  gtk_box_pack_start (GTK_BOX (dialog_vbox1), hbox1, TRUE, TRUE, 0);
1644  gtk_container_set_border_width (GTK_CONTAINER (hbox1), 6);
1645 
1646  image1 = gtk_image_new_from_icon_name (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG);
1647  gtk_box_pack_start (GTK_BOX (hbox1), image1, TRUE, TRUE, 0);
1648  gtk_misc_set_alignment (GTK_MISC (image1), 0.5, 0);
1649 
1650  gchar *labelMessage = g_strconcat ("<span weight=\"bold\" size=\"larger\">", _(primaryText),
1651  "</span>\n<span/>\n", _(secondaryText), NULL);
1652  label1 = gtk_label_new (labelMessage);
1653  g_free (labelMessage);
1654  GtkWidget *vbox9 = gtk_vbox_new (FALSE, 0);
1655  gtk_box_pack_start (GTK_BOX (vbox9), label1, FALSE, FALSE, 0);
1656  gtk_box_pack_start (GTK_BOX (hbox1), vbox9, FALSE, FALSE, 0);
1657  gtk_label_set_use_markup (GTK_LABEL (label1), TRUE);
1658  gtk_label_set_line_wrap (GTK_LABEL (label1), TRUE);
1659 
1660  // even with no checkbox, this extra hbox gives the recommended 24 px space between the
1661  // label and the buttons
1662  GtkWidget *hbox2 = gtk_hbox_new (FALSE, 12);
1663  if (show_checkbox) {
1664  GtkWidget *label3 = gtk_label_new (" ");
1665 
1666  checkbox = gtk_check_button_new_with_label(_("Do not show this dialog again."));
1667  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(checkbox), FALSE);
1668  gtk_box_pack_start (GTK_BOX (hbox2), label3, FALSE, FALSE, 0);
1669  gtk_box_pack_start (GTK_BOX (hbox2), checkbox, FALSE, FALSE, 0);
1670  }
1671  gtk_box_pack_start (GTK_BOX (vbox9), hbox2, FALSE, FALSE, 12);
1672 
1673  dialog_action_area1 = GTK_DIALOG (dialog1)->action_area;
1674  gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
1675 
1676  cancelbutton1 = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
1677  gtk_dialog_add_action_widget (GTK_DIALOG (dialog1), cancelbutton1, GTK_RESPONSE_CANCEL);
1678  GTK_WIDGET_SET_FLAGS (cancelbutton1, GTK_CAN_DEFAULT);
1679  gtk_widget_grab_default (cancelbutton1);
1680  gtk_widget_grab_focus (cancelbutton1);
1681 
1682  okbutton1 = gtk_button_new_from_stock (GTK_STOCK_OK);
1683  gtk_dialog_add_action_widget (GTK_DIALOG (dialog1), okbutton1, GTK_RESPONSE_OK);
1684  GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT);
1685 
1686  gtk_widget_show_all (dialog1);
1687 
1688  if (gtk_dialog_run ((GtkDialog*)dialog1) == GTK_RESPONSE_OK) {
1689  /* check to see if user clicked on "do not show again" box */
1690  if ((show_checkbox == TRUE) &&
1691  (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbox)) == TRUE) &&
1692  (ask_to_show_again != NULL) ) {
1693  /* The user clicked the "do not show again box". Set corresponding
1694  * flag to FALSE. */
1695  *ask_to_show_again = FALSE;
1696  }
1697  returnVal = TRUE;
1698  }
1699  gtk_widget_destroy (dialog1);
1700 
1701  return returnVal;
1702 }
1703 
1704 
1705 
1706 /* ---------------------------------------------------- */
1712 void
1713 interface_show_alert_dialog (gchar *primaryText, gchar *secondaryText,
1714  gboolean show_checkbox, gboolean *ask_to_show_again )
1715  /* This fcn tells the user something, and only displays "OK" */
1716 {
1717  /* Set show_checkbox = TRUE to show "do not show this again" checkbox. */
1718  /* Point ask_to_show_again to the variable to set to not show the checkbox. */
1719  GtkWidget *dialog1;
1720  GtkWidget *dialog_vbox1;
1721  GtkWidget *hbox1;
1722  GtkWidget *image1;
1723  GtkWidget *label1;
1724  GtkWidget *checkbox=NULL;
1725  GtkWidget *dialog_action_area1;
1726  GtkWidget *okbutton1;
1727 
1728  dialog1 = gtk_dialog_new ();
1729  gtk_container_set_border_width (GTK_CONTAINER (dialog1), 6);
1730  gtk_window_set_resizable (GTK_WINDOW (dialog1), FALSE);
1731  gtk_window_set_type_hint (GTK_WINDOW (dialog1), GDK_WINDOW_TYPE_HINT_DIALOG);
1732  gtk_dialog_set_has_separator (GTK_DIALOG (dialog1), FALSE);
1733 
1734  dialog_vbox1 = GTK_DIALOG (dialog1)->vbox;
1735 
1736  hbox1 = gtk_hbox_new (FALSE, 12);
1737  gtk_box_pack_start (GTK_BOX (dialog_vbox1), hbox1, TRUE, TRUE, 0);
1738  gtk_container_set_border_width (GTK_CONTAINER (hbox1), 6);
1739 
1740  image1 = gtk_image_new_from_icon_name (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG);
1741  gtk_box_pack_start (GTK_BOX (hbox1), image1, TRUE, TRUE, 0);
1742  gtk_misc_set_alignment (GTK_MISC (image1), 0.5, 0);
1743 
1744  gchar *labelMessage = g_strconcat ("<span weight=\"bold\" size=\"larger\">", _(primaryText),
1745  "</span>\n<span/>\n", _(secondaryText), NULL);
1746  label1 = gtk_label_new (labelMessage);
1747  g_free (labelMessage);
1748 
1749  GtkWidget *vbox9 = gtk_vbox_new (FALSE, 0);
1750  gtk_box_pack_start (GTK_BOX (vbox9), label1, FALSE, FALSE, 0);
1751  gtk_label_set_use_markup (GTK_LABEL (label1), TRUE);
1752  gtk_label_set_line_wrap (GTK_LABEL (label1), TRUE);
1753  gtk_box_pack_start (GTK_BOX (hbox1), vbox9, FALSE, FALSE, 0);
1754 
1755  GtkWidget *hbox2 = gtk_hbox_new (FALSE, 12);
1756  if (show_checkbox) {
1757  GtkWidget *label3 = gtk_label_new (" ");
1758 
1759  checkbox = gtk_check_button_new_with_label(_("Do not show this dialog again."));
1760  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(checkbox), FALSE);
1761  gtk_box_pack_start (GTK_BOX (hbox2), label3, FALSE, FALSE, 0);
1762  gtk_box_pack_start (GTK_BOX (hbox2), checkbox, FALSE, FALSE, 0);
1763  }
1764  gtk_box_pack_start (GTK_BOX (vbox9), hbox2, FALSE, FALSE, 12);
1765 
1766  dialog_action_area1 = GTK_DIALOG (dialog1)->action_area;
1767  gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
1768 
1769  okbutton1 = gtk_button_new_from_stock (GTK_STOCK_OK);
1770  gtk_dialog_add_action_widget (GTK_DIALOG (dialog1), okbutton1, GTK_RESPONSE_OK);
1771  GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT);
1772 
1773  gtk_widget_show_all (dialog1);
1774 
1775  /* check to see if user clicked on "do not show again" box */
1776  if ((show_checkbox == TRUE) &&
1777  (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbox)) == TRUE) &&
1778  (ask_to_show_again != NULL) ) {
1779  /* The user clicked the "do not show again box". Set corresponding
1780  * flag to FALSE. */
1781  *ask_to_show_again = FALSE;
1782  }
1783 
1784  gtk_dialog_run (GTK_DIALOG(dialog1));
1785  gtk_widget_destroy (dialog1);
1786 
1787  return;
1788 }
1789 
1790 static int focused_widget_num = 0;
1791 
1792 void
1793 focus_in_event_callback (int *widget_num)
1794 {
1795  focused_widget_num = *widget_num;
1796 }
1797 
1798 void
1799 interface_show_layer_edit_dialog (gerbv_user_transformation_t *transform,
1800  gerbv_unit_t screenUnit) {
1801  GtkWidget *dialog;
1802  GtkWidget *check1,*check2,*tempWidget,*tempWidget2,*tableWidget;
1803  GtkWidget *spin1,*spin2,*spin3,*spin4,*spin5;
1804  GtkAdjustment *adj;
1805  gerbv_user_transformation_t startTransform = *transform;
1806  GtkWidget **focus_widgets[] = {&spin1, &spin2, &spin3, &spin4, &spin5, &check1, &check2, NULL};
1807  int focus_nums[G_N_ELEMENTS(focus_widgets)];
1808  int i;
1809 
1810  dialog = gtk_dialog_new_with_buttons (_("Edit layer"),
1811  GTK_WINDOW (screen.win.topLevelWindow), GTK_DIALOG_DESTROY_WITH_PARENT,
1812  GTK_STOCK_CANCEL, GTK_RESPONSE_NONE, GTK_STOCK_OK, GTK_RESPONSE_OK,
1813  GTK_STOCK_APPLY, GTK_RESPONSE_APPLY,
1814  NULL);
1815 
1816  gtk_container_set_border_width (GTK_CONTAINER (dialog), 6);
1817  gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
1818  gtk_window_set_type_hint (GTK_WINDOW (dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
1819  gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
1820 
1821  tableWidget = gtk_table_new (16,3,FALSE);
1822  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), tableWidget, FALSE, FALSE, 0);
1823 
1824  tempWidget = gtk_label_new (NULL);
1825  gtk_label_set_markup (GTK_LABEL (tempWidget), _("<span weight=\"bold\">Translation</span>"));
1826  gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1827  gtk_table_attach ((GtkTable *) tableWidget, tempWidget,0,2,0,1,GTK_EXPAND|GTK_FILL,0,0,5);
1828 
1829  tempWidget = gtk_label_new (" ");
1830  gtk_table_attach ((GtkTable *) tableWidget, tempWidget,0,1,1,2,0,0,0,0);
1831  gdouble translateX, translateY;
1832 
1833  if (screenUnit == (gerbv_unit_t) GERBV_MILS) {
1834  tempWidget = gtk_label_new (_("X (mils):"));
1835  tempWidget2 = gtk_label_new (_("Y (mils):"));
1836  translateX = transform->translateX * 1000;
1837  translateY = transform->translateY * 1000;
1838  }
1839  else if (screen.unit == (gerbv_gui_unit_t) GERBV_MMS) {
1840  tempWidget = gtk_label_new (_("X (mms):"));
1841  tempWidget2 = gtk_label_new (_("Y (mms):"));
1842  translateX = transform->translateX * 25.4;
1843  translateY = transform->translateY * 25.4;
1844  }
1845  else {
1846  tempWidget = gtk_label_new (_("X (inches):"));
1847  tempWidget2 = gtk_label_new (_("Y (inches):"));
1848  translateX = transform->translateX;
1849  translateY = transform->translateY;
1850  }
1851 
1852  gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1853  gtk_table_attach ((GtkTable *) tableWidget, tempWidget,1,2,1,2,GTK_EXPAND|GTK_FILL,0,0,0);
1854  gtk_misc_set_alignment (GTK_MISC (tempWidget2), 0.0, 0.5);
1855  gtk_table_attach ((GtkTable *) tableWidget, tempWidget2,1,2,2,3,GTK_EXPAND|GTK_FILL,0,0,0);
1856  adj = (GtkAdjustment *) gtk_adjustment_new (translateX, -1000000, 1000000, 1, 10, 0.0);
1857  spin1 = (GtkWidget *) gtk_spin_button_new (adj, 0.1, 4);
1858  gtk_table_attach ((GtkTable *) tableWidget, spin1,2,3,1,2,GTK_FILL,0,0,0);
1859  adj = (GtkAdjustment *) gtk_adjustment_new (translateY, -1000000, 1000000, 1, 10, 0.0);
1860  spin2 = (GtkWidget *) gtk_spin_button_new (adj, 0.1, 4);
1861  gtk_table_attach ((GtkTable *) tableWidget, spin2,2,3,2,3,GTK_FILL,0,0,0);
1862 
1863  gtk_table_set_row_spacing ((GtkTable *) tableWidget, 3, 8);
1864  tempWidget = gtk_label_new (NULL);
1865  gtk_label_set_markup (GTK_LABEL (tempWidget), _("<span weight=\"bold\">Scale</span>"));
1866  gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1867  gtk_table_attach ((GtkTable *) tableWidget, tempWidget,0,2,4,5,GTK_EXPAND|GTK_FILL,0,0,5);
1868 
1869  tempWidget = gtk_label_new (_("X direction:"));
1870  gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1871  gtk_table_attach ((GtkTable *) tableWidget, tempWidget,1,2,5,6,GTK_EXPAND|GTK_FILL,0,0,0);
1872  tempWidget = gtk_label_new (_("Y direction:"));
1873  gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1874  gtk_table_attach ((GtkTable *) tableWidget, tempWidget,1,2,6,7,GTK_EXPAND|GTK_FILL,0,0,0);
1875  adj = (GtkAdjustment *) gtk_adjustment_new (transform->scaleX, -1000000, 1000000, 1, 10, 0.0);
1876  spin3 = (GtkWidget *) gtk_spin_button_new (adj, 1, 3);
1877  gtk_table_attach ((GtkTable *) tableWidget, spin3,2,3,5,6,GTK_FILL,0,0,0);
1878  adj = (GtkAdjustment *) gtk_adjustment_new (transform->scaleY, -1000000, 1000000, 1, 10, 0.0);
1879  spin4 = (GtkWidget *) gtk_spin_button_new (adj, 1, 3);
1880  gtk_table_attach ((GtkTable *) tableWidget, spin4,2,3,6,7,GTK_FILL,0,0,0);
1881 
1882  gtk_table_set_row_spacing ((GtkTable *) tableWidget, 7, 8);
1883 
1884  tempWidget = gtk_label_new (NULL);
1885  gtk_label_set_markup (GTK_LABEL (tempWidget), _("<span weight=\"bold\">Rotation</span>"));
1886  gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1887  gtk_table_attach ((GtkTable *) tableWidget, tempWidget,0,2,8,9,GTK_EXPAND|GTK_FILL,0,0,5);
1888 
1889  tempWidget = gtk_label_new (_("Rotation (degrees): "));
1890  gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1891  gtk_table_attach ((GtkTable *) tableWidget, tempWidget,1,2,9,10,GTK_EXPAND|GTK_FILL,0,0,0);
1892  spin5 = gtk_combo_box_new_text();
1893  gtk_combo_box_append_text ((GtkComboBox *)spin5, _("None"));
1894  gtk_combo_box_append_text ((GtkComboBox *)spin5, _("90 deg CCW"));
1895  gtk_combo_box_append_text ((GtkComboBox *)spin5, _("180 deg CCW"));
1896  gtk_combo_box_append_text ((GtkComboBox *)spin5, _("270 deg CCW"));
1897  gdouble degreeRotation = transform->rotation/M_PI*180;
1898  if ((degreeRotation < 135)&&(degreeRotation >= 45))
1899  gtk_combo_box_set_active ((GtkComboBox *)spin5, 1);
1900  else if ((degreeRotation < 225)&&(degreeRotation >= 135))
1901  gtk_combo_box_set_active ((GtkComboBox *)spin5, 2);
1902  else if ((degreeRotation < 315)&&(degreeRotation >= 225))
1903  gtk_combo_box_set_active ((GtkComboBox *)spin5, 3);
1904  else
1905  gtk_combo_box_set_active ((GtkComboBox *)spin5, 0);
1906  /*
1907  adj = (GtkAdjustment *) gtk_adjustment_new (transform->rotation/M_PI*180, -1000000, 1000000,
1908  1, 10, 0.0);
1909  spin5 = (GtkWidget *) gtk_spin_button_new (adj, 0, 3);
1910  */
1911  gtk_table_attach ((GtkTable *) tableWidget, spin5,2,3,9,10,GTK_FILL,0,0,0);
1912 
1913 
1914  gtk_table_set_row_spacing ((GtkTable *) tableWidget, 10, 8);
1915  tempWidget = gtk_label_new (NULL);
1916  gtk_label_set_markup (GTK_LABEL (tempWidget), _("<span weight=\"bold\">Mirroring</span>"));
1917  gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1918  gtk_table_attach ((GtkTable *) tableWidget, tempWidget,0,2,11,12,GTK_EXPAND|GTK_FILL,0,0,5);
1919 
1920  tempWidget = gtk_label_new (_("About X axis:"));
1921  gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1922  gtk_table_attach ((GtkTable *) tableWidget, tempWidget,1,2,12,13,GTK_EXPAND|GTK_FILL,0,0,0);
1923  check1 = (GtkWidget *) gtk_check_button_new ();
1924  gtk_toggle_button_set_active ((GtkToggleButton *) check1, transform->mirrorAroundX);
1925  gtk_table_attach ((GtkTable *) tableWidget, check1,2,3,12,13,0,0,0,2);
1926 
1927  tempWidget = gtk_label_new (_("About Y axis:"));
1928  gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1929  gtk_table_attach ((GtkTable *) tableWidget, tempWidget,1,2,13,14,GTK_EXPAND|GTK_FILL,0,0,0);
1930  check2 = (GtkWidget *) gtk_check_button_new ();
1931  gtk_toggle_button_set_active ((GtkToggleButton *) check2, transform->mirrorAroundY);
1932  gtk_table_attach ((GtkTable *) tableWidget, check2,2,3,13,14,0,0,0,2);
1933 
1934  for (i = 0; focus_widgets[i] != NULL; i++) {
1935  /* Set stored focus */
1936  if (i == focused_widget_num) {
1937  gtk_widget_grab_focus (*focus_widgets[i]);
1938  }
1939 
1940  /* Set focus-in-event callback */
1941  focus_nums[i] = i;
1942  g_signal_connect_swapped ((gpointer)(*focus_widgets[i]), "focus-in-event",
1943  G_CALLBACK (focus_in_event_callback), (gpointer)(focus_nums + i));
1944  }
1945 
1946  gtk_table_set_row_spacing ((GtkTable *) tableWidget, 14, 8);
1947  gtk_widget_show_all (dialog);
1948  gint result = GTK_RESPONSE_APPLY;
1949 
1950  // each time the user selects "apply", update the screen and re-enter the dialog loop
1951  while (result == GTK_RESPONSE_APPLY) {
1952  result = gtk_dialog_run (GTK_DIALOG(dialog));
1953  if (result != GTK_RESPONSE_NONE) {
1954  /* extract all the parameters */
1955  if (screenUnit == (gerbv_unit_t) GERBV_MILS) {
1956  transform->translateX = gtk_spin_button_get_value ((GtkSpinButton *) spin1)/
1957  1000;
1958  transform->translateY = gtk_spin_button_get_value ((GtkSpinButton *) spin2)/
1959  1000;
1960  }
1961  else if (screen.unit == (gerbv_gui_unit_t) GERBV_MMS) {
1962  transform->translateX = gtk_spin_button_get_value ((GtkSpinButton *) spin1)/
1963  25.4;
1964  transform->translateY = gtk_spin_button_get_value ((GtkSpinButton *) spin2)/
1965  25.4;
1966  }
1967  else {
1968  transform->translateX = gtk_spin_button_get_value ((GtkSpinButton *) spin1);
1969  transform->translateY = gtk_spin_button_get_value ((GtkSpinButton *) spin2);
1970  }
1971  transform->scaleX = gtk_spin_button_get_value ((GtkSpinButton *)spin3);
1972  transform->scaleY = gtk_spin_button_get_value ((GtkSpinButton *)spin4);
1973  gint rotationIndex = gtk_combo_box_get_active ((GtkComboBox *)spin5);
1974  if (rotationIndex == 0)
1975  transform->rotation = 0;
1976  else if (rotationIndex == 1)
1977  transform->rotation = 90.0/180*M_PI;
1978  else if (rotationIndex == 2)
1979  transform->rotation = 180.0/180*M_PI;
1980  else if (rotationIndex == 3)
1981  transform->rotation = 270.0/180*M_PI;
1982  transform->mirrorAroundX = gtk_toggle_button_get_active ((GtkToggleButton *) check1);
1983  transform->mirrorAroundY = gtk_toggle_button_get_active ((GtkToggleButton *) check2);
1984 
1985  render_refresh_rendered_image_on_screen ();
1986  callbacks_update_layer_tree ();
1987  }
1988  }
1989  if (result == GTK_RESPONSE_NONE) {
1990  // revert back to the start values if the user cancelled
1991  *transform = startTransform;
1992  }
1993 #if 0
1994  /* Store focus */
1995  for (i = 0; focus_widgets[i] != NULL; i++) {
1996  g_object_get (*focus_widgets[i], "has-focus", &has_focus, NULL);
1997  if (has_focus) {
1998  focus_widget_num = i;
1999  break;
2000  }
2001  }
2002 #endif
2003 
2004  gtk_widget_destroy (dialog);
2005 
2006  return;
2007 }
2008