]> code.delx.au - gnu-emacs/blob - lwlib/xrdb-cpp.c
#
[gnu-emacs] / lwlib / xrdb-cpp.c
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
32 #include <stdio.h>
33 #include <ctype.h>
34 #include <X11/Xlib.h>
35 #include <X11/Xos.h>
36 #include <X11/Intrinsic.h>
37 #include <X11/Xmu/SysUtil.h>
38 #include <sys/stat.h>
39
40 extern char *index ();
41
42 static int
43 file_p (path)
44 char *path;
45 {
46 struct stat status;
47
48 return (access (path, R_OK) == 0 /* exists and is readable */
49 && stat (path, &status) == 0 /* get the status */
50 && (status.st_mode & S_IFDIR) == 0); /* not a directory */
51 }
52
53 #ifndef CPP_PROGRAM
54 #define CPP_PROGRAM "/lib/cpp"
55 #endif
56
57 static char cpp_string [BUFSIZ];
58 static char *cpp_file = 0;
59
60 #define Resolution(pixels, mm) ((((pixels) * 100000 / (mm)) + 50) / 100)
61
62 void
63 lwlib_xrdb_initialize (display)
64 Display *display;
65 {
66 Screen *screen;
67 Visual *visual;
68 char server [255];
69 char *colon, *s;
70
71 #define Push(str) \
72 (strncpy (s, str, sizeof(str)), s += (sizeof(str)-1))
73
74 #define Print(str, thing) \
75 (sprintf (s, str, thing), s = index (s, 0))
76
77 s = cpp_string;
78 Push (CPP_PROGRAM);
79
80 Push (" -DCLIENTHOST=");
81 XmuGetHostname (s, sizeof (cpp_string) - (s - cpp_string));
82 s = index (s, 0);
83 Push (" -DSERVERHOST=");
84 strcpy (s, XDisplayName (DisplayString (display)));
85 colon = index (s, ':');
86 if (colon == s)
87 {
88 XmuGetHostname (s, sizeof (cpp_string) - (s - cpp_string));
89 s = index (s, 0);
90 }
91 else if (colon)
92 s = colon;
93 else
94 s = index (s, 0);
95
96 Print (" -DVERSION=%d", ProtocolVersion(display));
97 Print (" -DREVISION=%d", ProtocolRevision(display));
98 Print (" -DVENDOR=\"%s\"", ServerVendor(display));
99 Print (" -DRELEASE=%d", VendorRelease(display));
100 screen = DefaultScreenOfDisplay(display);
101 visual = DefaultVisualOfScreen(screen);
102 Print (" -DWIDTH=%d", screen->width);
103 Print (" -DHEIGHT=%d", screen->height);
104 Print (" -DX_RESOLUTION=%d", Resolution(screen->width,screen->mwidth));
105 Print (" -DY_RESOLUTION=%d", Resolution(screen->height,screen->mheight));
106 Print (" -DPLANES=%d", DisplayPlanes(display, DefaultScreen(display)));
107 Print (" -DBITS_PER_RGB=%d", visual->bits_per_rgb);
108 switch(visual->class) {
109 case StaticGray: Print (" -DCLASS=%s", "StaticGray"); break;
110 case GrayScale: Print (" -DCLASS=%s", "GrayScale"); break;
111 case StaticColor: Print (" -DCLASS=%s", "StaticColor");
112 Print (" -DCOLOR", 0); break;
113 case PseudoColor: Print (" -DCLASS=%s", "PseudoColor");
114 Print (" -DCOLOR", 0); break;
115 case TrueColor: Print (" -DCLASS=%s", "TrueColor");
116 Print (" -DCOLOR", 0); break;
117 case DirectColor: Print (" -DCLASS=%s", "DirectColor");
118 Print (" -DCOLOR", 0); break;
119 default:
120 fprintf (stderr, "unexpected visual class=%d\n", visual->class);
121 exit (-1);
122 }
123 *s++ = ' ';
124 *s = 0;
125 cpp_file = s;
126 }
127
128 XrmDatabase
129 lwlib_GetFileDatabase (path)
130 char *path;
131 {
132 XrmDatabase db = 0;
133 char line [BUFSIZ];
134 char *s;
135 FILE *file;
136
137 if (! file_p (path))
138 return 0;
139
140 strcpy (cpp_file, path);
141 if (! (file = popen (cpp_string, "r")))
142 {
143 fprintf (stderr,
144 "couldn't execute %s; resource file %s file not munged.\n",
145 CPP_PROGRAM, path);
146 return XrmGetFileDatabase (path);
147 }
148 while (s = fgets (line, sizeof (line), file))
149 {
150 char ch, *tail;
151 if (*s == '!') continue;
152 for (; ((ch = *s) != '\n') && isspace(ch); s++);
153 if ((ch == '\0') || (ch == '\n') || (ch == '#')) continue;
154 tail = s + strlen (s);
155 if (tail - s < 3) continue; /* this would be syntactically incorrect */
156 while (*(tail-1) == '\n' && /* handle \ at end of line */
157 *(tail-2) == '\\')
158 {
159 if (! fgets (tail, sizeof (line) - (tail - line), file))
160 continue;
161 tail += strlen (tail);
162 }
163 XrmPutLineResource (&db, s);
164 }
165 pclose (file);
166 return db;
167 }
168
169 #ifdef THIS_IS_X11R5
170
171 int
172 lwlib_CombineFileDatabase (path, target_db, override)
173 char *path;
174 XrmDatabase *target_db;
175 Bool override;
176 {
177 XrmDatabase source_db = lwlib_GetFileDatabase (path);
178 if (! source_db)
179 return (! file_p (path));
180 XrmCombineDatabase (source_db, target_db, override);
181 return 1;
182 }
183
184 #endif /* r5 */