Commit 600d45c413eacefb2908652736fc654b5c69700d
1 parent
983dcc99
Exists in
master
and in
5 other branches
Conteúdo do clipboard passa a ficar guardado no widget no formato original da li…
…b3270 para permitir a futura implementação de cópia com formatação
Showing
3 changed files
with
85 additions
and
87 deletions
Show diff stats
src/pw3270/v3270/private.h
| ... | ... | @@ -152,7 +152,11 @@ G_BEGIN_DECLS |
| 152 | 152 | GSource * timer; |
| 153 | 153 | GtkIMContext * input_method; |
| 154 | 154 | unsigned short keyflags; |
| 155 | - gchar * clipboard; /**< Clipboard contents (text only) */ | |
| 155 | + | |
| 156 | + struct | |
| 157 | + { | |
| 158 | + char * text; /**< Clipboard contents (lib3270 charset) */ | |
| 159 | + } selection; | |
| 156 | 160 | |
| 157 | 161 | LIB3270_CURSOR pointer_id; |
| 158 | 162 | unsigned char pointer; /**< Mouse pointer ID */ | ... | ... |
src/pw3270/v3270/selection.c
| ... | ... | @@ -63,11 +63,17 @@ static void clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection, |
| 63 | 63 | |
| 64 | 64 | switch(target) |
| 65 | 65 | { |
| 66 | - case CLIPBOARD_TYPE_TEXT: | |
| 67 | - if(!widget->clipboard) | |
| 66 | + case CLIPBOARD_TYPE_TEXT: /* Get clipboard contents as text */ | |
| 67 | + if(!widget->selection.text) | |
| 68 | + { | |
| 68 | 69 | lib3270_ring_bell(widget->host); |
| 70 | + } | |
| 69 | 71 | else |
| 70 | - gtk_selection_data_set_text(selection,widget->clipboard,-1); | |
| 72 | + { | |
| 73 | + gchar * text = g_convert(widget->selection.text, -1, "UTF-8", lib3270_get_charset(widget->host), NULL, NULL, NULL); | |
| 74 | + gtk_selection_data_set_text(selection,text,-1); | |
| 75 | + g_free(text); | |
| 76 | + } | |
| 71 | 77 | break; |
| 72 | 78 | |
| 73 | 79 | default: |
| ... | ... | @@ -96,46 +102,11 @@ gchar * v3270_get_text(GtkWidget *widget, int offset, int len) |
| 96 | 102 | return text; |
| 97 | 103 | } |
| 98 | 104 | |
| 99 | -/** | |
| 100 | - * Get lib3270 selection as a g_malloc buffer. | |
| 101 | - * | |
| 102 | - * @param widget Widget containing the desired section. | |
| 103 | - * | |
| 104 | - * @return NULL if error, otherwise the selected buffer contents (release with g_free). | |
| 105 | - * | |
| 106 | - */ /* | |
| 107 | -static gchar * v3270_get_selected(v3270 *widget) | |
| 108 | -{ | |
| 109 | - gchar *text = lib3270_get_selected(widget->host); | |
| 110 | - if(text) | |
| 111 | - { | |
| 112 | - gchar *str = g_strdup(text); | |
| 113 | - lib3270_free(text); | |
| 114 | - return str; | |
| 115 | - } | |
| 116 | - return NULL; | |
| 117 | -} | |
| 118 | - | |
| 119 | -static gchar * v3270_cut_selected(v3270 *widget) | |
| 120 | -{ | |
| 121 | - gchar *text = lib3270_cut_selected(widget->host); | |
| 122 | - if(text) | |
| 123 | - { | |
| 124 | - gchar *str = g_strdup(text); | |
| 125 | - lib3270_free(text); | |
| 126 | - return str; | |
| 127 | - } | |
| 128 | - return NULL; | |
| 129 | -} | |
| 130 | -*/ | |
| 131 | - | |
| 132 | -gchar * v3270_get_selected(GtkWidget *widget, gboolean cut) | |
| 105 | +static const char * update_selected_text(GtkWidget *widget, gboolean cut) | |
| 133 | 106 | { |
| 134 | 107 | v3270 * terminal; |
| 135 | 108 | char * text; |
| 136 | 109 | |
| 137 | - g_return_val_if_fail(GTK_IS_V3270(widget),NULL); | |
| 138 | - | |
| 139 | 110 | terminal = GTK_V3270(widget); |
| 140 | 111 | |
| 141 | 112 | v3270_clear_clipboard(terminal); |
| ... | ... | @@ -227,32 +198,77 @@ gchar * v3270_get_selected(GtkWidget *widget, gboolean cut) |
| 227 | 198 | text = g_string_free(buffer,FALSE); |
| 228 | 199 | } |
| 229 | 200 | |
| 230 | - terminal->clipboard = g_convert(text, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL); | |
| 201 | + return terminal->selection.text = text; | |
| 231 | 202 | |
| 232 | - lib3270_free(text); | |
| 203 | +} | |
| 233 | 204 | |
| 205 | +/** | |
| 206 | + * Get lib3270 selection as a g_malloc buffer. | |
| 207 | + * | |
| 208 | + * @param widget Widget containing the desired section. | |
| 209 | + * | |
| 210 | + * @return NULL if error, otherwise the selected buffer contents (release with g_free). | |
| 211 | + * | |
| 212 | + */ | |
| 213 | +gchar * v3270_get_selected(GtkWidget *widget, gboolean cut) | |
| 214 | +{ | |
| 215 | + const char *text; | |
| 216 | + | |
| 217 | + g_return_val_if_fail(GTK_IS_V3270(widget),NULL); | |
| 234 | 218 | |
| 235 | - return g_strdup(terminal->clipboard); | |
| 219 | + text = update_selected_text(widget,cut); | |
| 220 | + | |
| 221 | + if(text) | |
| 222 | + return g_convert(text, -1, "UTF-8", lib3270_get_charset(GTK_V3270(widget)->host), NULL, NULL, NULL); | |
| 223 | + | |
| 224 | + return NULL; | |
| 236 | 225 | } |
| 237 | 226 | |
| 238 | 227 | gchar * v3270_get_copy(GtkWidget *widget) |
| 239 | 228 | { |
| 229 | + const char *text; | |
| 240 | 230 | g_return_val_if_fail(GTK_IS_V3270(widget),NULL); |
| 241 | - return g_strdup(GTK_V3270(widget)->clipboard); | |
| 231 | + | |
| 232 | + text = update_selected_text(widget,FALSE); | |
| 233 | + | |
| 234 | + if(text) | |
| 235 | + return g_convert(text, -1, "UTF-8", lib3270_get_charset(GTK_V3270(widget)->host), NULL, NULL, NULL); | |
| 236 | + | |
| 237 | + return NULL; | |
| 238 | +} | |
| 239 | + | |
| 240 | +static void update_system_clipboard(GtkWidget *widget) | |
| 241 | +{ | |
| 242 | + if(GTK_V3270(widget)->selection.text) | |
| 243 | + { | |
| 244 | + GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD); | |
| 245 | + | |
| 246 | + if(gtk_clipboard_set_with_owner( clipboard, | |
| 247 | + targets, | |
| 248 | + G_N_ELEMENTS(targets), | |
| 249 | + (GtkClipboardGetFunc) clipboard_get, | |
| 250 | + (GtkClipboardClearFunc) clipboard_clear, | |
| 251 | + G_OBJECT(widget) | |
| 252 | + )) | |
| 253 | + { | |
| 254 | + gtk_clipboard_set_can_store(clipboard,targets,1); | |
| 255 | + } | |
| 256 | + | |
| 257 | + g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); | |
| 258 | + } | |
| 242 | 259 | } |
| 243 | 260 | |
| 261 | + | |
| 244 | 262 | void v3270_copy_append(GtkWidget *widget) |
| 245 | 263 | { |
| 246 | 264 | v3270 * terminal; |
| 247 | 265 | char * str; |
| 248 | - gchar * text; | |
| 249 | - gchar * clip; | |
| 250 | 266 | |
| 251 | 267 | g_return_if_fail(GTK_IS_V3270(widget)); |
| 252 | 268 | |
| 253 | 269 | terminal = GTK_V3270(widget); |
| 254 | 270 | |
| 255 | - if(!terminal->clipboard) | |
| 271 | + if(!terminal->selection.text) | |
| 256 | 272 | { |
| 257 | 273 | // Clipboard is empty, do a single copy |
| 258 | 274 | v3270_copy(widget, V3270_SELECT_TEXT, FALSE); |
| ... | ... | @@ -261,54 +277,36 @@ void v3270_copy_append(GtkWidget *widget) |
| 261 | 277 | |
| 262 | 278 | str = lib3270_get_selected(terminal->host); |
| 263 | 279 | |
| 264 | - if(!str) | |
| 265 | - return; | |
| 266 | - | |
| 267 | - text = g_convert(str, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL); | |
| 268 | - | |
| 269 | - lib3270_free(str); | |
| 280 | + if(str) | |
| 281 | + { | |
| 282 | + size_t len = strlen(terminal->selection.text)+strlen(str)+2; | |
| 270 | 283 | |
| 271 | - clip = g_strconcat(terminal->clipboard,"\n",text,NULL); | |
| 284 | + terminal->selection.text = lib3270_realloc(terminal->selection.text,len); | |
| 272 | 285 | |
| 273 | - g_free(text); | |
| 274 | - v3270_clear_clipboard(terminal); | |
| 286 | + strncat(terminal->selection.text,"\n",len); | |
| 287 | + strncat(terminal->selection.text,str,len); | |
| 275 | 288 | |
| 276 | - terminal->clipboard = clip; | |
| 289 | + lib3270_free(str); | |
| 290 | + } | |
| 277 | 291 | |
| 278 | - gtk_clipboard_set_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),terminal->clipboard,-1); | |
| 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); | |
| 279 | 296 | |
| 280 | 297 | g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); |
| 298 | +*/ | |
| 299 | + | |
| 300 | + update_system_clipboard(widget); | |
| 281 | 301 | |
| 282 | 302 | } |
| 283 | 303 | |
| 284 | 304 | void v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode, gboolean cut) |
| 285 | 305 | { |
| 286 | - gchar * text; | |
| 287 | - GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD); | |
| 288 | - | |
| 289 | 306 | g_return_if_fail(GTK_IS_V3270(widget)); |
| 290 | - | |
| 291 | 307 | GTK_V3270(widget)->table = (mode == V3270_SELECT_TABLE ? 1 : 0); |
| 292 | - | |
| 293 | - text = v3270_get_selected(widget,cut); | |
| 294 | - | |
| 295 | - if(text) | |
| 296 | - { | |
| 297 | - if(gtk_clipboard_set_with_owner( clipboard, | |
| 298 | - targets, | |
| 299 | - G_N_ELEMENTS(targets), | |
| 300 | - (GtkClipboardGetFunc) clipboard_get, | |
| 301 | - (GtkClipboardClearFunc) clipboard_clear, | |
| 302 | - G_OBJECT(widget) | |
| 303 | - )) | |
| 304 | - { | |
| 305 | - gtk_clipboard_set_can_store(clipboard,targets,1); | |
| 306 | - } | |
| 307 | - | |
| 308 | - g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); | |
| 309 | - g_free(text); | |
| 310 | - } | |
| 311 | - | |
| 308 | + update_selected_text(widget,cut); | |
| 309 | + update_system_clipboard(widget); | |
| 312 | 310 | } |
| 313 | 311 | |
| 314 | 312 | void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding) | ... | ... |
src/pw3270/v3270/widget.c
| ... | ... | @@ -897,11 +897,7 @@ GtkWidget * v3270_new(void) |
| 897 | 897 | |
| 898 | 898 | void v3270_clear_clipboard(v3270 *terminal) |
| 899 | 899 | { |
| 900 | - if(terminal->clipboard) | |
| 901 | - { | |
| 902 | - g_free(terminal->clipboard); | |
| 903 | - terminal->clipboard = NULL; | |
| 904 | - } | |
| 900 | + terminal->selection.text = lib3270_free(terminal->selection.text); | |
| 905 | 901 | } |
| 906 | 902 | |
| 907 | 903 | #if GTK_CHECK_VERSION(3,0,0) | ... | ... |