Commit 2642fe34a787712f71b18868e957df43e3471196
1 parent
fdc58940
Exists in
master
and in
2 other branches
Adding method to suggest session filename and path.
Showing
4 changed files
with
90 additions
and
7 deletions
Show diff stats
src/include/v3270/keyfile.h
| ... | ... | @@ -45,7 +45,12 @@ |
| 45 | 45 | V3270KeyFile * v3270_key_file_open(GtkWidget *terminal, const gchar *name, GError **error); |
| 46 | 46 | void v3270_key_file_close(GtkWidget *terminal); |
| 47 | 47 | void v3270_key_file_save(GtkWidget *terminal); |
| 48 | - const gchar * v3270_key_file_get_file_name(GtkWidget *terminal); | |
| 48 | + | |
| 49 | + /// @brief Get current key filename | |
| 50 | + const gchar * v3270_key_file_get_filename(GtkWidget *terminal); | |
| 51 | + | |
| 52 | + /// @brief Build a writable key filename | |
| 53 | + gchar * v3270_key_file_build_filename(GtkWidget *terminal); | |
| 49 | 54 | |
| 50 | 55 | GKeyFile * v3270_key_file_get(GtkWidget *terminal); |
| 51 | 56 | ... | ... |
src/objects/actions/save.c
| ... | ... | @@ -71,10 +71,8 @@ |
| 71 | 71 | gtk_file_chooser_set_pw3270_filters(GTK_FILE_CHOOSER(dialog)); |
| 72 | 72 | |
| 73 | 73 | if(terminal) { |
| 74 | - const gchar * current_file = v3270_key_file_get_file_name(terminal); | |
| 75 | - if(current_file && g_file_test(current_file,G_FILE_TEST_IS_REGULAR) && !g_str_has_prefix(current_file,g_get_user_config_dir())) { | |
| 76 | - gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),current_file); | |
| 77 | - } | |
| 74 | + g_autofree gchar * filename = v3270_key_file_build_filename(terminal); | |
| 75 | + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog),filename); | |
| 78 | 76 | } |
| 79 | 77 | |
| 80 | 78 | g_signal_connect(dialog,"response",G_CALLBACK(response),terminal); | ... | ... |
src/objects/os/linux/savedesktopicon.c
| ... | ... | @@ -279,7 +279,7 @@ X-Desktop-File-Install-Version=0.23 |
| 279 | 279 | if(bytes >= 0) |
| 280 | 280 | buffer[bytes] = '\0'; |
| 281 | 281 | |
| 282 | - g_autofree gchar * exec_line = g_strdup_printf("%s \"%s\"",buffer,v3270_key_file_get_file_name(terminal)); | |
| 282 | + g_autofree gchar * exec_line = g_strdup_printf("%s \"%s\"",buffer,v3270_key_file_get_filename(terminal)); | |
| 283 | 283 | g_key_file_set_string(keyfile,"Desktop Entry","Exec",exec_line); |
| 284 | 284 | |
| 285 | 285 | } | ... | ... |
src/objects/window/keyfile.c
| ... | ... | @@ -39,6 +39,7 @@ |
| 39 | 39 | #include <v3270/settings.h> |
| 40 | 40 | #include <v3270/keyfile.h> |
| 41 | 41 | #include <v3270/actions.h> |
| 42 | + #include <lib3270/properties.h> | |
| 42 | 43 | #include <string.h> |
| 43 | 44 | #include <stdlib.h> |
| 44 | 45 | |
| ... | ... | @@ -203,7 +204,86 @@ void v3270_key_file_close(GtkWidget *terminal) { |
| 203 | 204 | |
| 204 | 205 | } |
| 205 | 206 | |
| 206 | - const gchar * v3270_key_file_get_file_name(GtkWidget *terminal) { | |
| 207 | + /// @brief Search standard paths. | |
| 208 | + static gchar * v3270_get_configuration_folder(GtkWidget *terminal) { | |
| 209 | + | |
| 210 | + size_t folder; | |
| 211 | + const gchar *folders[] = { | |
| 212 | + g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS), | |
| 213 | + g_get_user_data_dir(), | |
| 214 | + g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP) | |
| 215 | + }; | |
| 216 | + | |
| 217 | + size_t application; | |
| 218 | + const gchar *applications[] = { | |
| 219 | + v3270_get_session_name(terminal), | |
| 220 | + G_STRINGIFY(PRODUCT_NAME), | |
| 221 | + PACKAGE_NAME, | |
| 222 | + "3270", | |
| 223 | + "tn3270" | |
| 224 | + }; | |
| 225 | + | |
| 226 | + for(folder = 0; folder < G_N_ELEMENTS(folders); folder++) { | |
| 227 | + | |
| 228 | + if(!(folders[folder] && g_file_test(folders[folder],G_FILE_TEST_IS_DIR))) | |
| 229 | + continue; | |
| 230 | + | |
| 231 | + for(application = 0; application < G_N_ELEMENTS(applications); application++) { | |
| 232 | + | |
| 233 | + gchar * appdir = g_build_filename(folder[folders],application[applications],NULL); | |
| 234 | + | |
| 235 | + debug("Testing for \"%s\"",appdir); | |
| 236 | + if(g_file_test(appdir,G_FILE_TEST_IS_DIR)) { | |
| 237 | + return appdir; | |
| 238 | + } | |
| 239 | + g_free(appdir); | |
| 240 | + | |
| 241 | + } | |
| 242 | + | |
| 243 | + } | |
| 244 | + | |
| 245 | + // Not found, try the current session path. | |
| 246 | + const gchar * filename = v3270_key_file_get_filename(terminal); | |
| 247 | + debug("Testing for \"%s\"",filename); | |
| 248 | + if(filename | |
| 249 | + && g_file_test(filename,G_FILE_TEST_IS_REGULAR) | |
| 250 | + && g_str_has_prefix(filename,g_get_user_data_dir()) | |
| 251 | + && !g_str_has_prefix(filename,g_get_user_config_dir()) | |
| 252 | + ) { | |
| 253 | + return g_path_get_dirname(filename); | |
| 254 | + } | |
| 255 | + | |
| 256 | + debug("%s: Using standard documents folder",__FUNCTION__); | |
| 257 | + return g_strdup(g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS)); | |
| 258 | + | |
| 259 | + } | |
| 260 | + | |
| 261 | + gchar * v3270_key_file_build_filename(GtkWidget *terminal) { | |
| 262 | + | |
| 263 | + const gchar * filename = v3270_key_file_get_filename(terminal); | |
| 264 | + if(filename && g_file_test(filename,G_FILE_TEST_IS_REGULAR) && !g_str_has_prefix(filename,g_get_user_config_dir())) { | |
| 265 | + return g_strdup(filename); | |
| 266 | + } | |
| 267 | + | |
| 268 | + debug("\n\n\n%s",__FUNCTION__); | |
| 269 | + g_autofree gchar * folder = v3270_get_configuration_folder(terminal); | |
| 270 | + | |
| 271 | + const char * hostname = lib3270_host_get_name(v3270_get_session(terminal)); | |
| 272 | + debug("Hostname=\"%s\"",hostname); | |
| 273 | + | |
| 274 | + gchar * name = g_strconcat(folder,G_DIR_SEPARATOR_S,hostname,".3270",NULL); | |
| 275 | + unsigned int index = 0; | |
| 276 | + while(g_file_test(name,G_FILE_TEST_EXISTS)) { | |
| 277 | + g_free(name); | |
| 278 | + name = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s.%u.3270",folder,hostname,++index); | |
| 279 | + } | |
| 280 | + | |
| 281 | + debug("%s returns \"%s\"",__FUNCTION__,name); | |
| 282 | + | |
| 283 | + return name; | |
| 284 | + } | |
| 285 | + | |
| 286 | + const gchar * v3270_key_file_get_filename(GtkWidget *terminal) { | |
| 207 | 287 | |
| 208 | 288 | V3270KeyFile *session = v3270_get_session_descriptor(terminal); |
| 209 | 289 | ... | ... |