Index: src/hid/gtk/gui-top-window.c =================================================================== --- src/hid/gtk/gui-top-window.c (revision 813) +++ src/hid/gtk/gui-top-window.c (revision 814) @@ -1607,7 +1607,8 @@ /* ------------------------------------------------------------ */ static int stdin_listen = 0; -static char *pcbmenu_paths[] = {"gpcb-menu.res", "gpcb-menu.res", PCBSHAREDIR "/gpcb-menu.res", NULL}; +static char *pcbmenu_paths_in[] = {"gpcb-menu.res", "gpcb-menu.res", PCBSHAREDIR "/gpcb-menu.res", NULL}; +static char **pcbmenu_paths = NULL; HID_Attribute ghid_attribute_list[] = { @@ -1643,7 +1644,7 @@ %end-doc */ {"pcb-menu", "Location of gpcb-menu.res file", - HID_String, 0, 0, {0, "gpcb-menu.res", 0}, 0, &pcbmenu_paths[0]} + HID_String, 0, 0, {0, "gpcb-menu.res", 0}, 0, &pcbmenu_paths_in[0]} #define HA_pcbmenu 2 }; @@ -2028,6 +2029,8 @@ else Message (_("Warning: could not determine home directory\n")); + resolve_all_paths(pcbmenu_paths_in, pcbmenu_paths); + for(s = pcbmenu_paths; *s != NULL; s++) { if (access (*s, R_OK) == 0) return strdup (*s); Index: src/hid/lesstif/menu.c =================================================================== --- src/hid/lesstif/menu.c (revision 813) +++ src/hid/lesstif/menu.c (revision 814) @@ -1293,7 +1293,7 @@ else if (home_pcbmenu != NULL && (access(home_pcbmenu, R_OK) == 0)) filename = home_pcbmenu; else if (access(lesstif_pcbmenu_path, R_OK) == 0) - filename = lesstif_pcbmenu_path; + resolve_path(lesstif_pcbmenu_path, &filename); /* TODO: memleak! */ else filename = 0; Index: src/main.c =================================================================== --- src/main.c (revision 813) +++ src/main.c (revision 814) @@ -1385,7 +1385,7 @@ } -void resolve_paths(const char **in, const char **out, int numpaths) +void resolve_paths(const char **in, char **out, int numpaths) { for(out; numpaths > 0; numpaths--,in++,out++) { if (*in != NULL) { @@ -1405,15 +1405,6 @@ } } -#define resolve_all_paths(in, out) \ -do { \ - int __numpath__ = sizeof(in) / sizeof(char *); \ - if (__numpath__ > 0) { \ - out = malloc(sizeof(char *) * __numpath__); \ - resolve_paths(in, out, __numpath__); \ - } \ -} while(0) - void resolve_path(const char *in, char **out) { resolve_paths(&in, out, 1); Index: src/misc.h =================================================================== --- src/misc.h (revision 813) +++ src/misc.h (revision 814) @@ -144,6 +144,7 @@ void NetlistChanged (int force_unfreeze); + /* Allocate *out and copy the path from in to out, replacing ~ with homedir */ void resolve_path(const char *in, char **out); @@ -151,5 +152,20 @@ free() on in */ char *resolve_path_inplace(char *in); + +/* Resolve all paths from a in[] into out[](should be large enough) */ +void resolve_paths(const char **in, char **out, int numpaths); + +/* Resolve all paths from a char *in[] into a freshly allocated char **out */ +#define resolve_all_paths(in, out) \ +do { \ + int __numpath__ = sizeof(in) / sizeof(char *); \ + if (__numpath__ > 0) { \ + out = malloc(sizeof(char *) * __numpath__); \ + resolve_paths(in, out, __numpath__); \ + } \ +} while(0) + + #endif /* PCB_MISC_H */