From 110bebbee2f48632065afc0bf3c8da1e1ddc9289 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Wed, 8 Jan 2020 10:23:32 -0300 Subject: [PATCH] Implement save/load of the session-name property. --- src/include/v3270/dialogs.h | 1 - src/terminal/keyfile.c | 41 +++++++++++++++++++++++++++++++++++++++++ src/terminal/properties/set.c | 38 ++++++++++++++++++++++++++++++++------ src/terminal/windows/registry.c | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 7 deletions(-) diff --git a/src/include/v3270/dialogs.h b/src/include/v3270/dialogs.h index 498fd98..b464341 100644 --- a/src/include/v3270/dialogs.h +++ b/src/include/v3270/dialogs.h @@ -47,7 +47,6 @@ LIB3270_EXPORT GtkTreeModel * v3270_font_family_model_new(GtkWidget *widget, const gchar *selected, GtkTreeIter * active); - G_END_DECLS #endif // V3270_DIALOGS_H_INCLUDED diff --git a/src/terminal/keyfile.c b/src/terminal/keyfile.c index 83f8d1f..94c2080 100644 --- a/src/terminal/keyfile.c +++ b/src/terminal/keyfile.c @@ -236,6 +236,34 @@ v3270 * terminal = GTK_V3270(widget); v3270Class * klass = GTK_V3270_GET_CLASS(widget); + // Save session name. + { + g_autofree gchar * session_name = g_strdup(terminal->session.name ? terminal->session.name : G_STRINGIFY(PRODUCT_NAME)); + + gchar *ptr = strrchr(session_name,':'); + if(ptr) + *ptr = 0; + + if(g_ascii_strcasecmp(session_name,G_STRINGIFY(PRODUCT_NAME))) { + + g_key_file_set_string( + key_file, + group_name, + "session-name", + session_name + ); + + } else { + g_key_file_remove_key( + key_file, + group_name, + "session-name", + NULL + ); + } + + } + // Save Toggles for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) save_by_pspec(widget,klass->properties.toggle[ix],key_file,group_name); @@ -266,6 +294,19 @@ g_object_freeze_notify(G_OBJECT(widget)); terminal->freeze = 1; + // Load session_name + if(g_key_file_has_key(key_file,group_name,"session-name",NULL)) { + + g_autofree gchar * session_name = g_key_file_get_string(key_file,group_name,"session-name",NULL); + + gchar *ptr = strrchr(session_name,':'); + if(ptr) + *ptr = 0; + + v3270_set_session_name(widget, session_name); + + } + // Load Toggles for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) load_by_pspec(widget,klass->properties.toggle[ix],key_file,group_name); diff --git a/src/terminal/properties/set.c b/src/terminal/properties/set.c index f89d222..493cf07 100644 --- a/src/terminal/properties/set.c +++ b/src/terminal/properties/set.c @@ -171,20 +171,46 @@ LIB3270_EXPORT void v3270_set_url(GtkWidget *widget, const gchar *uri) LIB3270_EXPORT void v3270_set_session_name(GtkWidget *widget, const gchar *name) { g_return_if_fail(GTK_IS_V3270(widget)); - g_return_if_fail(name != NULL); - if(GTK_V3270(widget)->session.name) { + v3270 * terminal = GTK_V3270(widget); + + if(!(name && *name)) + name = G_STRINGIFY(PRODUCT_NAME); + + if(terminal->session.name) { - if(!strcmp(GTK_V3270(widget)->session.name,name)) { - // Same session name, keep it. + // If it's the same name ignore it. + if(!strcmp(terminal->session.name,name)) return; + + g_free(terminal->session.name); + terminal->session.name = NULL; + + } + + g_autofree gchar * new_name = g_strdup(name); + + // Check for session id + gchar session_id = 0; + { + gchar *ptr = strrchr(new_name,':'); + if(ptr) { + *(ptr++) = 0; + session_id = *ptr; + lib3270_set_session_id(terminal->host,session_id); } + } - g_free(GTK_V3270(widget)->session.name); + if(!session_id) + session_id = lib3270_get_session_id(terminal->host); + if(session_id) { + terminal->session.name = g_strdup_printf("%s:%c",new_name,session_id); + } else { + terminal->session.name = g_strdup(new_name); } - GTK_V3270(widget)->session.name = g_strdup(name); + g_message("Session name changes to \"%s\"",terminal->session.name); g_signal_emit(GTK_WIDGET(widget), v3270_widget_signal[V3270_SIGNAL_SESSION_CHANGED], 0); g_object_notify_by_pspec(G_OBJECT(widget), GTK_V3270_GET_CLASS(widget)->properties.session_name); diff --git a/src/terminal/windows/registry.c b/src/terminal/windows/registry.c index 3599b68..8dd9937 100644 --- a/src/terminal/windows/registry.c +++ b/src/terminal/windows/registry.c @@ -212,6 +212,22 @@ v3270 * terminal = GTK_V3270(widget); v3270Class * klass = GTK_V3270_GET_CLASS(widget); + // Save session name. + { + g_autofree gchar * session_name = g_strdup(terminal->session.name ? terminal->session.name : G_STRINGIFY(PRODUCT_NAME)); + + gchar *ptr = strrchr(session_name,':'); + if(ptr) + *ptr = 0; + + if(g_ascii_strcasecmp(session_name,G_STRINGIFY(PRODUCT_NAME))) { + RegSetValueEx(hKey,"session-name",0,REG_SZ,(const BYTE *) session_name,strlen(session_name)+1); + } else { + RegDeleteValue(hKey,"session-name"); + } + + } + // Save Toggles for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) save_by_pspec(widget,klass->properties.toggle[ix],hKey); @@ -251,6 +267,22 @@ g_object_freeze_notify(G_OBJECT(widget)); + // Load session name + { + BYTE data[4097]; + unsigned long datatype; + unsigned long datalen = 4096; + + memset(data,0,sizeof(data)); + + if(RegQueryValueExA(hKey,"session-name",NULL,&datatype,data,&datalen) == ERROR_SUCCESS) { + + v3270_set_session_name(widget, (const gchar *) data); + + } + + } + // Load Toggles for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) load_by_pspec(widget,klass->properties.toggle[ix],hKey); -- libgit2 0.21.2