From 51b1179e660996ef53becdbb65fb8451d8e6b463 Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Fri, 16 Mar 2012 02:56:19 +0000 Subject: [PATCH] Implementando paste com conversao de charset --- src/gtk/v3270/clipboard.c | 115 +++++++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------- src/gtk/v3270/private.h | 1 + src/gtk/v3270/v3270.h | 2 +- src/gtk/v3270/widget.c | 12 +++++++++++- 4 files changed, 52 insertions(+), 78 deletions(-) diff --git a/src/gtk/v3270/clipboard.c b/src/gtk/v3270/clipboard.c index 1a4667e..2e33386 100644 --- a/src/gtk/v3270/clipboard.c +++ b/src/gtk/v3270/clipboard.c @@ -109,21 +109,23 @@ void v3270_copy_clipboard(v3270 *widget) } } -static void paste_text(GtkWidget *widget, const gchar *text, const gchar *encoding) +void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding) { - gchar *buffer = NULL; - gchar *ptr; - GError *error = NULL; - H3270 *session = v3270_get_session(widget); + gchar * buffer = NULL; + H3270 * session = v3270_get_session(widget); + const gchar * charset = lib3270_get_charset(session); + gboolean next; if(!text) return; - - buffer = g_convert(text, -1, lib3270_get_charset(session), encoding, NULL, NULL, &error); + else if(g_strcasecmp(encoding,charset)) + buffer = g_convert(text, -1, charset, encoding, NULL, NULL, NULL); + else + buffer = g_strdup(text); if(!buffer) { - /* Falhou ao converter - Reajusta e tenta de novo */ + /* Conversion failed, update special chars and try again */ int f; static const struct _xlat @@ -150,12 +152,6 @@ static void paste_text(GtkWidget *widget, const gchar *text, const gchar *encodi gchar *string = g_strdup(text); - if(error) - { - g_error_free(error); - error = NULL; - } - // FIXME (perry#1#): Is there any better way for a "sed" here? for(f=0;fmessage ? error->message : N_( "Unexpected error" ), ln[f]); - g_error_free(error); - error = 0; - } - else - { - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s", ln[f]); - } + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s\n%s",error->message, ln[f]); + gtk_dialog_run(GTK_DIALOG (dialog)); gtk_widget_destroy(dialog); - return; + break; } else { g_free(str); } - } + } g_strfreev(ln); - g_free(string); - } - - g_free(string); - if(error) - { - g_error_free(error); - error = 0; } - - if(!buffer) - { - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW( gtk_widget_get_toplevel(widget)), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_OK, - _( "Can't convert text from %s to %s" ), encoding, lib3270_get_charset(session)); - - gtk_window_set_title(GTK_WINDOW(dialog), _( "Charset error" ) ); - if(error) - { - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s", error->message ? error->message : N_( "Unexpected error" )); - g_error_free(error); - error = 0; - } - gtk_dialog_run(GTK_DIALOG (dialog)); - gtk_widget_destroy(dialog); - - return; - } + g_free(string); } - if(error) - g_error_free(error); - - /* Remove TABS */ - for(ptr = buffer;*ptr;ptr++) - { - if(*ptr == '\t') - *ptr = ' '; - } + if(buffer) + { + /* Remove TABS */ + gchar *ptr; - trace("Received text:%p (%d bytes)",buffer,(int) strlen(buffer)); + for(ptr = buffer;*ptr;ptr++) + { + if(*ptr == '\t') + *ptr = ' '; + } + } + else + { + g_signal_emit(widget,v3270_widget_signal[SIGNAL_PASTENEXT], 0, FALSE); + return; + } -// paste_string(buffer); + next = lib3270_paste(session,buffer) ? TRUE : FALSE; g_free(buffer); + g_signal_emit(widget,v3270_widget_signal[SIGNAL_PASTENEXT], 0, next); + } static void text_received(GtkClipboard *clipboard, const gchar *text, GtkWidget *widget) { - paste_text(widget,text,"UTF-8"); + v3270_paste_string(widget,text,"UTF-8"); } void v3270_paste_clipboard(v3270 *widget) diff --git a/src/gtk/v3270/private.h b/src/gtk/v3270/private.h index 59023e3..f81dc1e 100644 --- a/src/gtk/v3270/private.h +++ b/src/gtk/v3270/private.h @@ -74,6 +74,7 @@ G_BEGIN_DECLS SIGNAL_MODEL_CHANGED, SIGNAL_SELECTING, SIGNAL_POPUP, + SIGNAL_PASTENEXT, LAST_SIGNAL }; diff --git a/src/gtk/v3270/v3270.h b/src/gtk/v3270/v3270.h index 39f8d3c..15c967d 100644 --- a/src/gtk/v3270/v3270.h +++ b/src/gtk/v3270/v3270.h @@ -202,9 +202,9 @@ // Clipboard void v3270_copy_clipboard(v3270 *widget); + void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding); void v3270_paste_clipboard(v3270 *widget); - G_END_DECLS #endif // V3270_H_INCLUDED diff --git a/src/gtk/v3270/widget.c b/src/gtk/v3270/widget.c index 5429ba7..0635caf 100644 --- a/src/gtk/v3270/widget.c +++ b/src/gtk/v3270/widget.c @@ -291,6 +291,16 @@ static void v3270_class_init(v3270Class *klass) NULL, NULL, pw3270_BOOL__VOID_BOOL_BOOL_POINTER, G_TYPE_BOOLEAN, 3, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_POINTER); + + v3270_widget_signal[SIGNAL_PASTENEXT] = + g_signal_new( "pastenext", + G_OBJECT_CLASS_TYPE (gobject_class), + G_SIGNAL_RUN_FIRST, + 0, + NULL, NULL, + pw3270_VOID__VOID_BOOL, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + } void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int height) @@ -456,7 +466,7 @@ static void v3270_init(v3270 *widget) if(widget->host->sz != sizeof(H3270)) { - g_error(N_( "Unexpected signature in H3270 object, possible version mismatch in lib3270") ); + g_error( _( "Unexpected signature in H3270 object, possible version mismatch in lib3270") ); return; } -- libgit2 0.21.2