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); | ... | ... |