1 /* A general interface to the widgets of different toolkits.
2 Copyright (C) 1992, 1993 Lucid, Inc.
4 This file is part of the Lucid Widget Library.
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)
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.
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. */
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().
28 #ifndef __STDC_EXTENDED__
29 #define __STDC_EXTENDED__
40 #include <X11/Intrinsic.h>
41 #include <X11/Xmu/SysUtil.h>
44 extern char *index ();
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 */
58 #define CPP_PROGRAM "/lib/cpp"
61 static char cpp_string
[BUFSIZ
];
62 static char *cpp_file
= 0;
64 #define Resolution(pixels, mm) ((((pixels) * 100000 / (mm)) + 50) / 100)
67 lwlib_xrdb_initialize (display
)
76 (strncpy (s, str, sizeof(str)), s += (sizeof(str)-1))
78 #define Print(str, thing) \
79 (sprintf (s, str, thing), s = index (s, 0))
84 Push (" -DCLIENTHOST=");
85 XmuGetHostname (s
, sizeof (cpp_string
) - (s
- cpp_string
));
87 Push (" -DSERVERHOST=");
88 strcpy (s
, XDisplayName (DisplayString (display
)));
89 colon
= index (s
, ':');
92 XmuGetHostname (s
, sizeof (cpp_string
) - (s
- cpp_string
));
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;
124 fprintf (stderr
, "unexpected visual class=%d\n", visual
->class);
133 lwlib_GetFileDatabase (path
)
144 strcpy (cpp_file
, path
);
145 if (! (file
= popen (cpp_string
, "r")))
148 "couldn't execute %s; resource file %s file not munged.\n",
150 return XrmGetFileDatabase (path
);
152 while (s
= fgets (line
, sizeof (line
), file
))
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 */
163 if (! fgets (tail
, sizeof (line
) - (tail
- line
), file
))
165 tail
+= strlen (tail
);
167 XrmPutLineResource (&db
, s
);
176 lwlib_CombineFileDatabase (path
, target_db
, override
)
178 XrmDatabase
*target_db
;
181 XrmDatabase source_db
= lwlib_GetFileDatabase (path
);
183 return (! file_p (path
));
184 XrmCombineDatabase (source_db
, target_db
, override
);