root/branches/2.1/lwlib/xrdb-cpp.c

Revision 3104, 5.2 kB (checked in by himi, 6 years ago)

set svn:eol-style

  • Property svn:eol-style set to native
Line 
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 #ifdef HAVE_CONFIG_H
33 #include <config.h>
34 #endif
35
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 */
Note: See TracBrowser for help on using the browser.