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
@@ -47,7 +47,6 @@ | @@ -47,7 +47,6 @@ | ||
47 | 47 | ||
48 | LIB3270_EXPORT GtkTreeModel * v3270_font_family_model_new(GtkWidget *widget, const gchar *selected, GtkTreeIter * active); | 48 | LIB3270_EXPORT GtkTreeModel * v3270_font_family_model_new(GtkWidget *widget, const gchar *selected, GtkTreeIter * active); |
49 | 49 | ||
50 | - | ||
51 | G_END_DECLS | 50 | G_END_DECLS |
52 | 51 | ||
53 | #endif // V3270_DIALOGS_H_INCLUDED | 52 | #endif // V3270_DIALOGS_H_INCLUDED |
src/terminal/keyfile.c
@@ -236,6 +236,34 @@ | @@ -236,6 +236,34 @@ | ||
236 | v3270 * terminal = GTK_V3270(widget); | 236 | v3270 * terminal = GTK_V3270(widget); |
237 | v3270Class * klass = GTK_V3270_GET_CLASS(widget); | 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 | // Save Toggles | 267 | // Save Toggles |
240 | for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) | 268 | for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) |
241 | save_by_pspec(widget,klass->properties.toggle[ix],key_file,group_name); | 269 | save_by_pspec(widget,klass->properties.toggle[ix],key_file,group_name); |
@@ -266,6 +294,19 @@ | @@ -266,6 +294,19 @@ | ||
266 | g_object_freeze_notify(G_OBJECT(widget)); | 294 | g_object_freeze_notify(G_OBJECT(widget)); |
267 | terminal->freeze = 1; | 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 | // Load Toggles | 310 | // Load Toggles |
270 | for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) | 311 | for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) |
271 | load_by_pspec(widget,klass->properties.toggle[ix],key_file,group_name); | 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,20 +171,46 @@ LIB3270_EXPORT void v3270_set_url(GtkWidget *widget, const gchar *uri) | ||
171 | LIB3270_EXPORT void v3270_set_session_name(GtkWidget *widget, const gchar *name) | 171 | LIB3270_EXPORT void v3270_set_session_name(GtkWidget *widget, const gchar *name) |
172 | { | 172 | { |
173 | g_return_if_fail(GTK_IS_V3270(widget)); | 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 | return; | 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 | g_signal_emit(GTK_WIDGET(widget), v3270_widget_signal[V3270_SIGNAL_SESSION_CHANGED], 0); | 215 | g_signal_emit(GTK_WIDGET(widget), v3270_widget_signal[V3270_SIGNAL_SESSION_CHANGED], 0); |
190 | g_object_notify_by_pspec(G_OBJECT(widget), GTK_V3270_GET_CLASS(widget)->properties.session_name); | 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,6 +212,22 @@ | ||
212 | v3270 * terminal = GTK_V3270(widget); | 212 | v3270 * terminal = GTK_V3270(widget); |
213 | v3270Class * klass = GTK_V3270_GET_CLASS(widget); | 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 | // Save Toggles | 231 | // Save Toggles |
216 | for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) | 232 | for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) |
217 | save_by_pspec(widget,klass->properties.toggle[ix],hKey); | 233 | save_by_pspec(widget,klass->properties.toggle[ix],hKey); |
@@ -251,6 +267,22 @@ | @@ -251,6 +267,22 @@ | ||
251 | 267 | ||
252 | g_object_freeze_notify(G_OBJECT(widget)); | 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 | // Load Toggles | 286 | // Load Toggles |
255 | for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) | 287 | for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) |
256 | load_by_pspec(widget,klass->properties.toggle[ix],hKey); | 288 | load_by_pspec(widget,klass->properties.toggle[ix],hKey); |