[squeak-dev] User config directories (was: Merge Request: autoEncloseBeforeSpace.cs)

tim Rowledge tim at rowledge.org
Wed Dec 29 18:25:16 UTC 2021

We already have some mechanism for this, though I wouldn't claim it is particularly magnificent. See ExternalSettings class>>#preferenceDirectory etc. I use it for work/server preferences, with the file format described being OK but maybe better if we used JSON instead?

The location of the directory can certainly be a pain, but I've already ranted about the location of the sources file and this is a similar case. But let's not get involved in anything to do with the Windows registry; we all know that leads to weakening of the walls between us and the Dungeon Dimensions.

> On 2021-12-29, at 5:40 AM, Jakob Reschke <jakres+squeak at gmail.com> wrote:
> Hi all,
> Am Do., 23. Dez. 2021 um 13:39 Uhr schrieb Jakob Reschke
> <jakres+squeak at gmail.com>:
>> [...] we should write default
>> preferences to ~/.config/squeak-default-preferences.dat or so when the
>> wizard is finished for the first time [...]
> I just "quickly" wanted to try this out the other day, but it seems
> there is no clean way to determine the home directory from a plain
> Trunk image without third party packages. Sigh!
> The context: I would like to store some contested preferences
> externally in a well-known, stable location, so that when you start a
> new image, these preferences are already pre-set in the preference
> wizard with your choices from the last time you completed the wizard
> in a different image. For example, auto-enclose, enclose selection,
> colorful windows, attach tools to mouse cursor, ... That would allow
> us to change the default preferences for first-time users without
> bothering our veterans with behavior to which they are not accustomed,
> and which they first have to turn off in each new image.
> SecurityManager>>#primUntrustedUserDirectory comes closest to the
> user's home directory, but on Unix you would have to go up three
> directories and on Windows just two. On its own, the SecurityManager
> default untrustedUserDirectory does not really adhere to the platform
> rules for storing preferences (at least not on Windows). Also it may
> be incorrect to use the SecurityManager protocol for this purpose, I
> have no experience with it.
> Before I delve too much into getting the home directory, what I really want is
> - to access a place where some preferences values could be stored
> - without user input (i. e. they should not have to choose a file or
> directory first)
> - independent of the location of the current image file.
> - The place must be writable.
> - It must work eventually in a fresh image without extra plugins or
> packages loaded.
> Ideally the place would adhere to the rules and conventions of the
> platform. So if it is a directory to store configuration files:
> - On Windows this could be %APPDATA% (e. g. C:\Users\Jakob\AppData\Roaming)
> - On Linux this could be $XDG_CONFIG_HOME, with a fallback of $HOME/.config [1]
> - On the Mac I don't really know, but according to [2]
> $HOME/Library/Preferences might be it.
> (In all the cases above, a Squeak subdirectory should be created, of course.)
> - SqueakJS in the web browser could arbitrarily define a simulated
> directory in the local storage.
> - As a last resort, FileDrectory default could be used, although in
> general it does not fulfill the requirements (e. g. being indepent of
> the image location).
> I suppose it would make sense to implement the lookup of the path in
> the VM (or a plugin that is included by default). Otherwise, the
> minimum requirement would be that getenv() functionality is available
> without installing OSProcess first. It looks like Pharo has done
> something like that: `Smalltalk os environment` answers a dictionary
> of environment variables and this is used in FileSystem to retrieve
> preferences and home directories.
> Alternatively, we could outsource this to the VM completely by
> specifying a key-value store protocol of primitives for simple
> preferences. Then the VM could even implement it using
> platform-specific API (e. g. the Windows Registry, Mac NSUserDefaults
> [2]). But I have the feeling that this may not be the most popular
> choice in the community. ;-)
> What are your thoughts about the matter?
> [1] https://specifications.freedesktop.org/basedir-spec/latest/ar01s03.html
> [2] https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/UserDefaults/AboutPreferenceDomains/AboutPreferenceDomains.html
> Kind regards,
> Jakob

tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim
Strange OpCodes: DSO: Do Something or Other

More information about the Squeak-dev mailing list