aboutsummaryrefslogtreecommitdiffstats
path: root/lwlib/xrdb-cpp.c
diff options
context:
space:
mode:
authorDave Love1999-09-30 21:29:02 +0000
committerDave Love1999-09-30 21:29:02 +0000
commita08cb76c5a7501b8da3926e752559801bccbc0d4 (patch)
tree13e737cc3af2020f3b17c5e4576b7b6ef6e8f07f /lwlib/xrdb-cpp.c
parent8cc3881faf5a8595d8f62ba80b7b7e3b43c642f4 (diff)
downloademacs-a08cb76c5a7501b8da3926e752559801bccbc0d4.tar.gz
emacs-a08cb76c5a7501b8da3926e752559801bccbc0d4.zip
#
Diffstat (limited to 'lwlib/xrdb-cpp.c')
-rw-r--r--lwlib/xrdb-cpp.c184
1 files changed, 184 insertions, 0 deletions
diff --git a/lwlib/xrdb-cpp.c b/lwlib/xrdb-cpp.c
new file mode 100644
index 00000000000..4ede12e7652
--- /dev/null
+++ b/lwlib/xrdb-cpp.c
@@ -0,0 +1,184 @@
1/* A general interface to the widgets of different toolkits.
2 Copyright (C) 1992, 1993 Lucid, Inc.
3
4This file is part of the Lucid Widget Library.
5
6The Lucid Widget Library is free software; you can redistribute it and/or
7modify it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11The Lucid Widget Library is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
18the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19Boston, 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
40extern char *index ();
41
42static int
43file_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
57static char cpp_string [BUFSIZ];
58static char *cpp_file = 0;
59
60#define Resolution(pixels, mm) ((((pixels) * 100000 / (mm)) + 50) / 100)
61
62void
63lwlib_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
128XrmDatabase
129lwlib_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
171int
172lwlib_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 */