Commit 983dcc9916d0bc0dec97aaf58ac88ff28cfec4cd
1 parent
950f31ce
Exists in
master
and in
5 other branches
Modificando tratamento do clipboard para permitir cópia formatada
Showing
4 changed files
with
46 additions
and
35 deletions
Show diff stats
src/include/pw3270/v3270.h
@@ -155,12 +155,13 @@ | @@ -155,12 +155,13 @@ | ||
155 | V3270_SELECT_MAX | 155 | V3270_SELECT_MAX |
156 | } V3270_SELECT_FORMAT; | 156 | } V3270_SELECT_FORMAT; |
157 | 157 | ||
158 | - LIB3270_EXPORT const gchar * v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode, gboolean cut); | ||
159 | - LIB3270_EXPORT const gchar * v3270_copy_append(GtkWidget *widget); | 158 | + LIB3270_EXPORT void v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode, gboolean cut); |
159 | + LIB3270_EXPORT void v3270_copy_append(GtkWidget *widget); | ||
160 | + LIB3270_EXPORT gchar * v3270_get_selected(GtkWidget *widget, gboolean cut); | ||
161 | + LIB3270_EXPORT gchar * v3270_get_copy(GtkWidget *widget); | ||
162 | + | ||
160 | LIB3270_EXPORT int v3270_run_script(GtkWidget *widget, const gchar *script); | 163 | LIB3270_EXPORT int v3270_run_script(GtkWidget *widget, const gchar *script); |
161 | 164 | ||
162 | - LIB3270_EXPORT const gchar * v3270_get_selected_text(GtkWidget *widget, gboolean cut); | ||
163 | - LIB3270_EXPORT const gchar * v3270_get_copy(GtkWidget *widget); | ||
164 | LIB3270_EXPORT gchar * v3270_get_text(GtkWidget *widget,int offset, int len); | 165 | LIB3270_EXPORT gchar * v3270_get_text(GtkWidget *widget,int offset, int len); |
165 | LIB3270_EXPORT gchar * v3270_get_region(GtkWidget *widget, gint start_pos, gint end_pos, gboolean all); | 166 | LIB3270_EXPORT gchar * v3270_get_region(GtkWidget *widget, gint start_pos, gint end_pos, gboolean all); |
166 | 167 |
src/pw3270/dialog.c
@@ -326,24 +326,36 @@ | @@ -326,24 +326,36 @@ | ||
326 | 326 | ||
327 | void save_selected_action(GtkAction *action, GtkWidget *widget) | 327 | void save_selected_action(GtkAction *action, GtkWidget *widget) |
328 | { | 328 | { |
329 | + gchar *text = v3270_get_selected(widget,FALSE); | ||
330 | + | ||
329 | trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); | 331 | trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); |
330 | 332 | ||
331 | - save_dialog( action, | ||
332 | - widget, | ||
333 | - N_( "Save selection to file" ), | ||
334 | - N_( "Can't save selection to file\n%s" ), | ||
335 | - v3270_get_selected_text(widget,FALSE)); | 333 | + if(text) |
334 | + { | ||
335 | + save_dialog( action, | ||
336 | + widget, | ||
337 | + N_( "Save selection to file" ), | ||
338 | + N_( "Can't save selection to file\n%s" ), | ||
339 | + text); | ||
340 | + g_free(text); | ||
341 | + } | ||
336 | } | 342 | } |
337 | 343 | ||
338 | void save_copy_action(GtkAction *action, GtkWidget *widget) | 344 | void save_copy_action(GtkAction *action, GtkWidget *widget) |
339 | { | 345 | { |
346 | + gchar *text = v3270_get_copy(widget); | ||
347 | + | ||
340 | trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); | 348 | trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); |
341 | 349 | ||
342 | - save_dialog( action, | ||
343 | - widget, | ||
344 | - N_( "Save copy to file" ), | ||
345 | - N_( "Can't save copy to file\n%s" ), | ||
346 | - v3270_get_copy(widget)); | 350 | + if(text) |
351 | + { | ||
352 | + save_dialog( action, | ||
353 | + widget, | ||
354 | + N_( "Save copy to file" ), | ||
355 | + N_( "Can't save copy to file\n%s" ), | ||
356 | + text); | ||
357 | + g_free(text); | ||
358 | + } | ||
347 | } | 359 | } |
348 | 360 | ||
349 | static void paste_filename(GtkWidget *widget, const gchar *filename, const gchar *encoding) | 361 | static void paste_filename(GtkWidget *widget, const gchar *filename, const gchar *encoding) |
src/pw3270/print.c
@@ -690,7 +690,7 @@ static gchar * enum_to_string(GType type, guint enum_value) | @@ -690,7 +690,7 @@ static gchar * enum_to_string(GType type, guint enum_value) | ||
690 | { | 690 | { |
691 | PRINT_INFO * info = NULL; | 691 | PRINT_INFO * info = NULL; |
692 | GtkPrintOperation * print; | 692 | GtkPrintOperation * print; |
693 | - const gchar * text; | 693 | + gchar * text; |
694 | GError * err = NULL; | 694 | GError * err = NULL; |
695 | 695 | ||
696 | #ifdef X3270_TRACE | 696 | #ifdef X3270_TRACE |
@@ -735,6 +735,7 @@ static gchar * enum_to_string(GType type, guint enum_value) | @@ -735,6 +735,7 @@ static gchar * enum_to_string(GType type, guint enum_value) | ||
735 | if(sz > info->cols) | 735 | if(sz > info->cols) |
736 | info->cols = sz; | 736 | info->cols = sz; |
737 | } | 737 | } |
738 | + g_free(text); | ||
738 | } | 739 | } |
739 | g_signal_connect(print,"draw_page",G_CALLBACK(draw_text),info); | 740 | g_signal_connect(print,"draw_page",G_CALLBACK(draw_text),info); |
740 | break; | 741 | break; |
src/pw3270/v3270/selection.c
@@ -129,7 +129,7 @@ static gchar * v3270_cut_selected(v3270 *widget) | @@ -129,7 +129,7 @@ static gchar * v3270_cut_selected(v3270 *widget) | ||
129 | } | 129 | } |
130 | */ | 130 | */ |
131 | 131 | ||
132 | -const gchar * v3270_get_selected_text(GtkWidget *widget, gboolean cut) | 132 | +gchar * v3270_get_selected(GtkWidget *widget, gboolean cut) |
133 | { | 133 | { |
134 | v3270 * terminal; | 134 | v3270 * terminal; |
135 | char * text; | 135 | char * text; |
@@ -232,38 +232,37 @@ const gchar * v3270_get_selected_text(GtkWidget *widget, gboolean cut) | @@ -232,38 +232,37 @@ const gchar * v3270_get_selected_text(GtkWidget *widget, gboolean cut) | ||
232 | lib3270_free(text); | 232 | lib3270_free(text); |
233 | 233 | ||
234 | 234 | ||
235 | - return terminal->clipboard; | 235 | + return g_strdup(terminal->clipboard); |
236 | } | 236 | } |
237 | 237 | ||
238 | -const gchar * v3270_get_copy(GtkWidget *widget) | 238 | +gchar * v3270_get_copy(GtkWidget *widget) |
239 | { | 239 | { |
240 | - v3270 *terminal; | ||
241 | - | ||
242 | g_return_val_if_fail(GTK_IS_V3270(widget),NULL); | 240 | g_return_val_if_fail(GTK_IS_V3270(widget),NULL); |
243 | - | ||
244 | - terminal = GTK_V3270(widget); | ||
245 | - | ||
246 | - return terminal->clipboard; | 241 | + return g_strdup(GTK_V3270(widget)->clipboard); |
247 | } | 242 | } |
248 | 243 | ||
249 | -const gchar * v3270_copy_append(GtkWidget *widget) | 244 | +void v3270_copy_append(GtkWidget *widget) |
250 | { | 245 | { |
251 | v3270 * terminal; | 246 | v3270 * terminal; |
252 | char * str; | 247 | char * str; |
253 | gchar * text; | 248 | gchar * text; |
254 | gchar * clip; | 249 | gchar * clip; |
255 | 250 | ||
256 | - g_return_val_if_fail(GTK_IS_V3270(widget),NULL); | 251 | + g_return_if_fail(GTK_IS_V3270(widget)); |
257 | 252 | ||
258 | terminal = GTK_V3270(widget); | 253 | terminal = GTK_V3270(widget); |
259 | 254 | ||
260 | if(!terminal->clipboard) | 255 | if(!terminal->clipboard) |
261 | - return v3270_get_selected_text(widget,FALSE); | 256 | + { |
257 | + // Clipboard is empty, do a single copy | ||
258 | + v3270_copy(widget, V3270_SELECT_TEXT, FALSE); | ||
259 | + return; | ||
260 | + } | ||
262 | 261 | ||
263 | str = lib3270_get_selected(terminal->host); | 262 | str = lib3270_get_selected(terminal->host); |
264 | 263 | ||
265 | if(!str) | 264 | if(!str) |
266 | - return terminal->clipboard; | 265 | + return; |
267 | 266 | ||
268 | text = g_convert(str, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL); | 267 | text = g_convert(str, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL); |
269 | 268 | ||
@@ -280,19 +279,18 @@ const gchar * v3270_copy_append(GtkWidget *widget) | @@ -280,19 +279,18 @@ const gchar * v3270_copy_append(GtkWidget *widget) | ||
280 | 279 | ||
281 | g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); | 280 | g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); |
282 | 281 | ||
283 | - return terminal->clipboard; | ||
284 | } | 282 | } |
285 | 283 | ||
286 | -const gchar * v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode, gboolean cut) | 284 | +void v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode, gboolean cut) |
287 | { | 285 | { |
288 | - const gchar * text; | 286 | + gchar * text; |
289 | GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD); | 287 | GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD); |
290 | 288 | ||
291 | - g_return_val_if_fail(GTK_IS_V3270(widget),NULL); | 289 | + g_return_if_fail(GTK_IS_V3270(widget)); |
292 | 290 | ||
293 | GTK_V3270(widget)->table = (mode == V3270_SELECT_TABLE ? 1 : 0); | 291 | GTK_V3270(widget)->table = (mode == V3270_SELECT_TABLE ? 1 : 0); |
294 | 292 | ||
295 | - text = v3270_get_selected_text(widget,cut); | 293 | + text = v3270_get_selected(widget,cut); |
296 | 294 | ||
297 | if(text) | 295 | if(text) |
298 | { | 296 | { |
@@ -308,10 +306,9 @@ const gchar * v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode, gboolean c | @@ -308,10 +306,9 @@ const gchar * v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode, gboolean c | ||
308 | } | 306 | } |
309 | 307 | ||
310 | g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); | 308 | g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); |
309 | + g_free(text); | ||
311 | } | 310 | } |
312 | 311 | ||
313 | - return text; | ||
314 | - | ||
315 | } | 312 | } |
316 | 313 | ||
317 | void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding) | 314 | void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding) |