view lwlib/xrdb-cpp.c @ 26114:c19849fe02b5

Doc fix, duplex and setpagedevice configuration. (ps-print-version): New version number (4.2). (ps-spool-config, ps-spool-tumble): New vars. (ps-print-prologue-1): Changed to defconst, adjust PostScript programming, new PostScript procedure to handle errors. (ps-print-prologue-2): Changed to defconst. (ps-print-duplex-feature): New const: duplex and tumble setting. (ps-setup, ps-begin-file): Fix funs. (ps-boolean-capitalized): New fun. Doc fix, n-up printing. (ps-print-version): New version number (5.0). (ps-page-dimensions-database): Added document media. (ps-n-up-printing, ps-n-up-margin, ps-n-up-border-p, ps-n-up-filling) (ps-page-order, ps-printing-region-p): New vars. (ps-n-up-printing, ps-n-up-filling, ps-header-sheet, ps-end-job): New funs. (ps-page-dimensions-get-media, ps-n-up-landscape, ps-n-up-lines) (ps-n-up-columns, ps-n-up-missing, ps-n-up-xcolumn, ps-n-up-ycolumn) (ps-n-up-xline, ps-n-up-yline, ps-n-up-repeat, ps-n-up-end) (ps-n-up-xstart, ps-n-up-ystart): New macros. (ps-print-begin-sheet-hook): New hook. (ps-boundingbox-re, ps-n-up-database, ps-n-up-filling-database): New const. (ps-setup, ps-begin-file, ps-get-buffer-name, ps-begin-job) (ps-end-file, ps-dummy-page, ps-generate): Fix funs. (ps-print-prologue-1): Adjust PostScript programming for n-up printing. (ps-count-lines): Changed to defun. (ps-header-page): Changed to defsubst, fix fun. (ps-printing-region): Doc fix, adjust programming code. (ps-output-boolean, ps-background-pages, ps-background-text) (ps-background-image, ps-background, ps-get-boundingbox): Adjust programming code. Doc fix, better customization. (ps-print-region-function, ps-number-of-columns, ps-spool-tumble) (ps-print-color-p, ps-printing-region-p, ps-n-up-database) (ps-end-file): Doc fix. (ps-setup, ps-begin-file): Fun fix. (postscript): New group. (ps-zebra-gray, ps-banner-page-when-duplexing): New vars. (ps-print-prologue-1): Adjust PostScript programming. (ps-print): Adjust group hierarchy. (ps-print-n-up, ps-print-zebra, ps-print-background, ps-print-printer) (ps-print-page): New subgroups. (ps-print-prologue-header, ps-printer-name, ps-lpr-command) (ps-lpr-switches, ps-page-dimensions-database, ps-paper-type) (ps-landscape-mode, ps-print-control-characters, ps-n-up-printing) (ps-n-up-margin, ps-n-up-border-p, ps-n-up-filling, ps-zebra-stripes) (ps-zebra-stripe-height, ps-print-background-image) (ps-print-background-text, ps-spool-config): Adjust customization. (dos-ps-printer): Definition eliminated.
author Kenichi Handa <handa@m17n.org>
date Wed, 20 Oct 1999 01:06:27 +0000
parents e0d966fb548f
children
line wrap: on
line source

/* 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

#ifdef HAVE_CONFIG_H
#include <config.h>
#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 */