31 #if !defined(WIN32) && !defined(QUARTZ)
32 # include <gdk/gdkx.h>
64 # include <cairo-win32.h>
66 # include <cairo-quartz.h>
68 # include <cairo-xlib.h>
72 #define dprintf if(DEBUG) printf
78 #define GERBV_PROJECT_FILE_NAME N_("Gerbv Project")
79 #define GERBV_PROJECT_FILE_EXT ".gvp"
80 #define GERBV_PROJECT_FILE_PAT "*.gvp"
85 extern gerbv_screen_t
screen;
93 char *aperture_names[] = {
"NONE",
110 static void callbacks_units_changed (gerbv_gui_unit_t unit);
111 static void callbacks_update_statusbar_coordinates (gint x, gint y);
112 static void callbacks_update_ruler_scales (
void);
113 static void callbacks_render_type_changed (
void);
114 static void show_no_layers_warning (
void);
115 static double screen_units(
double);
116 static double line_length(
double,
double,
double,
double);
117 static double arc_length(
double,
double);
118 static void aperture_report(gerbv_aperture_t *[],
int);
121 gchar *utf8_strncpy(gchar *dst,
const gchar *src, gsize byte_len)
124 glong char_len = g_utf8_strlen(src, byte_len - 1);
125 return g_utf8_strncpy(dst, src, char_len);
128 void utf8_snprintf(gchar *dst, gsize byte_len,
const gchar *fmt, ...)
133 gchar *str = g_strdup_vprintf(fmt, ap);
134 utf8_strncpy(dst, str, byte_len);
140 static void show_no_layers_warning (
void) {
141 gchar *str = g_new(gchar, MAX_DISTLEN);
142 utf8_strncpy(str, _(
"No layers are currently loaded. A layer must be loaded first."), MAX_DISTLEN - 7);
143 utf8_snprintf(
screen.statusbar.diststr, MAX_DISTLEN,
"<b>%s</b>", str);
160 _(
"Do you want to close any open layers and start a new project?"),
161 _(
"Starting a new project will cause all currently open layers to be closed. Any unsaved changes will be lost."),
168 callbacks_update_layer_tree ();
169 render_clear_selection_buffer ();
176 render_refresh_rendered_image_on_screen();
190 gchar *filename=NULL;
191 GtkFileFilter * filter;
195 _(
"Do you want to close any open layers and load an existing project?"),
196 _(
"Loading a project will cause all currently open layers to be closed. Any unsaved changes will be lost."),
203 gtk_file_chooser_dialog_new (_(
"Open project file..."),
205 GTK_FILE_CHOOSER_ACTION_OPEN,
206 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
207 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
209 gtk_file_chooser_set_current_folder ((GtkFileChooser *)
screen.win.gerber,
212 filter = gtk_file_filter_new();
213 gtk_file_filter_set_name(filter, _(GERBV_PROJECT_FILE_NAME));
214 gtk_file_filter_add_pattern(filter, GERBV_PROJECT_FILE_PAT);
215 gtk_file_chooser_add_filter ((GtkFileChooser *)
screen.win.gerber,
218 filter = gtk_file_filter_new();
219 gtk_file_filter_set_name(filter, _(
"All"));
220 gtk_file_filter_add_pattern(filter,
"*");
221 gtk_file_chooser_add_filter ((GtkFileChooser *)
screen.win.gerber,
224 gtk_widget_show (
screen.win.gerber);
225 if (gtk_dialog_run ((GtkDialog*)
screen.win.gerber) == GTK_RESPONSE_ACCEPT) {
227 gtk_file_chooser_get_filename(GTK_FILE_CHOOSER (
screen.win.gerber));
232 gtk_widget_destroy (
screen.win.gerber);
236 main_open_project_from_filename (
mainProject, filename);
239 render_refresh_rendered_image_on_screen();
240 callbacks_update_layer_tree();
256 GSList *filenames=NULL;
257 GSList *filename=NULL;
260 gtk_file_chooser_dialog_new (_(
"Open Gerber, drill, or pick & place file(s)..."),
262 GTK_FILE_CHOOSER_ACTION_OPEN,
263 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
264 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
267 gtk_file_chooser_set_select_multiple((GtkFileChooser *)
screen.win.gerber, TRUE);
268 gtk_file_chooser_set_current_folder ((GtkFileChooser *)
screen.win.gerber,
270 gtk_widget_show (
screen.win.gerber);
271 if (gtk_dialog_run ((GtkDialog*)
screen.win.gerber) == GTK_RESPONSE_ACCEPT) {
273 gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER (
screen.win.gerber));
278 gtk_widget_destroy (
screen.win.gerber);
281 for (filename=filenames; filename; filename=filename->next) {
284 g_slist_free(filenames);
287 render_refresh_rendered_image_on_screen();
288 callbacks_update_layer_tree();
295 callbacks_revert_activate (GtkMenuItem *menuitem,
299 render_clear_selection_buffer();
300 callbacks_update_selected_object_message(FALSE);
301 render_refresh_rendered_image_on_screen();
302 callbacks_update_layer_tree();
307 callbacks_save_project_activate (GtkMenuItem *menuitem,
313 callbacks_generic_save_activate (menuitem, (gpointer) CALLBACKS_SAVE_PROJECT_AS);
314 callbacks_update_layer_tree();
320 callbacks_save_layer_activate (GtkMenuItem *menuitem,
334 callbacks_update_layer_tree();
338 callbacks_update_layer_tree();
341 struct l_image_info {
352 gint i, filecount, img;
354 struct l_image_info {
359 images=(
struct l_image_info *)g_new0(
struct l_image_info,1);
362 case CALLBACKS_SAVE_FILE_DRILLM:
365 case CALLBACKS_SAVE_FILE_RS274XM:
369 GERB_MESSAGE(_(
"Unknown Layer type for merge"));
372 dprintf(_(
"Looking for matching files\n"));
380 images = (
struct l_image_info *)g_renew(
struct l_image_info, images, img+1);
384 GERB_MESSAGE (_(
"Not Enough Files of same type to merge"));
387 dprintf(_(
"Now merging files\n"));
388 for (i = 0; i < img; ++i) {
391 thisTransform=images[i].transform;
392 if (NULL == thisTransform)
393 thisTransform = &identityTransform;
406 callbacks_generic_save_activate (GtkMenuItem *menuitem,
409 gchar *filename = NULL;
410 gchar *windowTitle = NULL;
411 gint processType = GPOINTER_TO_INT (user_data);
412 GtkFileFilter *filter;
413 GtkSpinButton *spin_but;
415 GtkTooltips *tooltips;
423 _(
"Please select a layer and try again."),
430 gtk_file_chooser_dialog_new (
"", NULL,
431 GTK_FILE_CHOOSER_ACTION_SAVE,
433 GtkFileChooser *file_chooser_p =
434 GTK_FILE_CHOOSER(
screen.win.gerber);
435 gtk_file_chooser_set_do_overwrite_confirmation (file_chooser_p, TRUE);
437 hbox = gtk_hbox_new (0, 0);
438 spin_but = GTK_SPIN_BUTTON(gtk_spin_button_new_with_range (0, 0, 1));
439 label = gtk_label_new (
"");
440 tooltips = gtk_tooltips_new ();
441 gtk_box_pack_end (GTK_BOX(hbox), GTK_WIDGET(spin_but), 0, 0, 1);
442 gtk_box_pack_end (GTK_BOX(hbox), label, 0, 0, 5);
443 gtk_box_pack_end (GTK_BOX(GTK_DIALOG(
screen.win.gerber)->vbox),
446 if (processType == CALLBACKS_SAVE_PROJECT_AS)
447 windowTitle = g_strdup (_(
"Save project as..."));
448 else if (processType == CALLBACKS_SAVE_FILE_PS)
449 windowTitle = g_strdup (_(
"Export PS file as..."));
450 else if (processType == CALLBACKS_SAVE_FILE_PDF)
451 windowTitle = g_strdup (_(
"Export PDF file as..."));
452 else if (processType == CALLBACKS_SAVE_FILE_SVG)
453 windowTitle = g_strdup (_(
"Export SVG file as..."));
454 else if (processType == CALLBACKS_SAVE_FILE_PNG) {
455 windowTitle = g_strdup (_(
"Export PNG file as..."));
456 gtk_label_set_text (GTK_LABEL(label), _(
"DPI:"));
457 gtk_spin_button_set_range (spin_but, 0, 6000);
458 gtk_spin_button_set_increments (spin_but, 10, 100);
459 gtk_tooltips_set_tip (tooltips, GTK_WIDGET(label),
460 _(
"DPI value, autoscaling if 0"), NULL);
461 gtk_tooltips_set_tip (tooltips, GTK_WIDGET(spin_but),
462 _(
"DPI value, autoscaling if 0"), NULL);
463 gtk_spin_button_set_value (spin_but, dpi);
464 gtk_widget_show_all (hbox);
465 }
else if (processType == CALLBACKS_SAVE_FILE_RS274X)
466 windowTitle = g_strdup (_(
"Export RS-274X file as..."));
467 else if (processType == CALLBACKS_SAVE_FILE_DRILL)
468 windowTitle = g_strdup (_(
"Export Excellon drill file as..."));
469 else if (processType == CALLBACKS_SAVE_FILE_RS274XM)
470 windowTitle = g_strdup (_(
"Export RS-274Xm file as..."));
471 else if (processType == CALLBACKS_SAVE_FILE_DRILLM)
472 windowTitle = g_strdup (_(
"Export Excellon drillm file as..."));
473 else if (processType == CALLBACKS_SAVE_LAYER_AS)
474 windowTitle = g_strdup (_(
"Save layer as..."));
476 gtk_dialog_add_buttons (GTK_DIALOG(
screen.win.gerber),
477 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
478 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
481 gtk_window_set_title (GTK_WINDOW(
screen.win.gerber), windowTitle);
482 g_free (windowTitle);
486 if (processType != CALLBACKS_SAVE_PROJECT_AS) {
490 gtk_file_chooser_set_current_folder (file_chooser_p, dirName);
495 if (processType == CALLBACKS_SAVE_PROJECT_AS) {
496 filter = gtk_file_filter_new ();
497 gtk_file_filter_set_name (filter, _(GERBV_PROJECT_FILE_NAME));
498 gtk_file_filter_add_pattern (filter, GERBV_PROJECT_FILE_PAT);
499 gtk_file_chooser_add_filter (file_chooser_p, filter);
501 filter = gtk_file_filter_new ();
502 gtk_file_filter_set_name (filter, _(
"All"));
503 gtk_file_filter_add_pattern (filter,
"*");
504 gtk_file_chooser_add_filter (file_chooser_p, filter);
506 gtk_file_chooser_set_current_name (file_chooser_p,
507 "untitled" GERBV_PROJECT_FILE_EXT);
510 gtk_widget_show (
screen.win.gerber);
511 if (gtk_dialog_run (GTK_DIALOG(
screen.win.gerber)) == GTK_RESPONSE_ACCEPT) {
512 filename = gtk_file_chooser_get_filename (file_chooser_p);
513 spin_but_val = gtk_spin_button_get_value_as_int (spin_but);
515 gtk_widget_destroy (
screen.win.gerber);
518 if (processType == CALLBACKS_SAVE_PROJECT_AS) {
519 main_save_as_project_from_filename (
mainProject, filename);
520 rename_main_window(filename, NULL);
522 else if (processType == CALLBACKS_SAVE_FILE_PS)
524 else if (processType == CALLBACKS_SAVE_FILE_PDF)
526 else if (processType == CALLBACKS_SAVE_FILE_SVG)
528 else if (processType == CALLBACKS_SAVE_FILE_PNG) {
541 bb.
left - (w*GERBV_DEFAULT_BORDER_COEFF)/2.0,
542 bb.
top - (h*GERBV_DEFAULT_BORDER_COEFF)/2.0,
544 w*dpi*(1 + GERBV_DEFAULT_BORDER_COEFF),
545 h*dpi*(1 + GERBV_DEFAULT_BORDER_COEFF),
548 &renderInfo, filename);
550 }
else if (processType == CALLBACKS_SAVE_LAYER_AS) {
553 gerbv_save_layer_from_index (
mainProject, index, filename);
560 else if (processType == CALLBACKS_SAVE_FILE_RS274X) {
566 else if (processType == CALLBACKS_SAVE_FILE_DRILL) {
572 else if (processType == CALLBACKS_SAVE_FILE_RS274XM) {
578 GERB_MESSAGE (_(
"Merged visible gerber layers and placed in '%s'"),filename);
581 else if (processType == CALLBACKS_SAVE_FILE_DRILLM) {
587 GERB_MESSAGE (_(
"Merged visible drill layers and placed in '%s'"),filename);
592 callbacks_update_layer_tree ();
597 #if GTK_CHECK_VERSION(2,10,0)
600 callbacks_begin_print (GtkPrintOperation *operation, GtkPrintContext *context,
601 gpointer user_data) {
602 gtk_print_operation_set_n_pages (operation, 1);
608 callbacks_print_render_page (GtkPrintOperation *operation,
609 GtkPrintContext *context,
613 GtkPrintSettings *pSettings = gtk_print_operation_get_print_settings (operation);
616 (gint) gtk_print_context_get_width (context),
617 (gint) gtk_print_context_get_height (context)};
622 gdouble xres = gtk_print_context_get_dpi_x (context);
623 gdouble yres = gtk_print_context_get_dpi_y (context);
624 gdouble scalePercentage = gtk_print_settings_get_scale (pSettings);
628 gerbv_render_translate_to_fit_display (
mainProject, &renderInfo);
629 cr = gtk_print_context_get_cairo_context (context);
630 gerbv_render_all_layers_to_cairo_target_for_vector_output (
mainProject, cr, &renderInfo);
635 callbacks_print_activate (GtkMenuItem *menuitem, gpointer user_data)
637 GtkPrintOperation *print;
640 print = gtk_print_operation_new ();
642 g_signal_connect (print,
"begin_print", G_CALLBACK (callbacks_begin_print), NULL);
643 g_signal_connect (print,
"draw_page", G_CALLBACK (callbacks_print_render_page), NULL);
647 (void) gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
648 (GtkWindow *)
screen.win.topLevelWindow , NULL);
650 g_object_unref (print);
656 callbacks_fullscreen_toggled (GtkMenuItem *menuitem, gpointer user_data)
659 GdkWindowState state = gdk_window_get_state (gtk_widget_get_window(
screen.win.topLevelWindow));
660 if(state & GDK_WINDOW_STATE_FULLSCREEN)
661 gtk_window_unfullscreen (GTK_WINDOW(
screen.win.topLevelWindow));
663 gtk_window_fullscreen (GTK_WINDOW(
screen.win.topLevelWindow));
668 callbacks_show_toolbar_toggled (GtkMenuItem *menuitem, gpointer user_data)
670 gtk_widget_set_visible (user_data, GTK_CHECK_MENU_ITEM(menuitem)->active);
675 callbacks_show_sidepane_toggled (GtkMenuItem *menuitem, gpointer user_data)
677 gtk_widget_set_visible (user_data, GTK_CHECK_MENU_ITEM(menuitem)->active);
687 int i = GPOINTER_TO_INT(user_data);
694 if (0 <= i && i <= mainProject->last_loaded) {
714 render_clear_selection_buffer ();
715 callbacks_update_layer_tree ();
718 render_refresh_rendered_image_on_screen ();
720 render_recreate_composite_surface (
screen.drawing_area);
721 callbacks_force_expose_event_for_screen ();
727 callbacks_zoom_in_activate (GtkMenuItem *menuitem,
730 render_zoom_display (ZOOM_IN, 0, 0, 0);
735 callbacks_zoom_out_activate (GtkMenuItem *menuitem,
738 render_zoom_display (ZOOM_OUT, 0, 0, 0);
743 callbacks_fit_to_window_activate (GtkMenuItem *menuitem,
747 render_refresh_rendered_image_on_screen();
778 gerbv_aperture_list_t *aperture_list;
785 GString *general_report_str = g_string_new(NULL);
786 if (stats_report->layer_count == 0) {
787 g_string_printf(general_report_str,
788 _(
"No Gerber layers visible!"));
790 if (stats_report->error_list->error_text == NULL) {
791 g_string_printf(general_report_str,
792 ngettext(
"No errors found in %d visible "
794 "No errors found in %d visible "
796 stats_report->layer_count),
797 stats_report->layer_count);
799 g_string_printf(general_report_str,
800 ngettext(
"Found errors in %d visible "
802 "Found errors in %d visible "
804 stats_report->layer_count),
805 stats_report->layer_count);
809 GtkWidget *general_label = gtk_label_new(general_report_str->str);
810 g_string_free(general_report_str, TRUE);
811 gtk_misc_set_alignment(GTK_MISC(general_label), 0, 0);
812 gtk_misc_set_padding(GTK_MISC(general_label), 7, 7);
813 gtk_label_set_selectable(GTK_LABEL(general_label), TRUE);
815 struct table *general_table;
817 if (stats_report->layer_count > 0 &&
818 stats_report->error_list->error_text != NULL) {
819 general_table = table_new_with_columns(3,
820 _(
"Layer"), G_TYPE_UINT, _(
"File"), G_TYPE_STRING,
821 _(
"Error"), G_TYPE_STRING);
823 general_table = table_new_with_columns(2,
824 _(
"Layer"), G_TYPE_UINT, _(
"File"), G_TYPE_STRING);
826 table_set_column_align(general_table, 0, 1.0);
831 if (files[i] && files[i]->isVisible &&
834 table_add_row(general_table, i + 1, files[i]->name,
"");
837 if (stats_report->layer_count > 0 &&
838 stats_report->error_list->error_text != NULL) {
839 for (err_list = stats_report->error_list;
841 err_list = err_list->next) {
842 if (i + 1 == err_list->layer) {
843 table_add_row(general_table,
847 err_list->error_text);
855 GtkWidget *G_report_window = gtk_scrolled_window_new(NULL, NULL);
856 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(G_report_window),
857 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
859 struct table *G_table =
860 table_new_with_columns(3, _(
"Code"), G_TYPE_STRING,
861 _(
"Count"), G_TYPE_UINT, _(
"Note"), G_TYPE_STRING);
862 table_set_column_align(G_table, 0, 1.0);
863 table_set_column_align(G_table, 1, 1.0);
864 gtk_tree_view_set_headers_clickable(
865 GTK_TREE_VIEW(G_table->widget), TRUE);
867 table_add_row(G_table,
"G0", stats_report->G0,
869 table_add_row(G_table,
"G1", stats_report->G1,
870 _(
"1X linear interpolation"));
871 table_add_row(G_table,
"G2", stats_report->G2,
872 _(
"CW interpolation"));
873 table_add_row(G_table,
"G3", stats_report->G3,
874 _(
"CCW interpolation"));
875 table_add_row(G_table,
"G4", stats_report->G4,
876 _(
"Comment/ignore block"));
877 table_add_row(G_table,
"G10", stats_report->G10,
878 _(
"10X linear interpolation"));
879 table_add_row(G_table,
"G11", stats_report->G11,
880 _(
"0.1X linear interpolation"));
881 table_add_row(G_table,
"G12", stats_report->G12,
882 _(
"0.01X linear interpolation"));
883 table_add_row(G_table,
"G36", stats_report->G36,
885 table_add_row(G_table,
"G37", stats_report->G37,
887 table_add_row(G_table,
"G54", stats_report->G54,
889 table_add_row(G_table,
"G55", stats_report->G55,
891 table_add_row(G_table,
"G70", stats_report->G70,
892 _(
"Units = inches"));
893 table_add_row(G_table,
"G71", stats_report->G71,
895 table_add_row(G_table,
"G74", stats_report->G74,
896 _(
"Disable 360 circ. interpolation"));
897 table_add_row(G_table,
"G75", stats_report->G75,
898 _(
"Enable 360 circ. interpolation"));
899 table_add_row(G_table,
"G90", stats_report->G90,
900 _(
"Absolute units"));
901 table_add_row(G_table,
"G91", stats_report->G91,
902 _(
"Incremental units"));
903 table_add_row(G_table,
"", stats_report->G_unknown,
904 _(
"Unknown G codes"));
906 table_set_sortable(G_table);
907 gtk_container_add(GTK_CONTAINER(G_report_window), G_table->widget);
910 GtkWidget *D_report_window = gtk_scrolled_window_new(NULL, NULL);
911 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(D_report_window),
912 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
914 struct table *D_table =
915 table_new_with_columns(3, _(
"Code"), G_TYPE_STRING,
916 _(
"Count"), G_TYPE_UINT, _(
"Note"), G_TYPE_STRING);
917 table_set_column_align(D_table, 0, 1.0);
918 table_set_column_align(D_table, 1, 1.0);
919 gtk_tree_view_set_headers_clickable(
920 GTK_TREE_VIEW(D_table->widget), TRUE);
921 table_add_row(D_table,
"D1", stats_report->D1,
923 table_add_row(D_table,
"D2", stats_report->D2,
925 table_add_row(D_table,
"D3", stats_report->D3,
926 _(
"Flash aperture"));
927 table_add_row(D_table,
"", stats_report->D_unknown,
928 _(
"Undefined D codes"));
929 table_add_row(D_table,
"", stats_report->D_error,
932 table_set_sortable(D_table);
933 gtk_container_add(GTK_CONTAINER(D_report_window), D_table->widget);
936 GtkWidget *M_report_window = gtk_scrolled_window_new(NULL, NULL);
937 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(M_report_window),
938 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
940 struct table *M_table =
941 table_new_with_columns(3, _(
"Code"), G_TYPE_STRING,
942 _(
"Count"), G_TYPE_UINT, _(
"Note"), G_TYPE_STRING);
943 table_set_column_align(M_table, 0, 1.0);
944 table_set_column_align(M_table, 1, 1.0);
945 gtk_tree_view_set_headers_clickable(
946 GTK_TREE_VIEW(M_table->widget), TRUE);
947 table_add_row(M_table,
"M0", stats_report->M0,
949 table_add_row(M_table,
"M1", stats_report->M1,
951 table_add_row(M_table,
"M2", stats_report->M2,
953 table_add_row(M_table,
"", stats_report->M_unknown,
954 _(
"Unknown M codes"));
956 table_set_sortable(M_table);
957 gtk_container_add(GTK_CONTAINER(M_report_window), M_table->widget);
960 GtkWidget *misc_report_window = gtk_scrolled_window_new(NULL, NULL);
961 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(misc_report_window),
962 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
964 struct table *misc_table =
965 table_new_with_columns(2, _(
"Code"), G_TYPE_STRING,
966 _(
"Count"), G_TYPE_UINT);
967 table_set_column_align(misc_table, 1, 1.0);
968 gtk_tree_view_set_headers_clickable(
969 GTK_TREE_VIEW(misc_table->widget), TRUE);
970 table_add_row(misc_table,
"X", stats_report->X);
971 table_add_row(misc_table,
"Y", stats_report->Y);
972 table_add_row(misc_table,
"I", stats_report->I);
973 table_add_row(misc_table,
"J", stats_report->J);
974 table_add_row(misc_table,
"*", stats_report->star);
975 table_add_row(misc_table, _(
"Unknown"), stats_report->unknown);
977 table_set_sortable(misc_table);
978 gtk_container_add(GTK_CONTAINER(misc_report_window),
982 GtkWidget *aperture_def_report_window =
983 gtk_scrolled_window_new(NULL, NULL);
984 gtk_scrolled_window_set_policy(
985 GTK_SCROLLED_WINDOW(aperture_def_report_window),
986 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
988 if (stats_report->aperture_list->number == -1) {
989 GtkWidget *aperture_def_label = gtk_label_new(
990 _(
"No aperture definitions found in active Gerber file(s)!"));
991 gtk_misc_set_alignment(GTK_MISC(aperture_def_label), 0, 0);
992 gtk_misc_set_padding(GTK_MISC(aperture_def_label), 7, 7);
993 gtk_label_set_selectable(GTK_LABEL(aperture_def_label), TRUE);
994 gtk_scrolled_window_add_with_viewport(
995 GTK_SCROLLED_WINDOW(aperture_def_report_window),
998 struct table *aperture_def_table = table_new_with_columns(6,
999 _(
"Layer"), G_TYPE_UINT,
1000 _(
"D code"), G_TYPE_STRING,
1001 _(
"Aperture"), G_TYPE_STRING,
1002 _(
"Param[0]"), G_TYPE_DOUBLE,
1003 _(
"Param[1]"), G_TYPE_DOUBLE,
1004 _(
"Param[2]"), G_TYPE_DOUBLE);
1005 table_set_column_align(aperture_def_table, 0, 1.0);
1006 table_set_column_align(aperture_def_table, 1, 1.0);
1007 gtk_tree_view_set_headers_clickable(
1008 GTK_TREE_VIEW(aperture_def_table->widget), TRUE);
1009 gtk_tree_view_set_search_column(
1010 GTK_TREE_VIEW(aperture_def_table->widget), 1);
1012 GString *gstr = g_string_new(NULL);
1013 for (aperture_list = stats_report->aperture_list;
1014 aperture_list != NULL;
1015 aperture_list = aperture_list->next) {
1016 g_string_printf(gstr,
"D%d", aperture_list->number);
1017 table_add_row(aperture_def_table,
1018 aperture_list->layer,
1020 aperture_names[aperture_list->type],
1021 aperture_list->parameter[0],
1022 aperture_list->parameter[1],
1023 aperture_list->parameter[2]);
1025 g_string_free(gstr, TRUE);
1026 table_set_sortable(aperture_def_table);
1027 gtk_container_add(GTK_CONTAINER(aperture_def_report_window),
1028 aperture_def_table->widget);
1032 GtkWidget *aperture_usage_report_window =
1033 gtk_scrolled_window_new(NULL, NULL);
1034 gtk_scrolled_window_set_policy(
1035 GTK_SCROLLED_WINDOW(aperture_usage_report_window),
1036 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1038 unsigned int aperture_count = 0;
1040 if (stats_report->D_code_list->number == -1) {
1041 GtkWidget *aperture_usage_label = gtk_label_new(
1042 _(
"No apertures used in Gerber file(s)!"));
1043 gtk_misc_set_alignment(GTK_MISC(aperture_usage_label), 0, 0);
1044 gtk_misc_set_padding(GTK_MISC(aperture_usage_label), 7, 7);
1045 gtk_label_set_selectable(GTK_LABEL(aperture_usage_label), TRUE);
1046 gtk_scrolled_window_add_with_viewport(
1047 GTK_SCROLLED_WINDOW(aperture_usage_report_window),
1048 aperture_usage_label);
1050 struct table *aperture_usage_table = table_new_with_columns(2,
1051 _(
"Code"), G_TYPE_STRING,
1052 _(
"Count"), G_TYPE_UINT);
1053 table_set_column_align(aperture_usage_table, 0, 1.0);
1054 table_set_column_align(aperture_usage_table, 1, 1.0);
1055 gtk_tree_view_set_headers_clickable(
1056 GTK_TREE_VIEW(aperture_usage_table->widget), TRUE);
1058 GString *gstr = g_string_new(NULL);
1059 for (aperture_list = stats_report->D_code_list;
1060 aperture_list != NULL;
1061 aperture_list = aperture_list->next) {
1062 g_string_printf(gstr,
"D%d", aperture_list->number);
1063 table_add_row(aperture_usage_table,
1065 aperture_list->count);
1066 aperture_count += aperture_list->count;
1068 g_string_free(gstr, TRUE);
1069 table_add_row(aperture_usage_table, _(
"Total"), aperture_count);
1070 table_set_sortable(aperture_usage_table);
1071 gtk_container_add( GTK_CONTAINER(aperture_usage_report_window),
1072 aperture_usage_table->widget);
1076 GtkWidget *analyze_active_gerbers;
1077 analyze_active_gerbers = gtk_dialog_new_with_buttons(
1078 _(
"Gerber codes report on visible layers"),
1079 NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
1080 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
1081 gtk_container_set_border_width(GTK_CONTAINER (analyze_active_gerbers), 5);
1083 gtk_dialog_set_default_response (GTK_DIALOG(analyze_active_gerbers),
1084 GTK_RESPONSE_ACCEPT);
1085 g_signal_connect (G_OBJECT(analyze_active_gerbers),
1087 G_CALLBACK (gtk_widget_destroy),
1088 GTK_WIDGET(analyze_active_gerbers));
1091 GtkWidget *general_report_window =
1092 gtk_scrolled_window_new(NULL, NULL);
1093 gtk_scrolled_window_set_policy(
1094 GTK_SCROLLED_WINDOW(general_report_window),
1095 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1097 GtkWidget *vbox = gtk_vbox_new(0, 0);
1098 gtk_box_pack_start(GTK_BOX(vbox), general_label, 0, 0, 0);
1099 gtk_box_pack_start(GTK_BOX(vbox), general_table->widget, 0, 0, 0);
1100 gtk_scrolled_window_add_with_viewport(
1101 GTK_SCROLLED_WINDOW(general_report_window), vbox);
1104 GtkWidget *notebook = gtk_notebook_new();
1106 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1107 GTK_WIDGET(general_report_window),
1108 gtk_label_new(_(
"General")));
1110 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1111 GTK_WIDGET(G_report_window),
1112 gtk_label_new(_(
"G codes")));
1114 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1115 GTK_WIDGET(D_report_window),
1116 gtk_label_new(_(
"D codes")));
1118 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1119 GTK_WIDGET(M_report_window),
1120 gtk_label_new(_(
"M codes")));
1122 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1123 GTK_WIDGET(misc_report_window),
1124 gtk_label_new(_(
"Misc. codes")));
1126 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1127 GTK_WIDGET(aperture_def_report_window),
1128 gtk_label_new(_(
"Aperture definitions")));
1130 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1131 GTK_WIDGET(aperture_usage_report_window),
1132 gtk_label_new(_(
"Aperture usage")));
1136 GTK_CONTAINER(GTK_DIALOG(analyze_active_gerbers)->vbox),
1137 GTK_WIDGET(notebook));
1138 gtk_widget_set_size_request(analyze_active_gerbers, 640, 300);
1139 gtk_widget_show_all(analyze_active_gerbers);
1160 GString *general_report_str = g_string_new(NULL);
1161 if (stats_report->layer_count == 0) {
1162 g_string_printf(general_report_str,
1163 _(
"No drill layers visible!"));
1165 if (stats_report->error_list->error_text == NULL) {
1166 g_string_printf(general_report_str,
1167 ngettext(
"No errors found in %d visible "
1169 "No errors found in %d visible "
1171 stats_report->layer_count),
1172 stats_report->layer_count);
1174 g_string_printf(general_report_str,
1175 ngettext(
"Found errors found in %d visible "
1177 "Found errors found in %d visible "
1179 stats_report->layer_count),
1180 stats_report->layer_count);
1184 GtkWidget *general_label = gtk_label_new(general_report_str->str);
1185 g_string_free(general_report_str, TRUE);
1186 gtk_misc_set_alignment(GTK_MISC(general_label), 0, 0);
1187 gtk_misc_set_padding(GTK_MISC(general_label), 7, 7);
1188 gtk_label_set_selectable(GTK_LABEL(general_label), TRUE);
1190 struct table *general_table;
1192 if (stats_report->layer_count > 0 &&
1193 stats_report->error_list->error_text != NULL) {
1194 general_table = table_new_with_columns(3,
1195 _(
"Layer"), G_TYPE_UINT, _(
"File"), G_TYPE_STRING,
1196 _(
"Error"), G_TYPE_STRING);
1198 general_table = table_new_with_columns(2,
1199 _(
"Layer"), G_TYPE_UINT, _(
"File"), G_TYPE_STRING);
1201 table_set_column_align(general_table, 0, 1.0);
1206 if (files[i] && files[i]->isVisible &&
1209 table_add_row(general_table, i + 1, files[i]->name,
"");
1212 if (stats_report->layer_count > 0 &&
1213 stats_report->error_list->error_text != NULL) {
1214 for (err_list = stats_report->error_list;
1216 err_list = err_list->next) {
1217 if (i + 1 != err_list->layer)
1219 table_add_row(general_table,
1221 error_type_string(err_list->type),
1222 err_list->error_text);
1229 GtkWidget *G_report_window = gtk_scrolled_window_new(NULL, NULL);
1230 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(G_report_window),
1231 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1233 struct table *G_table =
1234 table_new_with_columns(3, _(
"Code"), G_TYPE_STRING,
1235 _(
"Count"), G_TYPE_UINT, _(
"Note"), G_TYPE_STRING);
1236 table_set_column_align(G_table, 0, 1.0);
1237 table_set_column_align(G_table, 1, 1.0);
1238 gtk_tree_view_set_headers_clickable(
1239 GTK_TREE_VIEW(G_table->widget), TRUE);
1241 table_add_row(G_table,
"G00", stats_report->G00,
1243 table_add_row(G_table,
"G01", stats_report->G01,
1244 _(
"1X linear interpolation"));
1245 table_add_row(G_table,
"G02", stats_report->G02,
1246 _(
"CW interpolation"));
1247 table_add_row(G_table,
"G03", stats_report->G03,
1248 _(
"CCW interpolation"));
1249 table_add_row(G_table,
"G04", stats_report->G04,
1250 _(
"Variable dwell"));
1251 table_add_row(G_table,
"G05", stats_report->G05,
1253 table_add_row(G_table,
"G85", stats_report->G85,
1255 table_add_row(G_table,
"G90", stats_report->G90,
1256 _(
"Absolute units"));
1257 table_add_row(G_table,
"G91", stats_report->G91,
1258 _(
"Incremental units"));
1259 table_add_row(G_table,
"G93", stats_report->G93,
1261 table_add_row(G_table,
"", stats_report->G_unknown,
1262 _(
"Unknown G codes"));
1264 table_set_sortable(G_table);
1265 gtk_container_add(GTK_CONTAINER(G_report_window), G_table->widget);
1268 GtkWidget *M_report_window = gtk_scrolled_window_new(NULL, NULL);
1269 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(M_report_window),
1270 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1272 struct table *M_table =
1273 table_new_with_columns(3, _(
"Code"), G_TYPE_STRING,
1274 _(
"Count"), G_TYPE_UINT, _(
"Note"), G_TYPE_STRING);
1275 table_set_column_align(M_table, 0, 1.0);
1276 table_set_column_align(M_table, 1, 1.0);
1277 gtk_tree_view_set_headers_clickable(
1278 GTK_TREE_VIEW(M_table->widget), TRUE);
1279 table_add_row(M_table,
"M00", stats_report->M00,
1280 _(
"End of program"));
1281 table_add_row(M_table,
"M01", stats_report->M01,
1282 _(
"End of pattern"));
1283 table_add_row(M_table,
"M18", stats_report->M18,
1284 _(
"Tool tip check"));
1285 table_add_row(M_table,
"M25", stats_report->M25,
1286 _(
"Begin pattern"));
1287 table_add_row(M_table,
"M30", stats_report->M30,
1288 _(
"End program rewind"));
1289 table_add_row(M_table,
"M31", stats_report->M31,
1290 _(
"Begin pattern"));
1291 table_add_row(M_table,
"M45", stats_report->M45,
1293 table_add_row(M_table,
"M47", stats_report->M47,
1294 _(
"Operator message"));
1295 table_add_row(M_table,
"M48", stats_report->M48,
1296 _(
"Begin program header"));
1297 table_add_row(M_table,
"M71", stats_report->M71,
1299 table_add_row(M_table,
"M72", stats_report->M72,
1300 _(
"English units"));
1301 table_add_row(M_table,
"M95", stats_report->M95,
1302 _(
"End program header"));
1303 table_add_row(M_table,
"M97", stats_report->M97,
1305 table_add_row(M_table,
"M98", stats_report->M98,
1307 table_add_row(M_table,
"", stats_report->M_unknown,
1308 _(
"Unknown M codes"));
1310 table_set_sortable(M_table);
1311 gtk_container_add(GTK_CONTAINER(M_report_window), M_table->widget);
1314 GtkWidget *misc_report_window = gtk_scrolled_window_new(NULL, NULL);
1315 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(misc_report_window),
1316 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1318 struct table *misc_table =
1319 table_new_with_columns(2,
1321 _(
"Count"), G_TYPE_STRING,
1322 _(
"Code"), G_TYPE_STRING);
1323 table_set_column_align(misc_table, 0, 1.0);
1324 char *str = strdup(
"");
1325 sprintf(str,
"%d", stats_report->comment);
1326 table_add_row(misc_table, str,_(
"Comments"));
1327 sprintf(str,
"%d", stats_report->unknown);
1328 table_add_row(misc_table, str, _(
"Unknown codes"));
1329 sprintf(str,
"%d", stats_report->R);
1330 table_add_row(misc_table, str, _(
"Repeat hole (R)"));
1332 if (stats_report->detect != NULL ) {
1333 table_add_row(misc_table,
"", stats_report->detect);
1336 table_set_sortable(misc_table);
1337 gtk_container_add(GTK_CONTAINER(misc_report_window),
1338 misc_table->widget);
1341 GtkWidget *drill_usage_report_window =
1342 gtk_scrolled_window_new(NULL, NULL);
1343 gtk_scrolled_window_set_policy(
1344 GTK_SCROLLED_WINDOW(drill_usage_report_window),
1345 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1347 struct table *drill_usage_table = table_new_with_columns(4,
1348 _(
"Drill no."), G_TYPE_UINT,
1349 _(
"Dia."), G_TYPE_DOUBLE,
1350 _(
"Units"), G_TYPE_STRING,
1351 _(
"Count"), G_TYPE_UINT);
1353 table_set_column_align(drill_usage_table, 0, 1.0);
1354 table_set_column_align(drill_usage_table, 3, 1.0);
1355 gtk_tree_view_set_headers_clickable(
1356 GTK_TREE_VIEW(drill_usage_table->widget), TRUE);
1359 for (drill_list = stats_report->drill_list;
1360 drill_list != NULL; drill_list = drill_list->next) {
1361 if (drill_list->drill_num == -1)
1364 table_add_row(drill_usage_table,
1365 drill_list->drill_num,
1366 drill_list->drill_size,
1367 drill_list->drill_unit,
1368 drill_list->drill_count);
1371 table_set_sortable(drill_usage_table);
1372 gtk_container_add(GTK_CONTAINER(drill_usage_report_window),
1373 drill_usage_table->widget);
1376 GtkWidget *analyze_active_drill;
1377 analyze_active_drill = gtk_dialog_new_with_buttons(
1378 _(
"Drill codes report on visible layers"),
1379 NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
1380 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
1381 gtk_container_set_border_width (GTK_CONTAINER (analyze_active_drill), 5);
1383 gtk_dialog_set_default_response (GTK_DIALOG(analyze_active_drill),
1384 GTK_RESPONSE_ACCEPT);
1385 g_signal_connect (G_OBJECT(analyze_active_drill),
1387 G_CALLBACK (gtk_widget_destroy),
1388 GTK_WIDGET(analyze_active_drill));
1391 GtkWidget *general_report_window =
1392 gtk_scrolled_window_new(NULL, NULL);
1393 gtk_scrolled_window_set_policy(
1394 GTK_SCROLLED_WINDOW(general_report_window),
1395 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1397 GtkWidget *vbox = gtk_vbox_new(0, 0);
1398 gtk_box_pack_start(GTK_BOX(vbox), general_label, 0, 0, 0);
1399 gtk_box_pack_start(GTK_BOX(vbox), general_table->widget, 0, 0, 0);
1400 gtk_scrolled_window_add_with_viewport(
1401 GTK_SCROLLED_WINDOW(general_report_window), vbox);
1404 GtkWidget *notebook = gtk_notebook_new();
1406 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1407 GTK_WIDGET(general_report_window),
1408 gtk_label_new(_(
"General")));
1410 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1411 GTK_WIDGET(G_report_window),
1412 gtk_label_new(_(
"G codes")));
1414 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1415 GTK_WIDGET(M_report_window),
1416 gtk_label_new(_(
"M codes")));
1418 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1419 GTK_WIDGET(misc_report_window),
1420 gtk_label_new(_(
"Misc. codes")));
1422 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1423 GTK_WIDGET(drill_usage_report_window),
1424 gtk_label_new(_(
"Drill usage")));
1427 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(analyze_active_drill)->vbox),
1428 GTK_WIDGET(notebook));
1429 gtk_widget_set_size_request(analyze_active_drill, 400, 300);
1430 gtk_widget_show_all(analyze_active_drill);
1437 callbacks_control_gerber_options_activate (GtkMenuItem *menuitem,
1445 callbacks_online_manual_activate (GtkMenuItem *menuitem,
1462 gboolean layers_dirty = FALSE;
1472 _(
"Do you want to close all open layers and quit the program?"),
1473 _(
"Quitting the program will cause any unsaved changes to be lost."),
1494 GtkWidget *aboutdialog1;
1496 gchar *translators = _(
"translator-credits");
1498 gchar *
string = g_strdup_printf(_(
"gerbv -- a Gerber (RS-274/X) viewer.\n\n"
1499 "This is gerbv version %s\n"
1500 "Compiled on %s at %s\n"
1502 "gerbv is part of the gEDA Project.\n"
1504 "For more information see:\n"
1505 " gEDA homepage: http://geda-project.org/\n"
1506 " gEDA Wiki: http://wiki.geda-project.org/"),
1507 VERSION, __DATE__, __TIME__);
1508 #if GTK_CHECK_VERSION(2,6,0)
1509 gchar *license = g_strdup_printf(_(
"gerbv -- a Gerber (RS-274/X) viewer.\n\n"
1510 "Copyright (C) 2000-2007 Stefan Petersen\n\n"
1511 "This program is free software: you can redistribute it and/or modify\n"
1512 "it under the terms of the GNU General Public License as published by\n"
1513 "the Free Software Foundation, either version 2 of the License, or\n"
1514 "(at your option) any later version.\n\n"
1515 "This program is distributed in the hope that it will be useful,\n"
1516 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
1517 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
1518 "GNU General Public License for more details.\n\n"
1519 "You should have received a copy of the GNU General Public License\n"
1520 "along with this program. If not, see <http://www.gnu.org/licenses/>."));
1525 aboutdialog1 = gtk_about_dialog_new ();
1526 gtk_container_set_border_width (GTK_CONTAINER (aboutdialog1), 5);
1527 gtk_about_dialog_set_version (GTK_ABOUT_DIALOG (aboutdialog1), VERSION);
1528 gtk_about_dialog_set_name (GTK_ABOUT_DIALOG (aboutdialog1), _(
"Gerbv"));
1530 gtk_about_dialog_set_translator_credits (GTK_ABOUT_DIALOG (aboutdialog1), translators);
1531 gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG (aboutdialog1),
string);
1532 gtk_about_dialog_set_license(GTK_ABOUT_DIALOG (aboutdialog1), license);
1535 a_size =
sizeof(authors_string_array)/
sizeof(authors_string_array[0]);
1536 a = g_new(gchar *, a_size);
1537 for (i = 0; i < a_size; i++)
1538 a[i] = _(authors_string_array[i]);
1540 gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG (aboutdialog1), (
const gchar **)a);
1541 gtk_about_dialog_set_website(GTK_ABOUT_DIALOG (aboutdialog1),
"http://gerbv.geda-project.org/");
1544 g_signal_connect (G_OBJECT(aboutdialog1),
"response",
1545 G_CALLBACK (gtk_widget_destroy), GTK_WIDGET(aboutdialog1));
1550 aboutdialog1 = gtk_message_dialog_new ( GTK_WINDOW (
screen.win.topLevelWindow),
1551 GTK_DIALOG_DESTROY_WITH_PARENT,
1557 gtk_window_set_title ( GTK_WINDOW (aboutdialog1), _(
"About Gerbv"));
1560 g_signal_connect_swapped (aboutdialog1,
"response",
1561 G_CALLBACK (gtk_widget_destroy),
1566 gtk_widget_show_all(GTK_WIDGET(aboutdialog1));
1584 GtkWidget *bugs_dialog = gtk_dialog_new_with_buttons(_(
"Known bugs in gerbv"),
1586 GTK_DIALOG_DESTROY_WITH_PARENT,
1587 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
1589 gtk_container_set_border_width (GTK_CONTAINER (bugs_dialog), 5);
1590 gtk_dialog_set_default_response (GTK_DIALOG(bugs_dialog),
1591 GTK_RESPONSE_ACCEPT);
1592 g_signal_connect (G_OBJECT(bugs_dialog),
"response",
1593 G_CALLBACK (gtk_widget_destroy), GTK_WIDGET(bugs_dialog));
1596 GString *bugs_string = g_string_new(NULL);
1597 for (i=0; bugs_string_array[i] != NULL; i++) {
1599 g_string_append_printf(bugs_string,
"%s\n",
1600 (bugs_string_array[i][0] ==
'\0') ?
"" : _(bugs_string_array[i]));
1604 GtkWidget *bugs_label = gtk_label_new (bugs_string->str);
1605 g_string_free(bugs_string, FALSE);
1606 gtk_misc_set_alignment(GTK_MISC(bugs_label), 0, 0);
1607 gtk_misc_set_padding(GTK_MISC(bugs_label), 7, 7);
1610 GtkWidget *bugs_window = gtk_scrolled_window_new (NULL, NULL);
1611 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(bugs_window),
1612 GTK_WIDGET(bugs_label));
1613 gtk_widget_set_size_request(bugs_window, 600, 300);
1614 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(bugs_dialog)->vbox),
1615 GTK_WIDGET(bugs_window));
1617 gtk_widget_show_all(GTK_WIDGET(bugs_dialog));
1618 gtk_dialog_run(GTK_DIALOG(bugs_dialog));
1623 gdouble callbacks_calculate_actual_distance (gdouble inputDimension) {
1624 return screen_units(inputDimension);
1628 void callbacks_update_ruler_pointers (
void) {
1629 double xPosition, yPosition;
1634 xPosition = callbacks_calculate_actual_distance (xPosition);
1635 yPosition = callbacks_calculate_actual_distance (yPosition);
1637 g_object_set (G_OBJECT (
screen.win.hRuler),
"position", xPosition, NULL);
1638 g_object_set (G_OBJECT (
screen.win.vRuler),
"position", yPosition, NULL);
1643 callbacks_render_type_changed () {
1644 static gboolean isChanging = FALSE;
1650 GtkCheckMenuItem *check_item =
screen.win.menu_view_render_group[type];
1651 dprintf (
"%s(): type = %d, check_item = %p\n", __FUNCTION__, type, check_item);
1652 gtk_check_menu_item_set_active (check_item, TRUE);
1653 gtk_combo_box_set_active (
screen.win.sidepaneRenderComboBox, type);
1655 render_refresh_rendered_image_on_screen();
1661 callbacks_units_changed (gerbv_gui_unit_t unit) {
1662 static gboolean isChanging = FALSE;
1670 if (unit == GERBV_MILS){
1671 gtk_combo_box_set_active (GTK_COMBO_BOX (
screen.win.statusUnitComboBox), GERBV_MILS);
1672 gtk_check_menu_item_set_active (
screen.win.menu_view_unit_group[GERBV_MILS], TRUE);
1673 }
else if (unit == GERBV_MMS){
1674 gtk_combo_box_set_active (GTK_COMBO_BOX (
screen.win.statusUnitComboBox), GERBV_MMS);
1675 gtk_check_menu_item_set_active (
screen.win.menu_view_unit_group[GERBV_MMS], TRUE);
1677 gtk_combo_box_set_active (GTK_COMBO_BOX (
screen.win.statusUnitComboBox), GERBV_INS);
1678 gtk_check_menu_item_set_active (
screen.win.menu_view_unit_group[GERBV_INS], TRUE);
1681 callbacks_update_ruler_scales ();
1682 callbacks_update_statusbar_coordinates (
screen.last_x,
screen.last_y);
1684 if (
screen.tool == MEASURE)
1685 callbacks_update_statusbar_measured_distance (
screen.win.lastMeasuredX,
screen.win.lastMeasuredY);
1692 callbacks_update_ruler_scales (
void) {
1693 double xStart, xEnd, yStart, yEnd;
1703 xStart = callbacks_calculate_actual_distance (xStart);
1704 xEnd = callbacks_calculate_actual_distance (xEnd);
1705 yStart = callbacks_calculate_actual_distance (yStart);
1706 yEnd = callbacks_calculate_actual_distance (yEnd);
1711 gtk_ruler_set_range (GTK_RULER (
screen.win.hRuler), xStart, xEnd, 0, xEnd - xStart);
1714 gtk_ruler_set_range (GTK_RULER (
screen.win.vRuler), yEnd, yStart, 0, yEnd - yStart);
1718 void callbacks_update_scrollbar_limits (
void){
1724 GtkAdjustment *hAdjust = (GtkAdjustment *)
screen.win.hAdjustment;
1725 GtkAdjustment *vAdjust = (GtkAdjustment *)
screen.win.vAdjustment;
1728 hAdjust->page_increment = hAdjust->page_size;
1729 hAdjust->step_increment = hAdjust->page_size / 10.0;
1731 vAdjust->page_increment = vAdjust->page_size;
1732 vAdjust->step_increment = vAdjust->page_size / 10.0;
1737 callbacks_update_scrollbar_positions ();
1741 void callbacks_update_scrollbar_positions (
void){
1742 gdouble positionX,positionY;
1745 if (positionX < ((GtkAdjustment *)
screen.win.hAdjustment)->lower)
1746 positionX = ((GtkAdjustment *)
screen.win.hAdjustment)->lower;
1747 if (positionX > (((GtkAdjustment *)
screen.win.hAdjustment)->upper - ((GtkAdjustment *)
screen.win.hAdjustment)->page_size))
1748 positionX = (((GtkAdjustment *)
screen.win.hAdjustment)->upper - ((GtkAdjustment *)
screen.win.hAdjustment)->page_size);
1749 gtk_adjustment_set_value ((GtkAdjustment *)
screen.win.hAdjustment, positionX);
1751 positionY = ((GtkAdjustment *)
screen.win.vAdjustment)->upper - screenRenderInfo.
lowerLeftY -
1752 ((GtkAdjustment *)
screen.win.vAdjustment)->page_size +
1753 ((GtkAdjustment *)
screen.win.vAdjustment)->lower;
1754 if (positionY < ((GtkAdjustment *)
screen.win.vAdjustment)->lower)
1755 positionY = ((GtkAdjustment *)
screen.win.vAdjustment)->lower;
1756 if (positionY > (((GtkAdjustment *)
screen.win.vAdjustment)->upper - ((GtkAdjustment *)
screen.win.vAdjustment)->page_size))
1757 positionY = (((GtkAdjustment *)
screen.win.vAdjustment)->upper - ((GtkAdjustment *)
screen.win.vAdjustment)->page_size);
1758 gtk_adjustment_set_value ((GtkAdjustment *)
screen.win.vAdjustment, positionY);
1763 callbacks_scrollbar_button_released (GtkWidget *widget, GdkEventButton *event){
1767 render_refresh_rendered_image_on_screen();
1773 callbacks_scrollbar_button_pressed (GtkWidget *widget, GdkEventButton *event){
1775 screen.state = SCROLLBAR;
1780 void callbacks_hadjustment_value_changed (GtkAdjustment *adjustment, gpointer user_data){
1783 if (
screen.state == SCROLLBAR) {
1784 screenRenderInfo.
lowerLeftX = gtk_adjustment_get_value (adjustment);
1789 void callbacks_vadjustment_value_changed (GtkAdjustment *adjustment, gpointer user_data){
1792 if (
screen.state == SCROLLBAR) {
1793 screenRenderInfo.
lowerLeftY = adjustment->upper -
1794 (gtk_adjustment_get_value (adjustment) + adjustment->page_size) + adjustment->lower;
1800 callbacks_layer_tree_visibility_button_toggled (GtkCellRendererToggle *cell_renderer,
1802 gpointer user_data){
1803 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model
1804 ((GtkTreeView *)
screen.win.layerTree);
1806 gboolean newVisibility=TRUE;
1809 gtk_tree_model_get_iter_from_string ((GtkTreeModel *)list_store, &iter, path);
1811 GtkTreePath *treePath = gtk_tree_path_new_from_string (path);
1812 if (gtk_tree_model_get_iter((GtkTreeModel *)list_store, &iter, treePath)) {
1815 indices = gtk_tree_path_get_indices (treePath);
1818 newVisibility = FALSE;
1821 render_clear_selection_buffer();
1823 callbacks_update_layer_tree ();
1825 render_refresh_rendered_image_on_screen();
1828 render_recreate_composite_surface (
screen.drawing_area);
1829 callbacks_force_expose_event_for_screen ();
1836 callbacks_get_col_number_from_tree_view_column (GtkTreeViewColumn *col)
1841 g_return_val_if_fail ( col != NULL, -1 );
1842 g_return_val_if_fail ( col->tree_view != NULL, -1 );
1843 cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(col->tree_view));
1844 num = g_list_index(cols, (gpointer) col);
1851 callbacks_add_layer_button_clicked (GtkButton *button, gpointer user_data) {
1857 callbacks_unselect_all_tool_buttons (
void) {
1862 callbacks_switch_to_normal_tool_cursor (gint toolNumber) {
1865 switch (toolNumber) {
1867 gdk_window_set_cursor(GDK_WINDOW(
screen.drawing_area->window),
1871 cursor = gdk_cursor_new(GDK_FLEUR);
1872 gdk_window_set_cursor(GDK_WINDOW(
screen.drawing_area->window),
1874 gdk_cursor_destroy(cursor);
1877 cursor = gdk_cursor_new(GDK_SIZING);
1878 gdk_window_set_cursor(GDK_WINDOW(
screen.drawing_area->window),
1880 gdk_cursor_destroy(cursor);
1883 cursor = gdk_cursor_new(GDK_CROSSHAIR);
1884 gdk_window_set_cursor(GDK_WINDOW(
screen.drawing_area->window),
1886 gdk_cursor_destroy(cursor);
1895 callbacks_switch_to_correct_cursor (
void) {
1898 if (
screen.state == IN_MOVE) {
1899 cursor = gdk_cursor_new(GDK_FLEUR);
1900 gdk_window_set_cursor(GDK_WINDOW(
screen.drawing_area->window),
1902 gdk_cursor_destroy(cursor);
1905 else if (
screen.state == IN_ZOOM_OUTLINE) {
1906 cursor = gdk_cursor_new(GDK_SIZING);
1907 gdk_window_set_cursor(GDK_WINDOW(
screen.drawing_area->window),
1909 gdk_cursor_destroy(cursor);
1912 callbacks_switch_to_normal_tool_cursor (
screen.tool);
1917 callbacks_change_tool (GtkButton *button, gpointer user_data) {
1918 gint toolNumber = GPOINTER_TO_INT (user_data);
1921 if (
screen.win.updatingTools)
1923 screen.win.updatingTools = TRUE;
1924 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (
screen.win.toolButtonPointer), FALSE);
1925 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (
screen.win.toolButtonPan), FALSE);
1926 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (
screen.win.toolButtonZoom), FALSE);
1927 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (
screen.win.toolButtonMeasure), FALSE);
1928 switch (toolNumber) {
1930 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (
screen.win.toolButtonPointer), TRUE);
1933 utf8_strncpy(
screen.statusbar.diststr,
1934 _(
"Click to select objects in the current layer. Middle click and drag to pan."),
1938 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (
screen.win.toolButtonPan), TRUE);
1941 utf8_strncpy(
screen.statusbar.diststr,
1942 _(
"Click and drag to pan. Right click and drag to zoom."),
1946 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (
screen.win.toolButtonZoom), TRUE);
1949 utf8_strncpy(
screen.statusbar.diststr,
1950 _(
"Click and drag to zoom in. Shift+click to zoom out."),
1954 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (
screen.win.toolButtonMeasure), TRUE);
1957 utf8_strncpy(
screen.statusbar.diststr,
1958 _(
"Click and drag to measure a distance."),
1964 callbacks_switch_to_normal_tool_cursor (toolNumber);
1966 screen.win.updatingTools = FALSE;
1967 callbacks_force_expose_event_for_screen();
1972 callbacks_select_row (gint rowIndex) {
1973 GtkTreeSelection *selection;
1975 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model
1976 ((GtkTreeView *)
screen.win.layerTree);
1978 selection = gtk_tree_view_get_selection((GtkTreeView *)
screen.win.layerTree);
1979 if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(list_store), &iter, NULL, rowIndex)) {
1980 gtk_tree_selection_select_iter (selection, &iter);
1992 GtkTreeSelection *selection;
1994 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model
1995 ((GtkTreeView *)
screen.win.layerTree);
1999 selection = gtk_tree_view_get_selection((GtkTreeView *)
screen.win.layerTree);
2000 if (gtk_tree_selection_get_selected(selection, NULL, &iter)) {
2001 while (gtk_tree_model_iter_nth_child ((GtkTreeModel *)list_store,
2003 if (gtk_tree_selection_iter_is_selected (selection, &iter)) {
2014 callbacks_remove_layer_button_clicked (GtkButton *button, gpointer user_data) {
2017 if ((index >= 0) && (index <= mainProject->last_loaded)) {
2018 render_remove_selected_objects_belonging_to_layer (index);
2020 callbacks_update_layer_tree ();
2021 callbacks_select_row (0);
2024 render_refresh_rendered_image_on_screen();
2027 render_recreate_composite_surface (
screen.drawing_area);
2028 callbacks_force_expose_event_for_screen ();
2035 callbacks_move_layer_down_menu_activate (GtkMenuItem *menuitem, gpointer user_data) {
2036 callbacks_move_layer_down_button_clicked(NULL, NULL);
2037 gtk_widget_grab_focus (
screen.win.layerTree);
2042 callbacks_move_layer_down_button_clicked (GtkButton *button, gpointer user_data) {
2045 show_no_layers_warning ();
2049 if (index < mainProject->last_loaded) {
2050 gerbv_change_layer_order (
mainProject, index, index + 1);
2051 callbacks_update_layer_tree ();
2052 callbacks_select_row (index + 1);
2054 render_refresh_rendered_image_on_screen ();
2057 render_recreate_composite_surface (
screen.drawing_area);
2058 callbacks_force_expose_event_for_screen ();
2065 callbacks_move_layer_up_menu_activate (GtkMenuItem *menuitem, gpointer user_data) {
2066 callbacks_move_layer_up_button_clicked (NULL, NULL);
2067 gtk_widget_grab_focus (
screen.win.layerTree);
2072 callbacks_move_layer_up_button_clicked (GtkButton *button, gpointer user_data) {
2075 show_no_layers_warning ();
2079 gerbv_change_layer_order (
mainProject, index, index - 1);
2080 callbacks_update_layer_tree ();
2081 callbacks_select_row (index - 1);
2083 render_refresh_rendered_image_on_screen();
2086 render_recreate_composite_surface (
screen.drawing_area);
2087 callbacks_force_expose_event_for_screen ();
2093 void callbacks_layer_tree_row_inserted (GtkTreeModel *tree_model, GtkTreePath *path,
2094 GtkTreeIter *oIter, gpointer user_data) {
2095 gint *indices=NULL,oldPosition,newPosition;
2097 if ((!
screen.win.treeIsUpdating)&&(path != NULL)) {
2098 indices = gtk_tree_path_get_indices (path);
2100 newPosition = indices[0];
2104 if (oldPosition < newPosition)
2108 gerbv_change_layer_order (
mainProject, oldPosition, newPosition);
2111 render_refresh_rendered_image_on_screen();
2114 render_recreate_composite_surface (
screen.drawing_area);
2115 callbacks_force_expose_event_for_screen ();
2118 GtkTreeSelection *selection;
2120 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model
2121 ((GtkTreeView *)
screen.win.layerTree);
2123 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
screen.win.layerTree));
2124 if (gtk_tree_model_get_iter ((GtkTreeModel *)list_store, &iter, path))
2125 gtk_tree_selection_select_iter (selection, &iter);
2132 callbacks_show_color_picker_dialog (gint index){
2133 screen.win.colorSelectionDialog = NULL;
2134 GtkColorSelectionDialog *cs= (GtkColorSelectionDialog *) gtk_color_selection_dialog_new (_(
"Select a color"));
2135 GtkColorSelection *colorsel = (GtkColorSelection *) cs->colorsel;
2137 screen.win.colorSelectionDialog = (GtkWidget *) cs;
2138 screen.win.colorSelectionIndex = index;
2144 gtk_color_selection_set_has_opacity_control (colorsel, TRUE);
2147 gtk_widget_show_all((GtkWidget *)cs);
2148 if (gtk_dialog_run ((GtkDialog*)cs) == GTK_RESPONSE_OK) {
2149 GtkColorSelection *colorsel = (GtkColorSelection *) cs->colorsel;
2150 gint rowIndex =
screen.win.colorSelectionIndex;
2154 gdk_colormap_alloc_color(gdk_colormap_get_system(), &
mainProject->
file[rowIndex]->
color, FALSE, TRUE);
2164 callbacks_update_layer_tree ();
2165 render_refresh_rendered_image_on_screen();
2167 gtk_widget_destroy ((GtkWidget *)cs);
2168 screen.win.colorSelectionDialog = NULL;
2173 callbacks_invert_layer_clicked (GtkButton *button, gpointer user_data) {
2176 show_no_layers_warning ();
2180 render_refresh_rendered_image_on_screen ();
2181 callbacks_update_layer_tree ();
2186 callbacks_change_layer_color_clicked (GtkButton *button, gpointer user_data) {
2189 show_no_layers_warning ();
2192 callbacks_show_color_picker_dialog (index);
2196 callbacks_change_background_color_clicked (GtkButton *button, gpointer user_data) {
2197 callbacks_show_color_picker_dialog (-1);
2202 callbacks_reload_layer_clicked (GtkButton *button, gpointer user_data) {
2205 show_no_layers_warning ();
2208 render_remove_selected_objects_belonging_to_layer (index);
2210 render_refresh_rendered_image_on_screen ();
2211 callbacks_update_layer_tree();
2215 callbacks_change_layer_edit_clicked (GtkButton *button, gpointer userData){
2219 show_no_layers_warning ();
2225 render_refresh_rendered_image_on_screen ();
2226 callbacks_update_layer_tree ();
2231 callbacks_change_layer_format_clicked (GtkButton *button, gpointer user_data)
2233 gerbv_HID_Attribute *attr = NULL;
2236 gerbv_HID_Attr_Val * results = NULL;
2241 show_no_layers_warning ();
2244 dprintf (
"%s(): index = %d\n", __FUNCTION__, index);
2249 type = N_(
"Unknown type");
2251 if (attr == NULL || n == 0)
2254 _(
"Format editing is currently only supported for Excellon drill file formats."),
2260 dprintf (
"%s(): n = %d, attr = %p\n", __FUNCTION__, n, attr);
2265 _(
"Editing the file type will reload the layer, destroying your changes. Click OK to edit the file type and destroy your changes, or Cancel to leave."),
2268 if (rc == 0)
return;
2271 results = (gerbv_HID_Attr_Val *) malloc (n *
sizeof (gerbv_HID_Attr_Val));
2272 if (results == NULL)
2274 fprintf (stderr,
"%s() -- malloc failed\n", __FUNCTION__);
2279 if (attribute_interface_dialog (attr, n, results,
2280 _(
"Edit file format"),
2288 dprintf (_(
"%s(): Reloading layer\n"), __FUNCTION__);
2291 for (i = 0; i < n; i++)
2293 if (results[i].str_value)
2294 free (results[i].str_value);
2299 render_refresh_rendered_image_on_screen();
2300 callbacks_update_layer_tree();
2305 callbacks_layer_tree_key_press (GtkWidget *widget, GdkEventKey *event, gpointer user_data) {
2308 if(event->keyval == GDK_space){
2311 GtkTreeViewColumn *col;
2315 tree = (GtkTreeView *)
screen.win.layerTree;
2316 gtk_tree_view_get_cursor (tree, &path, &col);
2318 indices = gtk_tree_path_get_indices (path);
2320 idx = callbacks_get_col_number_from_tree_view_column (col);
2322 callbacks_show_color_picker_dialog (indices[0]);
2325 gtk_tree_path_free (path);
2334 callbacks_layer_tree_button_press (GtkWidget *widget, GdkEventButton *event,
2335 gpointer user_data) {
2338 GtkTreeViewColumn *column;
2342 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model
2343 ((GtkTreeView *)
screen.win.layerTree);
2344 if (event->button == 1) {
2345 if (gtk_tree_view_get_path_at_pos ((GtkTreeView *) widget, event->x, event->y,
2346 &path, &column, &x, &y)) {
2347 if (gtk_tree_model_get_iter((GtkTreeModel *)list_store, &iter, path)) {
2349 indices = gtk_tree_path_get_indices (path);
2351 columnIndex = callbacks_get_col_number_from_tree_view_column (column);
2353 callbacks_show_color_picker_dialog (indices[0]);
2364 gtk_menu_popup(GTK_MENU(
screen.win.layerTreePopupMenu), NULL, NULL, NULL, NULL,
2365 event->button, event->time);
2373 callbacks_update_layer_tree (
void) {
2374 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model
2375 ((GtkTreeView *)
screen.win.layerTree);
2378 GtkTreeSelection *selection;
2379 gint oldSelectedRow;
2381 if (!
screen.win.treeIsUpdating) {
2382 screen.win.treeIsUpdating = TRUE;
2385 if (oldSelectedRow < 0)
2387 gtk_list_store_clear (list_store);
2391 GdkPixbuf *pixbuf,*blackPixbuf;
2394 unsigned char red, green, blue, alpha;
2401 color = (red )* (256*256*256) + (green ) * (256*256) + (blue )* (256) + (alpha );
2402 pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, 20, 15);
2403 gdk_pixbuf_fill (pixbuf, color);
2405 blackPixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, 20, 15);
2406 color = (100 )* (256*256*256) + (100 ) * (256*256) + (100 )* (256) + (150 );
2407 gdk_pixbuf_fill (blackPixbuf, color);
2410 gdk_pixbuf_copy_area (pixbuf, 1, 1, 18, 13, blackPixbuf, 1, 1);
2412 g_object_unref(pixbuf);
2414 gtk_list_store_append (list_store, &iter);
2416 gchar startChar[2],*modifiedCode;
2420 gint numberOfModifications = 0;
2423 numberOfModifications++;
2428 numberOfModifications++;
2433 numberOfModifications++;
2438 numberOfModifications++;
2442 numberOfModifications++;
2444 if (numberOfModifications > 1)
2446 if (numberOfModifications == 0)
2447 modifiedCode = g_strdup (
"");
2449 modifiedCode = g_strdup (startChar);
2462 gtk_list_store_set (list_store, &iter,
2469 g_free (modifiedCode);
2471 g_object_unref(blackPixbuf);
2475 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
screen.win.layerTree));
2480 if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
2481 if (gtk_tree_model_iter_nth_child ((GtkTreeModel *) list_store,
2482 &iter, NULL, oldSelectedRow)) {
2483 gtk_tree_selection_select_iter (selection, &iter);
2487 gtk_widget_set_sensitive (
screen.win.curLayerMenuItem, showItems);
2488 gtk_widget_set_sensitive (
screen.win.curAnalyzeMenuItem, showItems);
2489 gtk_widget_set_sensitive (
screen.win.curEditMenuItem, showItems);
2490 gtk_widget_set_sensitive (
screen.win.curFileMenuItem1, showItems);
2491 gtk_widget_set_sensitive (
screen.win.curFileMenuItem2, showItems);
2492 gtk_widget_set_sensitive (
screen.win.curFileMenuItem3, showItems);
2493 gtk_widget_set_sensitive (
screen.win.curFileMenuItem4, showItems);
2494 gtk_widget_set_sensitive (
screen.win.curFileMenuItem5, showItems);
2495 gtk_widget_set_sensitive (
screen.win.curFileMenuItem6, showItems);
2496 gtk_widget_set_sensitive (
screen.win.curFileMenuItem7, showItems);
2497 screen.win.treeIsUpdating = FALSE;
2503 callbacks_display_object_properties_clicked (GtkButton *button, gpointer user_data) {
2507 gboolean validAperture;
2513 _(
"Objects must be selected using the pointer tool before you can view the object properties."),
2519 for (i=0; i<
screen.selectionInfo.selectedNodeArray->len; i++){
2520 gerbv_selection_item_t sItem = g_array_index (
screen.selectionInfo.selectedNodeArray,
2521 gerbv_selection_item_t, i);
2525 gboolean show_length;
2529 validAperture = TRUE;
2531 validAperture = FALSE;
2537 layer_name = g_strdup(_(
"<unnamed layer>"));
2539 layer_name = g_strdup(net->
layer->
name);
2542 if (net->
label == NULL) {
2543 net_label = g_strdup(_(
"<unlabeled net>"));
2545 net_label = g_strdup(net->
label->str);
2548 g_message (_(
"Object type: Polygon"));
2555 if (i != 0) g_message (
" ");
2562 g_message (_(
"Object type: Line"));
2568 g_message (_(
"Object type: Arc"));
2570 length = arc_length(net->
cirseg->width,
2577 g_message (_(
"Object type: Unknown"));
2580 g_message (_(
" Exposure: On"));
2581 if (validAperture) {
2584 g_message (_(
" Start location: (%g, %g)"),
2586 g_message (_(
" Stop location: (%g, %g)"),
2589 screen.length_sum += length;
2590 g_message (_(
" Length: %g (sum: %g)"),
2591 screen_units(length), screen_units(
screen.length_sum));
2593 g_message (_(
" Layer name: %s"), layer_name);
2594 g_message (_(
" Net label: %s"), net_label);
2598 if (i != 0) g_message (
" ");
2599 g_message (_(
"Object type: Flashed aperture"));
2600 if (validAperture) {
2603 g_message (_(
" Location: (%g, %g)"),
2605 g_message (_(
" Layer name: %s"), layer_name);
2606 g_message (_(
" Net label: %s"), net_label);
2612 g_free (layer_name);
2615 g_message (
"---------------------------------------");
2622 GdkPixmap *renderedPixmap = gdk_pixmap_new (NULL, renderInfo->
displayWidth,
2629 while( now - 30 < start) {
2631 dprintf(_(
"Benchmark(): Starting redraw #%d\n"), i);
2632 gerbv_render_to_pixmap_using_gdk (
mainProject, renderedPixmap, renderInfo, NULL, NULL);
2634 dprintf(_(
"Elapsed time = %ld seconds\n"), (
long int) (now - start));
2636 g_message(_(
"FAST (=GDK) mode benchmark: %d redraws in %ld seconds (%g redraws/second)\n"),
2637 i, (
long int) (now - start), (
double) i / (
double)(now - start));
2638 gdk_pixmap_unref(renderedPixmap);
2645 while( now - 30 < start) {
2647 dprintf(_(
"Benchmark(): Starting redraw #%d\n"), i);
2648 cairo_surface_t *cSurface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
2650 cairo_t *cairoTarget = cairo_create (cSurface);
2651 gerbv_render_all_layers_to_cairo_target (
mainProject, cairoTarget, renderInfo);
2652 cairo_destroy (cairoTarget);
2653 cairo_surface_destroy (cSurface);
2655 dprintf(_(
"Elapsed time = %ld seconds\n"), (
long int) (now - start));
2657 g_message(_(
"NORMAL (=Cairo) mode benchmark: %d redraws in %ld seconds (%g redraws/second)\n"),
2658 i, (
long int) (now - start), (
double) i / (
double)(now - start));
2663 callbacks_benchmark_clicked (GtkButton *button, gpointer user_data)
2671 g_message(_(
"Full zoom benchmarks\n"));
2672 callbacks_support_benchmark (&renderInfo);
2675 g_message(_(
"x5 zoom benchmarks\n"));
2682 callbacks_support_benchmark (&renderInfo);
2687 callbacks_edit_object_properties_clicked (GtkButton *button, gpointer user_data){
2692 callbacks_move_objects_clicked (GtkButton *button, gpointer user_data){
2694 gerbv_image_move_selected_objects (
screen.selectionInfo.selectedNodeArray, -0.050, 0.050);
2695 callbacks_update_layer_tree();
2696 render_clear_selection_buffer ();
2697 render_refresh_rendered_image_on_screen ();
2702 callbacks_reduce_object_area_clicked (GtkButton *button, gpointer user_data){
2704 gerbv_image_reduce_area_of_selected_objects (
screen.selectionInfo.selectedNodeArray, 0.20, 3, 3, 0.01);
2705 render_clear_selection_buffer ();
2706 render_refresh_rendered_image_on_screen ();
2711 callbacks_delete_objects_clicked (GtkButton *button, gpointer user_data){
2714 _(
"Objects must be selected using the pointer tool before they can be deleted."),
2726 _(
"Do you want to permanently delete the selected objects?"),
2727 _(
"Gerbv currently has no undo function, so this action cannot be undone. This action will not change the saved file unless you save the file afterwards."),
2734 screen.selectionInfo.selectedNodeArray);
2735 render_refresh_rendered_image_on_screen ();
2738 callbacks_update_layer_tree();
2740 render_clear_selection_buffer ();
2741 callbacks_update_selected_object_message(FALSE);
2746 callbacks_drawingarea_configure_event (GtkWidget *widget, GdkEventConfigure *event)
2748 GdkDrawable *drawable = widget->window;
2754 int x_off=0, y_off=0;
2757 if (GDK_IS_WINDOW(widget->window)) {
2759 GdkWindow *window = GDK_WINDOW(widget->window);
2760 gdk_window_get_internal_paint_info (window, &drawable, &x_off, &y_off);
2762 visual = gdk_drawable_get_visual (drawable);
2763 if (
screen.windowSurface)
2764 cairo_surface_destroy ((cairo_surface_t *)
2767 #if defined(WIN32) || defined(QUARTZ)
2768 cairo_t *cairoTarget = gdk_cairo_create (GDK_WINDOW(widget->window));
2770 screen.windowSurface = cairo_get_target (cairoTarget);
2773 screen.windowSurface = cairo_surface_reference (
screen.windowSurface);
2774 cairo_destroy (cairoTarget);
2776 screen.windowSurface = (gpointer) cairo_xlib_surface_create (GDK_DRAWABLE_XDISPLAY (drawable),
2777 GDK_DRAWABLE_XID (drawable),
2778 GDK_VISUAL_XVISUAL (visual),
2787 render_refresh_rendered_image_on_screen();
2793 callbacks_drawingarea_expose_event (GtkWidget *widget, GdkEventExpose *event)
2796 GdkPixmap *new_pixmap;
2797 GdkGC *gc = gdk_gc_new(widget->window);
2802 new_pixmap = gdk_pixmap_new(widget->window,
2803 widget->allocation.width,
2804 widget->allocation.height,
2809 gdk_draw_rectangle(new_pixmap, gc, TRUE,
2810 event->area.x, event->area.y,
2811 event->area.width, event->area.height);
2817 if (
screen.pixmap != NULL) {
2818 gdk_draw_pixmap(new_pixmap,
2819 widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
2821 event->area.x -
screen.off_x,
2822 event->area.y -
screen.off_y,
2823 event->area.x, event->area.y,
2824 event->area.width, event->area.height);
2830 gdk_draw_pixmap(widget->window,
2831 widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
2833 event->area.x, event->area.y,
2834 event->area.x, event->area.y,
2835 event->area.width, event->area.height);
2837 gdk_pixmap_unref(new_pixmap);
2843 if (
screen.state == IN_ZOOM_OUTLINE) {
2844 render_draw_zoom_outline(
screen.centered_outline_zoom);
2846 else if (
screen.state == IN_MEASURE) {
2849 if (
screen.tool == MEASURE &&
screen.state != IN_MEASURE) {
2858 int x_off=0, y_off=0;
2859 GdkDrawable *drawable = widget->window;
2862 if (GDK_IS_WINDOW(widget->window)) {
2864 GdkWindow *window = GDK_WINDOW(widget->window);
2865 gdk_window_get_internal_paint_info (window,
2866 &drawable, &x_off, &y_off);
2868 visual = gdk_drawable_get_visual (drawable);
2869 gdk_drawable_get_size (drawable, &width, &height);
2871 #if defined(WIN32) || defined(QUARTZ)
2873 cr = gdk_cairo_create (GDK_WINDOW(widget->window));
2875 cairo_surface_t *buffert;
2877 buffert = (gpointer) cairo_xlib_surface_create (GDK_DRAWABLE_XDISPLAY (drawable),
2878 GDK_DRAWABLE_XID (drawable),
2879 GDK_VISUAL_XVISUAL (visual),
2880 event->area.width,
event->area.height);
2881 cr = cairo_create (buffert);
2883 cairo_translate (cr, -event->area.x +
screen.off_x, -event->area.y +
screen.off_y);
2884 render_project_to_cairo_target (cr);
2886 #if !defined(WIN32) && !defined(QUARTZ)
2887 cairo_surface_destroy (buffert);
2890 if (
screen.tool == MEASURE)
2897 callbacks_screen2board(gdouble *X, gdouble *Y, gint x, gint y) {
2913 callbacks_update_statusbar_coordinates (gint x, gint y) {
2916 callbacks_screen2board(&X, &Y, x, y);
2917 if (
screen.unit == GERBV_MILS) {
2918 utf8_snprintf(
screen.statusbar.coordstr, MAX_COORDLEN,
2919 _(
"(%8.2f, %8.2f)"),
2920 COORD2MILS(X), COORD2MILS(Y));
2921 }
else if (
screen.unit == GERBV_MMS) {
2922 utf8_snprintf(
screen.statusbar.coordstr, MAX_COORDLEN,
2923 _(
"(%8.3f, %8.3f)"),
2924 COORD2MMS(X), COORD2MMS(Y));
2926 utf8_snprintf(
screen.statusbar.coordstr, MAX_COORDLEN,
2927 _(
"(%4.5f, %4.5f)"),
2928 COORD2INS(X), COORD2INS(Y));
2934 callbacks_update_selected_object_message (gboolean userTriedToSelect) {
2935 if (
screen.tool != POINTER)
2938 gint selectionLength =
screen.selectionInfo.selectedNodeArray->len;
2939 if ((selectionLength == 0)&&(userTriedToSelect)) {
2942 gchar *str = g_new(gchar, MAX_DISTLEN);
2943 utf8_strncpy(str, _(
"No object selected. Objects can only be selected in the active layer."),
2945 utf8_snprintf(
screen.statusbar.diststr, MAX_DISTLEN,
"<b>%s</b>", str);
2948 else if (selectionLength == 0) {
2949 utf8_strncpy(
screen.statusbar.diststr,
2950 _(
"Click to select objects in the current layer. Middle click and drag to pan."),
2953 else if (selectionLength == 1) {
2954 utf8_strncpy(
screen.statusbar.diststr,
2955 _(
"1 object is currently selected"),
2959 utf8_snprintf(
screen.statusbar.diststr, MAX_DISTLEN,
2960 ngettext(
"%d object are currently selected",
2961 "%d objects are currently selected",
2962 selectionLength), selectionLength);
2969 callbacks_drawingarea_motion_notify_event (GtkWidget *widget, GdkEventMotion *event)
2972 GdkModifierType state;
2975 gdk_window_get_pointer (event->window, &x, &y, &state);
2979 state =
event->state;
2991 callbacks_force_expose_event_for_screen ();
2992 callbacks_update_scrollbar_positions ();
2997 case IN_ZOOM_OUTLINE: {
2999 render_draw_zoom_outline(
screen.centered_outline_zoom);
3002 render_draw_zoom_outline(
screen.centered_outline_zoom);
3008 callbacks_screen2board(&(
screen.measure_last_x), &(
screen.measure_last_y),
3017 case IN_SELECTION_DRAG: {
3019 render_draw_selection_box_outline();
3022 render_draw_selection_box_outline();
3030 callbacks_update_statusbar_coordinates (x, y);
3031 callbacks_update_ruler_pointers ();
3037 callbacks_drawingarea_button_press_event (GtkWidget *widget, GdkEventButton *event)
3041 switch (event->button) {
3043 if (
screen.tool == POINTER) {
3047 screen.state = IN_SELECTION_DRAG;
3048 screen.start_x =
event->x;
3049 screen.start_y =
event->y;
3051 else if (
screen.tool == PAN) {
3054 screen.last_x =
event->x;
3055 screen.last_y =
event->y;
3057 else if (
screen.tool == ZOOM) {
3058 screen.state = IN_ZOOM_OUTLINE;
3060 screen.start_x =
event->x;
3061 screen.start_y =
event->y;
3062 screen.centered_outline_zoom =
event->state;
3064 else if (
screen.tool == MEASURE) {
3065 screen.state = IN_MEASURE;
3066 callbacks_screen2board(&(
screen.measure_start_x), &(
screen.measure_start_y),
3067 event->x, event->y);
3071 callbacks_force_expose_event_for_screen ();
3076 screen.last_x =
event->x;
3077 screen.last_y =
event->y;
3078 cursor = gdk_cursor_new(GDK_FLEUR);
3079 gdk_window_set_cursor(GDK_WINDOW(
screen.drawing_area->window),
3081 gdk_cursor_destroy(cursor);
3084 if (
screen.tool == POINTER) {
3090 (index <= mainProject->last_loaded) &&
3092 render_fill_selection_buffer_from_mouse_click(event->x,event->y,index,TRUE);
3094 render_clear_selection_buffer ();
3095 render_refresh_rendered_image_on_screen ();
3100 gtk_menu_popup(GTK_MENU(
screen.win.drawWindowPopupMenu), NULL, NULL, NULL, NULL,
3101 event->button, event->time);
3104 screen.state = IN_ZOOM_OUTLINE;
3105 screen.start_x =
event->x;
3106 screen.start_y =
event->y;
3107 screen.centered_outline_zoom =
event->state & GDK_SHIFT_MASK;
3108 cursor = gdk_cursor_new(GDK_SIZING);
3109 gdk_window_set_cursor(GDK_WINDOW(
screen.drawing_area->window),
3111 gdk_cursor_destroy(cursor);
3115 render_zoom_display (ZOOM_IN_CMOUSE, 0, event->x, event->y);
3118 render_zoom_display (ZOOM_OUT_CMOUSE, 0, event->x, event->y);
3123 callbacks_switch_to_correct_cursor ();
3129 callbacks_drawingarea_button_release_event (GtkWidget *widget, GdkEventButton *event)
3131 if (event->type == GDK_BUTTON_RELEASE) {
3132 if (
screen.state == IN_MOVE) {
3135 render_refresh_rendered_image_on_screen();
3136 callbacks_switch_to_normal_tool_cursor (
screen.tool);
3138 else if (
screen.state == IN_ZOOM_OUTLINE) {
3139 if ((event->state & GDK_SHIFT_MASK) != 0) {
3140 render_zoom_display (ZOOM_OUT_CMOUSE, 0, event->x, event->y);
3144 else if ((abs(
screen.start_x - event->x) < 4) &&
3145 (abs(
screen.start_y - event->y) < 4)) {
3146 render_zoom_display (ZOOM_IN_CMOUSE, 0, event->x, event->y);
3150 callbacks_switch_to_normal_tool_cursor (
screen.tool);
3152 else if (
screen.state == IN_SELECTION_DRAG) {
3159 gboolean eraseOldSelection = TRUE;
3161 if ((event->state & GDK_SHIFT_MASK) ||
3162 (event->state & GDK_CONTROL_MASK)) {
3163 eraseOldSelection = FALSE;
3165 if ((fabs((
double)(
screen.last_x -
screen.start_x)) < 5) &&
3167 render_fill_selection_buffer_from_mouse_click(event->x,event->y,index,eraseOldSelection);
3169 render_fill_selection_buffer_from_mouse_drag(event->x,event->y,
3170 screen.start_x,
screen.start_y,index,eraseOldSelection);
3172 callbacks_update_selected_object_message (TRUE);
3174 render_clear_selection_buffer ();
3175 render_refresh_rendered_image_on_screen ();
3186 callbacks_window_key_press_event (GtkWidget *widget, GdkEventKey *event)
3188 switch(event->keyval) {
3190 if (
screen.tool == POINTER) {
3191 utf8_strncpy(
screen.statusbar.diststr,
3192 _(
"No objects are currently selected"),
3195 render_clear_selection_buffer ();
3203 if (event->keyval == GDK_Escape) {
3205 render_refresh_rendered_image_on_screen();
3213 callbacks_window_key_release_event (GtkWidget *widget, GdkEventKey *event)
3221 callbacks_window_scroll_event(GtkWidget *widget, GdkEventScroll *event)
3223 switch (event->direction) {
3225 render_zoom_display (ZOOM_IN_CMOUSE, 0, event->x, event->y);
3227 case GDK_SCROLL_DOWN:
3228 render_zoom_display (ZOOM_OUT_CMOUSE, 0, event->x, event->y);
3230 case GDK_SCROLL_LEFT:
3232 case GDK_SCROLL_RIGHT:
3251 if ((
screen.statusbar.coordstr != NULL)&&(GTK_IS_LABEL(
screen.win.statusMessageLeft))) {
3252 gtk_label_set_text(GTK_LABEL(
screen.win.statusMessageLeft),
screen.statusbar.coordstr);
3254 if ((
screen.statusbar.diststr != NULL)&&(GTK_IS_LABEL(
screen.win.statusMessageRight))) {
3255 gtk_label_set_markup(GTK_LABEL(
screen.win.statusMessageRight),
screen.statusbar.diststr);
3261 callbacks_update_statusbar_measured_distance (gdouble dx, gdouble dy){
3262 gdouble delta = sqrt(dx*dx + dy*dy);
3264 if (
screen.unit == GERBV_MILS) {
3265 utf8_snprintf(
screen.statusbar.diststr, MAX_DISTLEN,
3266 _(
"Measured distance: %8.2f mils (%8.2f x, %8.2f y)"),
3267 COORD2MILS(delta), COORD2MILS(dx), COORD2MILS(dy));
3269 else if (
screen.unit == GERBV_MMS) {
3270 utf8_snprintf(
screen.statusbar.diststr, MAX_DISTLEN,
3271 _(
"Measured distance: %8.3f mms (%8.3f x, %8.3f y)"),
3272 COORD2MMS(delta), COORD2MMS(dx), COORD2MMS(dy));
3275 utf8_snprintf(
screen.statusbar.diststr, MAX_DISTLEN,
3276 _(
"Measured distance: %4.5f inches (%4.5f x, %4.5f y)"),
3277 COORD2INS(delta), COORD2INS(dx), COORD2INS(dy));
3284 callbacks_sidepane_render_type_combo_box_changed (GtkComboBox *widget, gpointer user_data) {
3285 int type = gtk_combo_box_get_active (widget);
3287 dprintf (
"%s(): type = %d\n", __FUNCTION__, type);
3289 if (type < 0 || type == screenRenderInfo.
renderType)
3293 callbacks_render_type_changed ();
3298 callbacks_viewmenu_rendertype_changed (GtkCheckMenuItem *widget, gpointer user_data) {
3299 gint type = GPOINTER_TO_INT(user_data);
3304 dprintf (
"%s(): type = %d\n", __FUNCTION__, type);
3307 callbacks_render_type_changed ();
3312 callbacks_viewmenu_units_changed (GtkCheckMenuItem *widget, gpointer user_data) {
3313 gint unit = GPOINTER_TO_INT(user_data);
3315 if (unit < 0 || unit ==
screen.unit)
3318 dprintf (
"%s(): unit = %d, screen.unit = %d\n", __FUNCTION__, unit,
screen.unit);
3320 callbacks_units_changed (unit);
3325 callbacks_statusbar_unit_combo_box_changed (GtkComboBox *widget, gpointer user_data) {
3326 int unit = gtk_combo_box_get_active (widget);
3328 if (unit < 0 || unit ==
screen.unit)
3331 callbacks_units_changed (unit);
3336 callbacks_clear_messages_button_clicked (GtkButton *button, gpointer user_data) {
3337 GtkTextBuffer *textbuffer;
3338 GtkTextIter start, end;
3342 textbuffer = gtk_text_view_get_buffer((GtkTextView*)
screen.win.messageTextView);
3343 gtk_text_buffer_get_start_iter(textbuffer, &start);
3344 gtk_text_buffer_get_end_iter(textbuffer, &end);
3345 gtk_text_buffer_delete (textbuffer, &start, &end);
3350 callbacks_handle_log_messages(
const gchar *log_domain, GLogLevelFlags log_level,
3351 const gchar *message, gpointer user_data)
3353 GtkTextBuffer *textbuffer = NULL;
3356 GtkTextMark *StartMark = NULL, *StopMark = NULL;
3357 GtkTextIter StartIter, StopIter;
3358 GtkWidget *dialog, *label;
3360 if (!
screen.win.messageTextView)
3363 textbuffer = gtk_text_view_get_buffer((GtkTextView*)
screen.win.messageTextView);
3366 gtk_text_buffer_get_end_iter(textbuffer, &iter);
3370 StartMark = gtk_text_buffer_create_mark(textbuffer,
3371 "NewTextStart", &iter, TRUE);
3373 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
3377 tag = gtk_text_buffer_create_tag(textbuffer,
"black_foreground",
3378 "foreground",
"black", NULL);
3379 tag = gtk_text_buffer_create_tag(textbuffer,
"blue_foreground",
3380 "foreground",
"blue", NULL);
3381 tag = gtk_text_buffer_create_tag(textbuffer,
"red_foreground",
3382 "foreground",
"red", NULL);
3383 tag = gtk_text_buffer_create_tag(textbuffer,
"darkred_foreground",
3384 "foreground",
"darkred", NULL);
3385 tag = gtk_text_buffer_create_tag(textbuffer,
"darkblue_foreground",
3386 "foreground",
"darkblue", NULL);
3387 tag = gtk_text_buffer_create_tag (textbuffer,
"darkgreen_foreground",
3388 "foreground",
"darkgreen", NULL);
3389 tag = gtk_text_buffer_create_tag (textbuffer,
3390 "saddlebrown_foreground",
3391 "foreground",
"saddlebrown", NULL);
3398 switch (log_level & G_LOG_LEVEL_MASK) {
3399 case G_LOG_LEVEL_ERROR:
3401 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
3403 gtk_notebook_set_current_page(GTK_NOTEBOOK(
screen.win.sidepane_notebook), 1);
3404 gtk_widget_show(
screen.win.sidepane_notebook);
3406 case G_LOG_LEVEL_CRITICAL:
3407 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
3409 gtk_notebook_set_current_page(GTK_NOTEBOOK(
screen.win.sidepane_notebook), 1);
3410 gtk_widget_show(
screen.win.sidepane_notebook);
3412 case G_LOG_LEVEL_WARNING:
3413 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
3414 "darkred_foreground");
3415 gtk_notebook_set_current_page(GTK_NOTEBOOK(
screen.win.sidepane_notebook), 1);
3416 gtk_widget_show(
screen.win.sidepane_notebook);
3418 case G_LOG_LEVEL_MESSAGE:
3419 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
3420 "darkblue_foreground");
3421 gtk_notebook_set_current_page(GTK_NOTEBOOK(
screen.win.sidepane_notebook), 1);
3422 gtk_widget_show(
screen.win.sidepane_notebook);
3424 case G_LOG_LEVEL_INFO:
3425 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
3426 "darkgreen_foreground");
3428 case G_LOG_LEVEL_DEBUG:
3429 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
3430 "saddlebrown_foreground");
3433 tag = gtk_text_tag_table_lookup (gtk_text_buffer_get_tag_table(textbuffer),
3434 "black_foreground");
3441 if (log_level & G_LOG_FLAG_FATAL) {
3442 fprintf(stderr, _(
"Fatal error: %s\n"), message);
3445 dialog = gtk_dialog_new_with_buttons(_(
"Fatal Error"),
3446 NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
3447 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
3449 label = gtk_label_new(g_strdup_printf(_(
"Fatal error: %s"), message));
3450 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),
3452 gtk_label_set_selectable(GTK_LABEL(label), TRUE);
3453 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),
3454 gtk_label_new(_(
"\nGerbv will be closed now!")));
3456 gtk_container_set_border_width(GTK_CONTAINER(dialog), 5);
3458 gtk_widget_show_all(dialog);
3459 gtk_dialog_run(GTK_DIALOG(dialog));
3462 gtk_text_buffer_insert(textbuffer, &iter, message, -1);
3463 gtk_text_buffer_insert(textbuffer, &iter,
"\n", -1);
3465 gtk_text_buffer_get_end_iter(textbuffer, &iter);
3467 StopMark = gtk_text_buffer_create_mark(textbuffer,
3468 "NewTextStop", &iter, TRUE);
3470 gtk_text_buffer_get_iter_at_mark(textbuffer, &StartIter, StartMark);
3471 gtk_text_buffer_get_iter_at_mark(textbuffer, &StopIter, StopMark);
3473 gtk_text_buffer_apply_tag(textbuffer, tag, &StartIter, &StopIter);
3477 void callbacks_force_expose_event_for_screen (
void){
3479 GdkRectangle update_rect;
3487 gdk_window_invalidate_rect (
screen.drawing_area->window, &update_rect, FALSE);
3490 callbacks_update_ruler_scales ();
3491 callbacks_update_scrollbar_limits ();
3492 callbacks_update_scrollbar_positions ();
3495 static double screen_units(
double d) {
3498 return COORD2INS(d);
3501 return COORD2MILS(d);
3504 return COORD2MMS(d);
3511 static double line_length(
double x0,
double y0,
double x1,
double y1) {
3512 double dx = x0 - x1;
3513 double dy = y0 - y1;
3515 return sqrt(dx*dx + dy*dy);
3518 static double arc_length(
double dia,
double angle) {
3519 return M_PI*dia*(angle/360.0);
3522 static void aperture_report(gerbv_aperture_t *apertures[],
int aperture_num) {
3524 double *params = apertures[aperture_num]->parameter;
3526 g_message (_(
" Aperture used: D%d"), aperture_num);
3527 g_message (_(
" Aperture type: %s"), aperture_names[type]);
3531 g_message (_(
" Diameter: %g"),
3532 screen_units(params[0]));
3536 g_message (_(
" Dimensions: %gx%g"),
3537 screen_units(params[0]),
3538 screen_units(params[1]));