Commit 51b1179e660996ef53becdbb65fb8451d8e6b463
1 parent
0813b634
Exists in
master
and in
5 other branches
Implementando paste com conversao de charset
Showing
4 changed files
with
52 additions
and
78 deletions
Show diff stats
src/gtk/v3270/clipboard.c
| @@ -109,21 +109,23 @@ void v3270_copy_clipboard(v3270 *widget) | @@ -109,21 +109,23 @@ void v3270_copy_clipboard(v3270 *widget) | ||
| 109 | } | 109 | } |
| 110 | } | 110 | } |
| 111 | 111 | ||
| 112 | -static void paste_text(GtkWidget *widget, const gchar *text, const gchar *encoding) | 112 | +void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding) |
| 113 | { | 113 | { |
| 114 | - gchar *buffer = NULL; | ||
| 115 | - gchar *ptr; | ||
| 116 | - GError *error = NULL; | ||
| 117 | - H3270 *session = v3270_get_session(widget); | 114 | + gchar * buffer = NULL; |
| 115 | + H3270 * session = v3270_get_session(widget); | ||
| 116 | + const gchar * charset = lib3270_get_charset(session); | ||
| 117 | + gboolean next; | ||
| 118 | 118 | ||
| 119 | if(!text) | 119 | if(!text) |
| 120 | return; | 120 | return; |
| 121 | - | ||
| 122 | - buffer = g_convert(text, -1, lib3270_get_charset(session), encoding, NULL, NULL, &error); | 121 | + else if(g_strcasecmp(encoding,charset)) |
| 122 | + buffer = g_convert(text, -1, charset, encoding, NULL, NULL, NULL); | ||
| 123 | + else | ||
| 124 | + buffer = g_strdup(text); | ||
| 123 | 125 | ||
| 124 | if(!buffer) | 126 | if(!buffer) |
| 125 | { | 127 | { |
| 126 | - /* Falhou ao converter - Reajusta e tenta de novo */ | 128 | + /* Conversion failed, update special chars and try again */ |
| 127 | int f; | 129 | int f; |
| 128 | 130 | ||
| 129 | static const struct _xlat | 131 | static const struct _xlat |
| @@ -150,12 +152,6 @@ static void paste_text(GtkWidget *widget, const gchar *text, const gchar *encodi | @@ -150,12 +152,6 @@ static void paste_text(GtkWidget *widget, const gchar *text, const gchar *encodi | ||
| 150 | 152 | ||
| 151 | gchar *string = g_strdup(text); | 153 | gchar *string = g_strdup(text); |
| 152 | 154 | ||
| 153 | - if(error) | ||
| 154 | - { | ||
| 155 | - g_error_free(error); | ||
| 156 | - error = NULL; | ||
| 157 | - } | ||
| 158 | - | ||
| 159 | // FIXME (perry#1#): Is there any better way for a "sed" here? | 155 | // FIXME (perry#1#): Is there any better way for a "sed" here? |
| 160 | for(f=0;f<G_N_ELEMENTS(xlat);f++) | 156 | for(f=0;f<G_N_ELEMENTS(xlat);f++) |
| 161 | { | 157 | { |
| @@ -171,21 +167,17 @@ static void paste_text(GtkWidget *widget, const gchar *text, const gchar *encodi | @@ -171,21 +167,17 @@ static void paste_text(GtkWidget *widget, const gchar *text, const gchar *encodi | ||
| 171 | } | 167 | } |
| 172 | } | 168 | } |
| 173 | 169 | ||
| 174 | - buffer = g_convert(string, -1, lib3270_get_charset(session), encoding, NULL, NULL, &error); | 170 | + buffer = g_convert(string, -1, charset, encoding, NULL, NULL, NULL); |
| 175 | 171 | ||
| 176 | if(!buffer) | 172 | if(!buffer) |
| 177 | { | 173 | { |
| 174 | + // Still failing, convert line by line | ||
| 178 | gchar **ln = g_strsplit(string,"\n",-1); | 175 | gchar **ln = g_strsplit(string,"\n",-1); |
| 179 | 176 | ||
| 180 | for(f=0;ln[f];f++) | 177 | for(f=0;ln[f];f++) |
| 181 | { | 178 | { |
| 182 | - gchar *str = g_convert(ln[f], -1, lib3270_get_charset(session), encoding, NULL, NULL, &error); | ||
| 183 | - | ||
| 184 | - if(error) | ||
| 185 | - { | ||
| 186 | - g_error_free(error); | ||
| 187 | - error = 0; | ||
| 188 | - } | 179 | + GError *error = NULL; |
| 180 | + gchar *str = g_convert(ln[f], -1, charset, encoding, NULL, NULL, &error); | ||
| 189 | 181 | ||
| 190 | if(!str) | 182 | if(!str) |
| 191 | { | 183 | { |
| @@ -193,86 +185,57 @@ static void paste_text(GtkWidget *widget, const gchar *text, const gchar *encodi | @@ -193,86 +185,57 @@ static void paste_text(GtkWidget *widget, const gchar *text, const gchar *encodi | ||
| 193 | GTK_DIALOG_DESTROY_WITH_PARENT, | 185 | GTK_DIALOG_DESTROY_WITH_PARENT, |
| 194 | GTK_MESSAGE_ERROR, | 186 | GTK_MESSAGE_ERROR, |
| 195 | GTK_BUTTONS_OK, | 187 | GTK_BUTTONS_OK, |
| 196 | - _( "Can't convert line %d from %s to %s" ),f+1, encoding, lib3270_get_charset(session)); | 188 | + _( "Can't convert line %d from %s to %s" ),f+1, encoding, charset); |
| 197 | 189 | ||
| 198 | gtk_window_set_title(GTK_WINDOW(dialog), _( "Charset error" ) ); | 190 | gtk_window_set_title(GTK_WINDOW(dialog), _( "Charset error" ) ); |
| 199 | - if(error) | ||
| 200 | - { | ||
| 201 | - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s\n%s", error->message ? error->message : N_( "Unexpected error" ), ln[f]); | ||
| 202 | - g_error_free(error); | ||
| 203 | - error = 0; | ||
| 204 | - } | ||
| 205 | - else | ||
| 206 | - { | ||
| 207 | - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s", ln[f]); | ||
| 208 | - } | 191 | + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s\n%s",error->message, ln[f]); |
| 192 | + | ||
| 209 | gtk_dialog_run(GTK_DIALOG (dialog)); | 193 | gtk_dialog_run(GTK_DIALOG (dialog)); |
| 210 | gtk_widget_destroy(dialog); | 194 | gtk_widget_destroy(dialog); |
| 211 | - return; | ||
| 212 | 195 | ||
| 196 | + break; | ||
| 213 | } | 197 | } |
| 214 | else | 198 | else |
| 215 | { | 199 | { |
| 216 | g_free(str); | 200 | g_free(str); |
| 217 | } | 201 | } |
| 218 | - } | ||
| 219 | 202 | ||
| 203 | + } | ||
| 220 | g_strfreev(ln); | 204 | g_strfreev(ln); |
| 221 | - g_free(string); | ||
| 222 | - } | ||
| 223 | - | ||
| 224 | - g_free(string); | ||
| 225 | 205 | ||
| 226 | - if(error) | ||
| 227 | - { | ||
| 228 | - g_error_free(error); | ||
| 229 | - error = 0; | ||
| 230 | } | 206 | } |
| 231 | 207 | ||
| 232 | - | ||
| 233 | - if(!buffer) | ||
| 234 | - { | ||
| 235 | - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW( gtk_widget_get_toplevel(widget)), | ||
| 236 | - GTK_DIALOG_DESTROY_WITH_PARENT, | ||
| 237 | - GTK_MESSAGE_ERROR, | ||
| 238 | - GTK_BUTTONS_OK, | ||
| 239 | - _( "Can't convert text from %s to %s" ), encoding, lib3270_get_charset(session)); | ||
| 240 | - | ||
| 241 | - gtk_window_set_title(GTK_WINDOW(dialog), _( "Charset error" ) ); | ||
| 242 | - if(error) | ||
| 243 | - { | ||
| 244 | - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s", error->message ? error->message : N_( "Unexpected error" )); | ||
| 245 | - g_error_free(error); | ||
| 246 | - error = 0; | ||
| 247 | - } | ||
| 248 | - gtk_dialog_run(GTK_DIALOG (dialog)); | ||
| 249 | - gtk_widget_destroy(dialog); | ||
| 250 | - | ||
| 251 | - return; | ||
| 252 | - } | 208 | + g_free(string); |
| 253 | } | 209 | } |
| 254 | 210 | ||
| 255 | - if(error) | ||
| 256 | - g_error_free(error); | ||
| 257 | - | ||
| 258 | - /* Remove TABS */ | ||
| 259 | - for(ptr = buffer;*ptr;ptr++) | ||
| 260 | - { | ||
| 261 | - if(*ptr == '\t') | ||
| 262 | - *ptr = ' '; | ||
| 263 | - } | 211 | + if(buffer) |
| 212 | + { | ||
| 213 | + /* Remove TABS */ | ||
| 214 | + gchar *ptr; | ||
| 264 | 215 | ||
| 265 | - trace("Received text:%p (%d bytes)",buffer,(int) strlen(buffer)); | 216 | + for(ptr = buffer;*ptr;ptr++) |
| 217 | + { | ||
| 218 | + if(*ptr == '\t') | ||
| 219 | + *ptr = ' '; | ||
| 220 | + } | ||
| 221 | + } | ||
| 222 | + else | ||
| 223 | + { | ||
| 224 | + g_signal_emit(widget,v3270_widget_signal[SIGNAL_PASTENEXT], 0, FALSE); | ||
| 225 | + return; | ||
| 226 | + } | ||
| 266 | 227 | ||
| 267 | -// paste_string(buffer); | 228 | + next = lib3270_paste(session,buffer) ? TRUE : FALSE; |
| 268 | 229 | ||
| 269 | g_free(buffer); | 230 | g_free(buffer); |
| 270 | 231 | ||
| 232 | + g_signal_emit(widget,v3270_widget_signal[SIGNAL_PASTENEXT], 0, next); | ||
| 233 | + | ||
| 271 | } | 234 | } |
| 272 | 235 | ||
| 273 | static void text_received(GtkClipboard *clipboard, const gchar *text, GtkWidget *widget) | 236 | static void text_received(GtkClipboard *clipboard, const gchar *text, GtkWidget *widget) |
| 274 | { | 237 | { |
| 275 | - paste_text(widget,text,"UTF-8"); | 238 | + v3270_paste_string(widget,text,"UTF-8"); |
| 276 | } | 239 | } |
| 277 | 240 | ||
| 278 | void v3270_paste_clipboard(v3270 *widget) | 241 | void v3270_paste_clipboard(v3270 *widget) |
src/gtk/v3270/private.h
src/gtk/v3270/v3270.h
| @@ -202,9 +202,9 @@ | @@ -202,9 +202,9 @@ | ||
| 202 | 202 | ||
| 203 | // Clipboard | 203 | // Clipboard |
| 204 | void v3270_copy_clipboard(v3270 *widget); | 204 | void v3270_copy_clipboard(v3270 *widget); |
| 205 | + void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding); | ||
| 205 | void v3270_paste_clipboard(v3270 *widget); | 206 | void v3270_paste_clipboard(v3270 *widget); |
| 206 | 207 | ||
| 207 | - | ||
| 208 | G_END_DECLS | 208 | G_END_DECLS |
| 209 | 209 | ||
| 210 | #endif // V3270_H_INCLUDED | 210 | #endif // V3270_H_INCLUDED |
src/gtk/v3270/widget.c
| @@ -291,6 +291,16 @@ static void v3270_class_init(v3270Class *klass) | @@ -291,6 +291,16 @@ static void v3270_class_init(v3270Class *klass) | ||
| 291 | NULL, NULL, | 291 | NULL, NULL, |
| 292 | pw3270_BOOL__VOID_BOOL_BOOL_POINTER, | 292 | pw3270_BOOL__VOID_BOOL_BOOL_POINTER, |
| 293 | G_TYPE_BOOLEAN, 3, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_POINTER); | 293 | G_TYPE_BOOLEAN, 3, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_POINTER); |
| 294 | + | ||
| 295 | + v3270_widget_signal[SIGNAL_PASTENEXT] = | ||
| 296 | + g_signal_new( "pastenext", | ||
| 297 | + G_OBJECT_CLASS_TYPE (gobject_class), | ||
| 298 | + G_SIGNAL_RUN_FIRST, | ||
| 299 | + 0, | ||
| 300 | + NULL, NULL, | ||
| 301 | + pw3270_VOID__VOID_BOOL, | ||
| 302 | + G_TYPE_NONE, 1, G_TYPE_BOOLEAN); | ||
| 303 | + | ||
| 294 | } | 304 | } |
| 295 | 305 | ||
| 296 | void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int height) | 306 | void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int height) |
| @@ -456,7 +466,7 @@ static void v3270_init(v3270 *widget) | @@ -456,7 +466,7 @@ static void v3270_init(v3270 *widget) | ||
| 456 | 466 | ||
| 457 | if(widget->host->sz != sizeof(H3270)) | 467 | if(widget->host->sz != sizeof(H3270)) |
| 458 | { | 468 | { |
| 459 | - g_error(N_( "Unexpected signature in H3270 object, possible version mismatch in lib3270") ); | 469 | + g_error( _( "Unexpected signature in H3270 object, possible version mismatch in lib3270") ); |
| 460 | return; | 470 | return; |
| 461 | } | 471 | } |
| 462 | 472 |