Skip to content

Commit c2ffbe1

Browse files
committed
Preserve working directory, also for the flatpak app.
1 parent 7774755 commit c2ffbe1

1 file changed

Lines changed: 63 additions & 14 deletions

File tree

boot/toplevel.pl

Lines changed: 63 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -907,6 +907,7 @@
907907
catch(make_directory(Dir), E, (print_message(warning, E), fail)).
908908

909909
:- elif(current_prolog_flag(apple, true)).
910+
use_app_settings(true). % Indicate we need app settings
910911

911912
setup_app :-
912913
apple_set_locale,
@@ -917,24 +918,21 @@
917918
current_prolog_flag(executable, Exe),
918919
file_base_name(Exe, 'SWI-Prolog'),
919920
!,
920-
setup_macos_app,
921-
at_halt(save_working_directory).
921+
setup_macos_app.
922922
setup_app.
923923

924924
apple_set_locale :-
925925
( getenv('LC_CTYPE', 'UTF-8'),
926-
apple_current_locale_identifier(LocaleID),
927-
atom_concat(LocaleID, '.UTF-8', Locale),
928-
catch(setlocale(ctype, _Old, Locale), _, fail)
926+
apple_current_locale_identifier(LocaleID),
927+
atom_concat(LocaleID, '.UTF-8', Locale),
928+
catch(setlocale(ctype, _Old, Locale), _, fail)
929929
-> setenv('LANG', Locale),
930930
unsetenv('LC_CTYPE')
931931
; true
932932
).
933933

934934
setup_macos_app :-
935-
app_settings(Settings),
936-
WD = Settings.get(working_directory),
937-
catch(working_directory(_, WD), _, fail),
935+
restore_working_directory,
938936
!.
939937
setup_macos_app :-
940938
expand_file_name('~/Documents/Prolog', [PrologDir]),
@@ -948,14 +946,61 @@
948946
!.
949947
setup_macos_app.
950948

949+
:- elif(current_prolog_flag(emscripten, true)).
950+
setup_app.
951+
:- else.
952+
use_app_settings(true). % Indicate we need app settings
953+
954+
% Other (Unix-like) platforms.
955+
setup_app :-
956+
running_as_app,
957+
restore_working_directory,
958+
!.
959+
setup_app.
960+
961+
%! running_as_app is semidet.
962+
%
963+
% True if we were started from the dock.
964+
965+
running_as_app :-
966+
% getenv('FLATPAK_SANDBOX_DIR', _),
967+
current_prolog_flag(epilog, true),
968+
stream_property(In, file_no(0)),
969+
\+ stream_property(In, tty(true)),
970+
!.
971+
972+
:- endif.
973+
974+
975+
:- if(use_app_settings(true)).
976+
977+
/*******************************
978+
* APP WORKING DIRECTORY *
979+
*******************************/
980+
951981
save_working_directory :-
952982
working_directory(WD, WD),
953983
app_settings(Settings),
954984
( Settings.get(working_directory) == WD
955985
-> true
956-
; save_settings(Settings.put(working_directory, WD))
986+
; app_save_settings(Settings.put(working_directory, WD))
957987
).
958988

989+
restore_working_directory :-
990+
at_halt(save_working_directory),
991+
app_settings(Settings),
992+
WD = Settings.get(working_directory),
993+
catch(working_directory(_, WD), _, fail),
994+
!.
995+
996+
/*******************************
997+
* SETTINGS *
998+
*******************************/
999+
1000+
%! app_settings(-Settings:dict) is det.
1001+
%
1002+
% Get a dict holding the persistent application settings.
1003+
9591004
app_settings(Settings) :-
9601005
app_settings_file(File),
9611006
access_file(File, read),
@@ -968,7 +1013,11 @@
9681013
!.
9691014
app_settings(#{}).
9701015

971-
save_settings(Settings) :-
1016+
%! app_save_settings(+Settings:dict) is det.
1017+
%
1018+
% Save the given application settings dict.
1019+
1020+
app_save_settings(Settings) :-
9721021
app_settings_file(File),
9731022
catch(setup_call_cleanup(
9741023
open(File, write, Out, [encoding(utf8)]),
@@ -988,11 +1037,11 @@
9881037
[ access(write),
9891038
file_errors(fail)
9901039
]).
1040+
:- endif.% app_settings
9911041

992-
:- else.
993-
% Other platforms.
994-
setup_app.
995-
:- endif.
1042+
/*******************************
1043+
* TOPLEVEL *
1044+
*******************************/
9961045

9971046
:- '$hide'('$toplevel'/0). % avoid in the GUI stacktrace
9981047

0 commit comments

Comments
 (0)