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