diff --git a/src/include/pw3270/v3270.h b/src/include/pw3270/v3270.h index 679ea91..461b152 100644 --- a/src/include/pw3270/v3270.h +++ b/src/include/pw3270/v3270.h @@ -155,12 +155,13 @@ V3270_SELECT_MAX } V3270_SELECT_FORMAT; - LIB3270_EXPORT const gchar * v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode, gboolean cut); - LIB3270_EXPORT const gchar * v3270_copy_append(GtkWidget *widget); + LIB3270_EXPORT void v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode, gboolean cut); + LIB3270_EXPORT void v3270_copy_append(GtkWidget *widget); + LIB3270_EXPORT gchar * v3270_get_selected(GtkWidget *widget, gboolean cut); + LIB3270_EXPORT gchar * v3270_get_copy(GtkWidget *widget); + LIB3270_EXPORT int v3270_run_script(GtkWidget *widget, const gchar *script); - LIB3270_EXPORT const gchar * v3270_get_selected_text(GtkWidget *widget, gboolean cut); - LIB3270_EXPORT const gchar * v3270_get_copy(GtkWidget *widget); LIB3270_EXPORT gchar * v3270_get_text(GtkWidget *widget,int offset, int len); LIB3270_EXPORT gchar * v3270_get_region(GtkWidget *widget, gint start_pos, gint end_pos, gboolean all); diff --git a/src/pw3270/dialog.c b/src/pw3270/dialog.c index 3f1ee5c..b24a5ea 100644 --- a/src/pw3270/dialog.c +++ b/src/pw3270/dialog.c @@ -326,24 +326,36 @@ void save_selected_action(GtkAction *action, GtkWidget *widget) { + gchar *text = v3270_get_selected(widget,FALSE); + trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); - save_dialog( action, - widget, - N_( "Save selection to file" ), - N_( "Can't save selection to file\n%s" ), - v3270_get_selected_text(widget,FALSE)); + if(text) + { + save_dialog( action, + widget, + N_( "Save selection to file" ), + N_( "Can't save selection to file\n%s" ), + text); + g_free(text); + } } void save_copy_action(GtkAction *action, GtkWidget *widget) { + gchar *text = v3270_get_copy(widget); + trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); - save_dialog( action, - widget, - N_( "Save copy to file" ), - N_( "Can't save copy to file\n%s" ), - v3270_get_copy(widget)); + if(text) + { + save_dialog( action, + widget, + N_( "Save copy to file" ), + N_( "Can't save copy to file\n%s" ), + text); + g_free(text); + } } static void paste_filename(GtkWidget *widget, const gchar *filename, const gchar *encoding) diff --git a/src/pw3270/print.c b/src/pw3270/print.c index 96d68ac..3dbd76e 100644 --- a/src/pw3270/print.c +++ b/src/pw3270/print.c @@ -690,7 +690,7 @@ static gchar * enum_to_string(GType type, guint enum_value) { PRINT_INFO * info = NULL; GtkPrintOperation * print; - const gchar * text; + gchar * text; GError * err = NULL; #ifdef X3270_TRACE @@ -735,6 +735,7 @@ static gchar * enum_to_string(GType type, guint enum_value) if(sz > info->cols) info->cols = sz; } + g_free(text); } g_signal_connect(print,"draw_page",G_CALLBACK(draw_text),info); break; diff --git a/src/pw3270/v3270/selection.c b/src/pw3270/v3270/selection.c index aace895..db56456 100644 --- a/src/pw3270/v3270/selection.c +++ b/src/pw3270/v3270/selection.c @@ -129,7 +129,7 @@ static gchar * v3270_cut_selected(v3270 *widget) } */ -const gchar * v3270_get_selected_text(GtkWidget *widget, gboolean cut) +gchar * v3270_get_selected(GtkWidget *widget, gboolean cut) { v3270 * terminal; char * text; @@ -232,38 +232,37 @@ const gchar * v3270_get_selected_text(GtkWidget *widget, gboolean cut) lib3270_free(text); - return terminal->clipboard; + return g_strdup(terminal->clipboard); } -const gchar * v3270_get_copy(GtkWidget *widget) +gchar * v3270_get_copy(GtkWidget *widget) { - v3270 *terminal; - g_return_val_if_fail(GTK_IS_V3270(widget),NULL); - - terminal = GTK_V3270(widget); - - return terminal->clipboard; + return g_strdup(GTK_V3270(widget)->clipboard); } -const gchar * v3270_copy_append(GtkWidget *widget) +void v3270_copy_append(GtkWidget *widget) { v3270 * terminal; char * str; gchar * text; gchar * clip; - g_return_val_if_fail(GTK_IS_V3270(widget),NULL); + g_return_if_fail(GTK_IS_V3270(widget)); terminal = GTK_V3270(widget); if(!terminal->clipboard) - return v3270_get_selected_text(widget,FALSE); + { + // Clipboard is empty, do a single copy + v3270_copy(widget, V3270_SELECT_TEXT, FALSE); + return; + } str = lib3270_get_selected(terminal->host); if(!str) - return terminal->clipboard; + return; text = g_convert(str, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL); @@ -280,19 +279,18 @@ const gchar * v3270_copy_append(GtkWidget *widget) g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); - return terminal->clipboard; } -const gchar * v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode, gboolean cut) +void v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode, gboolean cut) { - const gchar * text; + gchar * text; GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD); - g_return_val_if_fail(GTK_IS_V3270(widget),NULL); + g_return_if_fail(GTK_IS_V3270(widget)); GTK_V3270(widget)->table = (mode == V3270_SELECT_TABLE ? 1 : 0); - text = v3270_get_selected_text(widget,cut); + text = v3270_get_selected(widget,cut); if(text) { @@ -308,10 +306,9 @@ const gchar * v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode, gboolean c } g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); + g_free(text); } - return text; - } void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding) -- libgit2 0.21.2