Commit bb522ebfa53846ecaa11131242007516e0c17b89

Authored by Perry Werneck
1 parent 8d7453fa

Implementing the new "save session" dialog.

@@ -57,3 +57,4 @@ src/include/lib3270 @@ -57,3 +57,4 @@ src/include/lib3270
57 vgcore.* 57 vgcore.*
58 gschemas.compiled 58 gschemas.compiled
59 *.gschema.xml 59 *.gschema.xml
  60 +*.3270
src/objects/actions/save.c
@@ -37,13 +37,28 @@ @@ -37,13 +37,28 @@
37 #include <pw3270.h> 37 #include <pw3270.h>
38 #include <pw3270/application.h> 38 #include <pw3270/application.h>
39 39
40 - static gchar * get_session_file_name(GtkWidget *terminal, const gchar *title) {  
41 40
42 - gchar * filename = NULL; 41 + static GtkWidget * factory(GtkWidget *terminal);
  42 + static void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal);
  43 +
  44 + GAction * pw3270_action_save_session_as_new(void) {
  45 +
  46 + pw3270SimpleAction * action = pw3270_dialog_action_new(factory);
  47 +
  48 + action->parent.name = "save.session.as";
  49 + action->label = N_("Save As");
  50 + action->icon_name = "document-save-as";
  51 + action->tooltip = N_("Save session properties to file");
  52 +
  53 + return G_ACTION(action);
  54 +
  55 + }
  56 +
  57 + GtkWidget * factory(GtkWidget *terminal) {
43 58
44 GtkWidget * dialog = 59 GtkWidget * dialog =
45 gtk_file_chooser_dialog_new( 60 gtk_file_chooser_dialog_new(
46 - title, 61 + _("Save session properties"),
47 GTK_WINDOW(gtk_widget_get_toplevel(terminal)), 62 GTK_WINDOW(gtk_widget_get_toplevel(terminal)),
48 GTK_FILE_CHOOSER_ACTION_SAVE, 63 GTK_FILE_CHOOSER_ACTION_SAVE,
49 _("Save"), GTK_RESPONSE_OK, 64 _("Save"), GTK_RESPONSE_OK,
@@ -56,43 +71,26 @@ @@ -56,43 +71,26 @@
56 71
57 if(terminal) { 72 if(terminal) {
58 const gchar * current_file = v3270_get_session_filename(terminal); 73 const gchar * current_file = v3270_get_session_filename(terminal);
59 - if(current_file) 74 + if(current_file && g_file_test(current_file,G_FILE_TEST_IS_REGULAR) && !g_str_has_prefix(current_file,g_get_user_config_dir()))
60 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),current_file); 75 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),current_file);
61 } 76 }
62 77
63 - gtk_widget_show_all(dialog);  
64 - if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) {  
65 - filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));  
66 - }  
67 -  
68 - gtk_widget_destroy(dialog); 78 + g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL);
  79 + g_signal_connect(dialog,"response",G_CALLBACK(response),terminal);
69 80
70 - return filename; 81 + return dialog;
71 } 82 }
72 83
73 - static void activate(GAction G_GNUC_UNUSED(*action), GVariant G_GNUC_UNUSED(*parameter), GtkWidget *terminal) { 84 + void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) {
74 85
75 - debug("%s",__FUNCTION__); 86 + debug("%s(%d)",__FUNCTION__,response_id);
76 87
77 - g_autofree gchar * filename = get_session_file_name(terminal, _("Save session properties")); 88 + g_autofree gchar * filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
78 89
79 - if(!filename)  
80 - return;  
81 -  
82 -  
83 -  
84 - }  
85 -  
86 - GAction * pw3270_action_save_session_as_new(void) {  
87 -  
88 - pw3270SimpleAction * action = pw3270_simple_action_new();  
89 -  
90 - action->parent.name = "save.session.as";  
91 - action->parent.activate = activate;  
92 - action->label = N_("Save As");  
93 - action->icon_name = "document-save-as";  
94 - action->tooltip = N_("Save session properties to file"); 90 + gtk_widget_destroy(dialog);
95 91
96 - return G_ACTION(action); 92 + if(response_id == GTK_RESPONSE_OK) {
  93 + v3270_set_session_filename(terminal, filename);
  94 + }
97 95
98 } 96 }
src/objects/window/terminal.c
@@ -323,6 +323,60 @@ @@ -323,6 +323,60 @@
323 return NULL; 323 return NULL;
324 } 324 }
325 325
  326 + void v3270_set_session_filename(GtkWidget *terminal, const gchar *filename) {
  327 +
  328 + struct SessionDescriptor * old_session = (struct SessionDescriptor *) g_object_get_data(G_OBJECT(terminal),"session-descriptor");
  329 + struct SessionDescriptor * new_session = (struct SessionDescriptor *) g_malloc0(sizeof(struct SessionDescriptor) + strlen(filename));
  330 +
  331 + if(old_session) {
  332 + memcpy(new_session,old_session,sizeof(struct SessionDescriptor));
  333 + }
  334 +
  335 + strcpy(new_session->filename,filename);
  336 + new_session->key_file = g_key_file_new();
  337 +
  338 + v3270_to_key_file(terminal,new_session->key_file,NULL);
  339 + v3270_accelerator_map_to_key_file(terminal,new_session->key_file,NULL);
  340 +
  341 + GError *error = NULL;
  342 + g_key_file_save_to_file(new_session->key_file,new_session->filename,&error);
  343 +
  344 + if(error) {
  345 +
  346 + g_message("Can't save file \"%s\": %s",new_session->filename,error->message);
  347 +
  348 + GtkWidget * dialog = gtk_message_dialog_new_with_markup(
  349 + GTK_WINDOW(gtk_widget_get_toplevel(terminal)),
  350 + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
  351 + GTK_MESSAGE_ERROR,
  352 + GTK_BUTTONS_CANCEL,
  353 + _("Can't save file \"%s\""),new_session->filename
  354 + );
  355 +
  356 + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",error->message);
  357 +
  358 + gtk_window_set_title(GTK_WINDOW(dialog),_("Can't save session file"));
  359 +
  360 + gtk_widget_show_all(dialog);
  361 +
  362 + g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL);
  363 + g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL);
  364 +
  365 + g_error_free(error);
  366 + g_key_file_free(new_session->key_file);
  367 + g_free(new_session);
  368 +
  369 + } else {
  370 +
  371 + new_session->changed = FALSE;
  372 + g_object_set_data_full(G_OBJECT(terminal),"session-descriptor",new_session,(GDestroyNotify) close_settings);
  373 +
  374 + }
  375 +
  376 +
  377 + }
  378 +
  379 +
326 GtkWidget * pw3270_terminal_new(GtkWidget *widget, const gchar *session_file) { 380 GtkWidget * pw3270_terminal_new(GtkWidget *widget, const gchar *session_file) {
327 381
328 struct SessionDescriptor * descriptor; 382 struct SessionDescriptor * descriptor;