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__
36 #include <X11/Intrinsic.h>
37 #include <X11/Xmu/SysUtil.h>
40 extern char *index ();
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 */
54 #define CPP_PROGRAM "/lib/cpp"
57 static char cpp_string
[BUFSIZ
];
58 static char *cpp_file
= 0;
60 #define Resolution(pixels, mm) ((((pixels) * 100000 / (mm)) + 50) / 100)
63 lwlib_xrdb_initialize (display
)
72 (strncpy (s, str, sizeof(str)), s += (sizeof(str)-1))
74 #define Print(str, thing) \
75 (sprintf (s, str, thing), s = index (s, 0))
80 Push (" -DCLIENTHOST=");
81 XmuGetHostname (s
, sizeof (cpp_string
) - (s
- cpp_string
));
83 Push (" -DSERVERHOST=");
84 strcpy (s
, XDisplayName (DisplayString (display
)));
85 colon
= index (s
, ':');
88 XmuGetHostname (s
, sizeof (cpp_string
) - (s
- cpp_string
));
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;
120 fprintf (stderr
, "unexpected visual class=%d\n", visual
->class);
129 lwlib_GetFileDatabase (path
)
140 strcpy (cpp_file
, path
);
141 if (! (file
= popen (cpp_string
, "r")))
144 "couldn't execute %s; resource file %s file not munged.\n",
146 return XrmGetFileDatabase (path
);
148 while (s
= fgets (line
, sizeof (line
), file
))
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 */
159 if (! fgets (tail
, sizeof (line
) - (tail
- line
), file
))
161 tail
+= strlen (tail
);
163 XrmPutLineResource (&db
, s
);
172 lwlib_CombineFileDatabase (path
, target_db
, override
)
174 XrmDatabase
*target_db
;
177 XrmDatabase source_db
= lwlib_GetFileDatabase (path
);
179 return (! file_p (path
));
180 XrmCombineDatabase (source_db
, target_db
, override
);