WINGs: Added 'const' attribute to function 'WMCreateHashTable'
[wmaker-crm.git] / WINGs / wapplication.c
bloba0aec2e12b529b8a7d555766cca58f0712bd4f92
2 #include <unistd.h>
3 #include <X11/Xlocale.h>
5 #include "WINGsP.h"
6 #include "wconfig.h"
9 struct W_Application WMApplication;
11 char *_WINGS_progname = NULL;
13 Bool W_ApplicationInitialized(void)
15 return _WINGS_progname != NULL;
18 void WMInitializeApplication(const char *applicationName, int *argc, char **argv)
20 int i;
22 assert(argc != NULL);
23 assert(argv != NULL);
24 assert(applicationName != NULL);
26 setlocale(LC_ALL, "");
28 #ifdef I18N
29 if (getenv("NLSPATH"))
30 bindtextdomain("WINGs", getenv("NLSPATH"));
31 else
32 bindtextdomain("WINGs", LOCALEDIR);
33 bind_textdomain_codeset("WINGs", "UTF-8");
34 #endif
36 _WINGS_progname = argv[0];
38 WMApplication.applicationName = wstrdup(applicationName);
39 WMApplication.argc = *argc;
41 WMApplication.argv = wmalloc((*argc + 1) * sizeof(char *));
42 for (i = 0; i < *argc; i++) {
43 WMApplication.argv[i] = wstrdup(argv[i]);
45 WMApplication.argv[i] = NULL;
47 /* initialize notification center */
48 W_InitNotificationCenter();
51 void WMSetResourcePath(const char *path)
53 if (WMApplication.resourcePath)
54 wfree(WMApplication.resourcePath);
55 WMApplication.resourcePath = wstrdup(path);
58 char *WMGetApplicationName()
60 return WMApplication.applicationName;
63 static char *checkFile(const char *path, const char *folder, const char *ext, const char *resource)
65 char *ret;
66 int extralen;
67 size_t slen;
69 if (!path || !resource)
70 return NULL;
72 extralen = (ext ? strlen(ext) + 1 : 0) + (folder ? strlen(folder) + 1 : 0) + 1;
73 slen = strlen(path) + strlen(resource) + 1 + extralen;
74 ret = wmalloc(slen);
76 if (wstrlcpy(ret, path, slen) >= slen)
77 goto error;
79 if (folder &&
80 (wstrlcat(ret, "/", slen) >= slen ||
81 wstrlcat(ret, folder, slen) >= slen))
82 goto error;
84 if (ext &&
85 (wstrlcat(ret, "/", slen) >= slen ||
86 wstrlcat(ret, ext, slen) >= slen))
87 goto error;
89 if (wstrlcat(ret, "/", slen) >= slen ||
90 wstrlcat(ret, resource, slen) >= slen)
91 goto error;
93 if (access(ret, F_OK) != 0)
94 goto error;
96 return ret;
98 error:
99 if (ret)
100 wfree(ret);
101 return NULL;
104 char *WMPathForResourceOfType(const char *resource, const char *ext)
106 char *path, *tmp, *appdir;
107 int i;
108 size_t slen;
110 path = tmp = appdir = NULL;
113 * Paths are searched in this order:
114 * - resourcePath/ext
115 * - dirname(argv[0])/ext
116 * - GNUSTEP_USER_ROOT/Applications/ApplicationName.app/ext
117 * - ~/GNUstep/Applications/ApplicationName.app/ext
118 * - GNUSTEP_LOCAL_ROOT/Applications/ApplicationName.app/ext
119 * - /usr/local/GNUstep/Applications/ApplicationName.app/ext
120 * - GNUSTEP_SYSTEM_ROOT/Applications/ApplicationName.app/ext
121 * - /usr/GNUstep/Applications/ApplicationName.app/ext
124 if (WMApplication.resourcePath) {
125 path = checkFile(WMApplication.resourcePath, NULL, ext, resource);
126 if (path)
127 goto out;
130 if (WMApplication.argv[0]) {
131 tmp = wstrdup(WMApplication.argv[0]);
132 i = strlen(tmp);
133 while (i > 0 && tmp[i] != '/')
134 i--;
135 tmp[i] = 0;
136 if (i > 0) {
137 path = checkFile(tmp, NULL, ext, resource);
138 } else {
139 path = NULL;
141 goto out;
144 slen = strlen(WMApplication.applicationName) + sizeof("Applications/.app");
145 appdir = wmalloc(slen);
146 if (snprintf(appdir, slen, "Applications/%s.app", WMApplication.applicationName) >= slen)
147 goto out;
149 path = checkFile(getenv("GNUSTEP_USER_ROOT"), appdir, ext, resource);
150 if (path)
151 goto out;
153 path = checkFile(wusergnusteppath(), appdir, ext, resource);
154 if (path)
155 goto out;
157 path = checkFile(getenv("GNUSTEP_LOCAL_ROOT"), appdir, ext, resource);
158 if (path)
159 goto out;
161 path = checkFile("/usr/local/GNUstep", appdir, ext, resource);
162 if (path)
163 goto out;
165 path = checkFile(getenv("GNUSTEP_SYSTEM_ROOT"), appdir, ext, resource);
166 if (path)
167 goto out;
169 path = checkFile("/usr/GNUstep", appdir, ext, resource); /* falls through */
171 out:
172 if (tmp)
173 wfree(tmp);
174 if (appdir)
175 wfree(appdir);
177 return path;