Commit 3f0a2779ace926ff3b37760c8b1a33dd706abc18
1 parent
34dc0b37
Exists in
master
and in
4 other branches
Fixing gtk/glib warnings
Fixing performance issues in session file.
Showing
7 changed files
with
95 additions
and
66 deletions
Show diff stats
Makefile.in
src/objects/actions/lib3270/pakey.c
| ... | ... | @@ -100,14 +100,15 @@ |
| 100 | 100 | } |
| 101 | 101 | |
| 102 | 102 | void Lib3270PaAction_init(Lib3270PaAction *object) { |
| 103 | - pw3270Action * action = PW3270_ACTION(object); | |
| 104 | - | |
| 105 | - action->activate = activate; | |
| 106 | - action->name = "pakey"; | |
| 107 | 103 | } |
| 108 | 104 | |
| 109 | 105 | |
| 110 | 106 | GAction * pw3270_action_new_pakey(void) { |
| 111 | - return G_ACTION(g_object_new(PW3270_TYPE_PAKEY_ACTION, NULL)); | |
| 107 | + pw3270Action * action = PW3270_ACTION(g_object_new(PW3270_TYPE_PAKEY_ACTION, NULL)); | |
| 108 | + | |
| 109 | + action->activate = activate; | |
| 110 | + action->name = "pakey"; | |
| 111 | + | |
| 112 | + return G_ACTION(action); | |
| 112 | 113 | } |
| 113 | 114 | ... | ... |
src/objects/actions/lib3270/pfkey.c
| ... | ... | @@ -100,14 +100,16 @@ |
| 100 | 100 | } |
| 101 | 101 | |
| 102 | 102 | void Lib3270PfAction_init(Lib3270PfAction *action) { |
| 103 | - | |
| 104 | - action->parent.activate = activate; | |
| 105 | - action->parent.name = "pfkey"; | |
| 106 | - | |
| 107 | 103 | } |
| 108 | 104 | |
| 109 | 105 | GAction * pw3270_action_new_pfkey(void) { |
| 110 | - return G_ACTION(g_object_new(PW3270_TYPE_PFKEY_ACTION, NULL)); | |
| 106 | + | |
| 107 | + pw3270Action * action = PW3270_ACTION(g_object_new(PW3270_TYPE_PFKEY_ACTION, NULL)); | |
| 108 | + | |
| 109 | + action->activate = activate; | |
| 110 | + action->name = "pfkey"; | |
| 111 | + | |
| 112 | + return G_ACTION(action); | |
| 111 | 113 | } |
| 112 | 114 | |
| 113 | 115 | ... | ... |
src/objects/actions/window.c
src/objects/application/actions/window.c
| ... | ... | @@ -56,7 +56,7 @@ |
| 56 | 56 | |
| 57 | 57 | } |
| 58 | 58 | |
| 59 | - void pw3270_application_new_tab_activated(GSimpleAction G_GNUC_UNUSED(* action), GVariant G_GNUC_UNUSED(*parameter), gpointer application) { | |
| 59 | + void pw3270_application_new_tab_activated(GSimpleAction G_GNUC_UNUSED(*action), GVariant G_GNUC_UNUSED(*parameter), gpointer application) { | |
| 60 | 60 | |
| 61 | 61 | debug("%s",__FUNCTION__); |
| 62 | 62 | pw3270_terminal_new(GTK_WIDGET(gtk_application_get_active_window(GTK_APPLICATION(application))), NULL); | ... | ... |
src/objects/window/terminal.c
| ... | ... | @@ -33,6 +33,13 @@ |
| 33 | 33 | #include <v3270/settings.h> |
| 34 | 34 | #include <v3270/actions.h> |
| 35 | 35 | |
| 36 | + struct SessionDescriptor | |
| 37 | + { | |
| 38 | + gboolean changed; ///< @brief Save file? | |
| 39 | + GKeyFile * key_file; | |
| 40 | + gchar filename[1]; | |
| 41 | + }; | |
| 42 | + | |
| 36 | 43 | static void session_changed(GtkWidget *terminal, GtkWidget *label) { |
| 37 | 44 | |
| 38 | 45 | gtk_label_set_text(GTK_LABEL(label),v3270_get_session_name(terminal)); |
| ... | ... | @@ -89,8 +96,37 @@ |
| 89 | 96 | return FALSE; |
| 90 | 97 | } |
| 91 | 98 | |
| 99 | + static void check_for_session_changed(GtkWidget *terminal) { | |
| 100 | + | |
| 101 | + struct SessionDescriptor * session = (struct SessionDescriptor *) g_object_get_data(G_OBJECT(terminal),"session-descriptor"); | |
| 102 | + | |
| 103 | + if(session->changed) { | |
| 104 | + | |
| 105 | + session->changed = FALSE; | |
| 106 | + | |
| 107 | + GError * error = NULL; | |
| 108 | + g_key_file_save_to_file(session->key_file,session->filename,&error); | |
| 109 | + | |
| 110 | + if(error) { | |
| 111 | + | |
| 112 | + g_warning("Can't save \"%s\": %s",session->filename,error->message); | |
| 113 | + g_error_free(error); | |
| 114 | + | |
| 115 | + } else { | |
| 116 | + | |
| 117 | + g_message("Session was saved to %s",session->filename); | |
| 118 | + | |
| 119 | + } | |
| 120 | + | |
| 121 | + } | |
| 122 | + | |
| 123 | + } | |
| 124 | + | |
| 125 | + | |
| 92 | 126 | static void on_terminal_destroy(GtkWidget *terminal, GtkWindow * window) { |
| 93 | 127 | |
| 128 | + check_for_session_changed(terminal); | |
| 129 | + | |
| 94 | 130 | if(gtk_window_get_default_widget(window) != terminal) { |
| 95 | 131 | return; |
| 96 | 132 | } |
| ... | ... | @@ -116,12 +152,6 @@ |
| 116 | 152 | |
| 117 | 153 | } |
| 118 | 154 | |
| 119 | - | |
| 120 | - static gboolean bg_auto_connect(GtkWidget *terminal) { | |
| 121 | - v3270_reconnect(terminal); | |
| 122 | - return FALSE; | |
| 123 | - } | |
| 124 | - | |
| 125 | 155 | static void disconnected(GtkWidget *terminal, GtkWindow * window) { |
| 126 | 156 | |
| 127 | 157 | debug("%s",__FUNCTION__); |
| ... | ... | @@ -205,85 +235,84 @@ |
| 205 | 235 | |
| 206 | 236 | // Setup session. |
| 207 | 237 | |
| 208 | - H3270 * hSession = v3270_get_session(terminal); | |
| 209 | - | |
| 210 | - if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_CONNECT_ON_STARTUP)) | |
| 211 | - g_idle_add((GSourceFunc) bg_auto_connect, terminal); | |
| 238 | +// H3270 * hSession = v3270_get_session(terminal); | |
| 212 | 239 | |
| 213 | 240 | return page; |
| 214 | 241 | |
| 215 | 242 | } |
| 216 | 243 | |
| 217 | - static void save_settings(GtkWidget *terminal, const gchar *filename) { | |
| 218 | - | |
| 219 | - GError *error = NULL; | |
| 220 | - GKeyFile * key_file = g_key_file_new(); | |
| 221 | - | |
| 222 | - g_key_file_load_from_file(key_file,filename,G_KEY_FILE_NONE,&error); | |
| 223 | - | |
| 224 | - if(error) { | |
| 225 | - | |
| 226 | - g_warning("Can't load \"%s\": %s",filename,error->message); | |
| 227 | - g_error_free(error); | |
| 228 | - return; | |
| 229 | - | |
| 230 | - } | |
| 244 | + static void save_settings(GtkWidget *terminal, struct SessionDescriptor * session) { | |
| 231 | 245 | |
| 232 | - v3270_to_key_file(terminal,key_file,"terminal"); | |
| 233 | - v3270_accelerator_map_to_key_file(terminal, key_file, "accelerators"); | |
| 246 | + debug("************************************* %s",__FUNCTION__); | |
| 247 | + v3270_to_key_file(terminal,session->key_file,"terminal"); | |
| 248 | + v3270_accelerator_map_to_key_file(terminal, session->key_file, "accelerators"); | |
| 234 | 249 | |
| 235 | - g_key_file_save_to_file(key_file,filename,&error); | |
| 250 | + session->changed = TRUE; | |
| 236 | 251 | |
| 237 | - if(error) { | |
| 252 | + } | |
| 238 | 253 | |
| 239 | - g_warning("Can't save \"%s\": %s",filename,error->message); | |
| 240 | - g_error_free(error); | |
| 254 | + 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) { | |
| 255 | + debug("%s(%s)=%s",__FUNCTION__,toggle_name,toggle_state ? "ON" : "OFF"); | |
| 256 | + g_key_file_set_boolean(session->key_file,"terminal",toggle_name,toggle_state); | |
| 257 | + session->changed = TRUE; | |
| 258 | + } | |
| 241 | 259 | |
| 242 | - } else { | |
| 260 | + static void close_settings(struct SessionDescriptor * session) { | |
| 243 | 261 | |
| 244 | - g_message("Session properties save to %s",filename); | |
| 245 | - } | |
| 262 | + if(session->key_file) { | |
| 246 | 263 | |
| 247 | - g_key_file_free(key_file); | |
| 264 | + if(session->changed) { | |
| 265 | + g_message("Saving file %s",session->filename); | |
| 266 | + g_key_file_save_to_file(session->key_file,session->filename,NULL); | |
| 267 | + } else { | |
| 268 | + g_message("Closing file %s",session->filename); | |
| 269 | + } | |
| 248 | 270 | |
| 271 | + g_key_file_free(session->key_file); | |
| 272 | + session->key_file = NULL; | |
| 273 | + } | |
| 249 | 274 | |
| 275 | + g_free(session); | |
| 250 | 276 | } |
| 251 | 277 | |
| 252 | - | |
| 253 | 278 | GtkWidget * pw3270_terminal_new(GtkWidget *widget, const gchar *session_file) { |
| 254 | 279 | |
| 280 | + struct SessionDescriptor * descriptor; | |
| 281 | + | |
| 255 | 282 | g_return_val_if_fail(PW3270_IS_APPLICATION_WINDOW(widget),NULL); |
| 256 | 283 | |
| 257 | 284 | pw3270ApplicationWindow * window = PW3270_APPLICATION_WINDOW(widget); |
| 258 | 285 | GtkWidget * terminal = v3270_new(); |
| 259 | 286 | |
| 260 | - gchar * filename; | |
| 261 | - | |
| 262 | 287 | if(session_file) { |
| 263 | 288 | |
| 264 | 289 | // Use the supplied session file |
| 265 | - filename = g_strdup(session_file); | |
| 290 | + descriptor = g_malloc0(sizeof(struct SessionDescriptor) + strlen(session_file)); | |
| 291 | + strcpy(descriptor->filename,session_file); | |
| 266 | 292 | |
| 267 | 293 | } else { |
| 268 | 294 | |
| 269 | 295 | // No session file, use the default one. |
| 270 | - filename = g_build_filename(g_get_user_config_dir(),G_STRINGIFY(PRODUCT_NAME) ".conf",NULL); | |
| 296 | + g_autofree gchar * filename = g_build_filename(g_get_user_config_dir(),G_STRINGIFY(PRODUCT_NAME) ".conf",NULL); | |
| 297 | + | |
| 298 | + descriptor = g_malloc0(sizeof(struct SessionDescriptor) + strlen(filename)); | |
| 299 | + strcpy(descriptor->filename,filename); | |
| 271 | 300 | |
| 272 | 301 | } |
| 273 | 302 | |
| 274 | 303 | // Setup session file; |
| 275 | 304 | GError *error = NULL; |
| 276 | - g_object_set_data_full(G_OBJECT(terminal),"session-file-name",filename,g_free); | |
| 305 | + g_object_set_data_full(G_OBJECT(terminal),"session-descriptor",descriptor,(GDestroyNotify) close_settings); | |
| 277 | 306 | |
| 278 | - GKeyFile * key_file = g_key_file_new(); | |
| 307 | + descriptor->key_file = g_key_file_new(); | |
| 279 | 308 | |
| 280 | - if(g_file_test(filename,G_FILE_TEST_IS_REGULAR)) { | |
| 309 | + if(g_file_test(descriptor->filename,G_FILE_TEST_IS_REGULAR)) { | |
| 281 | 310 | |
| 282 | 311 | // Found session file, open it. |
| 283 | - if(!g_key_file_load_from_file(key_file,filename,G_KEY_FILE_NONE,&error)) { | |
| 284 | - g_warning("Can't load \"%s\"",filename); | |
| 312 | + if(!g_key_file_load_from_file(descriptor->key_file,descriptor->filename,G_KEY_FILE_NONE,&error)) { | |
| 313 | + g_warning("Can't load \"%s\"",descriptor->filename); | |
| 285 | 314 | } else { |
| 286 | - g_message("Loading session properties from %s",filename); | |
| 315 | + g_message("Loading session properties from %s",descriptor->filename); | |
| 287 | 316 | } |
| 288 | 317 | |
| 289 | 318 | } else { |
| ... | ... | @@ -291,7 +320,7 @@ |
| 291 | 320 | // No session file, load the defaults (if available). |
| 292 | 321 | lib3270_autoptr(char) default_settings = lib3270_build_data_filename("defaults.conf",NULL); |
| 293 | 322 | if(g_file_test(default_settings,G_FILE_TEST_IS_REGULAR)) { |
| 294 | - if(!g_key_file_load_from_file(key_file,default_settings,G_KEY_FILE_NONE,&error)) { | |
| 323 | + if(!g_key_file_load_from_file(descriptor->key_file,default_settings,G_KEY_FILE_NONE,&error)) { | |
| 295 | 324 | g_warning("Can't load \"%s\"",default_settings); |
| 296 | 325 | } else { |
| 297 | 326 | g_message("Loading session properties from %s",default_settings); |
| ... | ... | @@ -310,17 +339,16 @@ |
| 310 | 339 | |
| 311 | 340 | } else { |
| 312 | 341 | |
| 313 | - v3270_load_key_file(terminal,key_file,NULL); | |
| 314 | - v3270_accelerator_map_load_key_file(terminal,key_file,NULL); | |
| 342 | + v3270_load_key_file(terminal,descriptor->key_file,NULL); | |
| 343 | + v3270_accelerator_map_load_key_file(terminal,descriptor->key_file,NULL); | |
| 315 | 344 | |
| 316 | 345 | } |
| 317 | 346 | |
| 318 | - g_key_file_free(key_file); | |
| 319 | - | |
| 320 | 347 | append_terminal_page(window,terminal); |
| 321 | 348 | |
| 322 | 349 | // Setup signals. |
| 323 | - g_signal_connect(G_OBJECT(terminal),"save-settings",G_CALLBACK(save_settings),filename); | |
| 350 | + g_signal_connect(G_OBJECT(terminal),"save-settings",G_CALLBACK(save_settings),descriptor); | |
| 351 | + g_signal_connect(G_OBJECT(terminal),"toggle_changed",G_CALLBACK(toggle_changed),descriptor); | |
| 324 | 352 | |
| 325 | 353 | return terminal; |
| 326 | 354 | ... | ... |
src/pw3270/window.c
| ... | ... | @@ -306,9 +306,6 @@ static GtkWidget * trace_window = NULL; |
| 306 | 306 | |
| 307 | 307 | v3270_set_scaled_fonts(GTK_PW3270(widget)->terminal,get_boolean_from_config("terminal","sfonts",FALSE)); |
| 308 | 308 | |
| 309 | - if(pw3270_get_toggle(widget,LIB3270_TOGGLE_CONNECT_ON_STARTUP)) | |
| 310 | - g_idle_add((GSourceFunc) bg_auto_connect, widget); | |
| 311 | - | |
| 312 | 309 | return widget; |
| 313 | 310 | } |
| 314 | 311 | ... | ... |