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