Mercurial > emacs
annotate lwlib/xrdb-cpp.c @ 40165:dcacad791568
#
author | André Spiegel <spiegel@gnu.org> |
---|---|
date | Sun, 21 Oct 2001 23:38:42 +0000 |
parents | e0d966fb548f |
children |
rev | line source |
---|---|
25842 | 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 | |
26087
e0d966fb548f
Add support for large files, plus some locale improvements.
Paul Eggert <eggert@twinsun.com>
parents:
25842
diff
changeset
|
32 #ifdef HAVE_CONFIG_H |
e0d966fb548f
Add support for large files, plus some locale improvements.
Paul Eggert <eggert@twinsun.com>
parents:
25842
diff
changeset
|
33 #include <config.h> |
e0d966fb548f
Add support for large files, plus some locale improvements.
Paul Eggert <eggert@twinsun.com>
parents:
25842
diff
changeset
|
34 #endif |
e0d966fb548f
Add support for large files, plus some locale improvements.
Paul Eggert <eggert@twinsun.com>
parents:
25842
diff
changeset
|
35 |
25842 | 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 */ |