Commit b68041954603518a4d76e5eab4ddbc0ccdcc33b8

Authored by perry.werneck@gmail.com
1 parent bce19738

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",&registry,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 }
... ...