Commit d6e1a58bda6ef2dc2d3a6032fea33a19cfd06c73
1 parent
a2973972
Exists in
master
and in
1 other branch
Working in the new "save" dialog.
Showing
7 changed files
with
220 additions
and
81 deletions
Show diff stats
src/dialogs/save/private.h
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 | ... | ... |