diff --git a/src/gtk/actions.c b/src/gtk/actions.c index 60ff910..d7ea18c 100644 --- a/src/gtk/actions.c +++ b/src/gtk/actions.c @@ -97,13 +97,19 @@ static void reload_action(GtkAction *action, GtkWidget *widget) static void copy_action(GtkAction *action, GtkWidget *widget) { trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); - v3270_copy_clipboard(widget); + v3270_copy(widget); +} + +static void append_action(GtkAction *action, GtkWidget *widget) +{ + trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); + v3270_copy_append(widget); } static void paste_clipboard_action(GtkAction *action, GtkWidget *widget) { trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); - v3270_paste_clipboard(widget); + v3270_paste(widget); } static void paste_next_action(GtkAction *action, GtkWidget *widget) @@ -145,7 +151,6 @@ static void connect_standard_action(GtkAction *action, GtkWidget *widget, const { "activate", activate_action }, { "reload", reload_action }, { "connect", connect_action }, - { "copy", copy_action }, { "disconnect", disconnect_action }, { "hostname", hostname_action } }; @@ -409,6 +414,33 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash nm = g_strconcat(name,attr, NULL); } + else if(!g_strcasecmp(name,"copy")) + { + static const gchar * src[] = { "begin", + "table", + "image", + "append", + NULL + }; + + static const GCallback cbk[] = { G_CALLBACK(copy_action), + G_CALLBACK(nop_action), + G_CALLBACK(nop_action), + G_CALLBACK(append_action) + }; + callback = cbk; + action_type = ACTION_TYPE_TABLE; + attr = ui_get_attribute("mode",names,values); + + id = id_from_array(attr,src,error); + if(id < 0) + { + *error = g_error_new(ERROR_DOMAIN,EINVAL,_("Unexpected or invalid mode attribute: \"%s\"" ), attr); + return NULL; + } + + nm = g_strconcat(name,attr,NULL); + } else if(!g_strcasecmp(name,"save")) { static const GCallback cbk[] = { G_CALLBACK(save_all_action), diff --git a/src/gtk/v3270/clipboard.c b/src/gtk/v3270/clipboard.c index 9524a22..e1d2e80 100644 --- a/src/gtk/v3270/clipboard.c +++ b/src/gtk/v3270/clipboard.c @@ -127,26 +127,66 @@ const gchar * v3270_get_selected_text(GtkWidget *widget) return terminal->clipboard; } -void v3270_copy_clipboard(GtkWidget *widget) +const gchar * v3270_copy_append(GtkWidget *widget) +{ + v3270 * terminal; + char * str; + gchar * text; + gchar * clip; + + g_return_val_if_fail(GTK_IS_V3270(widget),NULL); + + terminal = GTK_V3270(widget); + + if(!terminal->clipboard) + return v3270_get_selected_text(widget); + + str = lib3270_get_selected(terminal->host); + + if(!str) + return terminal->clipboard; + + text = g_convert(str, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL); + + free(str); + + clip = g_strconcat(terminal->clipboard,"\n",text,NULL); + + g_free(text); + g_free(terminal->clipboard); + + terminal->clipboard = clip; + + gtk_clipboard_set_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),terminal->clipboard,-1); + + g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); + + + return terminal->clipboard; +} + +const gchar * v3270_copy(GtkWidget *widget) { const gchar * text = v3270_get_selected_text(widget); GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD); - if(!text) - return; - - if(gtk_clipboard_set_with_owner( clipboard, - targets, - G_N_ELEMENTS(targets), - (GtkClipboardGetFunc) clipboard_get, - (GtkClipboardClearFunc) clipboard_clear, - G_OBJECT(widget) - )) + if(text) { - gtk_clipboard_set_can_store(clipboard,targets,1); + if(gtk_clipboard_set_with_owner( clipboard, + targets, + G_N_ELEMENTS(targets), + (GtkClipboardGetFunc) clipboard_get, + (GtkClipboardClearFunc) clipboard_clear, + G_OBJECT(widget) + )) + { + gtk_clipboard_set_can_store(clipboard,targets,1); + } + + g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); } - g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); + return text; } @@ -281,7 +321,7 @@ static void text_received(GtkClipboard *clipboard, const gchar *text, GtkWidget v3270_paste_string(widget,text,"UTF-8"); } -void v3270_paste_clipboard(GtkWidget *widget) +void v3270_paste(GtkWidget *widget) { gtk_clipboard_request_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),(GtkClipboardTextReceivedFunc) text_received,(gpointer) widget); } diff --git a/src/gtk/v3270/v3270.h b/src/gtk/v3270/v3270.h index d6c6908..3674ec1 100644 --- a/src/gtk/v3270/v3270.h +++ b/src/gtk/v3270/v3270.h @@ -203,9 +203,11 @@ // Clipboard const gchar * v3270_get_selected_text(GtkWidget *widget); gchar * v3270_get_text(GtkWidget *widget); - void v3270_copy_clipboard(GtkWidget *widget); + const gchar * v3270_copy(GtkWidget *widget); + const gchar * v3270_copy_append(GtkWidget *widget); + + void v3270_paste(GtkWidget *widget); void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding); - void v3270_paste_clipboard(GtkWidget *widget); G_END_DECLS diff --git a/ui/00default.xml b/ui/00default.xml index 95ce747..f1454b1 100644 --- a/ui/00default.xml +++ b/ui/00default.xml @@ -49,10 +49,10 @@ - - - - + + + + @@ -135,7 +135,7 @@ - + -- libgit2 0.21.2