diff lwlib/xrdb-cpp.c @ 25842:648d04be6a9c

#
author Dave Love <fx@gnu.org>
date Thu, 30 Sep 1999 21:29:02 +0000
parents
children e0d966fb548f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lwlib/xrdb-cpp.c	Thu Sep 30 21:29:02 1999 +0000
@@ -0,0 +1,184 @@
+/* A general interface to the widgets of different toolkits.
+   Copyright (C) 1992, 1993 Lucid, Inc.
+
+This file is part of the Lucid Widget Library.
+
+The Lucid Widget Library is free software; you can redistribute it and/or 
+modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+The Lucid Widget Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of 
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* This code reads a resource database file and filters it through cpp
+   with the same set of preprocessor defines that `xrdb' uses.
+   Call lwlib_xrdb_initialize(dpy) once, and then call the function
+   lwlib_GetFileDatabase() instead of XrmGetFileDatabase(), 
+   and lwlib_CombineFileDatabase() instead of XrmCombineFileDatabase().
+ */
+
+#ifndef __STDC_EXTENDED__
+#define __STDC_EXTENDED__
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+#include <X11/Xlib.h>
+#include <X11/Xos.h>
+#include <X11/Intrinsic.h>
+#include <X11/Xmu/SysUtil.h>
+#include <sys/stat.h>
+
+extern char *index ();
+
+static int
+file_p (path)
+     char *path;
+{
+  struct stat status;
+
+  return (access (path, R_OK) == 0		/* exists and is readable */
+	  && stat (path, &status) == 0		/* get the status */
+	  && (status.st_mode & S_IFDIR) == 0);	/* not a directory */
+}
+
+#ifndef CPP_PROGRAM
+#define CPP_PROGRAM "/lib/cpp"
+#endif
+
+static char cpp_string [BUFSIZ];
+static char *cpp_file = 0;
+
+#define Resolution(pixels, mm) ((((pixels) * 100000 / (mm)) + 50) / 100)
+
+void
+lwlib_xrdb_initialize (display)
+     Display *display;
+{
+  Screen *screen;
+  Visual *visual;
+  char server [255];
+  char *colon, *s;
+
+#define Push(str)  \
+  (strncpy (s, str, sizeof(str)), s += (sizeof(str)-1))
+
+#define Print(str, thing)  \
+  (sprintf (s, str, thing), s = index (s, 0))
+
+  s = cpp_string;
+  Push (CPP_PROGRAM);
+
+  Push (" -DCLIENTHOST=");
+  XmuGetHostname (s, sizeof (cpp_string) - (s - cpp_string));
+  s = index (s, 0);
+  Push (" -DSERVERHOST=");
+  strcpy (s, XDisplayName (DisplayString (display)));
+  colon = index (s, ':');
+  if (colon == s)
+    {
+      XmuGetHostname (s, sizeof (cpp_string) - (s - cpp_string));
+      s = index (s, 0);
+    }
+  else if (colon)
+    s = colon;
+  else
+    s = index (s, 0);
+  
+  Print (" -DVERSION=%d", ProtocolVersion(display));
+  Print (" -DREVISION=%d", ProtocolRevision(display));
+  Print (" -DVENDOR=\"%s\"", ServerVendor(display));
+  Print (" -DRELEASE=%d", VendorRelease(display));
+  screen = DefaultScreenOfDisplay(display);
+  visual = DefaultVisualOfScreen(screen);
+  Print (" -DWIDTH=%d", screen->width);
+  Print (" -DHEIGHT=%d", screen->height);
+  Print (" -DX_RESOLUTION=%d", Resolution(screen->width,screen->mwidth));
+  Print (" -DY_RESOLUTION=%d", Resolution(screen->height,screen->mheight));
+  Print (" -DPLANES=%d", DisplayPlanes(display, DefaultScreen(display)));
+  Print (" -DBITS_PER_RGB=%d", visual->bits_per_rgb);
+  switch(visual->class) {
+  case StaticGray:	Print (" -DCLASS=%s", "StaticGray");	break;
+  case GrayScale:	Print (" -DCLASS=%s", "GrayScale");	break;
+  case StaticColor:	Print (" -DCLASS=%s", "StaticColor");
+			Print (" -DCOLOR", 0); 			break;
+  case PseudoColor:	Print (" -DCLASS=%s", "PseudoColor");
+			Print (" -DCOLOR", 0);			break;
+  case TrueColor:	Print (" -DCLASS=%s", "TrueColor");
+			Print (" -DCOLOR", 0);			break;
+  case DirectColor:	Print (" -DCLASS=%s", "DirectColor");
+			Print (" -DCOLOR", 0);			break;
+  default:
+    fprintf (stderr, "unexpected visual class=%d\n", visual->class);
+    exit (-1);
+  }
+  *s++ = ' ';
+  *s = 0;
+  cpp_file = s;
+}
+
+XrmDatabase
+lwlib_GetFileDatabase (path)
+     char *path;
+{
+  XrmDatabase db = 0;
+  char line [BUFSIZ];
+  char *s;
+  FILE *file;
+
+  if (! file_p (path))
+    return 0;
+
+  strcpy (cpp_file, path);
+  if (! (file = popen (cpp_string, "r")))
+    {
+      fprintf (stderr,
+	       "couldn't execute %s; resource file %s file not munged.\n",
+	       CPP_PROGRAM, path);
+      return XrmGetFileDatabase (path);
+    }
+  while (s = fgets (line, sizeof (line), file))
+    {
+      char ch, *tail;
+      if (*s == '!') continue;
+      for (; ((ch = *s) != '\n') && isspace(ch); s++);
+      if ((ch == '\0') || (ch == '\n') || (ch == '#')) continue;
+      tail = s + strlen (s);
+      if (tail - s < 3) continue;   /* this would be syntactically incorrect */
+      while (*(tail-1) == '\n' &&   /* handle \ at end of line */
+	     *(tail-2) == '\\')
+	{
+	  if (! fgets (tail, sizeof (line) - (tail - line), file))
+	    continue;
+	  tail += strlen (tail);
+	}
+      XrmPutLineResource (&db, s);
+    }
+  pclose (file);
+  return db;
+}
+
+#ifdef THIS_IS_X11R5
+
+int
+lwlib_CombineFileDatabase (path, target_db, override)
+     char *path;
+     XrmDatabase *target_db;
+     Bool override;
+{
+  XrmDatabase source_db = lwlib_GetFileDatabase (path);
+  if (! source_db)
+    return (! file_p (path));
+  XrmCombineDatabase (source_db, target_db, override);
+  return 1;
+}
+
+#endif /* r5 */