diff --git a/Makefile.in b/Makefile.in index 08447cb..0e5abc1 100644 --- a/Makefile.in +++ b/Makefile.in @@ -265,7 +265,7 @@ run: \ $(BINDBG)/$(PACKAGE_NAME)@EXEEXT@ \ gschemas.compiled - @LD_LIBRARY_PATH=$(BINDBG) \ + @G_DEBUG=fatal-warnings \ $(BINDBG)/$(PACKAGE_NAME)@EXEEXT@ mem-check: \ diff --git a/src/objects/actions/lib3270/pakey.c b/src/objects/actions/lib3270/pakey.c index 334eb82..941cb80 100644 --- a/src/objects/actions/lib3270/pakey.c +++ b/src/objects/actions/lib3270/pakey.c @@ -100,14 +100,15 @@ } void Lib3270PaAction_init(Lib3270PaAction *object) { - pw3270Action * action = PW3270_ACTION(object); - - action->activate = activate; - action->name = "pakey"; } GAction * pw3270_action_new_pakey(void) { - return G_ACTION(g_object_new(PW3270_TYPE_PAKEY_ACTION, NULL)); + pw3270Action * action = PW3270_ACTION(g_object_new(PW3270_TYPE_PAKEY_ACTION, NULL)); + + action->activate = activate; + action->name = "pakey"; + + return G_ACTION(action); } diff --git a/src/objects/actions/lib3270/pfkey.c b/src/objects/actions/lib3270/pfkey.c index 9dbebec..dc23b4a 100644 --- a/src/objects/actions/lib3270/pfkey.c +++ b/src/objects/actions/lib3270/pfkey.c @@ -100,14 +100,16 @@ } void Lib3270PfAction_init(Lib3270PfAction *action) { - - action->parent.activate = activate; - action->parent.name = "pfkey"; - } GAction * pw3270_action_new_pfkey(void) { - return G_ACTION(g_object_new(PW3270_TYPE_PFKEY_ACTION, NULL)); + + pw3270Action * action = PW3270_ACTION(g_object_new(PW3270_TYPE_PFKEY_ACTION, NULL)); + + action->activate = activate; + action->name = "pfkey"; + + return G_ACTION(action); } diff --git a/src/objects/actions/window.c b/src/objects/actions/window.c index f51aa64..aee223c 100644 --- a/src/objects/actions/window.c +++ b/src/objects/actions/window.c @@ -83,6 +83,7 @@ }; for(ix = 0; ix < G_N_ELEMENTS(actions); ix++) { + debug("Creating action %u (%s)", (unsigned int) ix, g_action_get_name(actions[ix])); g_action_map_add_action(map,actions[ix]); } } diff --git a/src/objects/application/actions/window.c b/src/objects/application/actions/window.c index 9736b19..7597e8f 100644 --- a/src/objects/application/actions/window.c +++ b/src/objects/application/actions/window.c @@ -56,7 +56,7 @@ } - void pw3270_application_new_tab_activated(GSimpleAction G_GNUC_UNUSED(* action), GVariant G_GNUC_UNUSED(*parameter), gpointer application) { + void pw3270_application_new_tab_activated(GSimpleAction G_GNUC_UNUSED(*action), GVariant G_GNUC_UNUSED(*parameter), gpointer application) { debug("%s",__FUNCTION__); pw3270_terminal_new(GTK_WIDGET(gtk_application_get_active_window(GTK_APPLICATION(application))), NULL); diff --git a/src/objects/window/terminal.c b/src/objects/window/terminal.c index cf36a65..52d4d5c 100644 --- a/src/objects/window/terminal.c +++ b/src/objects/window/terminal.c @@ -33,6 +33,13 @@ #include #include + struct SessionDescriptor + { + gboolean changed; ///< @brief Save file? + GKeyFile * key_file; + gchar filename[1]; + }; + static void session_changed(GtkWidget *terminal, GtkWidget *label) { gtk_label_set_text(GTK_LABEL(label),v3270_get_session_name(terminal)); @@ -89,8 +96,37 @@ return FALSE; } + static void check_for_session_changed(GtkWidget *terminal) { + + struct SessionDescriptor * session = (struct SessionDescriptor *) g_object_get_data(G_OBJECT(terminal),"session-descriptor"); + + if(session->changed) { + + session->changed = FALSE; + + GError * error = NULL; + g_key_file_save_to_file(session->key_file,session->filename,&error); + + if(error) { + + g_warning("Can't save \"%s\": %s",session->filename,error->message); + g_error_free(error); + + } else { + + g_message("Session was saved to %s",session->filename); + + } + + } + + } + + static void on_terminal_destroy(GtkWidget *terminal, GtkWindow * window) { + check_for_session_changed(terminal); + if(gtk_window_get_default_widget(window) != terminal) { return; } @@ -116,12 +152,6 @@ } - - static gboolean bg_auto_connect(GtkWidget *terminal) { - v3270_reconnect(terminal); - return FALSE; - } - static void disconnected(GtkWidget *terminal, GtkWindow * window) { debug("%s",__FUNCTION__); @@ -205,85 +235,84 @@ // Setup session. - H3270 * hSession = v3270_get_session(terminal); - - if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_CONNECT_ON_STARTUP)) - g_idle_add((GSourceFunc) bg_auto_connect, terminal); +// H3270 * hSession = v3270_get_session(terminal); return page; } - static void save_settings(GtkWidget *terminal, const gchar *filename) { - - GError *error = NULL; - GKeyFile * key_file = g_key_file_new(); - - g_key_file_load_from_file(key_file,filename,G_KEY_FILE_NONE,&error); - - if(error) { - - g_warning("Can't load \"%s\": %s",filename,error->message); - g_error_free(error); - return; - - } + static void save_settings(GtkWidget *terminal, struct SessionDescriptor * session) { - v3270_to_key_file(terminal,key_file,"terminal"); - v3270_accelerator_map_to_key_file(terminal, key_file, "accelerators"); + debug("************************************* %s",__FUNCTION__); + v3270_to_key_file(terminal,session->key_file,"terminal"); + v3270_accelerator_map_to_key_file(terminal, session->key_file, "accelerators"); - g_key_file_save_to_file(key_file,filename,&error); + session->changed = TRUE; - if(error) { + } - g_warning("Can't save \"%s\": %s",filename,error->message); - g_error_free(error); + static void toggle_changed(G_GNUC_UNUSED v3270 *widget, G_GNUC_UNUSED LIB3270_TOGGLE_ID toggle_id, gboolean toggle_state, const gchar *toggle_name, struct SessionDescriptor * session) { + debug("%s(%s)=%s",__FUNCTION__,toggle_name,toggle_state ? "ON" : "OFF"); + g_key_file_set_boolean(session->key_file,"terminal",toggle_name,toggle_state); + session->changed = TRUE; + } - } else { + static void close_settings(struct SessionDescriptor * session) { - g_message("Session properties save to %s",filename); - } + if(session->key_file) { - g_key_file_free(key_file); + if(session->changed) { + g_message("Saving file %s",session->filename); + g_key_file_save_to_file(session->key_file,session->filename,NULL); + } else { + g_message("Closing file %s",session->filename); + } + g_key_file_free(session->key_file); + session->key_file = NULL; + } + g_free(session); } - GtkWidget * pw3270_terminal_new(GtkWidget *widget, const gchar *session_file) { + struct SessionDescriptor * descriptor; + g_return_val_if_fail(PW3270_IS_APPLICATION_WINDOW(widget),NULL); pw3270ApplicationWindow * window = PW3270_APPLICATION_WINDOW(widget); GtkWidget * terminal = v3270_new(); - gchar * filename; - if(session_file) { // Use the supplied session file - filename = g_strdup(session_file); + descriptor = g_malloc0(sizeof(struct SessionDescriptor) + strlen(session_file)); + strcpy(descriptor->filename,session_file); } else { // No session file, use the default one. - filename = g_build_filename(g_get_user_config_dir(),G_STRINGIFY(PRODUCT_NAME) ".conf",NULL); + g_autofree gchar * filename = g_build_filename(g_get_user_config_dir(),G_STRINGIFY(PRODUCT_NAME) ".conf",NULL); + + descriptor = g_malloc0(sizeof(struct SessionDescriptor) + strlen(filename)); + strcpy(descriptor->filename,filename); } // Setup session file; GError *error = NULL; - g_object_set_data_full(G_OBJECT(terminal),"session-file-name",filename,g_free); + g_object_set_data_full(G_OBJECT(terminal),"session-descriptor",descriptor,(GDestroyNotify) close_settings); - GKeyFile * key_file = g_key_file_new(); + descriptor->key_file = g_key_file_new(); - if(g_file_test(filename,G_FILE_TEST_IS_REGULAR)) { + if(g_file_test(descriptor->filename,G_FILE_TEST_IS_REGULAR)) { // Found session file, open it. - if(!g_key_file_load_from_file(key_file,filename,G_KEY_FILE_NONE,&error)) { - g_warning("Can't load \"%s\"",filename); + if(!g_key_file_load_from_file(descriptor->key_file,descriptor->filename,G_KEY_FILE_NONE,&error)) { + g_warning("Can't load \"%s\"",descriptor->filename); } else { - g_message("Loading session properties from %s",filename); + g_message("Loading session properties from %s",descriptor->filename); } } else { @@ -291,7 +320,7 @@ // No session file, load the defaults (if available). lib3270_autoptr(char) default_settings = lib3270_build_data_filename("defaults.conf",NULL); if(g_file_test(default_settings,G_FILE_TEST_IS_REGULAR)) { - if(!g_key_file_load_from_file(key_file,default_settings,G_KEY_FILE_NONE,&error)) { + if(!g_key_file_load_from_file(descriptor->key_file,default_settings,G_KEY_FILE_NONE,&error)) { g_warning("Can't load \"%s\"",default_settings); } else { g_message("Loading session properties from %s",default_settings); @@ -310,17 +339,16 @@ } else { - v3270_load_key_file(terminal,key_file,NULL); - v3270_accelerator_map_load_key_file(terminal,key_file,NULL); + v3270_load_key_file(terminal,descriptor->key_file,NULL); + v3270_accelerator_map_load_key_file(terminal,descriptor->key_file,NULL); } - g_key_file_free(key_file); - append_terminal_page(window,terminal); // Setup signals. - g_signal_connect(G_OBJECT(terminal),"save-settings",G_CALLBACK(save_settings),filename); + g_signal_connect(G_OBJECT(terminal),"save-settings",G_CALLBACK(save_settings),descriptor); + g_signal_connect(G_OBJECT(terminal),"toggle_changed",G_CALLBACK(toggle_changed),descriptor); return terminal; diff --git a/src/pw3270/window.c b/src/pw3270/window.c index bb44154..c8fc9ea 100644 --- a/src/pw3270/window.c +++ b/src/pw3270/window.c @@ -306,9 +306,6 @@ static GtkWidget * trace_window = NULL; v3270_set_scaled_fonts(GTK_PW3270(widget)->terminal,get_boolean_from_config("terminal","sfonts",FALSE)); - if(pw3270_get_toggle(widget,LIB3270_TOGGLE_CONNECT_ON_STARTUP)) - g_idle_add((GSourceFunc) bg_auto_connect, widget); - return widget; } -- libgit2 0.21.2