Commit 83cb7db35174e5a739f31c79b104e0fe7ac2e1a0

Authored by perry.werneck@gmail.com
1 parent 3cf480d7
Exists in master and in 1 other branch develop

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
@@ -152,7 +152,11 @@ G_BEGIN_DECLS @@ -152,7 +152,11 @@ G_BEGIN_DECLS
152 GSource * timer; 152 GSource * timer;
153 GtkIMContext * input_method; 153 GtkIMContext * input_method;
154 unsigned short keyflags; 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 LIB3270_CURSOR pointer_id; 161 LIB3270_CURSOR pointer_id;
158 unsigned char pointer; /**< Mouse pointer ID */ 162 unsigned char pointer; /**< Mouse pointer ID */
@@ -63,11 +63,17 @@ static void clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection, @@ -63,11 +63,17 @@ static void clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection,
63 63
64 switch(target) 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 lib3270_ring_bell(widget->host); 69 lib3270_ring_bell(widget->host);
  70 + }
69 else 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 break; 77 break;
72 78
73 default: 79 default:
@@ -96,46 +102,11 @@ gchar * v3270_get_text(GtkWidget *widget, int offset, int len) @@ -96,46 +102,11 @@ gchar * v3270_get_text(GtkWidget *widget, int offset, int len)
96 return text; 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 v3270 * terminal; 107 v3270 * terminal;
135 char * text; 108 char * text;
136 109
137 - g_return_val_if_fail(GTK_IS_V3270(widget),NULL);  
138 -  
139 terminal = GTK_V3270(widget); 110 terminal = GTK_V3270(widget);
140 111
141 v3270_clear_clipboard(terminal); 112 v3270_clear_clipboard(terminal);
@@ -227,32 +198,77 @@ gchar * v3270_get_selected(GtkWidget *widget, gboolean cut) @@ -227,32 +198,77 @@ gchar * v3270_get_selected(GtkWidget *widget, gboolean cut)
227 text = g_string_free(buffer,FALSE); 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 gchar * v3270_get_copy(GtkWidget *widget) 227 gchar * v3270_get_copy(GtkWidget *widget)
239 { 228 {
  229 + const char *text;
240 g_return_val_if_fail(GTK_IS_V3270(widget),NULL); 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 void v3270_copy_append(GtkWidget *widget) 262 void v3270_copy_append(GtkWidget *widget)
245 { 263 {
246 v3270 * terminal; 264 v3270 * terminal;
247 char * str; 265 char * str;
248 - gchar * text;  
249 - gchar * clip;  
250 266
251 g_return_if_fail(GTK_IS_V3270(widget)); 267 g_return_if_fail(GTK_IS_V3270(widget));
252 268
253 terminal = GTK_V3270(widget); 269 terminal = GTK_V3270(widget);
254 270
255 - if(!terminal->clipboard) 271 + if(!terminal->selection.text)
256 { 272 {
257 // Clipboard is empty, do a single copy 273 // Clipboard is empty, do a single copy
258 v3270_copy(widget, V3270_SELECT_TEXT, FALSE); 274 v3270_copy(widget, V3270_SELECT_TEXT, FALSE);
@@ -261,54 +277,36 @@ void v3270_copy_append(GtkWidget *widget) @@ -261,54 +277,36 @@ void v3270_copy_append(GtkWidget *widget)
261 277
262 str = lib3270_get_selected(terminal->host); 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 g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); 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 void v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode, gboolean cut) 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 g_return_if_fail(GTK_IS_V3270(widget)); 306 g_return_if_fail(GTK_IS_V3270(widget));
290 -  
291 GTK_V3270(widget)->table = (mode == V3270_SELECT_TABLE ? 1 : 0); 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 void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding) 312 void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding)
@@ -897,11 +897,7 @@ GtkWidget * v3270_new(void) @@ -897,11 +897,7 @@ GtkWidget * v3270_new(void)
897 897
898 void v3270_clear_clipboard(v3270 *terminal) 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 #if GTK_CHECK_VERSION(3,0,0) 903 #if GTK_CHECK_VERSION(3,0,0)