Mercurial > emacs
comparison lwlib/xrdb-cpp.c @ 25842:648d04be6a9c
#
author | Dave Love <fx@gnu.org> |
---|---|
date | Thu, 30 Sep 1999 21:29:02 +0000 |
parents | |
children | e0d966fb548f |
comparison
equal
deleted
inserted
replaced
25841:2b742626505a | 25842:648d04be6a9c |
---|---|
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 */ |