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,6 +331,7 @@ static gchar * enum_to_string(GType type, guint enum_value) | ||
331 | gtk_page_setup_to_key_file(pgsetup,conf,"page_setup"); | 331 | gtk_page_setup_to_key_file(pgsetup,conf,"page_setup"); |
332 | gtk_paper_size_to_key_file(papersize,conf,"paper_size"); | 332 | gtk_paper_size_to_key_file(papersize,conf,"paper_size"); |
333 | #endif | 333 | #endif |
334 | + | ||
334 | } | 335 | } |
335 | 336 | ||
336 | if(info->font_scaled) | 337 | if(info->font_scaled) |
@@ -548,6 +549,31 @@ static gchar * enum_to_string(GType type, guint enum_value) | @@ -548,6 +549,31 @@ static gchar * enum_to_string(GType type, guint enum_value) | ||
548 | trace("%s: %s=\"%s\"",__FUNCTION__,key,val); | 549 | trace("%s: %s=\"%s\"",__FUNCTION__,key,val); |
549 | gtk_print_settings_set(GTK_PRINT_SETTINGS(settings), key, val); | 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 | #endif // WIN32 | 577 | #endif // WIN32 |
552 | 578 | ||
553 | static GtkPrintOperation * begin_print_operation(GObject *obj, GtkWidget *widget, PRINT_INFO **info) | 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,7 +581,7 @@ static gchar * enum_to_string(GType type, guint enum_value) | ||
555 | GtkPrintOperation * print = gtk_print_operation_new(); | 581 | GtkPrintOperation * print = gtk_print_operation_new(); |
556 | GtkPrintSettings * settings = gtk_print_settings_new(); | 582 | GtkPrintSettings * settings = gtk_print_settings_new(); |
557 | GtkPageSetup * setup = gtk_page_setup_new(); | 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 | *info = g_new0(PRINT_INFO,1); | 586 | *info = g_new0(PRINT_INFO,1); |
561 | (*info)->session = v3270_get_session(widget); | 587 | (*info)->session = v3270_get_session(widget); |
@@ -593,8 +619,9 @@ static gchar * enum_to_string(GType type, guint enum_value) | @@ -593,8 +619,9 @@ static gchar * enum_to_string(GType type, guint enum_value) | ||
593 | 619 | ||
594 | if(get_registry_handle("print",®istry,KEY_READ)) | 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 | registry_foreach(registry,"settings",update_settings,(gpointer) settings); | 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,13 +639,99 @@ static gchar * enum_to_string(GType type, guint enum_value) | ||
612 | RegCloseKey(hKey); | 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 | RegCloseKey(registry); | 728 | RegCloseKey(registry); |
617 | } | 729 | } |
618 | 730 | ||
619 | #else | 731 | #else |
620 | GKeyFile * conf = get_application_keyfile(); | 732 | GKeyFile * conf = get_application_keyfile(); |
621 | GError * err = NULL; | 733 | GError * err = NULL; |
734 | + gchar * attr = g_object_get_data(obj,"papersize"); | ||
622 | 735 | ||
623 | if(!gtk_print_settings_load_key_file(settings,conf,"print_settings",&err)) | 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,6 +747,31 @@ static gchar * enum_to_string(GType type, guint enum_value) | ||
634 | err = NULL; | 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 | #endif | 775 | #endif |
638 | } | 776 | } |
639 | 777 |
src/pw3270/v3270/selection.c
@@ -81,6 +81,14 @@ static void clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection, | @@ -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 | gchar * v3270_get_text(GtkWidget *widget, int offset, int len) | 92 | gchar * v3270_get_text(GtkWidget *widget, int offset, int len) |
85 | { | 93 | { |
86 | v3270 * terminal; | 94 | v3270 * terminal; |
@@ -139,7 +147,6 @@ static const char * update_selected_text(GtkWidget *widget, gboolean cut) | @@ -139,7 +147,6 @@ static const char * update_selected_text(GtkWidget *widget, gboolean cut) | ||
139 | { | 147 | { |
140 | int c; | 148 | int c; |
141 | gchar * ptr = ln[l]; | 149 | gchar * ptr = ln[l]; |
142 | -// GString * buffer; | ||
143 | 150 | ||
144 | for(c=0;c<width && *ptr;c++) | 151 | for(c=0;c<width && *ptr;c++) |
145 | { | 152 | { |
@@ -289,14 +296,6 @@ void v3270_copy_append(GtkWidget *widget) | @@ -289,14 +296,6 @@ void v3270_copy_append(GtkWidget *widget) | ||
289 | lib3270_free(str); | 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 | update_system_clipboard(widget); | 299 | update_system_clipboard(widget); |
301 | 300 | ||
302 | } | 301 | } |