Mercurial > emacs
annotate lwlib/xrdb-cpp.c @ 42811:cf0c0ef57504
*** empty log message ***
| author | Jason Rumney <jasonr@gnu.org> |
|---|---|
| date | Thu, 17 Jan 2002 19:29:24 +0000 |
| parents | e0d966fb548f |
| children |
| rev | line source |
|---|---|
| 25842 | 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 | |
|
26087
e0d966fb548f
Add support for large files, plus some locale improvements.
Paul Eggert <eggert@twinsun.com>
parents:
25842
diff
changeset
|
32 #ifdef HAVE_CONFIG_H |
|
e0d966fb548f
Add support for large files, plus some locale improvements.
Paul Eggert <eggert@twinsun.com>
parents:
25842
diff
changeset
|
33 #include <config.h> |
|
e0d966fb548f
Add support for large files, plus some locale improvements.
Paul Eggert <eggert@twinsun.com>
parents:
25842
diff
changeset
|
34 #endif |
|
e0d966fb548f
Add support for large files, plus some locale improvements.
Paul Eggert <eggert@twinsun.com>
parents:
25842
diff
changeset
|
35 |
| 25842 | 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 */ |
