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 | } | ... | ... |