Previously, this was only (partially) possible by redefining the macro
GLOBAL_DEFAULTS_SUBDIR.  This told Window Maker to look for the global
config files in a particular subdirectory of SYSCONFDIR.

However:
* This is undocumented.
* GLOBAL_DEFAULTS_SUBDIR is ignored when installing the config files.  They
  are always installed to SYSCONFDIR/WindowMaker.

To solve these issues, we add a "--with-defsdatadir" option to configure
which allows a user to specify the global defaults directory.
---
 Makefile.am                      |  4 ++--
 WINGs/userdefaults.c             |  7 ++-----
 WindowMaker/Defaults/Makefile.am |  3 ---
 configure.ac                     | 15 +++++++++++++++
 src/defaults.c                   | 11 +++--------
 src/main.c                       |  6 +-----
 src/misc.c                       |  2 +-
 7 files changed, 24 insertions(+), 24 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 638cfed..786d3e8 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -21,8 +21,8 @@ config-paths.h: Makefile
        @echo '/* where shared data is stored */' >> $@
        @echo '#define PKGDATADIR "$(datadir)/WindowMaker"' >> $@
        @echo '' >> $@
-       @echo '/* where the configuration is stored */' >> $@
-       @echo '#define SYSCONFDIR "$(sysconfdir)"' >> $@
+       @echo '/* where the global defaults are stored */' >> $@
+       @echo '#define DEFSDATADIR "$(defsdatadir)"' >> $@
 
 ACLOCAL_AMFLAGS = -I m4
 
diff --git a/WINGs/userdefaults.c b/WINGs/userdefaults.c
index 65ed099..3ec776c 100644
--- a/WINGs/userdefaults.c
+++ b/WINGs/userdefaults.c
@@ -103,17 +103,14 @@ char *wdefaultspathfordomain(const char *domain)
 }
 
 /* XXX: doesn't quite belong to *user*defaults.c */
-#ifndef GLOBAL_DEFAULTS_SUBDIR
-#define GLOBAL_DEFAULTS_SUBDIR "WindowMaker"
-#endif
 char *wglobaldefaultspathfordomain(const char *domain)
 {
        char *t = NULL;
        size_t len;
 
-       len = strlen( SYSCONFDIR ) + strlen( GLOBAL_DEFAULTS_SUBDIR ) + 
strlen(domain) + 3;
+       len = strlen(DEFSDATADIR) + strlen(domain) + 2;
        t = wmalloc(len);
-       snprintf(t, len, "%s/%s/%s", SYSCONFDIR, GLOBAL_DEFAULTS_SUBDIR, 
domain);
+       snprintf(t, len, "%s/%s", DEFSDATADIR, domain);
 
        return t;
 }
diff --git a/WindowMaker/Defaults/Makefile.am b/WindowMaker/Defaults/Makefile.am
index e61b41f..182385c 100644
--- a/WindowMaker/Defaults/Makefile.am
+++ b/WindowMaker/Defaults/Makefile.am
@@ -1,6 +1,3 @@
-
-defsdatadir = $(sysconfdir)/WindowMaker
-
 defsdata_DATA = WMRootMenu WMWindowAttributes WindowMaker WMState WMGLOBAL
 
 wpexecbindir = @wprefs_bindir@
diff --git a/configure.ac b/configure.ac
index 8439c80..2b43e00 100644
--- a/configure.ac
+++ b/configure.ac
@@ -867,6 +867,21 @@ AS_IF([test "x$with_gnustepdir" = "x"],
 AC_SUBST([wprefs_datadir])dnl
 AC_SUBST([wprefs_bindir])dnl
 
+dnl Support for DEFSDATADIR option
+dnl ============================
+AC_ARG_WITH([defsdatadir],
+    [AS_HELP_STRING([--with-defsdatadir=PATH], [specify where global defaults 
are located [SYSCONFDIR/WindowMaker]])],
+    [AS_CASE([$withval],
+        [yes|no], [AC_MSG_ERROR([bad value '$withval' for --with-defsdatadir, 
expected a path]) ],
+        [/*],  [], dnl Absolute path, ok
+        [\$*], [], dnl Assumes it starts with a reference to $prefix or a 
similar variable, ok
+        [AC_MSG_ERROR([bad path '$withval' for defsdatadir, expecting an 
absolute path])])],
+    [with_defsdatadir=""])
+
+AS_IF([test "x$with_defsdatadir" != "x"],
+    [defsdatadir="$with_defsdatadir"],
+    [defsdatadir='${sysconfdir}/WindowMaker'])
+AC_SUBST([defsdatadir])dnl
 
 dnl Enable User Defined Menu thing
 dnl ==============================
diff --git a/src/defaults.c b/src/defaults.c
index f295ce1..f83f6a5 100644
--- a/src/defaults.c
+++ b/src/defaults.c
@@ -67,11 +67,6 @@
 
 #define MAX_SHORTCUT_LENGTH 32
 
-#ifndef GLOBAL_DEFAULTS_SUBDIR
-#define GLOBAL_DEFAULTS_SUBDIR "WindowMaker"
-#endif
-
-
 typedef struct _WDefaultEntry  WDefaultEntry;
 typedef int (WDECallbackConvert) (WScreen *scr, WDefaultEntry *entry, 
WMPropList *plvalue, void *addr, void **tdata);
 typedef int (WDECallbackUpdate) (WScreen *scr, WDefaultEntry *entry, void 
*tdata, void *extra_data);
@@ -879,7 +874,7 @@ static WMPropList *readGlobalDomain(const char *domainName, 
Bool requireDictiona
        char path[PATH_MAX];
        struct stat stbuf;
 
-       snprintf(path, sizeof(path), "%s/%s/%s", SYSCONFDIR, 
GLOBAL_DEFAULTS_SUBDIR, domainName);
+       snprintf(path, sizeof(path), "%s/%s", DEFSDATADIR, domainName);
        if (stat(path, &stbuf) >= 0) {
                globalDict = WMReadPropListFromFile(path);
                if (globalDict && requireDictionary && 
!WMIsPLDictionary(globalDict)) {
@@ -929,7 +924,7 @@ void wDefaultsMergeGlobalMenus(WDDomain * menuDomain)
                return;
 
 #ifdef GLOBAL_PREAMBLE_MENU_FILE
-       submenu = WMReadPropListFromFile(SYSCONFDIR "/" GLOBAL_DEFAULTS_SUBDIR 
"/" GLOBAL_PREAMBLE_MENU_FILE);
+       submenu = WMReadPropListFromFile(DEFSDATADIR "/" 
GLOBAL_PREAMBLE_MENU_FILE);
 
        if (submenu && !WMIsPLArray(submenu)) {
                wwarning(_("invalid global menu file %s"), 
GLOBAL_PREAMBLE_MENU_FILE);
@@ -943,7 +938,7 @@ void wDefaultsMergeGlobalMenus(WDDomain * menuDomain)
 #endif
 
 #ifdef GLOBAL_EPILOGUE_MENU_FILE
-       submenu = WMReadPropListFromFile(SYSCONFDIR "/" GLOBAL_DEFAULTS_SUBDIR 
"/" GLOBAL_EPILOGUE_MENU_FILE);
+       submenu = WMReadPropListFromFile(DEFSDATADIR "/" 
GLOBAL_EPILOGUE_MENU_FILE);
 
        if (submenu && !WMIsPLArray(submenu)) {
                wwarning(_("invalid global menu file %s"), 
GLOBAL_EPILOGUE_MENU_FILE);
diff --git a/src/main.c b/src/main.c
index d7aee3d..a00d9c7 100644
--- a/src/main.c
+++ b/src/main.c
@@ -59,10 +59,6 @@
 
 #include <WINGs/WUtil.h>
 
-#ifndef GLOBAL_DEFAULTS_SUBDIR
-#define GLOBAL_DEFAULTS_SUBDIR "WindowMaker"
-#endif
-
 /****** Global Variables ******/
 struct wmaker_global_variables w_global;
 
@@ -662,7 +658,7 @@ static int real_main(int argc, char **argv)
                                printf("Window Maker %s\n", VERSION);
                                exit(0);
                        } else if (strcmp(argv[i], "--global_defaults_path") == 
0) {
-                         printf("%s/%s\n", SYSCONFDIR, GLOBAL_DEFAULTS_SUBDIR);
+                         printf("%s\n", DEFSDATADIR);
                                exit(0);
                        } else if (strcmp(argv[i], "-locale") == 0 || 
strcmp(argv[i], "--locale") == 0) {
                                i++;
diff --git a/src/misc.c b/src/misc.c
index 02aa401..502f2b5 100644
--- a/src/misc.c
+++ b/src/misc.c
@@ -1017,7 +1017,7 @@ Bool UpdateDomainFile(WDDomain * domain)
        dict = domain->dictionary;
        if (WMIsPLDictionary(domain->dictionary)) {
                /* retrieve global system dictionary */
-               snprintf(path, sizeof(path), "%s/WindowMaker/%s", SYSCONFDIR, 
domain->domain_name);
+               snprintf(path, sizeof(path), "%s/%s", DEFSDATADIR, 
domain->domain_name);
                if (stat(path, &stbuf) >= 0) {
                        shared_dict = WMReadPropListFromFile(path);
                        if (shared_dict) {
-- 
2.7.4


-- 
To unsubscribe, send mail to wmaker-dev-unsubscr...@lists.windowmaker.org.

Reply via email to