Commit bb522ebfa53846ecaa11131242007516e0c17b89

Authored by Perry Werneck
1 parent 8d7453fa

Implementing the new "save session" dialog.

.gitignore
... ... @@ -57,3 +57,4 @@ src/include/lib3270
57 57 vgcore.*
58 58 gschemas.compiled
59 59 *.gschema.xml
  60 +*.3270
... ...
src/objects/actions/save.c
... ... @@ -37,13 +37,28 @@
37 37 #include <pw3270.h>
38 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 59 GtkWidget * dialog =
45 60 gtk_file_chooser_dialog_new(
46   - title,
  61 + _("Save session properties"),
47 62 GTK_WINDOW(gtk_widget_get_toplevel(terminal)),
48 63 GTK_FILE_CHOOSER_ACTION_SAVE,
49 64 _("Save"), GTK_RESPONSE_OK,
... ... @@ -56,43 +71,26 @@
56 71  
57 72 if(terminal) {
58 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 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 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 380 GtkWidget * pw3270_terminal_new(GtkWidget *widget, const gchar *session_file) {
327 381  
328 382 struct SessionDescriptor * descriptor;
... ...