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

Reply via email to