diff --git a/src/include/lib3270.h b/src/include/lib3270.h index 6332905..e0f9ef7 100644 --- a/src/include/lib3270.h +++ b/src/include/lib3270.h @@ -745,6 +745,8 @@ */ LIB3270_EXPORT char * lib3270_get_selected(H3270 *h); + LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession); + /** * Get all text inside the terminal. * diff --git a/src/include/v3270.h b/src/include/v3270.h index fbee5e7..3d99c96 100644 --- a/src/include/v3270.h +++ b/src/include/v3270.h @@ -153,10 +153,10 @@ V3270_SELECT_MAX } V3270_SELECT_FORMAT; - LIB3270_EXPORT const gchar * v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode); + 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 const gchar * v3270_get_selected_text(GtkWidget *widget); + 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/lib3270/selection.c b/src/lib3270/selection.c index d80c75e..917d569 100644 --- a/src/lib3270/selection.c +++ b/src/lib3270/selection.c @@ -527,6 +527,19 @@ LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) return get_text(hSession,0); } +LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) +{ + if(!hSession->selected || hSession->select.start == hSession->select.end) + return NULL; + + if(!lib3270_connected(hSession)) + return NULL; + + + return NULL; +} + + LIB3270_EXPORT int lib3270_get_selection_bounds(H3270 *hSession, int *start, int *end) { int first, last; diff --git a/src/pw3270/actions.c b/src/pw3270/actions.c index 9ac0446..753a51e 100644 --- a/src/pw3270/actions.c +++ b/src/pw3270/actions.c @@ -113,7 +113,7 @@ static void reload_action(GtkAction *action, GtkWidget *widget) v3270_reload(widget); } -static void copy_action(GtkAction *action, GtkWidget *widget) +static void do_copy(GtkAction *action, GtkWidget *widget, gboolean cut) { V3270_SELECT_FORMAT mode = V3270_SELECT_TEXT; const gchar * str = (const gchar *) g_object_get_data(G_OBJECT(action),"format"); @@ -143,7 +143,17 @@ static void copy_action(GtkAction *action, GtkWidget *widget) } trace_action(action,widget); - v3270_copy(widget,mode); + v3270_copy(widget,mode,cut); +} + +static void copy_action(GtkAction *action, GtkWidget *widget) +{ + do_copy(action, widget, FALSE); +} + +static void cut_action(GtkAction *action, GtkWidget *widget) +{ + do_copy(action, widget, TRUE); } static void append_action(GtkAction *action, GtkWidget *widget) @@ -559,7 +569,17 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash callback = cbk; action_type = ACTION_TYPE_TABLE; id = ui_get_bool_attribute("append",names,values,FALSE) ? 1 : 0; - nm = g_strconcat(id == 0 ? "copy" : "append",ui_get_attribute("format",names,values),NULL); + nm = g_strconcat(id == 0 ? "copy" : "copyappend",ui_get_attribute("format",names,values),NULL); + } + else if(!g_ascii_strcasecmp(name,"cut")) + { + static const GCallback cbk[] = { G_CALLBACK(cut_action), + G_CALLBACK(cut_action) + }; + callback = cbk; + action_type = ACTION_TYPE_TABLE; + id = ui_get_bool_attribute("append",names,values,FALSE) ? 1 : 0; + nm = g_strconcat(id == 0 ? "cut" : "cutappend",ui_get_attribute("format",names,values),NULL); } else if(!g_ascii_strcasecmp(name,"select")) { diff --git a/src/pw3270/dialog.c b/src/pw3270/dialog.c index fb37990..5783360 100644 --- a/src/pw3270/dialog.c +++ b/src/pw3270/dialog.c @@ -421,7 +421,7 @@ widget, N_( "Save selection to file" ), N_( "Can't save selection to file\n%s" ), - v3270_get_selected_text(widget)); + v3270_get_selected_text(widget,FALSE)); } void save_copy_action(GtkAction *action, GtkWidget *widget) diff --git a/src/pw3270/v3270/selection.c b/src/pw3270/v3270/selection.c index 5f94413..60a8ca8 100644 --- a/src/pw3270/v3270/selection.c +++ b/src/pw3270/v3270/selection.c @@ -103,7 +103,7 @@ gchar * v3270_get_text(GtkWidget *widget, int offset, int len) * * @return NULL if error, otherwise the selected buffer contents (release with g_free). * - */ + */ /* static gchar * v3270_get_selected(v3270 *widget) { gchar *text = lib3270_get_selected(widget->host); @@ -116,10 +116,23 @@ static gchar * v3270_get_selected(v3270 *widget) return NULL; } -const gchar * v3270_get_selected_text(GtkWidget *widget) +static gchar * v3270_cut_selected(v3270 *widget) { - v3270 *terminal; - gchar *text; + gchar *text = lib3270_cut_selected(widget->host); + if(text) + { + gchar *str = g_strdup(text); + lib3270_free(text); + return str; + } + return NULL; +} +*/ + +const gchar * v3270_get_selected_text(GtkWidget *widget, gboolean cut) +{ + v3270 * terminal; + char * text; g_return_val_if_fail(GTK_IS_V3270(widget),NULL); @@ -131,7 +144,10 @@ const gchar * v3270_get_selected_text(GtkWidget *widget) terminal->clipboard = NULL; } - text = v3270_get_selected(terminal); + if(cut) + text = lib3270_cut_selected(terminal->host); + else + text = lib3270_get_selected(terminal->host); if(!text) { @@ -217,7 +233,7 @@ const gchar * v3270_get_selected_text(GtkWidget *widget) terminal->clipboard = g_convert(text, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL); - g_free(text); + lib3270_free(text); return terminal->clipboard; @@ -246,7 +262,7 @@ const gchar * v3270_copy_append(GtkWidget *widget) terminal = GTK_V3270(widget); if(!terminal->clipboard) - return v3270_get_selected_text(widget); + return v3270_get_selected_text(widget,FALSE); str = lib3270_get_selected(terminal->host); @@ -271,7 +287,7 @@ const gchar * v3270_copy_append(GtkWidget *widget) return terminal->clipboard; } -const gchar * v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode) +const gchar * v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode, gboolean cut) { const gchar * text; GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD); @@ -280,7 +296,7 @@ const gchar * v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode) GTK_V3270(widget)->table = (mode == V3270_SELECT_TABLE ? 1 : 0); - text = v3270_get_selected_text(widget); + text = v3270_get_selected_text(widget,cut); if(text) { diff --git a/ui/99debug.xml b/ui/99debug.xml index e5d43d1..676f602 100644 --- a/ui/99debug.xml +++ b/ui/99debug.xml @@ -32,6 +32,7 @@ + -- libgit2 0.21.2