Commit 8cdc248c9769e50477679725f3d2c1d2af108a8b
1 parent
a41df4d9
Exists in
master
and in
1 other branch
Refactoring "paste from file" method.
Showing
20 changed files
with
598 additions
and
240 deletions
Show diff stats
| ... | ... | @@ -0,0 +1,333 @@ |
| 1 | +/* | |
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | + * | |
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | + * | |
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | + * Free Software Foundation. | |
| 11 | + * | |
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | + * obter mais detalhes. | |
| 16 | + * | |
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | + * | |
| 21 | + * Este programa está nomeado como - e possui - linhas de código. | |
| 22 | + * | |
| 23 | + * Contatos: | |
| 24 | + * | |
| 25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 27 | + * | |
| 28 | + */ | |
| 29 | + | |
| 30 | + | |
| 31 | + #include "private.h" | |
| 32 | + #include <internals.h> | |
| 33 | + #include <lib3270.h> | |
| 34 | + #include <lib3270/selection.h> | |
| 35 | + #include <clipboard.h> | |
| 36 | + #include <limits.h> | |
| 37 | + #include <v3270/dialogs.h> | |
| 38 | + | |
| 39 | +/*--[ Widget definition ]----------------------------------------------------------------------------*/ | |
| 40 | + | |
| 41 | + typedef struct _V3270LoadDialog | |
| 42 | + { | |
| 43 | + GtkDialog parent; | |
| 44 | + | |
| 45 | + GtkWidget * terminal; | |
| 46 | + GtkWidget * filename; | |
| 47 | + GtkWidget * charset; | |
| 48 | + | |
| 49 | + } V3270LoadDialog; | |
| 50 | + | |
| 51 | + typedef struct _V3270LoadDialogClass | |
| 52 | + { | |
| 53 | + GtkDialogClass parent_class; | |
| 54 | + int dummy; | |
| 55 | + | |
| 56 | + } V3270LoadDialogClass; | |
| 57 | + | |
| 58 | + #define GTK_TYPE_V3270LoadDialog (V3270LoadDialog_get_type ()) | |
| 59 | + #define V3270_LOAD_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270LoadDialog, V3270LoadDialog)) | |
| 60 | + #define V3270LoadDialog_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_V3270Loadialog, V3270LoadDialogClass)) | |
| 61 | + #define IS_V3270LoadDialog(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_V3270LoadDialog)) | |
| 62 | + #define IS_V3270LoadDialog_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_V3270LoadDialog)) | |
| 63 | + #define V3270LoadDialog_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_V3270LoadDialog, V3270LoadDialogClass)) | |
| 64 | + | |
| 65 | + G_DEFINE_TYPE(V3270LoadDialog, V3270LoadDialog, GTK_TYPE_DIALOG); | |
| 66 | + | |
| 67 | +/*--[ Implement ]------------------------------------------------------------------------------------*/ | |
| 68 | + | |
| 69 | + static void V3270LoadDialog_class_init(V3270LoadDialogClass G_GNUC_UNUSED(*klass)) | |
| 70 | + { | |
| 71 | + | |
| 72 | + debug("%s",__FUNCTION__); | |
| 73 | + | |
| 74 | + } | |
| 75 | + | |
| 76 | + static void cancel_operation(GtkButton G_GNUC_UNUSED(*button), GtkDialog *dialog) | |
| 77 | + { | |
| 78 | + gtk_dialog_response(dialog,GTK_RESPONSE_CANCEL); | |
| 79 | + } | |
| 80 | + | |
| 81 | + static void apply_operation(GtkButton G_GNUC_UNUSED(*button), GtkDialog *dialog) | |
| 82 | + { | |
| 83 | + gtk_dialog_response(dialog,GTK_RESPONSE_APPLY); | |
| 84 | + } | |
| 85 | + | |
| 86 | +#ifdef WIN32 | |
| 87 | +static void icon_press(GtkEntry G_GNUC_UNUSED(*entry), G_GNUC_UNUSED GtkEntryIconPosition icon_pos, G_GNUC_UNUSED GdkEvent *event, V3270LoadDialog *widget) | |
| 88 | +{ | |
| 89 | + g_autofree gchar *filename = | |
| 90 | + v3270_select_file( | |
| 91 | + GTK_WIDGET(widget), | |
| 92 | + _( "Select file"), | |
| 93 | + _("Open"), | |
| 94 | + GTK_FILE_CHOOSER_ACTION_OPEN, | |
| 95 | + gtk_entry_get_text(GTK_ENTRY(widget->filename)), | |
| 96 | + N_("All files"), "*.*", | |
| 97 | + NULL | |
| 98 | + ); | |
| 99 | + | |
| 100 | + if(filename && *filename) { | |
| 101 | + gtk_entry_set_text(GTK_ENTRY(widget->filename),filename); | |
| 102 | + } | |
| 103 | + | |
| 104 | +} | |
| 105 | +#else | |
| 106 | +static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_pos, G_GNUC_UNUSED GdkEvent *event, V3270LoadDialog *widget) | |
| 107 | +{ | |
| 108 | + GtkWidget * dialog = | |
| 109 | + gtk_file_chooser_dialog_new( | |
| 110 | + _( "Select file"), | |
| 111 | + GTK_WINDOW(widget), | |
| 112 | + GTK_FILE_CHOOSER_ACTION_OPEN, | |
| 113 | + _("Cancel"), GTK_RESPONSE_CANCEL, | |
| 114 | + _("Open"), GTK_RESPONSE_ACCEPT, | |
| 115 | + NULL ); | |
| 116 | + | |
| 117 | + | |
| 118 | + gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE); | |
| 119 | + g_signal_connect(G_OBJECT(dialog),"close",G_CALLBACK(v3270_dialog_close),NULL); | |
| 120 | + | |
| 121 | + const gchar *filename = gtk_entry_get_text(entry); | |
| 122 | + | |
| 123 | + if(filename && *filename) | |
| 124 | + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),filename); | |
| 125 | + | |
| 126 | + if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) | |
| 127 | + gtk_entry_set_text(entry,gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog))); | |
| 128 | + | |
| 129 | + gtk_widget_destroy(dialog); | |
| 130 | + | |
| 131 | + } | |
| 132 | +#endif // _WIN32 | |
| 133 | + | |
| 134 | + static void V3270LoadDialog_init(V3270LoadDialog *dialog) | |
| 135 | + { | |
| 136 | + // 0--------1---------------------2-------3--------------------4 | |
| 137 | + // 0 - Filename xxxxxxxxx.xxxxxxxxx.xxxxxxxxx.xxxxxxxxx.xxxxxxxxx. x | |
| 138 | + // 1 - Charset xxxxxxxxx.xxxxxxxxx. Format: xxxxxxxxx.xxxxxxxxx. | |
| 139 | + | |
| 140 | + | |
| 141 | + gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE); | |
| 142 | + | |
| 143 | + // Setup visual elements | |
| 144 | + // https://developer.gnome.org/hig/stable/visual-layout.html.en | |
| 145 | + GtkWidget *widget; | |
| 146 | + GtkWidget *button; | |
| 147 | + | |
| 148 | + GtkBox * box = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); | |
| 149 | + gtk_window_set_resizable(GTK_WINDOW(dialog),FALSE); | |
| 150 | + gtk_container_set_border_width(GTK_CONTAINER(box),18); | |
| 151 | + | |
| 152 | + GtkGrid * grid = GTK_GRID(gtk_grid_new()); | |
| 153 | + gtk_grid_set_row_spacing(GTK_GRID(grid),6); | |
| 154 | + gtk_grid_set_column_spacing(GTK_GRID(grid),12); | |
| 155 | + gtk_box_pack_start(box,GTK_WIDGET(grid),TRUE,TRUE,2); | |
| 156 | + | |
| 157 | + // Filename entry | |
| 158 | + { | |
| 159 | + dialog->filename = gtk_entry_new(); | |
| 160 | + gtk_widget_set_hexpand(GTK_WIDGET(dialog->filename),TRUE); | |
| 161 | + | |
| 162 | + widget = gtk_label_new_with_mnemonic(_("_Filename")); | |
| 163 | + gtk_widget_set_halign(widget,GTK_ALIGN_END); | |
| 164 | + gtk_widget_set_valign(widget,GTK_ALIGN_CENTER); | |
| 165 | + gtk_grid_attach(grid,widget,0,0,1,1); | |
| 166 | + gtk_label_set_mnemonic_widget(GTK_LABEL(widget),dialog->filename); | |
| 167 | + | |
| 168 | + gtk_entry_set_icon_from_icon_name(GTK_ENTRY(dialog->filename),GTK_ENTRY_ICON_SECONDARY,"document-open"); | |
| 169 | + gtk_entry_set_icon_activatable(GTK_ENTRY(dialog->filename),GTK_ENTRY_ICON_SECONDARY,TRUE); | |
| 170 | + gtk_entry_set_icon_tooltip_text(GTK_ENTRY(dialog->filename),GTK_ENTRY_ICON_SECONDARY,_("Select file")); | |
| 171 | + g_signal_connect(G_OBJECT(dialog->filename),"icon-press",G_CALLBACK(icon_press),dialog); | |
| 172 | + | |
| 173 | + gtk_entry_set_width_chars(GTK_ENTRY(dialog->filename),60); | |
| 174 | + gtk_entry_set_max_length(GTK_ENTRY(dialog->filename),PATH_MAX); | |
| 175 | + gtk_grid_attach(grid,GTK_WIDGET(dialog->filename),1,0,3,1); | |
| 176 | + } | |
| 177 | + | |
| 178 | + // Charset drop-down | |
| 179 | + { | |
| 180 | + widget = gtk_label_new_with_mnemonic (_("C_haracter Coding")); | |
| 181 | + gtk_widget_set_halign(widget,GTK_ALIGN_END); | |
| 182 | + gtk_widget_set_valign(widget,GTK_ALIGN_CENTER); | |
| 183 | + gtk_grid_attach(grid,widget,0,1,1,1); | |
| 184 | + | |
| 185 | + dialog->charset = v3270_charset_combo_box_new(); | |
| 186 | + gtk_grid_attach(grid,dialog->charset,1,1,1,1); | |
| 187 | + | |
| 188 | + } | |
| 189 | + | |
| 190 | + | |
| 191 | + // Buttons | |
| 192 | + // https://developer.gnome.org/icon-naming-spec/ | |
| 193 | +#ifdef _WIN32 | |
| 194 | + widget = NULL; | |
| 195 | +#elif GTK_CHECK_VERSION(3,14,0) | |
| 196 | + widget = gtk_dialog_get_header_bar(GTK_DIALOG(dialog)); | |
| 197 | +#else | |
| 198 | + widget = NULL; | |
| 199 | +#endif // GTK(3,14,0) | |
| 200 | + | |
| 201 | + if(widget) | |
| 202 | + { | |
| 203 | + // Have header bar | |
| 204 | + button = gtk_button_new_with_mnemonic(_("_Cancel")); | |
| 205 | + gtk_widget_set_tooltip_markup(button,_("Click to cancel operation")); | |
| 206 | + gtk_header_bar_pack_start(GTK_HEADER_BAR(widget),button); | |
| 207 | + g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(cancel_operation),dialog); | |
| 208 | + | |
| 209 | + button = gtk_button_new_with_mnemonic(_("_Load")); | |
| 210 | + gtk_widget_set_tooltip_markup(button,_("Click to load file")); | |
| 211 | + gtk_header_bar_pack_end(GTK_HEADER_BAR(widget),button); | |
| 212 | + g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(apply_operation),dialog); | |
| 213 | + } | |
| 214 | + else | |
| 215 | + { | |
| 216 | + gtk_box_set_spacing( | |
| 217 | + GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), | |
| 218 | + 18 | |
| 219 | + ); | |
| 220 | + | |
| 221 | + gtk_dialog_add_buttons( | |
| 222 | + GTK_DIALOG (dialog), | |
| 223 | + _("_Cancel"), GTK_RESPONSE_CANCEL, | |
| 224 | + _("_Load"), GTK_RESPONSE_APPLY, | |
| 225 | + NULL | |
| 226 | + ); | |
| 227 | + } | |
| 228 | + | |
| 229 | + } | |
| 230 | + | |
| 231 | + GtkWidget * v3270_load_dialog_new(GtkWidget *widget, const gchar *filename) | |
| 232 | + { | |
| 233 | + g_return_val_if_fail(GTK_IS_V3270(widget),NULL); | |
| 234 | + | |
| 235 | + gboolean use_header; | |
| 236 | + g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); | |
| 237 | + | |
| 238 | + // Create dialog | |
| 239 | + V3270LoadDialog * dialog = V3270_LOAD_DIALOG( | |
| 240 | + g_object_new( | |
| 241 | + GTK_TYPE_V3270LoadDialog, | |
| 242 | + "use-header-bar", (use_header ? 1 : 0), | |
| 243 | + NULL) | |
| 244 | + ); | |
| 245 | + | |
| 246 | + dialog->terminal = widget; | |
| 247 | + | |
| 248 | + gtk_window_set_title(GTK_WINDOW(dialog),_("Paste from file")); | |
| 249 | + | |
| 250 | + if(filename) | |
| 251 | + gtk_entry_set_text(GTK_ENTRY(dialog->filename),filename); | |
| 252 | + | |
| 253 | + gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gtk_widget_get_toplevel(widget))); | |
| 254 | + gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); | |
| 255 | + gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); | |
| 256 | + | |
| 257 | + return GTK_WIDGET(dialog); | |
| 258 | + } | |
| 259 | + | |
| 260 | + void v3270_load_dialog_apply(GtkWidget *widget, GError **error) | |
| 261 | + { | |
| 262 | + V3270LoadDialog * dialog = V3270_LOAD_DIALOG(widget); | |
| 263 | + | |
| 264 | + debug("%s error=%p",__FUNCTION__,*error); | |
| 265 | + | |
| 266 | + if(!v3270_is_connected(dialog->terminal)) | |
| 267 | + { | |
| 268 | + *error = g_error_new(g_quark_from_static_string(PACKAGE_NAME),ENOTCONN,"%s",strerror(ENOTCONN)); | |
| 269 | + return; | |
| 270 | + } | |
| 271 | + | |
| 272 | + // Load file | |
| 273 | + g_autofree gchar * contents = NULL; | |
| 274 | + g_file_get_contents( | |
| 275 | + gtk_entry_get_text(GTK_ENTRY(dialog->filename)), | |
| 276 | + &contents, | |
| 277 | + NULL, | |
| 278 | + error | |
| 279 | + ); | |
| 280 | + | |
| 281 | + // Got contents, check for charset conversion. | |
| 282 | + g_autofree gchar * converted = | |
| 283 | + v3270_convert_to_3270_charset( | |
| 284 | + dialog->terminal, | |
| 285 | + contents, | |
| 286 | + gtk_combo_box_get_active_id(GTK_COMBO_BOX(dialog->charset)), | |
| 287 | + error | |
| 288 | + ); | |
| 289 | + | |
| 290 | + if(*error) | |
| 291 | + return; | |
| 292 | + | |
| 293 | + gboolean next = lib3270_paste( | |
| 294 | + v3270_get_session(dialog->terminal), | |
| 295 | + (unsigned char *) converted | |
| 296 | + ) ? TRUE : FALSE; | |
| 297 | + | |
| 298 | + debug("next=%s",next ? "YES" : "NO"); | |
| 299 | + | |
| 300 | + g_signal_emit( | |
| 301 | + dialog->terminal, | |
| 302 | + v3270_widget_signal[V3270_SIGNAL_PASTENEXT], | |
| 303 | + 0, | |
| 304 | + next | |
| 305 | + ); | |
| 306 | + | |
| 307 | + } | |
| 308 | + | |
| 309 | + void v3270_load_dialog_run(GtkWidget *widget) | |
| 310 | + { | |
| 311 | + debug("%s",__FUNCTION__); | |
| 312 | + if(gtk_dialog_run(GTK_DIALOG(widget)) == GTK_RESPONSE_APPLY) | |
| 313 | + { | |
| 314 | + GError * error = NULL; | |
| 315 | + v3270_load_dialog_apply(widget,&error); | |
| 316 | + | |
| 317 | + if(error) | |
| 318 | + { | |
| 319 | + v3270_popup_gerror( | |
| 320 | + widget, | |
| 321 | + error, | |
| 322 | + NULL, | |
| 323 | + _("Can't open %s"),gtk_entry_get_text(GTK_ENTRY(V3270_LOAD_DIALOG(widget)->filename)) | |
| 324 | + ); | |
| 325 | + g_error_free(error); | |
| 326 | + } | |
| 327 | + | |
| 328 | + } | |
| 329 | + debug("%s",__FUNCTION__); | |
| 330 | + | |
| 331 | + } | |
| 332 | + | |
| 333 | + | ... | ... |
src/dialogs/popups.c
| ... | ... | @@ -100,3 +100,34 @@ |
| 100 | 100 | |
| 101 | 101 | } |
| 102 | 102 | |
| 103 | + void v3270_popup_gerror(GtkWidget *widget, GError *error, const gchar *title, const gchar *fmt, ...) | |
| 104 | + { | |
| 105 | + | |
| 106 | + // Format message. | |
| 107 | + va_list arg_ptr; | |
| 108 | + va_start(arg_ptr, fmt); | |
| 109 | + g_autofree gchar *text = g_strdup_vprintf(fmt,arg_ptr); | |
| 110 | + va_end(arg_ptr); | |
| 111 | + | |
| 112 | + GtkWidget *dialog = gtk_message_dialog_new( | |
| 113 | + GTK_WINDOW(gtk_widget_get_toplevel(widget)), | |
| 114 | + GTK_DIALOG_DESTROY_WITH_PARENT, | |
| 115 | + GTK_MESSAGE_ERROR, | |
| 116 | + GTK_BUTTONS_OK, | |
| 117 | + "%s",text | |
| 118 | + ); | |
| 119 | + | |
| 120 | + if(title) | |
| 121 | + gtk_window_set_title(GTK_WINDOW(dialog), title); | |
| 122 | + else | |
| 123 | + gtk_window_set_title(GTK_WINDOW(dialog), (title ? title : _("Operation failed"))); | |
| 124 | + | |
| 125 | + if(error) | |
| 126 | + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",error->message); | |
| 127 | + | |
| 128 | + g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL); | |
| 129 | + g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL); | |
| 130 | + | |
| 131 | + gtk_widget_show_all(dialog); | |
| 132 | + | |
| 133 | + } | ... | ... |
src/dialogs/print/print.c
| ... | ... | @@ -30,6 +30,7 @@ |
| 30 | 30 | #include "private.h" |
| 31 | 31 | #include <sys/param.h> |
| 32 | 32 | #include <lib3270/selection.h> |
| 33 | + #include <v3270/dialogs.h> | |
| 33 | 34 | #include <clipboard.h> |
| 34 | 35 | |
| 35 | 36 | G_DEFINE_TYPE(V3270PrintOperation, V3270PrintOperation, GTK_TYPE_PRINT_OPERATION); |
| ... | ... | @@ -45,25 +46,16 @@ |
| 45 | 46 | |
| 46 | 47 | if(result == GTK_PRINT_OPERATION_RESULT_ERROR) |
| 47 | 48 | { |
| 48 | - GError * err = NULL; | |
| 49 | + GError * err = NULL; | |
| 49 | 50 | |
| 50 | 51 | gtk_print_operation_get_error(prt,&err); |
| 51 | 52 | |
| 52 | - GtkWidget *dialog = gtk_message_dialog_new_with_markup( | |
| 53 | - GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(operation->widget))), | |
| 54 | - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | |
| 55 | - GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE, | |
| 56 | - "%s",_( "Print operation failed" ) | |
| 57 | - ); | |
| 58 | - | |
| 59 | - g_warning("%s",err->message); | |
| 60 | - | |
| 61 | - gtk_window_set_title(GTK_WINDOW(dialog),_("Error")); | |
| 62 | - | |
| 63 | - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(dialog),"%s",err->message); | |
| 64 | - | |
| 65 | - gtk_dialog_run(GTK_DIALOG(dialog)); | |
| 66 | - gtk_widget_destroy(dialog); | |
| 53 | + v3270_popup_gerror( | |
| 54 | + GTK_WIDGET(operation->widget), | |
| 55 | + err, | |
| 56 | + NULL, | |
| 57 | + "%s",_( "Print operation failed" ) | |
| 58 | + ); | |
| 67 | 59 | |
| 68 | 60 | g_error_free(err); |
| 69 | 61 | ... | ... |
src/dialogs/save/convenience.c
src/dialogs/save/private.h
| ... | ... | @@ -27,14 +27,27 @@ |
| 27 | 27 | * |
| 28 | 28 | */ |
| 29 | 29 | |
| 30 | + #include <config.h> | |
| 31 | + #define ENABLE_NLS | |
| 32 | + | |
| 33 | + #ifndef GETTEXT_PACKAGE | |
| 34 | + #define GETTEXT_PACKAGE PACKAGE_NAME | |
| 35 | + #endif | |
| 36 | + | |
| 37 | + #include <libintl.h> | |
| 38 | + #include <glib/gi18n.h> | |
| 39 | + #include <gtk/gtk.h> | |
| 40 | + #include <lib3270.h> | |
| 30 | 41 | #include <v3270.h> |
| 31 | - #include <save.h> | |
| 42 | + #include <v3270/dialogs.h> | |
| 32 | 43 | #include <v3270/print.h> |
| 33 | 44 | #include <lib3270/log.h> |
| 34 | 45 | #include <lib3270/trace.h> |
| 35 | 46 | |
| 36 | 47 | /*--[ Widget definition ]----------------------------------------------------------------------------*/ |
| 37 | 48 | |
| 49 | + G_BEGIN_DECLS | |
| 50 | + | |
| 38 | 51 | struct _V3270SaveDialog |
| 39 | 52 | { |
| 40 | 53 | GtkDialog parent; |
| ... | ... | @@ -54,7 +67,19 @@ |
| 54 | 67 | |
| 55 | 68 | }; |
| 56 | 69 | |
| 57 | -/*--[ Prototypes ]-----------------------------------------------------------------------------------*/ | |
| 70 | +/*--[ Save Dialog Widget ]---------------------------------------------------------------------------*/ | |
| 71 | + | |
| 72 | + #define GTK_TYPE_V3270SaveDialog (V3270SaveDialog_get_type ()) | |
| 73 | + #define V3270_SAVE_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270SaveDialog, V3270SaveDialog)) | |
| 74 | + #define V3270SaveDialog_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_V3270SaveDialog, V3270SaveDialogClass)) | |
| 75 | + #define IS_V3270SaveDialog(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_V3270SaveDialog)) | |
| 76 | + #define IS_V3270SaveDialog_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_V3270SaveDialog)) | |
| 77 | + #define V3270SaveDialog_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_V3270SaveDialog, V3270SaveDialogClass)) | |
| 78 | + | |
| 79 | + typedef struct _V3270SaveDialog V3270SaveDialog; | |
| 80 | + typedef struct _V3270SaveDialogClass V3270SaveDialogClass; | |
| 81 | + | |
| 82 | + G_END_DECLS | |
| 58 | 83 | |
| 59 | 84 | |
| 60 | 85 | ... | ... |
src/dialogs/save/save.c
| ... | ... | @@ -447,21 +447,14 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_ |
| 447 | 447 | |
| 448 | 448 | if(error) |
| 449 | 449 | { |
| 450 | - GtkWidget *popup = gtk_message_dialog_new_with_markup( | |
| 451 | - GTK_WINDOW(gtk_widget_get_toplevel(widget)), | |
| 452 | - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | |
| 453 | - GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE, | |
| 454 | - _("Can't save %s"),gtk_entry_get_text(GTK_ENTRY(V3270_SAVE_DIALOG(widget)->filename)) | |
| 450 | + v3270_popup_gerror( | |
| 451 | + widget, | |
| 452 | + error, | |
| 453 | + NULL, | |
| 454 | + _("Can't save %s"),gtk_entry_get_text(GTK_ENTRY(V3270_SAVE_DIALOG(widget)->filename)) | |
| 455 | 455 | ); |
| 456 | 456 | |
| 457 | - gtk_window_set_title(GTK_WINDOW(popup),_("Operation has failed")); | |
| 458 | - | |
| 459 | - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(popup),"%s",error->message); | |
| 460 | 457 | g_error_free(error); |
| 461 | - | |
| 462 | - gtk_dialog_run(GTK_DIALOG(popup)); | |
| 463 | - gtk_widget_destroy(popup); | |
| 464 | - | |
| 465 | 458 | } |
| 466 | 459 | |
| 467 | 460 | } | ... | ... |
src/dialogs/transfer.c
| ... | ... | @@ -39,6 +39,7 @@ |
| 39 | 39 | |
| 40 | 40 | #include <v3270.h> |
| 41 | 41 | #include <v3270/filetransfer.h> |
| 42 | + #include <v3270/dialogs.h> | |
| 42 | 43 | |
| 43 | 44 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| 44 | 45 | |
| ... | ... | @@ -89,21 +90,15 @@ static void save_activity_clicked(GtkWidget *button, GObject *activity) |
| 89 | 90 | |
| 90 | 91 | if(!g_file_set_contents(filename,text,-1,&error)) { |
| 91 | 92 | |
| 92 | - GtkWidget *popup = gtk_message_dialog_new_with_markup( | |
| 93 | - GTK_WINDOW(gtk_widget_get_toplevel(button)), | |
| 94 | - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | |
| 95 | - GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE, | |
| 96 | - _("Can't save %s"),filename | |
| 93 | + v3270_popup_gerror( | |
| 94 | + button, | |
| 95 | + error, | |
| 96 | + NULL, | |
| 97 | + _("Can't save %s"),filename | |
| 97 | 98 | ); |
| 98 | 99 | |
| 99 | - gtk_window_set_title(GTK_WINDOW(popup),_("Operation has failed")); | |
| 100 | - | |
| 101 | - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(popup),"%s",error->message); | |
| 102 | 100 | g_error_free(error); |
| 103 | 101 | |
| 104 | - gtk_dialog_run(GTK_DIALOG(popup)); | |
| 105 | - gtk_widget_destroy(popup); | |
| 106 | - | |
| 107 | 102 | } |
| 108 | 103 | |
| 109 | 104 | } | ... | ... |
src/filetransfer/activitylist.c
| ... | ... | @@ -28,6 +28,7 @@ |
| 28 | 28 | */ |
| 29 | 29 | |
| 30 | 30 | #include <internals.h> |
| 31 | + #include <v3270/dialogs.h> | |
| 31 | 32 | #include "private.h" |
| 32 | 33 | #include "marshal.h" |
| 33 | 34 | |
| ... | ... | @@ -430,21 +431,15 @@ |
| 430 | 431 | |
| 431 | 432 | if(!g_file_set_contents(list->filename,text,-1,&error)) { |
| 432 | 433 | |
| 433 | - GtkWidget *popup = gtk_message_dialog_new_with_markup( | |
| 434 | - GTK_WINDOW(gtk_widget_get_toplevel(widget)), | |
| 435 | - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | |
| 436 | - GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE, | |
| 437 | - _("Can't save %s"),list->filename | |
| 434 | + v3270_popup_gerror( | |
| 435 | + widget, | |
| 436 | + error, | |
| 437 | + NULL, | |
| 438 | + _("Can't save %s"),list->filename | |
| 438 | 439 | ); |
| 439 | 440 | |
| 440 | - gtk_window_set_title(GTK_WINDOW(popup),_("Operation has failed")); | |
| 441 | - | |
| 442 | - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(popup),"%s",error->message); | |
| 443 | 441 | g_error_free(error); |
| 444 | 442 | |
| 445 | - gtk_dialog_run(GTK_DIALOG(popup)); | |
| 446 | - gtk_widget_destroy(popup); | |
| 447 | - | |
| 448 | 443 | } |
| 449 | 444 | |
| 450 | 445 | ... | ... |
src/filetransfer/load.c
| ... | ... | @@ -32,6 +32,7 @@ |
| 32 | 32 | |
| 33 | 33 | #include <ctype.h> |
| 34 | 34 | #include <stdlib.h> |
| 35 | + #include <v3270/dialogs.h> | |
| 35 | 36 | |
| 36 | 37 | |
| 37 | 38 | /*--[ Statics ]--------------------------------------------------------------------------------------*/ |
| ... | ... | @@ -263,23 +264,15 @@ LIB3270_EXPORT void v3270ft_load(GtkWidget *widget,const gchar *filename) { |
| 263 | 264 | |
| 264 | 265 | if(error) { |
| 265 | 266 | |
| 266 | - GtkWidget *popup = gtk_message_dialog_new_with_markup( | |
| 267 | - GTK_WINDOW(widget), | |
| 268 | - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | |
| 269 | - GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE, | |
| 270 | - _("Can't load %s"),filename); | |
| 271 | - | |
| 272 | - gtk_window_set_title(GTK_WINDOW(popup),_("Operation has failed")); | |
| 273 | - | |
| 274 | - if(error->message && *error->message) { | |
| 275 | - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(popup),"%s",error->message); | |
| 276 | - } | |
| 267 | + v3270_popup_gerror( | |
| 268 | + widget, | |
| 269 | + error, | |
| 270 | + NULL, | |
| 271 | + _("Can't load %s"),filename | |
| 272 | + ); | |
| 277 | 273 | |
| 278 | 274 | g_error_free(error); |
| 279 | 275 | |
| 280 | - gtk_dialog_run(GTK_DIALOG(popup)); | |
| 281 | - gtk_widget_destroy(popup); | |
| 282 | - | |
| 283 | 276 | } |
| 284 | 277 | |
| 285 | 278 | } | ... | ... |
src/filetransfer/save.c
| ... | ... | @@ -109,20 +109,15 @@ static const gchar * getNameByFlag(LIB3270_FT_OPTION opt, LIB3270_FT_OPTION mask |
| 109 | 109 | |
| 110 | 110 | if(!g_file_set_contents(filename,text,-1,&error)) { |
| 111 | 111 | |
| 112 | - GtkWidget *popup = gtk_message_dialog_new_with_markup( | |
| 113 | - GTK_WINDOW(widget), | |
| 114 | - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | |
| 115 | - GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE, | |
| 116 | - _("Can't save %s"),filename); | |
| 112 | + v3270_popup_gerror( | |
| 113 | + widget, | |
| 114 | + error, | |
| 115 | + NULL, | |
| 116 | + _("Can't save %s"),filename | |
| 117 | + ); | |
| 117 | 118 | |
| 118 | - gtk_window_set_title(GTK_WINDOW(popup),_("Operation has failed")); | |
| 119 | - | |
| 120 | - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(popup),"%s",error->message); | |
| 121 | 119 | g_error_free(error); |
| 122 | 120 | |
| 123 | - gtk_dialog_run(GTK_DIALOG(popup)); | |
| 124 | - gtk_widget_destroy(popup); | |
| 125 | - | |
| 126 | 121 | } |
| 127 | 122 | |
| 128 | 123 | g_free(text); | ... | ... |
src/include/internals.h
| ... | ... | @@ -107,6 +107,8 @@ |
| 107 | 107 | |
| 108 | 108 | G_GNUC_INTERNAL void v3270_dialog_close(GtkDialog *dialog, gpointer user_data); |
| 109 | 109 | |
| 110 | + G_GNUC_INTERNAL gchar * v3270_convert_to_3270_charset(GtkWidget *widget, const gchar *text, const gchar *encoding, GError **error); | |
| 111 | + | |
| 110 | 112 | |
| 111 | 113 | /*--[ Internal Widgets & Tools ]---------------------------------------------------------------------*/ |
| 112 | 114 | ... | ... |
src/include/save.h
| ... | ... | @@ -31,37 +31,6 @@ |
| 31 | 31 | |
| 32 | 32 | #define V3270SAVE_H_INCLUDED 1 |
| 33 | 33 | |
| 34 | - #include <config.h> | |
| 35 | - #define ENABLE_NLS | |
| 36 | 34 | |
| 37 | - #ifndef GETTEXT_PACKAGE | |
| 38 | - #define GETTEXT_PACKAGE PACKAGE_NAME | |
| 39 | - #endif | |
| 40 | - | |
| 41 | - #include <libintl.h> | |
| 42 | - #include <glib/gi18n.h> | |
| 43 | - #include <gtk/gtk.h> | |
| 44 | - #include <lib3270.h> | |
| 45 | - | |
| 46 | - G_BEGIN_DECLS | |
| 47 | - | |
| 48 | -/*--[ Progress widget ]------------------------------------------------------------------------------*/ | |
| 49 | - | |
| 50 | - #define GTK_TYPE_V3270SaveDialog (V3270SaveDialog_get_type ()) | |
| 51 | - #define V3270_SAVE_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270SaveDialog, V3270SaveDialog)) | |
| 52 | - #define V3270SaveDialog_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_V3270SaveDialog, V3270SaveDialogClass)) | |
| 53 | - #define IS_V3270SaveDialog(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_V3270SaveDialog)) | |
| 54 | - #define IS_V3270SaveDialog_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_V3270SaveDialog)) | |
| 55 | - #define V3270SaveDialog_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_V3270SaveDialog, V3270SaveDialogClass)) | |
| 56 | - | |
| 57 | - typedef struct _V3270SaveDialog V3270SaveDialog; | |
| 58 | - typedef struct _V3270SaveDialogClass V3270SaveDialogClass; | |
| 59 | - | |
| 60 | -/*--[ Prototipes ]-----------------------------------------------------------------------------------*/ | |
| 61 | - | |
| 62 | - GtkWidget * v3270_save_dialog_new(GtkWidget *widget, LIB3270_CONTENT_OPTION mode, const gchar *filename); | |
| 63 | - void v3270_save_dialog_run(GtkWidget *widget); | |
| 64 | - | |
| 65 | - G_END_DECLS | |
| 66 | 35 | |
| 67 | 36 | #endif // V3270SAVE_H_INCLUDED | ... | ... |
src/include/v3270.h
| ... | ... | @@ -210,6 +210,7 @@ |
| 210 | 210 | |
| 211 | 211 | LIB3270_EXPORT void v3270_paste(GtkWidget *widget); |
| 212 | 212 | LIB3270_EXPORT void v3270_paste_text(GtkWidget *widget); |
| 213 | + LIB3270_EXPORT void v3270_paste_from_file(GtkWidget *widget); | |
| 213 | 214 | LIB3270_EXPORT void v3270_input_text(GtkWidget *widget, const gchar *text, const gchar *encoding); |
| 214 | 215 | |
| 215 | 216 | // Colors | ... | ... |
src/include/v3270/dialogs.h
| ... | ... | @@ -39,6 +39,15 @@ |
| 39 | 39 | LIB3270_EXPORT GtkWidget * v3270_dialog_new(GtkWidget *widget, const gchar *title, const gchar *apply); |
| 40 | 40 | LIB3270_EXPORT void v3270_error_popup(GtkWidget *widget, const gchar *title, const gchar *summary, const gchar *body); |
| 41 | 41 | |
| 42 | + LIB3270_EXPORT GtkWidget * v3270_save_dialog_new(GtkWidget *widget, LIB3270_CONTENT_OPTION mode, const gchar *filename); | |
| 43 | + LIB3270_EXPORT void v3270_save_dialog_run(GtkWidget *widget); | |
| 44 | + | |
| 45 | + LIB3270_EXPORT GtkWidget * v3270_load_dialog_new(GtkWidget *widget, const gchar *filename); | |
| 46 | + LIB3270_EXPORT void v3270_load_dialog_run(GtkWidget *widget); | |
| 47 | + | |
| 48 | + LIB3270_EXPORT void v3270_popup_gerror(GtkWidget *widget, GError *error, const gchar *title, const gchar *fmt, ...) G_GNUC_PRINTF(4,5); | |
| 49 | + | |
| 50 | + | |
| 42 | 51 | G_END_DECLS |
| 43 | 52 | |
| 44 | 53 | #endif // V3270_DIALOGS_H_INCLUDED | ... | ... |
src/selection/text.c
| ... | ... | @@ -29,6 +29,7 @@ |
| 29 | 29 | |
| 30 | 30 | #include <clipboard.h> |
| 31 | 31 | #include <lib3270/selection.h> |
| 32 | + #include <v3270/dialogs.h> | |
| 32 | 33 | |
| 33 | 34 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| 34 | 35 | |
| ... | ... | @@ -71,48 +72,50 @@ gchar * v3270_get_copy_as_text(v3270 * terminal, const gchar *encoding) |
| 71 | 72 | return v3270_get_selection_as_text(terminal, terminal->selection.blocks, encoding, FALSE); |
| 72 | 73 | } |
| 73 | 74 | |
| 74 | -LIB3270_EXPORT void v3270_input_text(GtkWidget *widget, const gchar *text, const gchar *encoding) | |
| 75 | +gchar * v3270_convert_to_3270_charset(GtkWidget *widget, const gchar *text, const gchar *encoding, GError **error) | |
| 75 | 76 | { |
| 76 | - gchar * buffer = NULL; | |
| 77 | - H3270 * session = v3270_get_session(widget); | |
| 78 | - const gchar * charset = lib3270_get_display_charset(session); | |
| 79 | - gboolean next; | |
| 77 | + if(*error || !text) | |
| 78 | + return NULL; | |
| 80 | 79 | |
| 81 | - if(!text) | |
| 82 | - return; | |
| 83 | - else if(g_ascii_strcasecmp(encoding,charset)) | |
| 84 | - buffer = g_convert(text, -1, charset, encoding, NULL, NULL, NULL); | |
| 85 | - else | |
| 86 | - buffer = g_strdup(text); | |
| 87 | - | |
| 88 | - if(!buffer) | |
| 89 | - { | |
| 90 | - /* Conversion failed, update special chars and try again */ | |
| 91 | - size_t f; | |
| 92 | - | |
| 93 | - static const struct _xlat | |
| 94 | - { | |
| 95 | - const gchar *from; | |
| 96 | - const gchar *to; | |
| 97 | - } xlat[] = | |
| 98 | - { | |
| 99 | - { "–", "-" }, | |
| 100 | - { "→", "->" }, | |
| 101 | - { "←", "<-" }, | |
| 102 | - { "©", "(c)" }, | |
| 103 | - { "↔", "<->" }, | |
| 104 | - { "™", "(TM)" }, | |
| 105 | - { "®", "(R)" }, | |
| 106 | - { "“", "\"" }, | |
| 107 | - { "”", "\"" }, | |
| 108 | - { "…", "..." }, | |
| 109 | - { "•", "*" }, | |
| 110 | - { "․", "." }, | |
| 111 | - { "·", "*" }, | |
| 112 | - | |
| 113 | - }; | |
| 114 | - | |
| 115 | - gchar *string = g_strdup(text); | |
| 80 | + const gchar * charset = lib3270_get_display_charset(v3270_get_session(widget)); | |
| 81 | + if(!encoding || (g_ascii_strcasecmp(encoding,charset) == 0)) | |
| 82 | + { | |
| 83 | + // No conversion needed. | |
| 84 | + return g_strdup(text); | |
| 85 | + } | |
| 86 | + | |
| 87 | + gchar *converted = g_convert(text, -1, charset, encoding, NULL, NULL, NULL); | |
| 88 | + if(converted) | |
| 89 | + return converted; | |
| 90 | + | |
| 91 | + // Conversion failed, update UTF-8 special chars and try again | |
| 92 | + if(!g_ascii_strcasecmp(encoding,"UTF-8")) | |
| 93 | + { | |
| 94 | + size_t f; | |
| 95 | + | |
| 96 | + static const struct _xlat | |
| 97 | + { | |
| 98 | + const gchar *from; | |
| 99 | + const gchar *to; | |
| 100 | + } xlat[] = | |
| 101 | + { | |
| 102 | + { "–", "-" }, | |
| 103 | + { "→", "->" }, | |
| 104 | + { "←", "<-" }, | |
| 105 | + { "©", "(c)" }, | |
| 106 | + { "↔", "<->" }, | |
| 107 | + { "™", "(TM)" }, | |
| 108 | + { "®", "(R)" }, | |
| 109 | + { "“", "\"" }, | |
| 110 | + { "”", "\"" }, | |
| 111 | + { "…", "..." }, | |
| 112 | + { "•", "*" }, | |
| 113 | + { "․", "." }, | |
| 114 | + { "·", "*" }, | |
| 115 | + | |
| 116 | + }; | |
| 117 | + | |
| 118 | + g_autofree gchar *string = g_strdup(text); | |
| 116 | 119 | |
| 117 | 120 | // FIXME (perry#1#): Is there any better way for a "sed" here? |
| 118 | 121 | for(f=0;f<G_N_ELEMENTS(xlat);f++) |
| ... | ... | @@ -129,52 +132,55 @@ LIB3270_EXPORT void v3270_input_text(GtkWidget *widget, const gchar *text, const |
| 129 | 132 | } |
| 130 | 133 | } |
| 131 | 134 | |
| 132 | - buffer = g_convert(string, -1, charset, encoding, NULL, NULL, NULL); | |
| 135 | + converted = g_convert(string, -1, charset, encoding, NULL, NULL, NULL); | |
| 136 | + | |
| 137 | + if(converted) | |
| 138 | + return converted; | |
| 139 | + | |
| 140 | + } | |
| 133 | 141 | |
| 134 | - if(!buffer) | |
| 142 | + /* | |
| 143 | + // Still failing, convert line by line | |
| 144 | + { | |
| 145 | + size_t f; | |
| 146 | + gchar **ln = g_strsplit(text,"\n",-1); | |
| 147 | + | |
| 148 | + for(f=0;ln[f];f++) | |
| 135 | 149 | { |
| 136 | - // Still failing, convert line by line | |
| 137 | - gchar **ln = g_strsplit(string,"\n",-1); | |
| 150 | + GError *error = NULL; | |
| 151 | + gchar *str = g_convert(ln[f], -1, charset, encoding, NULL, NULL, error); | |
| 138 | 152 | |
| 139 | - for(f=0;ln[f];f++) | |
| 153 | + if(!str) | |
| 140 | 154 | { |
| 141 | - GError *error = NULL; | |
| 142 | - gchar *str = g_convert(ln[f], -1, charset, encoding, NULL, NULL, &error); | |
| 143 | - | |
| 144 | - if(!str) | |
| 145 | - { | |
| 146 | - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW( gtk_widget_get_toplevel(widget)), | |
| 147 | - GTK_DIALOG_DESTROY_WITH_PARENT, | |
| 148 | - GTK_MESSAGE_ERROR, | |
| 149 | - GTK_BUTTONS_OK, | |
| 150 | - _( "Can't convert line %lu from %s to %s" ),(unsigned long) (f+1), encoding, charset); | |
| 151 | - | |
| 152 | - gtk_window_set_title(GTK_WINDOW(dialog), _( "Charset error" ) ); | |
| 153 | - | |
| 154 | - if(error) | |
| 155 | - { | |
| 156 | - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s\n%s",error->message, ln[f]); | |
| 157 | - g_error_free(error); | |
| 158 | - error = NULL; | |
| 159 | - } | |
| 160 | - | |
| 161 | - gtk_dialog_run(GTK_DIALOG (dialog)); | |
| 162 | - gtk_widget_destroy(dialog); | |
| 163 | - | |
| 164 | - break; | |
| 165 | - } | |
| 166 | - else | |
| 167 | - { | |
| 168 | - g_free(str); | |
| 169 | - } | |
| 170 | - | |
| 155 | + g_strfreev(ln); | |
| 156 | + return NULL; | |
| 171 | 157 | } |
| 172 | - g_strfreev(ln); | |
| 158 | + | |
| 159 | + g_free(str); | |
| 173 | 160 | |
| 174 | 161 | } |
| 162 | + g_strfreev(ln); | |
| 163 | + | |
| 164 | + } | |
| 165 | + */ | |
| 166 | + | |
| 167 | + // Can't convert, use fallbacks | |
| 168 | + return g_convert_with_fallback( | |
| 169 | + text, | |
| 170 | + -1, | |
| 171 | + charset, | |
| 172 | + encoding, | |
| 173 | + " ", | |
| 174 | + NULL, | |
| 175 | + NULL, | |
| 176 | + error | |
| 177 | + ); | |
| 178 | +} | |
| 175 | 179 | |
| 176 | - g_free(string); | |
| 177 | - } | |
| 180 | +LIB3270_EXPORT void v3270_input_text(GtkWidget *widget, const gchar *text, const gchar *encoding) | |
| 181 | +{ | |
| 182 | + GError * error = NULL; | |
| 183 | + g_autofree gchar * buffer = v3270_convert_to_3270_charset(widget,text,encoding,&error); | |
| 178 | 184 | |
| 179 | 185 | if(buffer) |
| 180 | 186 | { |
| ... | ... | @@ -187,17 +193,27 @@ LIB3270_EXPORT void v3270_input_text(GtkWidget *widget, const gchar *text, const |
| 187 | 193 | *ptr = ' '; |
| 188 | 194 | } |
| 189 | 195 | } |
| 190 | - else | |
| 196 | + | |
| 197 | + if(error) | |
| 191 | 198 | { |
| 192 | 199 | g_signal_emit(widget,v3270_widget_signal[V3270_SIGNAL_PASTENEXT], 0, FALSE); |
| 200 | + v3270_popup_gerror(widget,error,NULL,"%s",_("Can't paste text")); | |
| 201 | + g_error_free(error); | |
| 193 | 202 | return; |
| 194 | 203 | } |
| 195 | 204 | |
| 196 | - next = lib3270_paste(session,(unsigned char *) buffer) ? TRUE : FALSE; | |
| 197 | - | |
| 198 | - g_free(buffer); | |
| 199 | - | |
| 200 | - g_signal_emit(widget,v3270_widget_signal[V3270_SIGNAL_PASTENEXT], 0, next); | |
| 205 | + // Do paste. | |
| 206 | + gboolean next = lib3270_paste( | |
| 207 | + v3270_get_session(widget), | |
| 208 | + (unsigned char *) buffer | |
| 209 | + ) ? TRUE : FALSE; | |
| 210 | + | |
| 211 | + g_signal_emit( | |
| 212 | + v3270_get_session(widget), | |
| 213 | + v3270_widget_signal[V3270_SIGNAL_PASTENEXT], | |
| 214 | + 0, | |
| 215 | + next | |
| 216 | + ); | |
| 201 | 217 | |
| 202 | 218 | } |
| 203 | 219 | ... | ... |
src/terminal/callbacks.c
| ... | ... | @@ -35,7 +35,7 @@ |
| 35 | 35 | |
| 36 | 36 | #include <terminal.h> |
| 37 | 37 | #include <internals.h> |
| 38 | - #include <save.h> | |
| 38 | + #include <v3270/dialogs.h> | |
| 39 | 39 | |
| 40 | 40 | #include <gtk/gtk.h> |
| 41 | 41 | #include <libintl.h> |
| ... | ... | @@ -337,7 +337,7 @@ static int save(H3270 *session, LIB3270_CONTENT_OPTION mode, const char *filenam |
| 337 | 337 | GtkWidget * widget = GTK_WIDGET(lib3270_get_user_data(session)); |
| 338 | 338 | |
| 339 | 339 | if(!GTK_IS_V3270(widget)) |
| 340 | - return EINVAL; | |
| 340 | + return errno = EINVAL; | |
| 341 | 341 | |
| 342 | 342 | GtkWidget *dialog = v3270_save_dialog_new(widget,mode,filename); |
| 343 | 343 | gtk_widget_show_all(dialog); |
| ... | ... | @@ -347,6 +347,21 @@ static int save(H3270 *session, LIB3270_CONTENT_OPTION mode, const char *filenam |
| 347 | 347 | return 0; |
| 348 | 348 | } |
| 349 | 349 | |
| 350 | +static int load(H3270 *session, const char *filename) | |
| 351 | +{ | |
| 352 | + GtkWidget * widget = GTK_WIDGET(lib3270_get_user_data(session)); | |
| 353 | + | |
| 354 | + if(!GTK_IS_V3270(widget)) | |
| 355 | + return errno = EINVAL; | |
| 356 | + | |
| 357 | + GtkWidget *dialog = v3270_load_dialog_new(widget,filename); | |
| 358 | + gtk_widget_show_all(dialog); | |
| 359 | + v3270_load_dialog_run(dialog); | |
| 360 | + gtk_widget_destroy(dialog); | |
| 361 | + | |
| 362 | + return 0; | |
| 363 | +} | |
| 364 | + | |
| 350 | 365 | static void popup_handler(H3270 *session, LIB3270_NOTIFY type, const char *title, const char *msg, const char *fmt, va_list args) |
| 351 | 366 | { |
| 352 | 367 | GtkWidget *terminal = (GtkWidget *) lib3270_get_user_data(session); |
| ... | ... | @@ -493,6 +508,7 @@ static void popup_handler(H3270 *session, LIB3270_NOTIFY type, const char *title |
| 493 | 508 | cbk->update_ssl = update_ssl; |
| 494 | 509 | cbk->print = print; |
| 495 | 510 | cbk->save = save; |
| 511 | + cbk->load = load; | |
| 496 | 512 | cbk->popup_ssl_error = popup_ssl_error; |
| 497 | 513 | |
| 498 | 514 | } | ... | ... |
src/terminal/charset.c
| ... | ... | @@ -32,6 +32,7 @@ |
| 32 | 32 | #include <lib3270/charset.h> |
| 33 | 33 | #include <lib3270/log.h> |
| 34 | 34 | #include <lib3270/X11keysym.h> |
| 35 | + #include <v3270/dialogs.h> | |
| 35 | 36 | |
| 36 | 37 | #define ERROR_DOMAIN g_quark_from_static_string(PACKAGE_NAME) |
| 37 | 38 | |
| ... | ... | @@ -454,27 +455,17 @@ |
| 454 | 455 | |
| 455 | 456 | if(error) |
| 456 | 457 | { |
| 457 | - GtkWidget * dialog; | |
| 458 | - gchar * name = g_path_get_basename(path); | |
| 458 | + g_autofree gchar * name = g_path_get_basename(path); | |
| 459 | 459 | |
| 460 | - dialog = gtk_message_dialog_new( NULL, | |
| 461 | - GTK_DIALOG_DESTROY_WITH_PARENT, | |
| 462 | - GTK_MESSAGE_WARNING, | |
| 463 | - GTK_BUTTONS_OK, | |
| 464 | - _( "Can't parse %s" ), name); | |
| 465 | - | |
| 466 | - g_free(name); | |
| 467 | - | |
| 468 | - gtk_window_set_title(GTK_WINDOW(dialog), _( "Remap Failed" ) ); | |
| 469 | - | |
| 470 | - if(error->message) | |
| 471 | - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), "%s", error->message); | |
| 460 | + v3270_popup_gerror( | |
| 461 | + widget, | |
| 462 | + error, | |
| 463 | + _( "Remap Failed" ), | |
| 464 | + _( "Can't parse %s" ), name | |
| 465 | + ); | |
| 472 | 466 | |
| 473 | 467 | g_error_free(error); |
| 474 | 468 | |
| 475 | - gtk_dialog_run(GTK_DIALOG (dialog)); | |
| 476 | - gtk_widget_destroy(dialog); | |
| 477 | - | |
| 478 | 469 | } else { |
| 479 | 470 | |
| 480 | 471 | H3270 * hSession = v3270_get_session(widget); | ... | ... |
src/testprogram/toolbar.c
| ... | ... | @@ -59,11 +59,16 @@ |
| 59 | 59 | lib3270_disconnect(v3270_get_session(terminal)); |
| 60 | 60 | } |
| 61 | 61 | |
| 62 | -static void save_all_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) | |
| 62 | + static void save_all_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) | |
| 63 | 63 | { |
| 64 | 64 | lib3270_save_all(v3270_get_session(terminal),NULL); |
| 65 | 65 | } |
| 66 | 66 | |
| 67 | + static void load_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) | |
| 68 | + { | |
| 69 | + lib3270_load(v3270_get_session(terminal),NULL); | |
| 70 | + } | |
| 71 | + | |
| 67 | 72 | static void ft_clicked(GtkButton *button, GtkWidget *terminal) |
| 68 | 73 | { |
| 69 | 74 | v3270_error_popup(terminal,"title","summary","body"); |
| ... | ... | @@ -176,25 +181,28 @@ static void save_all_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *termin |
| 176 | 181 | |
| 177 | 182 | // https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html |
| 178 | 183 | static const struct _buttons { |
| 179 | - const gchar * icon; | |
| 184 | + const gchar * icon; // https://specifications.freedesktop.org/icon-naming-spec/latest/ar01s04.html | |
| 180 | 185 | GCallback callback; |
| 181 | 186 | const gchar * tooltip; |
| 182 | 187 | } buttons[] = { |
| 183 | - { "gtk-connect", G_CALLBACK(connect_clicked), "Connect to host" }, | |
| 184 | - { "gtk-disconnect", G_CALLBACK(disconnect_clicked), "Disconnect from host" }, | |
| 185 | - { "gtk-select-color", G_CALLBACK(color_clicked), "Edit or change color scheme" }, | |
| 186 | - { "gtk-home", G_CALLBACK(host_clicked), "Configure host" }, | |
| 187 | - { "gtk-print", G_CALLBACK(print_clicked), "Print screen contents" }, | |
| 188 | - { "gtk-harddisk", G_CALLBACK(ft_clicked), "Open file transfer dialog" }, | |
| 189 | - { "gtk-copy", G_CALLBACK(copy_clicked), "Copy data" }, | |
| 190 | - { "gtk-paste", G_CALLBACK(paste_clicked), "Paste data" }, | |
| 191 | - { "gtk-save", G_CALLBACK(save_all_clicked), "Save screen" } | |
| 188 | + { "gtk-connect", G_CALLBACK(connect_clicked), "Connect to host" }, | |
| 189 | + { "gtk-disconnect", G_CALLBACK(disconnect_clicked), "Disconnect from host" }, | |
| 190 | + { "gtk-select-color", G_CALLBACK(color_clicked), "Edit or change color scheme" }, | |
| 191 | + { "network-server", G_CALLBACK(host_clicked), "Configure host" }, | |
| 192 | + { "gtk-print", G_CALLBACK(print_clicked), "Print screen contents" }, | |
| 193 | + { "gtk-harddisk", G_CALLBACK(ft_clicked), "Open file transfer dialog" }, | |
| 194 | + { "gtk-copy", G_CALLBACK(copy_clicked), "Copy data" }, | |
| 195 | + { "gtk-paste", G_CALLBACK(paste_clicked), "Paste data" }, | |
| 196 | + { "document-save", G_CALLBACK(save_all_clicked), "Save screen" }, | |
| 197 | + { "document-open", G_CALLBACK(load_clicked), "Paste file" }, | |
| 198 | + | |
| 192 | 199 | }; |
| 193 | 200 | |
| 194 | 201 | GtkWidget * toolbar = gtk_toolbar_new(); |
| 195 | 202 | for(f = 0; f < G_N_ELEMENTS(buttons); f++) |
| 196 | 203 | { |
| 197 | - GtkWidget * button = GTK_WIDGET(gtk_tool_button_new_from_stock(buttons[f].icon)); | |
| 204 | + GtkWidget * button = gtk_tool_button_new(gtk_image_new_from_icon_name(buttons[f].icon,GTK_ICON_SIZE_SMALL_TOOLBAR),"-"); | |
| 205 | + | |
| 198 | 206 | gtk_widget_set_tooltip_markup(button,buttons[f].tooltip); |
| 199 | 207 | g_signal_connect(G_OBJECT(button),"clicked",buttons[f].callback,terminal); |
| 200 | 208 | gtk_toolbar_insert(GTK_TOOLBAR(toolbar),GTK_TOOL_ITEM(button),-1); | ... | ... |
src/trace/trace.c
| ... | ... | @@ -50,6 +50,7 @@ |
| 50 | 50 | #include <lib3270/trace.h> |
| 51 | 51 | #include <lib3270/properties.h> |
| 52 | 52 | #include <v3270/trace.h> |
| 53 | + #include <v3270/dialogs.h> | |
| 53 | 54 | #include <internals.h> |
| 54 | 55 | |
| 55 | 56 | #if defined( HAVE_SYSLOG ) |
| ... | ... | @@ -443,23 +444,14 @@ |
| 443 | 444 | |
| 444 | 445 | if(error) |
| 445 | 446 | { |
| 446 | - GtkWidget *popup = | |
| 447 | - gtk_message_dialog_new_with_markup( | |
| 448 | - GTK_WINDOW(gtk_widget_get_toplevel(widget)), | |
| 449 | - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | |
| 450 | - GTK_MESSAGE_ERROR, | |
| 451 | - GTK_BUTTONS_CLOSE, | |
| 452 | - _( "Can't save %s" ), | |
| 453 | - filename | |
| 454 | - ); | |
| 455 | - | |
| 456 | - gtk_window_set_title(GTK_WINDOW(popup),_("Can't save file")); | |
| 457 | - | |
| 458 | - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(popup),"%s",error->message); | |
| 459 | - g_error_free(error); | |
| 447 | + v3270_popup_gerror( | |
| 448 | + widget, | |
| 449 | + error, | |
| 450 | + NULL, | |
| 451 | + _( "Can't save %s" ), filename | |
| 452 | + ); | |
| 460 | 453 | |
| 461 | - gtk_dialog_run(GTK_DIALOG(popup)); | |
| 462 | - gtk_widget_destroy(popup); | |
| 454 | + g_error_free(error); | |
| 463 | 455 | |
| 464 | 456 | } |
| 465 | 457 | ... | ... |
v3270.cbp
| ... | ... | @@ -60,6 +60,9 @@ |
| 60 | 60 | <Unit filename="src/dialogs/linux/select.c"> |
| 61 | 61 | <Option compilerVar="CC" /> |
| 62 | 62 | </Unit> |
| 63 | + <Unit filename="src/dialogs/pastefile.c"> | |
| 64 | + <Option compilerVar="CC" /> | |
| 65 | + </Unit> | |
| 63 | 66 | <Unit filename="src/dialogs/popups.c"> |
| 64 | 67 | <Option compilerVar="CC" /> |
| 65 | 68 | </Unit> | ... | ... |