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,6 +41,8 @@
41 41
42 GtkWidget * terminal; 42 GtkWidget * terminal;
43 GtkWidget * filename; 43 GtkWidget * filename;
  44 + GtkWidget * charset;
  45 + GtkWidget * format;
44 LIB3270_CONTENT_OPTION mode; 46 LIB3270_CONTENT_OPTION mode;
45 47
46 }; 48 };
src/dialogs/save/save.c
@@ -35,6 +35,28 @@ @@ -35,6 +35,28 @@
35 35
36 G_DEFINE_TYPE(V3270SaveDialog, V3270SaveDialog, GTK_TYPE_DIALOG); 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 /*--[ Implement ]------------------------------------------------------------------------------------*/ 60 /*--[ Implement ]------------------------------------------------------------------------------------*/
39 61
40 /* 62 /*
@@ -44,7 +66,7 @@ @@ -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 debug("%s",__FUNCTION__); 72 debug("%s",__FUNCTION__);
@@ -64,6 +86,11 @@ @@ -64,6 +86,11 @@
64 86
65 static void V3270SaveDialog_init(V3270SaveDialog *dialog) 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 dialog->mode = LIB3270_CONTENT_ALL; 94 dialog->mode = LIB3270_CONTENT_ALL;
68 95
69 gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE); 96 gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE);
@@ -82,57 +109,159 @@ @@ -82,57 +109,159 @@
82 gtk_grid_set_column_spacing(GTK_GRID(grid),12); 109 gtk_grid_set_column_spacing(GTK_GRID(grid),12);
83 gtk_box_pack_start(box,GTK_WIDGET(grid),TRUE,TRUE,2); 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 #ifdef WIN32 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 #else 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 #endif // WIN32 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 // Buttons 219 // Buttons
110 // https://developer.gnome.org/icon-naming-spec/ 220 // https://developer.gnome.org/icon-naming-spec/
111 #if GTK_CHECK_VERSION(3,14,0) 221 #if GTK_CHECK_VERSION(3,14,0)
112 -  
113 widget = gtk_dialog_get_header_bar(GTK_DIALOG(dialog)); 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 #else 223 #else
126 -  
127 - #error TODO!  
128 - 224 + widget = NULL;
129 #endif // GTK(3,14,0) 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 GtkWidget * v3270_save_dialog_new(GtkWidget *widget, LIB3270_CONTENT_OPTION mode, const gchar *filename) 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 dialog->mode = mode; 265 dialog->mode = mode;
137 266
138 if(filename) 267 if(filename)
src/include/clipboard.h
@@ -87,12 +87,17 @@ @@ -87,12 +87,17 @@
87 87
88 G_GNUC_INTERNAL void v3270_update_system_clipboard(GtkWidget *widget); 88 G_GNUC_INTERNAL void v3270_update_system_clipboard(GtkWidget *widget);
89 G_GNUC_INTERNAL const char * v3270_update_selected_text(GtkWidget *widget, gboolean cut); 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 /// @brief Get contents. 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 G_GNUC_INTERNAL gchar * v3270_get_copy_as_data_block(v3270 * terminal); 101 G_GNUC_INTERNAL gchar * v3270_get_copy_as_data_block(v3270 * terminal);
97 102
98 /// @brief Set contents. 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,12 +49,12 @@ static void get_element_colors(v3270 * terminal, unsigned short attr, gchar **fg
49 } 49 }
50 50
51 /// @brief Get formatted contents as HTML DIV. 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 g_string_append_printf( 59 g_string_append_printf(
60 string, 60 string,
@@ -67,7 +67,7 @@ static gchar * get_as_div(v3270 * terminal) @@ -67,7 +67,7 @@ static gchar * get_as_div(v3270 * terminal)
67 67
68 while(element) 68 while(element)
69 { 69 {
70 - lib3270_selection * block = ((lib3270_selection *) element->data); 70 + const lib3270_selection * block = ((const lib3270_selection *) element->data);
71 unsigned int row, col, src = 0; 71 unsigned int row, col, src = 0;
72 unsigned short flags = block->contents[0].attribute.visual; 72 unsigned short flags = block->contents[0].attribute.visual;
73 73
@@ -144,9 +144,9 @@ static gchar * get_as_div(v3270 * terminal) @@ -144,9 +144,9 @@ static gchar * get_as_div(v3270 * terminal)
144 } 144 }
145 145
146 /// @brief Get formatted contents as HTML TABLE. 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 GString * string = g_string_new("<table><tbody>"); 150 GString * string = g_string_new("<table><tbody>");
151 151
152 unsigned int width = lib3270_get_width(terminal->host); 152 unsigned int width = lib3270_get_width(terminal->host);
@@ -155,11 +155,11 @@ static gchar * get_as_table(v3270 * terminal) @@ -155,11 +155,11 @@ static gchar * get_as_table(v3270 * terminal)
155 GList * column; 155 GList * column;
156 156
157 // Get contents 157 // Get contents
158 - GList * columns = v3270_getColumns_from_selection(terminal); 158 + GList * columns = v3270_getColumns_from_selection(terminal, selection);
159 159
160 while(element) 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 unsigned int row, col, src = 0; 164 unsigned int row, col, src = 0;
165 165
@@ -214,14 +214,14 @@ static gchar * get_as_table(v3270 * terminal) @@ -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 g_autofree char * text = NULL; 219 g_autofree char * text = NULL;
220 220
221 if(terminal->selection.format == V3270_SELECT_TABLE) 221 if(terminal->selection.format == V3270_SELECT_TABLE)
222 - text = get_as_table(terminal); 222 + text = get_as_table(terminal, terminal->selection.blocks);
223 else 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,14 +57,14 @@ static void clipboard_get(G_GNUC_UNUSED GtkClipboard *clipboard, GtkSelectionDa
57 { 57 {
58 case CLIPBOARD_TYPE_TEXT: // Get clipboard contents as text 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 gtk_selection_data_set_text(selection,text,-1); 61 gtk_selection_data_set_text(selection,text,-1);
62 } 62 }
63 break; 63 break;
64 64
65 case CLIPBOARD_TYPE_CSV: 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 debug("Selection:\n%s",text); 68 debug("Selection:\n%s",text);
69 gtk_selection_data_set( 69 gtk_selection_data_set(
70 selection, 70 selection,
@@ -78,7 +78,7 @@ static void clipboard_get(G_GNUC_UNUSED GtkClipboard *clipboard, GtkSelectionDa @@ -78,7 +78,7 @@ static void clipboard_get(G_GNUC_UNUSED GtkClipboard *clipboard, GtkSelectionDa
78 78
79 case CLIPBOARD_TYPE_HTML: 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 //debug("Selection:\n%s",text); 82 //debug("Selection:\n%s",text);
83 gtk_selection_data_set( 83 gtk_selection_data_set(
84 selection, 84 selection,
src/selection/table.c
@@ -34,13 +34,11 @@ @@ -34,13 +34,11 @@
34 /*--[ Implement ]------------------------------------------------------------------------------------*/ 34 /*--[ Implement ]------------------------------------------------------------------------------------*/
35 35
36 /// @brief Check if column has data. 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 if( (col >= block->bounds.col) && ( col < (block->bounds.col + block->bounds.width)) ) 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,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 return FALSE; 62 return FALSE;
65 } 63 }
66 64
67 /// @brief Get column list. 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 unsigned int col = 0; 68 unsigned int col = 0;
71 GList *rc = NULL; 69 GList *rc = NULL;
@@ -75,7 +73,7 @@ GList * v3270_getColumns_from_selection(v3270 * terminal) @@ -75,7 +73,7 @@ GList * v3270_getColumns_from_selection(v3270 * terminal)
75 // debug("col(%u): %s", col, hasDataOnColumn(terminal,col) ? "yes" : "no"); 73 // debug("col(%u): %s", col, hasDataOnColumn(terminal,col) ? "yes" : "no");
76 74
77 // Get first column. 75 // Get first column.
78 - while(!hasDataOnColumn(terminal,col)) { 76 + while(!hasDataOnColumn(terminal,col,selection)) {
79 if(col >= lib3270_get_width(terminal->host)) 77 if(col >= lib3270_get_width(terminal->host))
80 return rc; 78 return rc;
81 col++; 79 col++;
@@ -87,7 +85,7 @@ GList * v3270_getColumns_from_selection(v3270 * terminal) @@ -87,7 +85,7 @@ GList * v3270_getColumns_from_selection(v3270 * terminal)
87 rc = g_list_append(rc,columndescription); 85 rc = g_list_append(rc,columndescription);
88 86
89 // Get width. 87 // Get width.
90 - while(hasDataOnColumn(terminal,col++)) { 88 + while(hasDataOnColumn(terminal,col++,selection)) {
91 columndescription->width++; 89 columndescription->width++;
92 if(col >= lib3270_get_width(terminal->host)) 90 if(col >= lib3270_get_width(terminal->host))
93 return rc; 91 return rc;
@@ -98,12 +96,11 @@ GList * v3270_getColumns_from_selection(v3270 * terminal) @@ -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 GString * string = g_string_new(""); 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 debug("columns=%p",columns); 105 debug("columns=%p",columns);
109 106
@@ -121,7 +118,7 @@ gchar * v3270_get_copy_as_table(v3270 * terminal, const gchar *delimiter) @@ -121,7 +118,7 @@ gchar * v3270_get_copy_as_table(v3270 * terminal, const gchar *delimiter)
121 } 118 }
122 #endif // DEBUG 119 #endif // DEBUG
123 120
124 - GList * element = terminal->selection.blocks; 121 + GList * element = selection;
125 unsigned int width = lib3270_get_width(terminal->host); 122 unsigned int width = lib3270_get_width(terminal->host);
126 g_autofree gchar * line = g_malloc0(width+1); 123 g_autofree gchar * line = g_malloc0(width+1);
127 GList * column; 124 GList * column;
@@ -167,5 +164,12 @@ gchar * v3270_get_copy_as_table(v3270 * terminal, const gchar *delimiter) @@ -167,5 +164,12 @@ gchar * v3270_get_copy_as_table(v3270 * terminal, const gchar *delimiter)
167 g_list_free_full(columns,g_free); 164 g_list_free_full(columns,g_free);
168 165
169 g_autofree char * text = g_string_free(string,FALSE); 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,14 +33,13 @@
33 /*--[ Implement ]------------------------------------------------------------------------------------*/ 33 /*--[ Implement ]------------------------------------------------------------------------------------*/
34 34
35 /// @brief Get formatted contents as single text. 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 unsigned int row, col, src = 0; 43 unsigned int row, col, src = 0;
45 44
46 for(row=0; row < block->bounds.height; row++) 45 for(row=0; row < block->bounds.height; row++)
@@ -56,20 +55,20 @@ static gchar * get_as_text(v3270 * terminal) @@ -56,20 +55,20 @@ static gchar * get_as_text(v3270 * terminal)
56 g_string_append_c(string,'\n'); 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 g_autofree char * text = g_string_free(string,FALSE); 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 if(terminal->selection.format == V3270_SELECT_TABLE) 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 LIB3270_EXPORT void v3270_input_text(GtkWidget *widget, const gchar *text, const gchar *encoding) 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,6 +204,6 @@ LIB3270_EXPORT void v3270_input_text(GtkWidget *widget, const gchar *text, const
205 LIB3270_EXPORT gchar * v3270_get_copy(GtkWidget *widget) 204 LIB3270_EXPORT gchar * v3270_get_copy(GtkWidget *widget)
206 { 205 {
207 g_return_val_if_fail(GTK_IS_V3270(widget),NULL); 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