Hello gain Ian,
In retrospect, I wonder if your code might be integrated into Fl_Preferences.
The Root enum currently has two values:
enum Root { SYSTEM=0, USER };
But if another one was added:
enum Root { SYSTEM=0, USER, APPLICATION };
then the class could make a Root node using the application directory instead.
I don't know about others, but I am always weary of making modifications to the
Windows registry using SYSTEM, and prefer to keep data and preferences local to
the application itself... As I have discovered to my cost, using the "." to get
the current directory does not always work. Just an idea.
Nicholas
> Hello Ian,
>
> Yes, thank you, this is very interesting; I noticed your code in response to
> a previous post which I also replied to; although in retrospect, _my_ reply
> to that post is possibly erroneous: there are obviously caveats to the path
> when running a windows app under Wine that I was not aware of at that time.
> On MacOS, I believe the issue is complicated because one never knows if your
> program will launched by the Finder, Xcode, gdb, or the console. Mr. Eberly
> also has a neat solution for this issue when running under MacOS in his
> Wm3.System.cpp from the WildMagic 3 distribution.
>
> Nicholas
>
> >
> >
> > For what it is worth (and this doesn't really answer your question,
> > since it does not integrate well with Fl_Preferences and so forth) here
> > is the code I use to ascertain the app's "home" directory in a
> > cross-platform way.
> >
> > Might be some use to you, I guess.
> >
> >
> >
> >
> > /*
> > * Mechanism to handle determining *where* the exe actually lives
> > */
> >
> > #include <stdio.h>
> > #include <stdlib.h>
> > #include <unistd.h>
> >
> > #ifdef WIN32
> > #include <windows.h> /* GetModuleFileName */
> > #endif /* WIN32 */
> >
> > #ifdef __APPLE__ /* assume this is OSX */
> > #include <sys/param.h>
> > #include <mach-o/dyld.h> /* _NSGetExecutablePath : must add -framework
> > CoreFoundation to link line */
> > #include <string.h>
> > # ifndef PATH_MAX
> > # define PATH_MAX MAXPATHLEN
> > # endif
> > #endif /* APPLE */
> >
> > #ifndef PATH_MAX
> > # define PATH_MAX 2048
> > #endif
> >
> > #include "get_app_path.h"
> >
> > /***********************************************************************
> > *********************/
> > int get_app_path (char *pname, size_t pathsize)
> > {
> > long result;
> >
> > #ifdef LINUX
> > /* Oddly, the readlink(2) man page says no NULL is appended. */
> > /* So you have to do it yourself, based on the return value: */
> > pathsize --; /* Preserve a space to add the trailing NULL */
> > result = readlink("/proc/self/exe", pname, pathsize);
> > if (result > 0)
> > {
> > pname[result] = 0; /* add the #...@!%ing NULL */
> >
> > if ((access(pname, 0) == 0))
> > return 0; /* file exists, return OK */
> > /*else name doesn't seem to exist, return FAIL (falls
> > through) */
> > }
> > #endif /* LINUX */
> >
> > #ifdef WIN32
> > result = GetModuleFileName(NULL, pname, pathsize);
> > if (result > 0)
> > {
> > /* fix up the dir slashes... */
> > int len = strlen(pname);
> > int idx;
> > for (idx = 0; idx < len; idx++)
> > {
> > if (pname[idx] == '\\') pname[idx] = '/';
> > }
> > if ((access(pname, 0) == 0))
> > return 0; /* file exists, return OK */
> > /*else name doesn't seem to exist, return FAIL (falls
> > through) */
> > }
> > #endif /* WIN32 */
> >
> > #ifdef SOLARIS
> > char *p = getexecname();
> > if (p)
> > {
> > /* According to the Sun manpages, getexecname will
> > "normally" return an */
> > /* absolute path - BUT might not... AND that IF it is not,
> > pre-pending */
> > /* getcwd() will "usually" be the correct thing... Urgh!
> > */
> >
> > /* check pathname is absolute (begins with a / ???) */
> > if (p[0] == '/') /* assume this means we have an
> > absolute path */
> > {
> > strncpy(pname, p, pathsize);
> > if ((access(pname, 0) == 0))
> > return 0; /* file exists, return OK */
> > }
> > else /* if not, prepend getcwd() then check if file
> > exists */
> > {
> > getcwd(pname, pathsize);
> > result = strlen(pname);
> > strncat(pname, "/", (pathsize - result));
> > result ++;
> > strncat(pname, p, (pathsize - result));
> >
> > if ((access(pname, 0) == 0))
> > return 0; /* file exists, return OK */
> > /*else name doesn't seem to exist, return FAIL
> > (falls through) */
> > }
> > }
> > #endif /* SOLARIS */
> >
> > #ifdef __APPLE__ /* assume this is OSX */
> > /*
> > from http://www.hmug.org/man/3/NSModule.html
> >
> > extern int _NSGetExecutablePath(char *buf, unsigned long
> > *bufsize);
> >
> > _NSGetExecutablePath copies the path of the executable
> > into the buffer and returns 0 if the path was successfully
> > copied in the provided buffer. If the buffer is not large
> > enough, -1 is returned and the expected buffer size is
> > copied in *bufsize. Note that _NSGetExecutablePath will
> > return "a path" to the executable not a "real path" to the
> > executable. That is the path may be a symbolic link and
> > not the real file. And with deep directories the total
> > bufsize needed could be more than MAXPATHLEN.
> > */
> > int status = -1;
> > char *given_path = malloc(MAXPATHLEN * 2);
> > if (!given_path) return status;
> >
> > pathsize = MAXPATHLEN * 2;
> > result = _NSGetExecutablePath(given_path, &pathsize);
> > if (result == 0)
> > { /* OK, we got something - now try and resolve the real path...
> > */
> > if (realpath(given_path, pname) != NULL)
> > {
> > if ((access(pname, 0) == 0))
> > status = 0; /* file exists, return OK */
> > }
> > }
> > free (given_path);
> > return status;
> > #endif /* APPLE */
> >
> > return -1; /* Path Lookup Failed */
> > } /* where_do_I_live */
> >
> > /***********************************************************************
> > *********************/
> > /* End of File */
> >
> >
> >
> >
> > SELEX Sensors and Airborne Systems Limited
> > Registered Office: Sigma House, Christopher Martin Road, Basildon, Essex
> > SS14 3EL
> > A company registered in England & Wales. Company no. 02426132
> > ********************************************************************
> > This email and any attachments are confidential to the intended
> > recipient and may also be privileged. If you are not the intended
> > recipient please delete it from your system and notify the sender.
> > You should not copy it or use it for any purpose nor disclose or
> > distribute its contents to any other person.
> > ********************************************************************
> >
>
_______________________________________________
fltk mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk