Skip to content

Commit 1971f51

Browse files
committed
ADDED: Working directory handling for MacOS app.
1 parent 7c817e4 commit 1971f51

1 file changed

Lines changed: 83 additions & 27 deletions

File tree

boot/toplevel.pl

Lines changed: 83 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,6 @@
566566
initialise_prolog :-
567567
'$clean_history',
568568
apply_defines,
569-
apple_setup_app, % MacOS cwd/locale setup for swipl-win
570569
init_optimise,
571570
'$run_initialization',
572571
'$load_system_init_file', % -F file
@@ -677,32 +676,6 @@
677676
!.
678677
text_flag_value(_, Value, Value).
679678

680-
:- if(current_prolog_flag(apple,true)).
681-
apple_set_working_directory :-
682-
( expand_file_name('~', [Dir]),
683-
exists_directory(Dir)
684-
-> working_directory(_, Dir)
685-
; true
686-
).
687-
688-
apple_set_locale :-
689-
( getenv('LC_CTYPE', 'UTF-8'),
690-
apple_current_locale_identifier(LocaleID),
691-
atom_concat(LocaleID, '.UTF-8', Locale),
692-
catch(setlocale(ctype, _Old, Locale), _, fail)
693-
-> setenv('LANG', Locale),
694-
unsetenv('LC_CTYPE')
695-
; true
696-
).
697-
698-
apple_setup_app :-
699-
current_prolog_flag(apple, true),
700-
current_prolog_flag(console_menu, true), % SWI-Prolog.app on MacOS
701-
apple_set_working_directory,
702-
apple_set_locale.
703-
:- endif.
704-
apple_setup_app.
705-
706679
init_optimise :-
707680
current_prolog_flag(optimise, true),
708681
!,
@@ -918,6 +891,89 @@
918891
ensure_dir(Dir) :-
919892
catch(make_directory(Dir), E, (print_message(warning, E), fail)).
920893

894+
:- elif(current_prolog_flag(apple, true)).
895+
896+
setup_app :-
897+
apple_set_locale,
898+
current_prolog_flag(associated_file, _),
899+
!.
900+
setup_app :-
901+
current_prolog_flag(bundle, true),
902+
current_prolog_flag(executable, Exe),
903+
file_base_name(Exe, 'SWI-Prolog'),
904+
!,
905+
setup_macos_app,
906+
at_halt(save_working_directory).
907+
setup_app.
908+
909+
apple_set_locale :-
910+
( getenv('LC_CTYPE', 'UTF-8'),
911+
apple_current_locale_identifier(LocaleID),
912+
atom_concat(LocaleID, '.UTF-8', Locale),
913+
catch(setlocale(ctype, _Old, Locale), _, fail)
914+
-> setenv('LANG', Locale),
915+
unsetenv('LC_CTYPE')
916+
; true
917+
).
918+
919+
setup_macos_app :-
920+
app_settings(Settings),
921+
WD = Settings.get(working_directory),
922+
catch(working_directory(_, WD), _, fail),
923+
!.
924+
setup_macos_app :-
925+
expand_file_name('~/Documents/Prolog', [PrologDir]),
926+
( exists_directory(PrologDir)
927+
-> true
928+
; catch(make_directory(PrologDir), MkDirError,
929+
print_message(warning, MkDirError))
930+
),
931+
catch(working_directory(_, PrologDir), CdError,
932+
print_message(warning, CdError)),
933+
!.
934+
setup_macos_app.
935+
936+
save_working_directory :-
937+
working_directory(WD, WD),
938+
app_settings(Settings),
939+
( Settings.get(working_directory) == WD
940+
-> true
941+
; save_settings(Settings.put(working_directory, WD))
942+
).
943+
944+
app_settings(Settings) :-
945+
app_settings_file(File),
946+
access_file(File, read),
947+
catch(setup_call_cleanup(
948+
open(File, read, In, [encoding(utf8)]),
949+
read_term(In, Settings, []),
950+
close(In)),
951+
Error,
952+
(print_message(warning, Error), fail)),
953+
!.
954+
app_settings(#{}).
955+
956+
save_settings(Settings) :-
957+
app_settings_file(File),
958+
catch(setup_call_cleanup(
959+
open(File, write, Out, [encoding(utf8)]),
960+
write_term(Out, Settings,
961+
[ quoted(true),
962+
module(system), % default operators
963+
fullstop(true),
964+
nl(true)
965+
]),
966+
close(Out)),
967+
Error,
968+
(print_message(warning, Error), fail)).
969+
970+
971+
app_settings_file(File) :-
972+
absolute_file_name(user_app_config('app_settings.pl'), File,
973+
[ access(write),
974+
file_errors(fail)
975+
]).
976+
921977
:- else.
922978
% Other platforms.
923979
setup_app.

0 commit comments

Comments
 (0)