diff options
| author | Matthias Melcher <git@matthiasm.com> | 2020-01-11 00:19:58 +0100 |
|---|---|---|
| committer | Matthias Melcher <git@matthiasm.com> | 2020-01-11 00:19:58 +0100 |
| commit | 006d71c663112316c49ff50f395f7d0aef8ebfe8 (patch) | |
| tree | 7073642be197e4660770d1d77f2b0c2f1dcd4ea4 | |
| parent | 7e0c82637d5cb2de0d7baa5a3c2ebe8491663b06 (diff) | |
Improved documentation of Fl_Preferences.
Detailed information on how preference file paths are generated, and preliminary docs what happens if that fails. Documentation, on what FLTK die pre 1.4 when any of this failed. Also, a little TODO list for me that I will hopefully get to in the next days.
| -rw-r--r-- | src/Fl_Preferences.cxx | 97 |
1 files changed, 67 insertions, 30 deletions
diff --git a/src/Fl_Preferences.cxx b/src/Fl_Preferences.cxx index 4ac4d8a69..d30ed2e7b 100644 --- a/src/Fl_Preferences.cxx +++ b/src/Fl_Preferences.cxx @@ -98,31 +98,69 @@ unsigned int Fl_Preferences::file_access() } /** - The constructor creates a group that manages name/value pairs and - child groups. Groups are ready for reading and writing at any time. - The root argument is either Fl_Preferences::USER - or Fl_Preferences::SYSTEM. - - This constructor creates the <i>base</i> instance for all - following entries and reads existing databases into memory. The - vendor argument is a unique text string identifying the - development team or vendor of an application. A domain name or - an EMail address are great unique names, e.g. - "researchATmatthiasm.com" or "fltk.org". The - application argument can be the working title or final - name of your application. Both vendor and - application must be valid relative UNIX pathnames and - may contain '/'s to create deeper file structures. - - A set of Preferences marked "run-time" exists exactly one per application and - only as long as the application runs. It can be used as a database for - volatile information. FLTK uses it to register plugins at run-time. - - \param[in] root can be \c USER or \c SYSTEM for user specific or system wide - preferences - \param[in] vendor unique text describing the company or author of this file - \param[in] application unique text describing the application -*/ + The constructor creates a group that manages name/value pairs and + child groups. Groups are ready for reading and writing at any time. + The root argument is either Fl_Preferences::USER + or Fl_Preferences::SYSTEM. + + This constructor creates the <i>base</i> instance for all + following entries and reads existing databases into memory. The + vendor argument is a unique text string identifying the + development team or vendor of an application. A domain name or + an EMail address are great unique names, e.g. + "research.matthiasm.com" or "fluid.fltk.org". The + application argument can be the working title or final + name of your application. Both vendor and + application must be valid UNIX path segments and + may contain forward slashes to create deeper file structures. + + A set of Preferences marked "run-time" exists exactly once per application and + only as long as the application runs. It can be used as a database for + volatile information. FLTK uses it to register plugins at run-time. + + \note On \b MSWindows, the directory is constructed by querying the <i>Common AppData</i> + or <i>AppData</i> key of the <tt>Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders</tt> + registry entry. The filename and path is then constructed as <tt>$(query)/$(vendor)/$(application).prefs</tt> . + If the query call fails, data will be stored in RAM only and be lost when the app exits. + + \par In FLTK versions before 1.4.0, if querying the registry failed, preferences would be written to + <tt>C:\FLTK\$(vendor)\$(application).prefs</tt> . + + \note On \b Linux, the \c USER directory is constructed by reading \c $HOME . If \c $HOME is not set + or not pointing to an existing directory, we are checking the path member of the passwd struct returned by + \c getpwuid(getuid()) . If all attempts fail, data will be stored in RAM only and be lost when the app exits. + The filename and path is then constructed as <tt>$(directory)/.fltk/$(vendor)/$(application).prefs</tt> . + The \c SYSTEM directory is hardcoded as <tt>/etc/fltk/$(vendor)/$(application).prefs</tt> . + + \par In FLTK versions before 1.4.0, if \c $HOME was not set, the \c USER path would be empty, + generating <tt>$(vendor)/$(application).prefs</tt>, which was used relative the the current working directory. + + \note On \b MacOS, the \c USER directory is constructed by reading \c $HOME . If \c $HOME is not set + or not pointing to an existing directory, we check the path returned by \c NSHomeDirectory() , and + finally checking the path member of the passwd struct returned by \c getpwuid(getuid()) . + If all attempts fail, data will be stored in RAM only and be lost when the app exits. + The filename and path is then constructed as <tt>$(directory)/Library/Preferences/$(vendor)/$(application).prefs</tt> . + The \c SYSTEM directory is hardcoded as <tt>/Library/Preferences/$(vendor)/$(application).prefs</tt> . + + \par In FLTK versions before 1.4.0, if \c $HOME was not set, the \c USER path would be \c NULL , + generating <tt>\<null\>/Library/Preferences/$(vendor)/$(application).prefs</tt>, which would silently fail to + create a prefrences file. + + \param[in] root can be \c USER or \c SYSTEM for user specific or system wide preferences + \param[in] vendor unique text describing the company or author of this file, must be a valid filepath segment + \param[in] application unique text describing the application, must be a valid filepath segment + + \todo Before the release of 1.4.0, I want to make a failed attempt to write a preferences file smarter. I + plan to use a subgroup of the "runtime" preferences to store data and stay accessable until the application + exits. Data would be stored under <tt>./$(vendor)/$(application).prefs</tt> in RAM, but not on disk. + + \todo I want a way to access the type of the root preferences (SYSTEM, USER, MEMORY), and the state of + the file access (OK, FILE_SYSTEM_FAIL, PERMISSION_FAIL, etc.), and probably the dirty() flag as well. + + \todo Also, I need to explain runtime preferences. + + \todo Lastly, I think I have to put short sample code in the Doxygen docs. The test app ist just not enough. + */ Fl_Preferences::Fl_Preferences( Root root, const char *vendor, const char *application ) { node = new Node( "." ); rootNode = new RootNode( this, root, vendor, application ); @@ -133,13 +171,12 @@ Fl_Preferences::Fl_Preferences( Root root, const char *vendor, const char *appli \brief Use this constructor to create or read a preferences file at an arbitrary position in the file system. - The file name is generated in the form - <tt><i>path</i>/<i>application</i>.prefs</tt>. If \p application - is \c NULL, \p path must contain the full file name. + The file name is generated in the form <tt>$(path)/$(application).prefs</tt>. + If \p application is \c NULL, \p path is taken literally as the file path and name. \param[in] path path to the directory that contains the preferences file - \param[in] vendor unique text describing the company or author of this file - \param[in] application unique text describing the application + \param[in] vendor unique text describing the company or author of this file, must be a valid filepath segment + \param[in] application unique text describing the application, must be a valid filepath segment */ Fl_Preferences::Fl_Preferences( const char *path, const char *vendor, const char *application ) { node = new Node( "." ); |
