Commit 110bebbee2f48632065afc0bf3c8da1e1ddc9289
1 parent
ca73fc5d
Exists in
master
and in
1 other branch
Implement save/load of the session-name property.
Showing
4 changed files
with
105 additions
and
7 deletions
Show diff stats
src/include/v3270/dialogs.h
src/terminal/keyfile.c
| ... | ... | @@ -236,6 +236,34 @@ |
| 236 | 236 | v3270 * terminal = GTK_V3270(widget); |
| 237 | 237 | v3270Class * klass = GTK_V3270_GET_CLASS(widget); |
| 238 | 238 | |
| 239 | + // Save session name. | |
| 240 | + { | |
| 241 | + g_autofree gchar * session_name = g_strdup(terminal->session.name ? terminal->session.name : G_STRINGIFY(PRODUCT_NAME)); | |
| 242 | + | |
| 243 | + gchar *ptr = strrchr(session_name,':'); | |
| 244 | + if(ptr) | |
| 245 | + *ptr = 0; | |
| 246 | + | |
| 247 | + if(g_ascii_strcasecmp(session_name,G_STRINGIFY(PRODUCT_NAME))) { | |
| 248 | + | |
| 249 | + g_key_file_set_string( | |
| 250 | + key_file, | |
| 251 | + group_name, | |
| 252 | + "session-name", | |
| 253 | + session_name | |
| 254 | + ); | |
| 255 | + | |
| 256 | + } else { | |
| 257 | + g_key_file_remove_key( | |
| 258 | + key_file, | |
| 259 | + group_name, | |
| 260 | + "session-name", | |
| 261 | + NULL | |
| 262 | + ); | |
| 263 | + } | |
| 264 | + | |
| 265 | + } | |
| 266 | + | |
| 239 | 267 | // Save Toggles |
| 240 | 268 | for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) |
| 241 | 269 | save_by_pspec(widget,klass->properties.toggle[ix],key_file,group_name); |
| ... | ... | @@ -266,6 +294,19 @@ |
| 266 | 294 | g_object_freeze_notify(G_OBJECT(widget)); |
| 267 | 295 | terminal->freeze = 1; |
| 268 | 296 | |
| 297 | + // Load session_name | |
| 298 | + if(g_key_file_has_key(key_file,group_name,"session-name",NULL)) { | |
| 299 | + | |
| 300 | + g_autofree gchar * session_name = g_key_file_get_string(key_file,group_name,"session-name",NULL); | |
| 301 | + | |
| 302 | + gchar *ptr = strrchr(session_name,':'); | |
| 303 | + if(ptr) | |
| 304 | + *ptr = 0; | |
| 305 | + | |
| 306 | + v3270_set_session_name(widget, session_name); | |
| 307 | + | |
| 308 | + } | |
| 309 | + | |
| 269 | 310 | // Load Toggles |
| 270 | 311 | for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) |
| 271 | 312 | load_by_pspec(widget,klass->properties.toggle[ix],key_file,group_name); | ... | ... |
src/terminal/properties/set.c
| ... | ... | @@ -171,20 +171,46 @@ LIB3270_EXPORT void v3270_set_url(GtkWidget *widget, const gchar *uri) |
| 171 | 171 | LIB3270_EXPORT void v3270_set_session_name(GtkWidget *widget, const gchar *name) |
| 172 | 172 | { |
| 173 | 173 | g_return_if_fail(GTK_IS_V3270(widget)); |
| 174 | - g_return_if_fail(name != NULL); | |
| 175 | 174 | |
| 176 | - if(GTK_V3270(widget)->session.name) { | |
| 175 | + v3270 * terminal = GTK_V3270(widget); | |
| 176 | + | |
| 177 | + if(!(name && *name)) | |
| 178 | + name = G_STRINGIFY(PRODUCT_NAME); | |
| 179 | + | |
| 180 | + if(terminal->session.name) { | |
| 177 | 181 | |
| 178 | - if(!strcmp(GTK_V3270(widget)->session.name,name)) { | |
| 179 | - // Same session name, keep it. | |
| 182 | + // If it's the same name ignore it. | |
| 183 | + if(!strcmp(terminal->session.name,name)) | |
| 180 | 184 | return; |
| 185 | + | |
| 186 | + g_free(terminal->session.name); | |
| 187 | + terminal->session.name = NULL; | |
| 188 | + | |
| 189 | + } | |
| 190 | + | |
| 191 | + g_autofree gchar * new_name = g_strdup(name); | |
| 192 | + | |
| 193 | + // Check for session id | |
| 194 | + gchar session_id = 0; | |
| 195 | + { | |
| 196 | + gchar *ptr = strrchr(new_name,':'); | |
| 197 | + if(ptr) { | |
| 198 | + *(ptr++) = 0; | |
| 199 | + session_id = *ptr; | |
| 200 | + lib3270_set_session_id(terminal->host,session_id); | |
| 181 | 201 | } |
| 202 | + } | |
| 182 | 203 | |
| 183 | - g_free(GTK_V3270(widget)->session.name); | |
| 204 | + if(!session_id) | |
| 205 | + session_id = lib3270_get_session_id(terminal->host); | |
| 184 | 206 | |
| 207 | + if(session_id) { | |
| 208 | + terminal->session.name = g_strdup_printf("%s:%c",new_name,session_id); | |
| 209 | + } else { | |
| 210 | + terminal->session.name = g_strdup(new_name); | |
| 185 | 211 | } |
| 186 | 212 | |
| 187 | - GTK_V3270(widget)->session.name = g_strdup(name); | |
| 213 | + g_message("Session name changes to \"%s\"",terminal->session.name); | |
| 188 | 214 | |
| 189 | 215 | g_signal_emit(GTK_WIDGET(widget), v3270_widget_signal[V3270_SIGNAL_SESSION_CHANGED], 0); |
| 190 | 216 | g_object_notify_by_pspec(G_OBJECT(widget), GTK_V3270_GET_CLASS(widget)->properties.session_name); | ... | ... |
src/terminal/windows/registry.c
| ... | ... | @@ -212,6 +212,22 @@ |
| 212 | 212 | v3270 * terminal = GTK_V3270(widget); |
| 213 | 213 | v3270Class * klass = GTK_V3270_GET_CLASS(widget); |
| 214 | 214 | |
| 215 | + // Save session name. | |
| 216 | + { | |
| 217 | + g_autofree gchar * session_name = g_strdup(terminal->session.name ? terminal->session.name : G_STRINGIFY(PRODUCT_NAME)); | |
| 218 | + | |
| 219 | + gchar *ptr = strrchr(session_name,':'); | |
| 220 | + if(ptr) | |
| 221 | + *ptr = 0; | |
| 222 | + | |
| 223 | + if(g_ascii_strcasecmp(session_name,G_STRINGIFY(PRODUCT_NAME))) { | |
| 224 | + RegSetValueEx(hKey,"session-name",0,REG_SZ,(const BYTE *) session_name,strlen(session_name)+1); | |
| 225 | + } else { | |
| 226 | + RegDeleteValue(hKey,"session-name"); | |
| 227 | + } | |
| 228 | + | |
| 229 | + } | |
| 230 | + | |
| 215 | 231 | // Save Toggles |
| 216 | 232 | for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) |
| 217 | 233 | save_by_pspec(widget,klass->properties.toggle[ix],hKey); |
| ... | ... | @@ -251,6 +267,22 @@ |
| 251 | 267 | |
| 252 | 268 | g_object_freeze_notify(G_OBJECT(widget)); |
| 253 | 269 | |
| 270 | + // Load session name | |
| 271 | + { | |
| 272 | + BYTE data[4097]; | |
| 273 | + unsigned long datatype; | |
| 274 | + unsigned long datalen = 4096; | |
| 275 | + | |
| 276 | + memset(data,0,sizeof(data)); | |
| 277 | + | |
| 278 | + if(RegQueryValueExA(hKey,"session-name",NULL,&datatype,data,&datalen) == ERROR_SUCCESS) { | |
| 279 | + | |
| 280 | + v3270_set_session_name(widget, (const gchar *) data); | |
| 281 | + | |
| 282 | + } | |
| 283 | + | |
| 284 | + } | |
| 285 | + | |
| 254 | 286 | // Load Toggles |
| 255 | 287 | for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) |
| 256 | 288 | load_by_pspec(widget,klass->properties.toggle[ix],hKey); | ... | ... |