Commit | Line | Data |
---|---|---|
a08cb76c DL |
1 | /* A general interface to the widgets of different toolkits. |
2 | Copyright (C) 1992, 1993 Lucid, Inc. | |
3 | ||
4 | This file is part of the Lucid Widget Library. | |
5 | ||
6 | The Lucid Widget Library is free software; you can redistribute it and/or | |
7 | modify it under the terms of the GNU General Public License as published by | |
8 | the Free Software Foundation; either version 2, or (at your option) | |
9 | any later version. | |
10 | ||
11 | The Lucid Widget Library is distributed in the hope that it will be useful, | |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | GNU General Public License for more details. | |
15 | ||
16 | You should have received a copy of the GNU General Public License | |
17 | along with GNU Emacs; see the file COPYING. If not, write to | |
18 | the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
19 | Boston, MA 02111-1307, USA. */ | |
20 | ||
21 | /* This code reads a resource database file and filters it through cpp | |
22 | with the same set of preprocessor defines that `xrdb' uses. | |
23 | Call lwlib_xrdb_initialize(dpy) once, and then call the function | |
24 | lwlib_GetFileDatabase() instead of XrmGetFileDatabase(), | |
25 | and lwlib_CombineFileDatabase() instead of XrmCombineFileDatabase(). | |
26 | */ | |
27 | ||
28 | #ifndef __STDC_EXTENDED__ | |
29 | #define __STDC_EXTENDED__ | |
30 | #endif | |
31 | ||
0f0912e6 PE |
32 | #ifdef HAVE_CONFIG_H |
33 | #include <config.h> | |
34 | #endif | |
35 | ||
a08cb76c DL |
36 | #include <stdio.h> |
37 | #include <ctype.h> | |
38 | #include <X11/Xlib.h> | |
39 | #include <X11/Xos.h> | |
40 | #include <X11/Intrinsic.h> | |
41 | #include <X11/Xmu/SysUtil.h> | |
42 | #include <sys/stat.h> | |
43 | ||
44 | extern char *index (); | |
45 | ||
46 | static int | |
47 | file_p (path) | |
48 | char *path; | |
49 | { | |
50 | struct stat status; | |
51 | ||
52 | return (access (path, R_OK) == 0 /* exists and is readable */ | |
53 | && stat (path, &status) == 0 /* get the status */ | |
54 | && (status.st_mode & S_IFDIR) == 0); /* not a directory */ | |
55 | } | |
56 | ||
57 | #ifndef CPP_PROGRAM | |
58 | #define CPP_PROGRAM "/lib/cpp" | |
59 | #endif | |
60 | ||
61 | static char cpp_string [BUFSIZ]; | |
62 | static char *cpp_file = 0; | |
63 | ||
64 | #define Resolution(pixels, mm) ((((pixels) * 100000 / (mm)) + 50) / 100) | |
65 | ||
66 | void | |
67 | lwlib_xrdb_initialize (display) | |
68 | Display *display; | |
69 | { | |
70 | Screen *screen; | |
71 | Visual *visual; | |
72 | char server [255]; | |
73 | char *colon, *s; | |
74 | ||
75 | #define Push(str) \ | |
76 | (strncpy (s, str, sizeof(str)), s += (sizeof(str)-1)) | |
77 | ||
78 | #define Print(str, thing) \ | |
79 | (sprintf (s, str, thing), s = index (s, 0)) | |
80 | ||
81 | s = cpp_string; | |
82 | Push (CPP_PROGRAM); | |
83 | ||
84 | Push (" -DCLIENTHOST="); | |
85 | XmuGetHostname (s, sizeof (cpp_string) - (s - cpp_string)); | |
86 | s = index (s, 0); | |
87 | Push (" -DSERVERHOST="); | |
88 | strcpy (s, XDisplayName (DisplayString (display))); | |
89 | colon = index (s, ':'); | |
90 | if (colon == s) | |
91 | { | |
92 | XmuGetHostname (s, sizeof (cpp_string) - (s - cpp_string)); | |
93 | s = index (s, 0); | |
94 | } | |
95 | else if (colon) | |
96 | s = colon; | |
97 | else | |
98 | s = index (s, 0); | |
99 | ||
100 | Print (" -DVERSION=%d", ProtocolVersion(display)); | |
101 | Print (" -DREVISION=%d", ProtocolRevision(display)); | |
102 | Print (" -DVENDOR=\"%s\"", ServerVendor(display)); | |
103 | Print (" -DRELEASE=%d", VendorRelease(display)); | |
104 | screen = DefaultScreenOfDisplay(display); | |
105 | visual = DefaultVisualOfScreen(screen); | |
106 | Print (" -DWIDTH=%d", screen->width); | |
107 | Print (" -DHEIGHT=%d", screen->height); | |
108 | Print (" -DX_RESOLUTION=%d", Resolution(screen->width,screen->mwidth)); | |
109 | Print (" -DY_RESOLUTION=%d", Resolution(screen->height,screen->mheight)); | |
110 | Print (" -DPLANES=%d", DisplayPlanes(display, DefaultScreen(display))); | |
111 | Print (" -DBITS_PER_RGB=%d", visual->bits_per_rgb); | |
112 | switch(visual->class) { | |
113 | case StaticGray: Print (" -DCLASS=%s", "StaticGray"); break; | |
114 | case GrayScale: Print (" -DCLASS=%s", "GrayScale"); break; | |
115 | case StaticColor: Print (" -DCLASS=%s", "StaticColor"); | |
116 | Print (" -DCOLOR", 0); break; | |
117 | case PseudoColor: Print (" -DCLASS=%s", "PseudoColor"); | |
118 | Print (" -DCOLOR", 0); break; | |
119 | case TrueColor: Print (" -DCLASS=%s", "TrueColor"); | |
120 | Print (" -DCOLOR", 0); break; | |
121 | case DirectColor: Print (" -DCLASS=%s", "DirectColor"); | |
122 | Print (" -DCOLOR", 0); break; | |
123 | default: | |
124 | fprintf (stderr, "unexpected visual class=%d\n", visual->class); | |
125 | exit (-1); | |
126 | } | |
127 | *s++ = ' '; | |
128 | *s = 0; | |
129 | cpp_file = s; | |
130 | } | |
131 | ||
132 | XrmDatabase | |
133 | lwlib_GetFileDatabase (path) | |
134 | char *path; | |
135 | { | |
136 | XrmDatabase db = 0; | |
137 | char line [BUFSIZ]; | |
138 | char *s; | |
139 | FILE *file; | |
140 | ||
141 | if (! file_p (path)) | |
142 | return 0; | |
143 | ||
144 | strcpy (cpp_file, path); | |
145 | if (! (file = popen (cpp_string, "r"))) | |
146 | { | |
147 | fprintf (stderr, | |
148 | "couldn't execute %s; resource file %s file not munged.\n", | |
149 | CPP_PROGRAM, path); | |
150 | return XrmGetFileDatabase (path); | |
151 | } | |
152 | while (s = fgets (line, sizeof (line), file)) | |
153 | { | |
154 | char ch, *tail; | |
155 | if (*s == '!') continue; | |
156 | for (; ((ch = *s) != '\n') && isspace(ch); s++); | |
157 | if ((ch == '\0') || (ch == '\n') || (ch == '#')) continue; | |
158 | tail = s + strlen (s); | |
159 | if (tail - s < 3) continue; /* this would be syntactically incorrect */ | |
160 | while (*(tail-1) == '\n' && /* handle \ at end of line */ | |
161 | *(tail-2) == '\\') | |
162 | { | |
163 | if (! fgets (tail, sizeof (line) - (tail - line), file)) | |
164 | continue; | |
165 | tail += strlen (tail); | |
166 | } | |
167 | XrmPutLineResource (&db, s); | |
168 | } | |
169 | pclose (file); | |
170 | return db; | |
171 | } | |
172 | ||
173 | #ifdef THIS_IS_X11R5 | |
174 | ||
175 | int | |
176 | lwlib_CombineFileDatabase (path, target_db, override) | |
177 | char *path; | |
178 | XrmDatabase *target_db; | |
179 | Bool override; | |
180 | { | |
181 | XrmDatabase source_db = lwlib_GetFileDatabase (path); | |
182 | if (! source_db) | |
183 | return (! file_p (path)); | |
184 | XrmCombineDatabase (source_db, target_db, override); | |
185 | return 1; | |
186 | } | |
187 | ||
188 | #endif /* r5 */ |