Commit b68041954603518a4d76e5eab4ddbc0ccdcc33b8
1 parent
bce19738
Exists in
master
and in
5 other branches
Impressão passa a salvar/restaurar configuração do papel
Showing
2 changed files
with
150 additions
and
13 deletions
Show diff stats
src/pw3270/print.c
... | ... | @@ -331,6 +331,7 @@ static gchar * enum_to_string(GType type, guint enum_value) |
331 | 331 | gtk_page_setup_to_key_file(pgsetup,conf,"page_setup"); |
332 | 332 | gtk_paper_size_to_key_file(papersize,conf,"paper_size"); |
333 | 333 | #endif |
334 | + | |
334 | 335 | } |
335 | 336 | |
336 | 337 | if(info->font_scaled) |
... | ... | @@ -548,6 +549,31 @@ static gchar * enum_to_string(GType type, guint enum_value) |
548 | 549 | trace("%s: %s=\"%s\"",__FUNCTION__,key,val); |
549 | 550 | gtk_print_settings_set(GTK_PRINT_SETTINGS(settings), key, val); |
550 | 551 | } |
552 | + | |
553 | + // From https://git.gnome.org/browse/gtk+/tree/gtk/gtkprintutils.h | |
554 | + #define MM_PER_INCH 25.4 | |
555 | + #define POINTS_PER_INCH 72 | |
556 | + | |
557 | + // From https://git.gnome.org/browse/gtk+/tree/gtk/gtkprintutils.c | |
558 | + static gdouble _gtk_print_convert_from_mm (gdouble len, GtkUnit unit) | |
559 | + { | |
560 | + switch (unit) | |
561 | + { | |
562 | + case GTK_UNIT_MM: | |
563 | + return len; | |
564 | + case GTK_UNIT_INCH: | |
565 | + return len / MM_PER_INCH; | |
566 | + | |
567 | + default: | |
568 | + g_warning ("Unsupported unit"); | |
569 | + | |
570 | + /* Fall through */ | |
571 | + case GTK_UNIT_POINTS: | |
572 | + return len / (MM_PER_INCH / POINTS_PER_INCH); | |
573 | + break; | |
574 | + } | |
575 | + } | |
576 | + | |
551 | 577 | #endif // WIN32 |
552 | 578 | |
553 | 579 | static GtkPrintOperation * begin_print_operation(GObject *obj, GtkWidget *widget, PRINT_INFO **info) |
... | ... | @@ -555,7 +581,7 @@ static gchar * enum_to_string(GType type, guint enum_value) |
555 | 581 | GtkPrintOperation * print = gtk_print_operation_new(); |
556 | 582 | GtkPrintSettings * settings = gtk_print_settings_new(); |
557 | 583 | GtkPageSetup * setup = gtk_page_setup_new(); |
558 | - GtkPaperSize * papersize = gtk_paper_size_new((const gchar *) g_object_get_data(obj,"papersize")); | |
584 | + GtkPaperSize * papersize = NULL; | |
559 | 585 | |
560 | 586 | *info = g_new0(PRINT_INFO,1); |
561 | 587 | (*info)->session = v3270_get_session(widget); |
... | ... | @@ -593,8 +619,9 @@ static gchar * enum_to_string(GType type, guint enum_value) |
593 | 619 | |
594 | 620 | if(get_registry_handle("print",®istry,KEY_READ)) |
595 | 621 | { |
596 | - HKEY hKey; | |
597 | - DWORD disp; | |
622 | + HKEY hKey; | |
623 | + DWORD disp; | |
624 | + gchar * attr = g_object_get_data(obj,"papersize"); | |
598 | 625 | |
599 | 626 | registry_foreach(registry,"settings",update_settings,(gpointer) settings); |
600 | 627 | |
... | ... | @@ -612,13 +639,99 @@ static gchar * enum_to_string(GType type, guint enum_value) |
612 | 639 | RegCloseKey(hKey); |
613 | 640 | } |
614 | 641 | |
615 | - #warning Work in progress | |
642 | + if(attr) | |
643 | + { | |
644 | + // Paper is defined in xml, use it | |
645 | + papersize = gtk_paper_size_new(attr); | |
646 | + } | |
647 | + else if(RegCreateKeyEx(registry,"paper",0,NULL,REG_OPTION_NON_VOLATILE,KEY_READ,NULL,&hKey,&disp) == ERROR_SUCCESS) | |
648 | + { | |
649 | + // Use saved paper size | |
650 | + // Reference: https://git.gnome.org/browse/gtk+/tree/gtk/gtkpapersize.c | |
651 | + struct _papersettings | |
652 | + { | |
653 | + const gchar * name; | |
654 | + gchar * value; | |
655 | + } papersettings[] = | |
656 | + { | |
657 | + { "PPDName", NULL }, | |
658 | + { "Name", NULL }, | |
659 | + { "DisplayName", NULL } | |
660 | + }; | |
661 | + | |
662 | + int f; | |
663 | + gdouble width, height; | |
664 | + | |
665 | + // Read paper settings | |
666 | + registry_get_double(hKey, "Width", &width); | |
667 | + registry_get_double(hKey, "Height", &height); | |
668 | + | |
669 | + for(f=0;f<G_N_ELEMENTS(papersettings);f++) | |
670 | + { | |
671 | + BYTE data[4097]; | |
672 | + unsigned long datatype; | |
673 | + unsigned long datalen = 4096; | |
674 | + | |
675 | + if(RegQueryValueExA(hKey,papersettings[f].name,NULL,&datatype,data,&datalen) == ERROR_SUCCESS) | |
676 | + { | |
677 | + data[datalen+1] = 0; | |
678 | + trace("paper[%s]=\"%s\"",papersettings[f].name,data); | |
679 | + papersettings[f].value = g_strdup((gchar *) data); | |
680 | + } | |
681 | + } | |
682 | + | |
683 | + #define ppd_name papersettings[0].value | |
684 | + #define name papersettings[1].value | |
685 | + #define display_name papersettings[2].value | |
686 | + | |
687 | + if(!display_name) | |
688 | + display_name = g_strdup(name); | |
689 | + | |
690 | + if(ppd_name) | |
691 | + { | |
692 | + papersize = gtk_paper_size_new_from_ppd( ppd_name, | |
693 | + display_name, | |
694 | + _gtk_print_convert_from_mm(width,GTK_UNIT_POINTS), | |
695 | + _gtk_print_convert_from_mm(height,GTK_UNIT_POINTS)); | |
696 | + } | |
697 | + else if(name) | |
698 | + { | |
699 | + papersize = gtk_paper_size_new_custom(name, display_name,width, height, GTK_UNIT_MM); | |
700 | + } | |
701 | + else | |
702 | + { | |
703 | + g_warning("Invalid paper size settings, using defaults"); | |
704 | + papersize = gtk_paper_size_new(NULL); | |
705 | + } | |
706 | + | |
707 | + // Release memory | |
708 | + #undef ppd_name | |
709 | + #undef display_name | |
710 | + #undef name | |
711 | + | |
712 | + for(f=0;f<G_N_ELEMENTS(papersettings);f++) | |
713 | + { | |
714 | + if(papersettings[f].value) | |
715 | + g_free(papersettings[f].value); | |
716 | + } | |
717 | + | |
718 | + RegCloseKey(hKey); | |
719 | + | |
720 | + } | |
721 | + else | |
722 | + { | |
723 | + // Create default | |
724 | + papersize = gtk_paper_size_new(NULL); | |
725 | + } | |
726 | + | |
727 | + | |
616 | 728 | RegCloseKey(registry); |
617 | 729 | } |
618 | 730 | |
619 | 731 | #else |
620 | 732 | GKeyFile * conf = get_application_keyfile(); |
621 | 733 | GError * err = NULL; |
734 | + gchar * attr = g_object_get_data(obj,"papersize"); | |
622 | 735 | |
623 | 736 | if(!gtk_print_settings_load_key_file(settings,conf,"print_settings",&err)) |
624 | 737 | { |
... | ... | @@ -634,6 +747,31 @@ static gchar * enum_to_string(GType type, guint enum_value) |
634 | 747 | err = NULL; |
635 | 748 | } |
636 | 749 | |
750 | + if(attr) | |
751 | + { | |
752 | + // Paper is defined in xml, use it | |
753 | + papersize = gtk_paper_size_new(attr); | |
754 | + } | |
755 | + else if(g_key_file_has_group(conf,"paper_size")) | |
756 | + { | |
757 | + // Use saved paper size | |
758 | + GError *err = NULL; | |
759 | + | |
760 | + papersize = gtk_paper_size_new_from_key_file(conf,"paper_size",&err); | |
761 | + if(err) | |
762 | + { | |
763 | + g_warning("Error loading paper size: %s",err->message); | |
764 | + g_error_free(err); | |
765 | + } | |
766 | + | |
767 | + trace("Papersize: %p",papersize); | |
768 | + } | |
769 | + else | |
770 | + { | |
771 | + // Create default | |
772 | + papersize = gtk_paper_size_new(NULL); | |
773 | + } | |
774 | + | |
637 | 775 | #endif |
638 | 776 | } |
639 | 777 | ... | ... |
src/pw3270/v3270/selection.c
... | ... | @@ -81,6 +81,14 @@ static void clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection, |
81 | 81 | } |
82 | 82 | } |
83 | 83 | |
84 | +/** | |
85 | + * Get text at informed area. | |
86 | + * | |
87 | + * @param widget Widget. | |
88 | + * @param offset Offset of the desired text. | |
89 | + * @param len Number of characters to get. | |
90 | + * | |
91 | + */ | |
84 | 92 | gchar * v3270_get_text(GtkWidget *widget, int offset, int len) |
85 | 93 | { |
86 | 94 | v3270 * terminal; |
... | ... | @@ -139,7 +147,6 @@ static const char * update_selected_text(GtkWidget *widget, gboolean cut) |
139 | 147 | { |
140 | 148 | int c; |
141 | 149 | gchar * ptr = ln[l]; |
142 | -// GString * buffer; | |
143 | 150 | |
144 | 151 | for(c=0;c<width && *ptr;c++) |
145 | 152 | { |
... | ... | @@ -289,14 +296,6 @@ void v3270_copy_append(GtkWidget *widget) |
289 | 296 | lib3270_free(str); |
290 | 297 | } |
291 | 298 | |
292 | -/* | |
293 | - text = g_convert(terminal->selection.text, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL); | |
294 | - gtk_clipboard_set_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),text,-1); | |
295 | - g_free(text); | |
296 | - | |
297 | - g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); | |
298 | -*/ | |
299 | - | |
300 | 299 | update_system_clipboard(widget); |
301 | 300 | |
302 | 301 | } | ... | ... |