From bb522ebfa53846ecaa11131242007516e0c17b89 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Fri, 3 Jan 2020 18:20:51 -0300 Subject: [PATCH] Implementing the new "save session" dialog. --- .gitignore | 1 + src/objects/actions/save.c | 60 +++++++++++++++++++++++++++++------------------------------- src/objects/window/terminal.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 31 deletions(-) diff --git a/.gitignore b/.gitignore index e3ef52f..f371d16 100644 --- a/.gitignore +++ b/.gitignore @@ -57,3 +57,4 @@ src/include/lib3270 vgcore.* gschemas.compiled *.gschema.xml +*.3270 diff --git a/src/objects/actions/save.c b/src/objects/actions/save.c index 2df330f..a3724f0 100644 --- a/src/objects/actions/save.c +++ b/src/objects/actions/save.c @@ -37,13 +37,28 @@ #include #include - static gchar * get_session_file_name(GtkWidget *terminal, const gchar *title) { - gchar * filename = NULL; + static GtkWidget * factory(GtkWidget *terminal); + static void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal); + + GAction * pw3270_action_save_session_as_new(void) { + + pw3270SimpleAction * action = pw3270_dialog_action_new(factory); + + action->parent.name = "save.session.as"; + action->label = N_("Save As"); + action->icon_name = "document-save-as"; + action->tooltip = N_("Save session properties to file"); + + return G_ACTION(action); + + } + + GtkWidget * factory(GtkWidget *terminal) { GtkWidget * dialog = gtk_file_chooser_dialog_new( - title, + _("Save session properties"), GTK_WINDOW(gtk_widget_get_toplevel(terminal)), GTK_FILE_CHOOSER_ACTION_SAVE, _("Save"), GTK_RESPONSE_OK, @@ -56,43 +71,26 @@ if(terminal) { const gchar * current_file = v3270_get_session_filename(terminal); - if(current_file) + if(current_file && g_file_test(current_file,G_FILE_TEST_IS_REGULAR) && !g_str_has_prefix(current_file,g_get_user_config_dir())) gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),current_file); } - gtk_widget_show_all(dialog); - if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) { - filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - } - - gtk_widget_destroy(dialog); + g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL); + g_signal_connect(dialog,"response",G_CALLBACK(response),terminal); - return filename; + return dialog; } - static void activate(GAction G_GNUC_UNUSED(*action), GVariant G_GNUC_UNUSED(*parameter), GtkWidget *terminal) { + void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) { - debug("%s",__FUNCTION__); + debug("%s(%d)",__FUNCTION__,response_id); - g_autofree gchar * filename = get_session_file_name(terminal, _("Save session properties")); + g_autofree gchar * filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - if(!filename) - return; - - - - } - - GAction * pw3270_action_save_session_as_new(void) { - - pw3270SimpleAction * action = pw3270_simple_action_new(); - - action->parent.name = "save.session.as"; - action->parent.activate = activate; - action->label = N_("Save As"); - action->icon_name = "document-save-as"; - action->tooltip = N_("Save session properties to file"); + gtk_widget_destroy(dialog); - return G_ACTION(action); + if(response_id == GTK_RESPONSE_OK) { + v3270_set_session_filename(terminal, filename); + } } diff --git a/src/objects/window/terminal.c b/src/objects/window/terminal.c index 34ef6cb..257d509 100644 --- a/src/objects/window/terminal.c +++ b/src/objects/window/terminal.c @@ -323,6 +323,60 @@ return NULL; } + void v3270_set_session_filename(GtkWidget *terminal, const gchar *filename) { + + struct SessionDescriptor * old_session = (struct SessionDescriptor *) g_object_get_data(G_OBJECT(terminal),"session-descriptor"); + struct SessionDescriptor * new_session = (struct SessionDescriptor *) g_malloc0(sizeof(struct SessionDescriptor) + strlen(filename)); + + if(old_session) { + memcpy(new_session,old_session,sizeof(struct SessionDescriptor)); + } + + strcpy(new_session->filename,filename); + new_session->key_file = g_key_file_new(); + + v3270_to_key_file(terminal,new_session->key_file,NULL); + v3270_accelerator_map_to_key_file(terminal,new_session->key_file,NULL); + + GError *error = NULL; + g_key_file_save_to_file(new_session->key_file,new_session->filename,&error); + + if(error) { + + g_message("Can't save file \"%s\": %s",new_session->filename,error->message); + + GtkWidget * dialog = gtk_message_dialog_new_with_markup( + GTK_WINDOW(gtk_widget_get_toplevel(terminal)), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CANCEL, + _("Can't save file \"%s\""),new_session->filename + ); + + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",error->message); + + gtk_window_set_title(GTK_WINDOW(dialog),_("Can't save session file")); + + gtk_widget_show_all(dialog); + + g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL); + g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL); + + g_error_free(error); + g_key_file_free(new_session->key_file); + g_free(new_session); + + } else { + + new_session->changed = FALSE; + g_object_set_data_full(G_OBJECT(terminal),"session-descriptor",new_session,(GDestroyNotify) close_settings); + + } + + + } + + GtkWidget * pw3270_terminal_new(GtkWidget *widget, const gchar *session_file) { struct SessionDescriptor * descriptor; -- libgit2 0.21.2