|
566 | 566 | initialise_prolog :- |
567 | 567 | '$clean_history', |
568 | 568 | apply_defines, |
569 | | - apple_setup_app, % MacOS cwd/locale setup for swipl-win |
570 | 569 | init_optimise, |
571 | 570 | '$run_initialization', |
572 | 571 | '$load_system_init_file', % -F file |
|
677 | 676 | !. |
678 | 677 | text_flag_value(_, Value, Value). |
679 | 678 |
|
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 | | - |
706 | 679 | init_optimise :- |
707 | 680 | current_prolog_flag(optimise, true), |
708 | 681 | !, |
|
918 | 891 | ensure_dir(Dir) :- |
919 | 892 | catch(make_directory(Dir), E, (print_message(warning, E), fail)). |
920 | 893 |
|
| 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 | + |
921 | 977 | :- else. |
922 | 978 | % Other platforms. |
923 | 979 | setup_app. |
|
0 commit comments