From f4743ff85ad29d6665ee5ea9c6458dc9333aa17c Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Wed, 31 Jul 2019 14:22:15 -0300 Subject: [PATCH] Updating print dialog. --- src/pw3270/linux/print.c | 6 +++--- src/pw3270/print.c | 368 ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ src/pw3270/windows/print.c | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 187 insertions(+), 371 deletions(-) diff --git a/src/pw3270/linux/print.c b/src/pw3270/linux/print.c index fe3f2ab..8e3b92b 100644 --- a/src/pw3270/linux/print.c +++ b/src/pw3270/linux/print.c @@ -87,8 +87,8 @@ } -void setup_print_dialog(GtkPrintOperation * operation) -{ + void setup_print_dialog(GtkPrintOperation * operation) + { GtkPrintSettings * settings = gtk_print_settings_new(); GtkPageSetup * setup = gtk_page_setup_new(); GtkPaperSize * papersize = NULL; @@ -138,5 +138,5 @@ void setup_print_dialog(GtkPrintOperation * operation) gtk_page_setup_set_paper_size_and_default_margins(setup,papersize); gtk_print_operation_set_default_page_setup(operation,setup); -} + } diff --git a/src/pw3270/print.c b/src/pw3270/print.c index 23a2958..bce17bc 100644 --- a/src/pw3270/print.c +++ b/src/pw3270/print.c @@ -40,42 +40,6 @@ /*--[ Implement ]------------------------------------------------------------------------------------*/ -#ifdef _WIN32 - -#define save_string(h,k,v) save_settings(k,v,h) -#define save_double(h,k,v) registry_set_double(h,k,v) - -static void save_settings(const gchar *key, const gchar *value, HKEY hKey) -{ - RegSetValueEx(hKey,key,0,REG_SZ,(const BYTE *) value,strlen(value)+1); -} - -/* - * From: http://git.gnome.org/browse/gtk+/tree/gtk/gtkpagesetup.c - * something like this should really be in gobject! - * - * I Agree!! (Perry Werneck) - * - */ -static gchar * enum_to_string(GType type, guint enum_value) -{ - GEnumClass *enum_class; - GEnumValue *value; - gchar *retval = NULL; - - enum_class = g_type_class_ref (type); - - value = g_enum_get_value(enum_class, enum_value); - if (value) - retval = g_strdup (value->value_nick); - - g_type_class_unref (enum_class); - - return retval; -} - -#endif // _WIN32 - static void show_print_error(GtkWidget *widget, GError *err) { GtkWidget *dialog = gtk_message_dialog_new_with_markup( GTK_WINDOW(gtk_widget_get_toplevel(widget)), @@ -188,262 +152,6 @@ static gchar * enum_to_string(GType type, guint enum_value) } */ -#ifdef _WIN32 - void update_settings(const gchar *key, const gchar *val, gpointer *settings) - { - trace("%s: %s=\"%s\"",__FUNCTION__,key,val); - gtk_print_settings_set(GTK_PRINT_SETTINGS(settings), key, val); - } - - // From https://git.gnome.org/browse/gtk+/tree/gtk/gtkprintutils.h - #define MM_PER_INCH 25.4 - #define POINTS_PER_INCH 72 - - // From https://git.gnome.org/browse/gtk+/tree/gtk/gtkprintutils.c - static gdouble _gtk_print_convert_from_mm (gdouble len, GtkUnit unit) - { - switch (unit) - { - case GTK_UNIT_MM: - return len; - case GTK_UNIT_INCH: - return len / MM_PER_INCH; - - default: - g_warning ("Unsupported unit"); - - /* Fall through */ - case GTK_UNIT_POINTS: - return len / (MM_PER_INCH / POINTS_PER_INCH); - break; - } - } - -#endif // _WIN32 - -#if GTK_CHECK_VERSION(3,0,0) && !defined(WIN32) -/* -*/ -#endif // !WIN32 - -/* - static GtkPrintOperation * begin_print_operation(GObject *obj, GtkWidget *widget, PRINT_INFO **info) - { - GtkPrintOperation * print = gtk_print_operation_new(); - GtkPrintSettings * settings = gtk_print_settings_new(); - GtkPageSetup * setup = gtk_page_setup_new(); - GtkPaperSize * papersize = NULL; - - *info = g_new0(PRINT_INFO,1); - (*info)->session = v3270_get_session(widget); - (*info)->cols = 80; - (*info)->widget = widget; - - // Basic setup - gtk_print_operation_set_allow_async(print,get_boolean_from_config("print","allow_async",TRUE)); - - if(obj) - { - const gchar * attr = (const gchar *) g_object_get_data(obj,"jobname"); - if(attr) - gtk_print_operation_set_job_name(print,attr); - } - - gtk_print_operation_set_custom_tab_label(print, _( "Options" ) ); - gtk_print_operation_set_show_progress(print,TRUE); - - // Common signals - g_signal_connect(print,"done",G_CALLBACK(done),*info); - -#if GTK_CHECK_VERSION(3,0,0) && !defined(WIN32) - g_signal_connect(print,"create-custom-widget",G_CALLBACK(create_custom_widget), *info); - g_signal_connect(print,"custom-widget-apply",G_CALLBACK(custom_widget_apply), *info); -#else - { - g_autofree gchar *color_scheme = get_string_from_config("print","colors",""); - - if(color_scheme && *color_scheme) - v3270_set_color_table((*info)->color,color_scheme); - else - v3270_set_mono_color_table((*info)->color,"black","white"); - - } -#endif // !_WIN32 - - // Load page and print settings - { -#ifdef ENABLE_WINDOWS_REGISTRY - - HKEY registry; - - if(get_registry_handle("print",®istry,KEY_READ)) - { - HKEY hKey; - DWORD disp; - gchar * attr = g_object_get_data(obj,"papersize"); - - registry_foreach(registry,"settings",update_settings,(gpointer) settings); - - if(RegCreateKeyEx(registry,"pagesetup",0,NULL,REG_OPTION_NON_VOLATILE,KEY_READ,NULL,&hKey,&disp) == ERROR_SUCCESS) - { - gdouble val; - - #define load_double(h,k,s) if(registry_get_double(h,k,&val)) s(setup, val,GTK_UNIT_MM); - - load_double(hKey, "MarginTop", gtk_page_setup_set_top_margin ); - load_double(hKey, "MarginBottom", gtk_page_setup_set_bottom_margin ); - load_double(hKey, "MarginLeft", gtk_page_setup_set_left_margin ); - load_double(hKey, "MarginRight", gtk_page_setup_set_right_margin ); - - RegCloseKey(hKey); - } - - if(attr) - { - // Paper is defined in xml, use it - papersize = gtk_paper_size_new(attr); - } - else if(RegCreateKeyEx(registry,"paper",0,NULL,REG_OPTION_NON_VOLATILE,KEY_READ,NULL,&hKey,&disp) == ERROR_SUCCESS) - { - // Use saved paper size - // Reference: https://git.gnome.org/browse/gtk+/tree/gtk/gtkpapersize.c - struct _papersettings - { - const gchar * name; - gchar * value; - } papersettings[] = - { - { "PPDName", NULL }, - { "Name", NULL }, - { "DisplayName", NULL } - }; - - int f; - gdouble width, height; - - // Read paper settings - registry_get_double(hKey, "Width", &width); - registry_get_double(hKey, "Height", &height); - - for(f=0;fmessage); - g_error_free(err); - err = NULL; - } - - if(!gtk_page_setup_load_key_file(setup,conf,"page_setup",&err)) - { - g_warning("Error getting page setup: %s",err->message); - g_error_free(err); - err = NULL; - } - - if(attr) - { - // Paper is defined in xml, use it - papersize = gtk_paper_size_new(attr); - } - else if(g_key_file_has_group(conf,"paper_size")) - { - // Use saved paper size - GError *err = NULL; - - papersize = gtk_paper_size_new_from_key_file(conf,"paper_size",&err); - if(err) - { - g_warning("Error loading paper size: %s",err->message); - g_error_free(err); - } - - trace("Papersize: %p",papersize); - } - else - { - // Create default - papersize = gtk_paper_size_new(NULL); - } - -#endif - } - - // Finish settings - gtk_print_operation_set_print_settings(print,settings); - gtk_page_setup_set_paper_size_and_default_margins(setup,papersize); - gtk_print_operation_set_default_page_setup(print,setup); - - trace("%s ends",__FUNCTION__); - return print; - } - */ - void print_all_action(GtkAction *action, GtkWidget *widget) { pw3270_print(widget,G_OBJECT(action),GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, LIB3270_CONTENT_ALL); @@ -513,80 +221,8 @@ static gchar * enum_to_string(GType type, guint enum_value) } - /* - LIB3270_EXPORT int pw3270_print(GtkWidget *widget, GObject *action, GtkPrintOperationAction oper, LIB3270_CONTENT_OPTION src) + void print_settings_action(GtkAction *action, GtkWidget *terminal) { - PRINT_INFO * info = NULL; - GtkPrintOperation * print; - gchar * text; - GError * err = NULL; - - #ifdef X3270_TRACE - if(action) - lib3270_trace_event(v3270_get_session(widget),"Action %s activated on widget %p\n",gtk_action_get_name(GTK_ACTION(action)),widget); - #endif - - g_return_val_if_fail(GTK_IS_V3270(widget),EINVAL); - - print = begin_print_operation(action,widget,&info); - if(!print) - return -1; - - lib3270_get_screen_size(info->session,&info->rows,&info->cols); - - info->src = src; - - g_signal_connect(print,"begin_print",G_CALLBACK(begin_print),info); - - switch(src) - { - case LIB3270_CONTENT_ALL: - case LIB3270_CONTENT_SELECTED: - g_signal_connect(print,"draw_page",G_CALLBACK(draw_screen),info); - break; - - case LIB3270_CONTENT_COPY: - - text = v3270_get_copy(widget); - - if(text) - { - int r; - - info->text = g_strsplit(text,"\n",-1); - info->rows = g_strv_length(info->text); - - for(r=0;r < info->rows;r++) - { - size_t sz = strlen(info->text[r]); - if(sz > info->cols) - info->cols = sz; - } - g_free(text); - } - g_signal_connect(print,"draw_page",G_CALLBACK(draw_text),info); - break; - - - } - - // Run Print dialog - gtk_print_operation_run(print,oper,GTK_WINDOW(gtk_widget_get_toplevel(widget)),&err); - - if(err) - { - show_print_error(widget,err); - g_error_free(err); - } - - g_object_unref(print); - - return 0; - } - */ - -void print_settings_action(GtkAction *action, GtkWidget *terminal) -{ const gchar * title = g_object_get_data(G_OBJECT(action),"title"); GtkWidget * widget; GtkWidget * dialog = gtk_dialog_new_with_buttons ( gettext(title ? title : N_( "Print settings") ), @@ -640,4 +276,4 @@ void print_settings_action(GtkAction *action, GtkWidget *terminal) gtk_widget_destroy(dialog); -} + } diff --git a/src/pw3270/windows/print.c b/src/pw3270/windows/print.c index 324f4db..ad3bdad 100644 --- a/src/pw3270/windows/print.c +++ b/src/pw3270/windows/print.c @@ -27,18 +27,198 @@ * */ - #include "private.h" + #include "../private.h" #include #include #include #include + #define FONT_CONFIG "font-family" + #define DEFAULT_FONT "Courier New" /*--[ Implement ]------------------------------------------------------------------------------------*/ +#define save_string(h,k,v) save_settings(k,v,h) +#define save_double(h,k,v) registry_set_double(h,k,v) -void setup_print_dialog(GtkPrintOperation * operation) +static void save_settings(const gchar *key, const gchar *value, HKEY hKey) { + RegSetValueEx(hKey,key,0,REG_SZ,(const BYTE *) value,strlen(value)+1); +} + +/* + * From: http://git.gnome.org/browse/gtk+/tree/gtk/gtkpagesetup.c + * something like this should really be in gobject! + * + * I Agree!! (Perry Werneck) + * + */ +static gchar * enum_to_string(GType type, guint enum_value) +{ + GEnumClass *enum_class; + GEnumValue *value; + gchar *retval = NULL; + + enum_class = g_type_class_ref (type); + + value = g_enum_get_value(enum_class, enum_value); + if (value) + retval = g_strdup (value->value_nick); + + g_type_class_unref (enum_class); + return retval; } + void update_settings(const gchar *key, const gchar *val, gpointer *settings) + { + trace("%s: %s=\"%s\"",__FUNCTION__,key,val); + gtk_print_settings_set(GTK_PRINT_SETTINGS(settings), key, val); + } + + // From https://git.gnome.org/browse/gtk+/tree/gtk/gtkprintutils.h + #define MM_PER_INCH 25.4 + #define POINTS_PER_INCH 72 + + // From https://git.gnome.org/browse/gtk+/tree/gtk/gtkprintutils.c + static gdouble _gtk_print_convert_from_mm (gdouble len, GtkUnit unit) + { + switch (unit) + { + case GTK_UNIT_MM: + return len; + case GTK_UNIT_INCH: + return len / MM_PER_INCH; + + default: + g_warning ("Unsupported unit"); + + /* Fall through */ + case GTK_UNIT_POINTS: + return len / (MM_PER_INCH / POINTS_PER_INCH); + break; + } + } + + void setup_print_dialog(GtkPrintOperation * operation) + { + GtkPrintSettings * settings = gtk_print_settings_new(); + GtkPageSetup * setup = gtk_page_setup_new(); + GtkPaperSize * papersize = NULL; + +#ifdef ENABLE_WINDOWS_REGISTRY + + HKEY registry; + + if(get_registry_handle("print",®istry,KEY_READ)) + { + HKEY hKey; + DWORD disp; + + registry_foreach(registry,"settings",update_settings,(gpointer) settings); + + if(RegCreateKeyEx(registry,"pagesetup",0,NULL,REG_OPTION_NON_VOLATILE,KEY_READ,NULL,&hKey,&disp) == ERROR_SUCCESS) + { + gdouble val; + + #define load_double(h,k,s) if(registry_get_double(h,k,&val)) s(setup, val,GTK_UNIT_MM); + + load_double(hKey, "MarginTop", gtk_page_setup_set_top_margin ); + load_double(hKey, "MarginBottom", gtk_page_setup_set_bottom_margin ); + load_double(hKey, "MarginLeft", gtk_page_setup_set_left_margin ); + load_double(hKey, "MarginRight", gtk_page_setup_set_right_margin ); + + RegCloseKey(hKey); + } + + if(RegCreateKeyEx(registry,"paper",0,NULL,REG_OPTION_NON_VOLATILE,KEY_READ,NULL,&hKey,&disp) == ERROR_SUCCESS) + { + // Use saved paper size + // Reference: https://git.gnome.org/browse/gtk+/tree/gtk/gtkpapersize.c + struct _papersettings + { + const gchar * name; + gchar * value; + } papersettings[] = + { + { "PPDName", NULL }, + { "Name", NULL }, + { "DisplayName", NULL } + }; + + int f; + gdouble width, height; + + // Read paper settings + registry_get_double(hKey, "Width", &width); + registry_get_double(hKey, "Height", &height); + + for(f=0;f