Commit d6e1a58bda6ef2dc2d3a6032fea33a19cfd06c73

Authored by Perry Werneck
1 parent a2973972
Exists in master and in 1 other branch develop

Working in the new "save" dialog.

src/dialogs/save/private.h
... ... @@ -41,6 +41,8 @@
41 41  
42 42 GtkWidget * terminal;
43 43 GtkWidget * filename;
  44 + GtkWidget * charset;
  45 + GtkWidget * format;
44 46 LIB3270_CONTENT_OPTION mode;
45 47  
46 48 };
... ...
src/dialogs/save/save.c
... ... @@ -35,6 +35,28 @@
35 35  
36 36 G_DEFINE_TYPE(V3270SaveDialog, V3270SaveDialog, GTK_TYPE_DIALOG);
37 37  
  38 +/*--[ Formats ]--------------------------------------------------------------------------------------*/
  39 +
  40 + static const struct _formats
  41 + {
  42 + const gchar *name;
  43 + const gchar *extension;
  44 + } formats[] =
  45 + {
  46 + {
  47 + N_("Plain text"),
  48 + ".txt"
  49 + },
  50 + {
  51 + N_("Comma-separated values (CSV)"),
  52 + ".csv"
  53 + },
  54 + {
  55 + N_("HyperText Markup Language (HTML)"),
  56 + ".html"
  57 + }
  58 + };
  59 +
38 60 /*--[ Implement ]------------------------------------------------------------------------------------*/
39 61  
40 62 /*
... ... @@ -44,7 +66,7 @@
44 66 }
45 67 */
46 68  
47   - static void V3270SaveDialog_class_init(V3270SaveDialogClass *klass)
  69 + static void V3270SaveDialog_class_init(V3270SaveDialogClass G_GNUC_UNUSED(*klass))
48 70 {
49 71  
50 72 debug("%s",__FUNCTION__);
... ... @@ -64,6 +86,11 @@
64 86  
65 87 static void V3270SaveDialog_init(V3270SaveDialog *dialog)
66 88 {
  89 + // 0--------1---------------------2-------3------------------
  90 + // 0 - Filename xxxxxxxxx.xxxxxxxxx.xxxxxxxxx.xxxxxxxxx.xxxxxxxxx.
  91 + // 1 - Charset xxxxxxxxx.xxxxxxxxx. Format: xxxxxxxxx.xxxxxxxxx.
  92 +
  93 +
67 94 dialog->mode = LIB3270_CONTENT_ALL;
68 95  
69 96 gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE);
... ... @@ -82,57 +109,159 @@
82 109 gtk_grid_set_column_spacing(GTK_GRID(grid),12);
83 110 gtk_box_pack_start(box,GTK_WIDGET(grid),TRUE,TRUE,2);
84 111  
85   - dialog->filename = gtk_entry_new();
86   - gtk_widget_set_hexpand(GTK_WIDGET(dialog->filename),TRUE);
  112 + // Filename entry
  113 + {
  114 + dialog->filename = gtk_entry_new();
  115 + gtk_widget_set_hexpand(GTK_WIDGET(dialog->filename),TRUE);
87 116  
88   - widget = gtk_label_new_with_mnemonic("_Filename:");
89   - gtk_widget_set_halign(widget,GTK_ALIGN_END);
90   - gtk_widget_set_valign(widget,GTK_ALIGN_CENTER);
91   - gtk_grid_attach(grid,GTK_WIDGET(widget),0,0,1,1);
92   - gtk_label_set_mnemonic_widget(GTK_LABEL(widget),dialog->filename);
  117 + widget = gtk_label_new_with_mnemonic(_("_Filename"));
  118 + gtk_widget_set_halign(widget,GTK_ALIGN_END);
  119 + gtk_widget_set_valign(widget,GTK_ALIGN_CENTER);
  120 + gtk_grid_attach(grid,widget,0,0,1,1);
  121 + gtk_label_set_mnemonic_widget(GTK_LABEL(widget),dialog->filename);
93 122  
94 123 #ifdef WIN32
95   - widget = gtk_button_new_from_icon_name("document-open",GTK_ICON_SIZE_BUTTON);
96   - //g_signal_connect(G_OBJECT(widget),"clicked",G_CALLBACK(select_local_file),dialog);
97   - gtk_grid_attach(grid,widget,2,0,1,1);
  124 + widget = gtk_button_new_from_icon_name("document-open",GTK_ICON_SIZE_BUTTON);
  125 + //g_signal_connect(G_OBJECT(widget),"clicked",G_CALLBACK(select_local_file),dialog);
  126 + gtk_grid_attach(grid,widget,6,0,1,1);
98 127 #else
99   - gtk_entry_set_icon_from_icon_name(GTK_ENTRY(dialog->filename),GTK_ENTRY_ICON_SECONDARY,"document-open");
100   - gtk_entry_set_icon_activatable(GTK_ENTRY(dialog->filename),GTK_ENTRY_ICON_SECONDARY,TRUE);
101   - gtk_entry_set_icon_tooltip_text(GTK_ENTRY(dialog->filename),GTK_ENTRY_ICON_SECONDARY,_("Select file"));
102   - // g_signal_connect(G_OBJECT(dialog->filename),"icon-press",G_CALLBACK(icon_press),dialog);
  128 + gtk_entry_set_icon_from_icon_name(GTK_ENTRY(dialog->filename),GTK_ENTRY_ICON_SECONDARY,"document-open");
  129 + gtk_entry_set_icon_activatable(GTK_ENTRY(dialog->filename),GTK_ENTRY_ICON_SECONDARY,TRUE);
  130 + gtk_entry_set_icon_tooltip_text(GTK_ENTRY(dialog->filename),GTK_ENTRY_ICON_SECONDARY,_("Select file"));
  131 + // g_signal_connect(G_OBJECT(dialog->filename),"icon-press",G_CALLBACK(icon_press),dialog);
103 132 #endif // WIN32
104 133  
105   - gtk_entry_set_width_chars(GTK_ENTRY(dialog->filename),60);
106   - gtk_entry_set_max_length(GTK_ENTRY(dialog->filename),PATH_MAX);
107   - gtk_grid_attach(grid,GTK_WIDGET(dialog->filename),1,0,1,1);
  134 + gtk_entry_set_width_chars(GTK_ENTRY(dialog->filename),60);
  135 + gtk_entry_set_max_length(GTK_ENTRY(dialog->filename),PATH_MAX);
  136 + gtk_grid_attach(grid,GTK_WIDGET(dialog->filename),1,0,3,1);
  137 + }
  138 +
  139 + // Charset drop-down
  140 + {
  141 + static const struct _charsets
  142 + {
  143 + const gchar *name;
  144 + const gchar *description;
  145 + } charsets[] =
  146 + {
  147 + // http://en.wikipedia.org/wiki/Character_encoding
  148 + { "UTF-8", N_( "UTF-8" ) },
  149 + { "ISO-8859-1", N_( "Western Europe (ISO 8859-1)" ) },
  150 + { "CP1252", N_( "Windows Western languages (CP1252)" ) },
  151 + };
  152 +
  153 + size_t ix;
  154 + const gchar * scharset = NULL;
  155 +
  156 + widget = gtk_label_new_with_mnemonic (_("C_haracter Coding"));
  157 + gtk_widget_set_halign(widget,GTK_ALIGN_END);
  158 + gtk_widget_set_valign(widget,GTK_ALIGN_CENTER);
  159 + gtk_grid_attach(grid,widget,0,1,1,1);
  160 +
  161 + dialog->charset = gtk_combo_box_text_new();
  162 +
  163 + g_get_charset(&scharset);
  164 +
  165 + g_autofree gchar * text = g_strdup_printf(_("Current (%s)"),scharset);
  166 + gtk_combo_box_text_insert(
  167 + GTK_COMBO_BOX_TEXT(dialog->charset),
  168 + 0,
  169 + scharset,
  170 + text
  171 + );
  172 +
  173 + gtk_combo_box_set_active(GTK_COMBO_BOX(dialog->charset),0);
  174 +
  175 + gtk_grid_attach(grid,dialog->charset,1,1,1,1);
  176 +
  177 + for(ix=0;ix<G_N_ELEMENTS(charsets);ix++)
  178 + {
  179 + if(g_ascii_strcasecmp(charsets[ix].name,scharset))
  180 + {
  181 + gtk_combo_box_text_insert(
  182 + GTK_COMBO_BOX_TEXT(dialog->charset),
  183 + ix+1,
  184 + charsets[ix].name,
  185 + gettext(charsets[ix].description)
  186 + );
  187 + }
  188 + }
  189 +
  190 + }
  191 +
  192 + // Format drop-down
  193 + {
  194 + size_t ix;
  195 +
  196 + widget = gtk_label_new_with_mnemonic (_("File _Format"));
  197 + gtk_widget_set_halign(widget,GTK_ALIGN_END);
  198 + gtk_widget_set_valign(widget,GTK_ALIGN_CENTER);
  199 + gtk_grid_attach(grid,widget,2,1,1,1);
  200 +
  201 + dialog->format = gtk_combo_box_text_new();
  202 + gtk_grid_attach(grid,dialog->format,3,1,1,1);
  203 +
  204 + for(ix=0;ix<G_N_ELEMENTS(formats);ix++)
  205 + {
  206 + gtk_combo_box_text_insert(
  207 + GTK_COMBO_BOX_TEXT(dialog->format),
  208 + ix,
  209 + formats[ix].extension,
  210 + gettext(formats[ix].name)
  211 + );
  212 + }
  213 +
  214 + gtk_combo_box_set_active(GTK_COMBO_BOX(dialog->format),0);
  215 +
  216 + }
  217 +
108 218  
109 219 // Buttons
110 220 // https://developer.gnome.org/icon-naming-spec/
111 221 #if GTK_CHECK_VERSION(3,14,0)
112   -
113 222 widget = gtk_dialog_get_header_bar(GTK_DIALOG(dialog));
114   -
115   - button = gtk_button_new_with_mnemonic(_("_Cancel"));
116   - gtk_widget_set_tooltip_markup(button,_("Click to cancel operation"));
117   - gtk_header_bar_pack_start(GTK_HEADER_BAR(widget),button);
118   - g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(cancel_operation),dialog);
119   -
120   - button = gtk_button_new_with_mnemonic(_("_Save"));
121   - gtk_widget_set_tooltip_markup(button,_("Click to save file"));
122   - gtk_header_bar_pack_end(GTK_HEADER_BAR(widget),button);
123   - g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(apply_operation),dialog);
124   -
125 223 #else
126   -
127   - #error TODO!
128   -
  224 + widget = NULL;
129 225 #endif // GTK(3,14,0)
130 226  
  227 + if(widget)
  228 + {
  229 + // Have header bar
  230 + button = gtk_button_new_with_mnemonic(_("_Cancel"));
  231 + gtk_widget_set_tooltip_markup(button,_("Click to cancel operation"));
  232 + gtk_header_bar_pack_start(GTK_HEADER_BAR(widget),button);
  233 + g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(cancel_operation),dialog);
  234 +
  235 + button = gtk_button_new_with_mnemonic(_("_Save"));
  236 + gtk_widget_set_tooltip_markup(button,_("Click to save file"));
  237 + gtk_header_bar_pack_end(GTK_HEADER_BAR(widget),button);
  238 + g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(apply_operation),dialog);
  239 + }
  240 + else
  241 + {
  242 + gtk_dialog_add_buttons(
  243 + GTK_DIALOG (dialog),
  244 + _("_Cancel"), GTK_RESPONSE_CANCEL,
  245 + _("_Save"), GTK_RESPONSE_APPLY,
  246 + NULL
  247 + );
  248 + }
  249 +
131 250 }
132 251  
133 252 GtkWidget * v3270_save_dialog_new(GtkWidget *widget, LIB3270_CONTENT_OPTION mode, const gchar *filename)
134 253 {
135   - V3270SaveDialog * dialog = V3270_SAVE_DIALOG(g_object_new(GTK_TYPE_V3270SaveDialog,"use-header-bar", (gint) 1, NULL));
  254 + gboolean use_header;
  255 + g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL);
  256 +
  257 + // Create dialog
  258 + V3270SaveDialog * dialog = V3270_SAVE_DIALOG(
  259 + g_object_new(
  260 + GTK_TYPE_V3270SaveDialog,
  261 + "use-header-bar", (use_header ? 1 : 0),
  262 + NULL)
  263 + );
  264 +
136 265 dialog->mode = mode;
137 266  
138 267 if(filename)
... ...
src/include/clipboard.h
... ... @@ -87,12 +87,17 @@
87 87  
88 88 G_GNUC_INTERNAL void v3270_update_system_clipboard(GtkWidget *widget);
89 89 G_GNUC_INTERNAL const char * v3270_update_selected_text(GtkWidget *widget, gboolean cut);
90   - G_GNUC_INTERNAL GList * v3270_getColumns_from_selection(v3270 * terminal);
  90 + G_GNUC_INTERNAL GList * v3270_getColumns_from_selection(v3270 * terminal, const GList *selection);
91 91  
92 92 /// @brief Get contents.
93   - G_GNUC_INTERNAL gchar * v3270_get_copy_as_text(v3270 * terminal);
94   - G_GNUC_INTERNAL gchar * v3270_get_copy_as_html(v3270 * terminal);
95   - G_GNUC_INTERNAL gchar * v3270_get_copy_as_table(v3270 * terminal, const gchar *delimiter);
  93 + G_GNUC_INTERNAL gchar * v3270_get_selection_as_text(v3270 * terminal, const GList *selection, const gchar *encoding);
  94 + G_GNUC_INTERNAL gchar * v3270_get_selection_as_table(v3270 * terminal, const GList *selection, const gchar *delimiter, const gchar *encoding);
  95 +
  96 +
  97 +
  98 + G_GNUC_INTERNAL gchar * v3270_get_copy_as_text(v3270 * terminal, const gchar *encoding);
  99 + G_GNUC_INTERNAL gchar * v3270_get_copy_as_html(v3270 * terminal, const gchar *encoding);
  100 + G_GNUC_INTERNAL gchar * v3270_get_copy_as_table(v3270 * terminal, const gchar *delimiter, const gchar *encoding);
96 101 G_GNUC_INTERNAL gchar * v3270_get_copy_as_data_block(v3270 * terminal);
97 102  
98 103 /// @brief Set contents.
... ...
src/selection/html.c
... ... @@ -49,12 +49,12 @@ static void get_element_colors(v3270 * terminal, unsigned short attr, gchar **fg
49 49 }
50 50  
51 51 /// @brief Get formatted contents as HTML DIV.
52   -static gchar * get_as_div(v3270 * terminal)
  52 +static gchar * get_as_div(v3270 * terminal, const GList *selection)
53 53 {
54   - GList * element = terminal->selection.blocks;
55   - GString * string = g_string_new("");
56   - gchar * bgColor = gdk_rgba_to_string(terminal->color+V3270_COLOR_BACKGROUND);
57   - gchar * fgColor;
  54 + const GList * element = selection;
  55 + GString * string = g_string_new("");
  56 + gchar * bgColor = gdk_rgba_to_string(terminal->color+V3270_COLOR_BACKGROUND);
  57 + gchar * fgColor;
58 58  
59 59 g_string_append_printf(
60 60 string,
... ... @@ -67,7 +67,7 @@ static gchar * get_as_div(v3270 * terminal)
67 67  
68 68 while(element)
69 69 {
70   - lib3270_selection * block = ((lib3270_selection *) element->data);
  70 + const lib3270_selection * block = ((const lib3270_selection *) element->data);
71 71 unsigned int row, col, src = 0;
72 72 unsigned short flags = block->contents[0].attribute.visual;
73 73  
... ... @@ -144,9 +144,9 @@ static gchar * get_as_div(v3270 * terminal)
144 144 }
145 145  
146 146 /// @brief Get formatted contents as HTML TABLE.
147   -static gchar * get_as_table(v3270 * terminal)
  147 +static gchar * get_as_table(v3270 * terminal, const GList *selection)
148 148 {
149   - GList * element = terminal->selection.blocks;
  149 + const GList * element = selection;
150 150 GString * string = g_string_new("<table><tbody>");
151 151  
152 152 unsigned int width = lib3270_get_width(terminal->host);
... ... @@ -155,11 +155,11 @@ static gchar * get_as_table(v3270 * terminal)
155 155 GList * column;
156 156  
157 157 // Get contents
158   - GList * columns = v3270_getColumns_from_selection(terminal);
  158 + GList * columns = v3270_getColumns_from_selection(terminal, selection);
159 159  
160 160 while(element)
161 161 {
162   - lib3270_selection * block = ((lib3270_selection *) element->data);
  162 + const lib3270_selection * block = ((const lib3270_selection *) element->data);
163 163  
164 164 unsigned int row, col, src = 0;
165 165  
... ... @@ -214,14 +214,14 @@ static gchar * get_as_table(v3270 * terminal)
214 214  
215 215 }
216 216  
217   -gchar * v3270_get_copy_as_html(v3270 * terminal)
  217 +gchar * v3270_get_copy_as_html(v3270 * terminal, const gchar *encoding)
218 218 {
219 219 g_autofree char * text = NULL;
220 220  
221 221 if(terminal->selection.format == V3270_SELECT_TABLE)
222   - text = get_as_table(terminal);
  222 + text = get_as_table(terminal, terminal->selection.blocks);
223 223 else
224   - text = get_as_div(terminal);
  224 + text = get_as_div(terminal, terminal->selection.blocks);
225 225  
226   - return g_convert(text, -1, "UTF-8", lib3270_get_display_charset(terminal->host), NULL, NULL, NULL);
  226 + return g_convert(text, -1, (encoding ? encoding : "UTF-8"), lib3270_get_display_charset(terminal->host), NULL, NULL, NULL);
227 227 }
... ...
src/selection/linux/copy.c
... ... @@ -57,14 +57,14 @@ static void clipboard_get(G_GNUC_UNUSED GtkClipboard *clipboard, GtkSelectionDa
57 57 {
58 58 case CLIPBOARD_TYPE_TEXT: // Get clipboard contents as text
59 59 {
60   - g_autofree gchar *text = v3270_get_copy_as_text(terminal);
  60 + g_autofree gchar *text = v3270_get_copy_as_text(terminal,"UTF-8");
61 61 gtk_selection_data_set_text(selection,text,-1);
62 62 }
63 63 break;
64 64  
65 65 case CLIPBOARD_TYPE_CSV:
66 66 {
67   - g_autofree gchar *text = v3270_get_copy_as_table(terminal,";");
  67 + g_autofree gchar *text = v3270_get_copy_as_table(terminal,";","UTF-8");
68 68 debug("Selection:\n%s",text);
69 69 gtk_selection_data_set(
70 70 selection,
... ... @@ -78,7 +78,7 @@ static void clipboard_get(G_GNUC_UNUSED GtkClipboard *clipboard, GtkSelectionDa
78 78  
79 79 case CLIPBOARD_TYPE_HTML:
80 80 {
81   - g_autofree gchar *text = v3270_get_copy_as_html(terminal);
  81 + g_autofree gchar *text = v3270_get_copy_as_html(terminal,"UTF-8");
82 82 //debug("Selection:\n%s",text);
83 83 gtk_selection_data_set(
84 84 selection,
... ...
src/selection/table.c
... ... @@ -34,13 +34,11 @@
34 34 /*--[ Implement ]------------------------------------------------------------------------------------*/
35 35  
36 36 /// @brief Check if column has data.
37   -static gboolean hasDataOnColumn(v3270 * terminal, unsigned int col)
  37 +static gboolean hasDataOnColumn(v3270 * terminal, unsigned int col, const GList *selection)
38 38 {
39   - GList * element = terminal->selection.blocks;
40   -
41   - while(element)
  39 + while(selection)
42 40 {
43   - lib3270_selection * block = ((lib3270_selection *) element->data);
  41 + const lib3270_selection * block = ((const lib3270_selection *) selection->data);
44 42  
45 43 if( (col >= block->bounds.col) && ( col < (block->bounds.col + block->bounds.width)) )
46 44 {
... ... @@ -58,14 +56,14 @@ static gboolean hasDataOnColumn(v3270 * terminal, unsigned int col)
58 56  
59 57 }
60 58  
61   - element = g_list_next(element);
  59 + selection = g_list_next(selection);
62 60 }
63 61  
64 62 return FALSE;
65 63 }
66 64  
67 65 /// @brief Get column list.
68   -GList * v3270_getColumns_from_selection(v3270 * terminal)
  66 +GList * v3270_getColumns_from_selection(v3270 * terminal, const GList *selection)
69 67 {
70 68 unsigned int col = 0;
71 69 GList *rc = NULL;
... ... @@ -75,7 +73,7 @@ GList * v3270_getColumns_from_selection(v3270 * terminal)
75 73 // debug("col(%u): %s", col, hasDataOnColumn(terminal,col) ? "yes" : "no");
76 74  
77 75 // Get first column.
78   - while(!hasDataOnColumn(terminal,col)) {
  76 + while(!hasDataOnColumn(terminal,col,selection)) {
79 77 if(col >= lib3270_get_width(terminal->host))
80 78 return rc;
81 79 col++;
... ... @@ -87,7 +85,7 @@ GList * v3270_getColumns_from_selection(v3270 * terminal)
87 85 rc = g_list_append(rc,columndescription);
88 86  
89 87 // Get width.
90   - while(hasDataOnColumn(terminal,col++)) {
  88 + while(hasDataOnColumn(terminal,col++,selection)) {
91 89 columndescription->width++;
92 90 if(col >= lib3270_get_width(terminal->host))
93 91 return rc;
... ... @@ -98,12 +96,11 @@ GList * v3270_getColumns_from_selection(v3270 * terminal)
98 96  
99 97 }
100 98  
101   -/// @brief Get formatted contents as single text.
102   -gchar * v3270_get_copy_as_table(v3270 * terminal, const gchar *delimiter)
  99 +gchar * v3270_get_selection_as_table(v3270 * terminal, const GList *selection, const gchar *delimiter, const gchar *encoding)
103 100 {
104 101 GString * string = g_string_new("");
105 102  
106   - GList * columns = v3270_getColumns_from_selection(terminal);
  103 + GList * columns = v3270_getColumns_from_selection(terminal, selection);
107 104  
108 105 debug("columns=%p",columns);
109 106  
... ... @@ -121,7 +118,7 @@ gchar * v3270_get_copy_as_table(v3270 * terminal, const gchar *delimiter)
121 118 }
122 119 #endif // DEBUG
123 120  
124   - GList * element = terminal->selection.blocks;
  121 + GList * element = selection;
125 122 unsigned int width = lib3270_get_width(terminal->host);
126 123 g_autofree gchar * line = g_malloc0(width+1);
127 124 GList * column;
... ... @@ -167,5 +164,12 @@ gchar * v3270_get_copy_as_table(v3270 * terminal, const gchar *delimiter)
167 164 g_list_free_full(columns,g_free);
168 165  
169 166 g_autofree char * text = g_string_free(string,FALSE);
170   - return g_convert(text, -1, "UTF-8", lib3270_get_display_charset(terminal->host), NULL, NULL, NULL);
  167 + return g_convert(text, -1, (encoding ? encoding : "UTF-8"), lib3270_get_display_charset(terminal->host), NULL, NULL, NULL);
171 168 }
  169 +
  170 +/// @brief Get formatted contents as single text.
  171 +gchar * v3270_get_copy_as_table(v3270 * terminal, const gchar *delimiter, const gchar *encoding)
  172 +{
  173 + return v3270_get_selection_as_table(terminal, terminal->selection.blocks, delimiter, encoding);
  174 +}
  175 +
... ...
src/selection/text.c
... ... @@ -33,14 +33,13 @@
33 33 /*--[ Implement ]------------------------------------------------------------------------------------*/
34 34  
35 35 /// @brief Get formatted contents as single text.
36   -static gchar * get_as_text(v3270 * terminal)
  36 +gchar * v3270_get_selection_as_text(v3270 * terminal, const GList *selection, const gchar *encoding)
37 37 {
38   - GList * element = terminal->selection.blocks;
39   - GString * string = g_string_new("");
  38 + GString * string = g_string_new("");
40 39  
41   - while(element)
  40 + while(selection)
42 41 {
43   - lib3270_selection * block = ((lib3270_selection *) element->data);
  42 + lib3270_selection * block = ((lib3270_selection *) selection->data);
44 43 unsigned int row, col, src = 0;
45 44  
46 45 for(row=0; row < block->bounds.height; row++)
... ... @@ -56,20 +55,20 @@ static gchar * get_as_text(v3270 * terminal)
56 55 g_string_append_c(string,'\n');
57 56 }
58 57  
59   - element = g_list_next(element);
  58 + selection = g_list_next(selection);
60 59 }
61 60  
62 61 g_autofree char * text = g_string_free(string,FALSE);
63   - return g_convert(text, -1, "UTF-8", lib3270_get_display_charset(terminal->host), NULL, NULL, NULL);
  62 +
  63 + return g_convert(text, -1, (encoding ? encoding : "UTF-8"), lib3270_get_display_charset(terminal->host), NULL, NULL, NULL);
64 64  
65 65 }
66 66  
67   -gchar * v3270_get_copy_as_text(v3270 * terminal)
  67 +gchar * v3270_get_copy_as_text(v3270 * terminal, const gchar *encoding)
68 68 {
69 69 if(terminal->selection.format == V3270_SELECT_TABLE)
70   - return v3270_get_copy_as_table(terminal,"\t");
71   -
72   - return get_as_text(terminal);
  70 + return v3270_get_copy_as_table(terminal,"\t",encoding);
  71 + return v3270_get_selection_as_text(terminal, terminal->selection.blocks, encoding);
73 72 }
74 73  
75 74 LIB3270_EXPORT void v3270_input_text(GtkWidget *widget, const gchar *text, const gchar *encoding)
... ... @@ -205,6 +204,6 @@ LIB3270_EXPORT void v3270_input_text(GtkWidget *widget, const gchar *text, const
205 204 LIB3270_EXPORT gchar * v3270_get_copy(GtkWidget *widget)
206 205 {
207 206 g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
208   - return v3270_get_copy_as_text(GTK_V3270(widget));
  207 + return v3270_get_copy_as_text(GTK_V3270(widget),NULL);
209 208 }
210 209  
... ...