[comp.sources.misc] v10i009: Calctool V2.4 - a simple calculator

richb@Aus.Sun.COM (Rich Burridge) (01/16/90)

Posting-number: Volume 10, Issue 9
Submitted-by: richb@Aus.Sun.COM (Rich Burridge)
Archive-name: calctool24/part04

---- Cut Here and unpack ----
#!/bin/sh
# this is part 4 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file news.c continued
#
CurArch=4
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
     exit 1; fi
( read Scheck
  if test "$Scheck" != $CurArch
  then echo "Please unpack part $Scheck next!"
       exit 1;
  else exit 0; fi
) < s2_seq_.tmp || exit 1
echo "x - Continuing file news.c"
sed 's/^X//' << 'SHAR_EOF' >> news.c
X  for (i = 0; i < MAXREGS; i++)
X    {
X      switch (mtype)
X        {
X          case M_ACC    :                              /* Accuracies. */
X          case M_EXCH   :                              /* Register exchange. */
X          case M_LSHIFT :                              /* Left shift. */
X          case M_RCL    :                              /* Register recall. */
X          case M_RSHIFT :                              /* Right shift. */
X          case M_STO    :                              /* Register store. */
X                          FPRINTF(PostScript, "(%s)", num_names[i]) ;
X                          break ;
X          case M_CON    :                              /* Constants. */
X                          FPRINTF(PostScript, "(%s)", con_names[i]) ;
X                          break ;
X          case M_FUN    :                              /* Functions. */
X                          FPRINTF(PostScript, "(%s)", fun_names[i]) ;
X                          break ;
X        }
X      FPRINTF(PostScript, " { %1d typedprint }\n", (int) mtype) ;
X    }
X  FPRINTF(PostScript, "] /new DefaultMenu send def\n") ;
X  FFLUSH(PostScript) ;
X}
X
X
Xdestroy_frame()
X{
X  exit(0) ;
X}
X
X
Xdo_menu(mtype)      /* Popup appropriate menu and get value. */
Xenum menu_type mtype ;
X{
X  int mval ;
X
X  FPRINTF(PostScript, "{ /ParentMenu Menu%1d def } ClientMenu send\n",
X                      (int) mtype) ;
X  FFLUSH(PostScript) ;
X  pscanf(PostScriptInput, "%d", &mval) ;
X  return(mval) ;
X}
X
X
Xdrawline(x1, y1, x2, y2)
Xint x1, y1, x2, y2 ;
X{
X  FPRINTF(PostScript, "%d %d %d %d PSDrawLine\n", x1, x2, y1, y2) ;
X  FFLUSH(PostScript) ;
X}
X
X
Xdraw_regs()
X{
X  FPRINTF(PostScript, "PSDrawRegs\n") ;
X  FFLUSH(PostScript) ;
X}
X
X
Xdrawtext(x, y, window, fontno, color, str)
Xenum can_type window ;
Xenum font_type fontno ;
Xint x, y, color ;
Xchar *str ;
X{
X  int i ;
X  char font, fonttype[6], line[MAXLINE] ;
X 
X       if (fontno == SFONT) STRCPY(fonttype, "SFont") ;
X  else if (fontno == NFONT) STRCPY(fonttype, "NFont") ;
X  else if (fontno == BFONT) STRCPY(fonttype, "BFont") ;
X       if (window == KEYCANVAS) font = 'K' ;
X  else if (window == REGCANVAS) font = 'R' ;
X  line[0] = '\0' ;
X  for (i = 0; i < strlen(str); i++)
X    switch (str[i])
X      {
X        case '\\' : STRCAT(line,"\\\\") ;
X                    break ;
X        case '('  : STRCAT(line,"\\(") ;
X                    break ;
X        case ')'  : STRCAT(line,"\\)") ;
X                    break ;
X        default   : STRNCAT(line, &str[i], 1) ;
X      }
X  FPRINTF(PostScript, "(%s) %d %cCHeight %d ", line, x, font, y) ;
X  FPRINTF(PostScript, "%s %d %cC PSMakeText\n", fonttype, color, font) ;
X  FFLUSH(PostScript) ;
X}
X
X
Xget_display()         /* GET function key was pressed. */
X{
X}
X
X
Xget_next_event()
X{
X  int type ;
X
X  FFLUSH(PostScript) ;
X  if (pscanf(PostScriptInput, "%d", &type) == EOF) destroy_frame() ;
X  switch (type)
X    {
X      case KEYBOARD    : pscanf(PostScriptInput, "%d", &cur_ch) ;
X      case LEFT_DOWN   :
X      case MIDDLE_DOWN :
X      case LEFT_UP     :
X      case MIDDLE_UP   : pscanf(PostScriptInput, "%d%d", &curx, &cury) ;
X    }
X  return(type) ;
X}
X
X
Xhandle_selection()      /* Handle the GET function key being pressed. */
X{
X}
X
X
Xinit_fonts()
X{
X  FPRINTF(PostScript, "PSInitFonts\n") ;
X  FFLUSH(PostScript) ;
X  nfont_width = 9 ;
X}
X
X
Xinit_ws_type()
X{
X  gtype = NEWS ;
X  if (ps_open_PostScript() < 0) return -1 ;
X  if (send_ps_file(NEWSFILE) == -1)
X    {
X      FCLOSE(PostScript) ;
X      return(-1) ;
X    }
X  FFLUSH(PostScript) ;
X  if (ferror(PostScript))
X    {
X      FCLOSE(PostScript) ;
X      return(-1) ;
X    }
X  FPRINTF(PostScript, "PSIsColor\n") ;
X  FFLUSH(PostScript) ;
X  pscanf(PostScriptInput, "%d", &iscolor) ;
X  FPRINTF(PostScript, "PSInitialise\n") ;
X  FFLUSH(PostScript) ;
X  return(0) ;
X}
X
X
Xload_colors()      /* Create and load calctool color map. */
X{
X  u_char red[CALC_COLORSIZE], green[CALC_COLORSIZE], blue[CALC_COLORSIZE] ;
X  int i ;
X
X  calc_colorsetup(red, green, blue) ;
X  FPRINTF(PostScript, "%d PSMakeColorTable\n", CALC_COLORSIZE) ;
X  for (i = 0; i < CALC_COLORSIZE; i++)
X    FPRINTF(PostScript, "%d %d %d %d PSLoadColor\n",
X                         i, blue[i], green[i], red[i]) ;
X  FFLUSH(PostScript) ;
X}
X
X
X/*ARGSUSED*/
Xmake_frames(argc, argv)
Xint argc ;
Xchar *argv[] ;
X{
X  FPRINTF(PostScript, "%d %d %d %d %d %d %d PSMakeFrames\n",
X                     wx, wy, TWIDTH, DISPLAY+THEIGHT,
X                     ix, iy, iconic) ;
X  FFLUSH(PostScript) ;
X}
X
X
Xmake_icon()
X{
X  int depth, i, j, k, n ;
X  char line[MAXLINE], name[MAXLINE], v[16][5] ;
X  FILE *fin ;
X
X  if (iscolor) STRCPY(name, "calctool.color.icon") ;
X  else STRCPY(name, "calctool.icon") ;
X  if ((fin = fopen(name, "r")) == NULL)
X    {
X      FPRINTF(stderr, "%s: can't open %s.\n", progname, name) ;
X      exit(1) ;
X    }
X  depth = (iscolor) ? 8 : 1 ;
X  FPRINTF(PostScript, "/calctoolIcon %d %d %1d { } { <\n",
X                      ICONWIDTH, ICONHEIGHT, depth) ;
X  FGETS(line, MAXLINE, fin) ;
X  FGETS(line, MAXLINE, fin) ;
X  if (iscolor)
X    {
X      for (i = 0; i < 64; i++)
X        for (j = 0; j < 4; j++)
X          {
X            FGETS(line, MAXLINE, fin) ;
X            for (k = 0; k < 16; k++)
X              {
X                if (!(k % 2)) STRNCPY(v[k], &line[(k/2)*7+3], 2) ;
X                else STRNCPY(v[k], &line[(k/2)*7+5], 2) ;
X                v[k][2] = '\0' ;
X              }    
X                 if (j == 0 || j == 1) n = 16 ;
X            else if (j == 2) n = 10 ;
X            if (j != 3)
X              {
X                for (k = 0; k < n; k++)
X                  FPRINTF(PostScript, "%.2s ", v[k]) ;
X                FPRINTF(PostScript, "\n") ;
X              }
X          }
X    }
X  else
X    {
X      for (i = 0; i < 32; i++)
X        {
X          FGETS(line, MAXLINE, fin) ;
X          for (j = 0; j < 8; j++)
X            {
X              STRNCPY(v[j], &line[j*7+3], 4) ;
X              v[j][4] = '\0' ;
X            }
X          FPRINTF(PostScript, "%.4s %.4s %.4s %.4s %.4s %.4s\n",
X                              v[0], v[1], v[2], v[4], v[5], v[6]) ;
X        }
X    }
X  FPRINTF(PostScript, "> } buildimage def\n") ;
X  FFLUSH(PostScript) ;
X  FCLOSE(fin) ;
X}
X
X
Xmake_items()       /* Null routine. */
X{}
X
X
Xmake_subframes()   /* Null routine. */
X{}
X
X
Xsend_ps_file(fname)
Xchar *fname ;
X{
X  FILE *stream ;
X  int c ;
X 
X  if ((stream = fopen(fname,"r")) == NULL) return -1 ;
X  while ((c = getc(stream)) != EOF) PUTC(c, PostScript) ;
X  FCLOSE(stream) ;
X  return 0 ;
X}
X
X
Xset_cursor(type)
Xint type ;
X{
X  FPRINTF(PostScript, "%d PSSetCursor\n", type) ;
X  FFLUSH(PostScript) ;
X}
X
X
Xstart_tool()
X{
X  while (1)
X    process_event(get_next_event()) ;
X}
X
X
Xtoggle_reg_canvas()
X
X{
X  rstate = !rstate ;
X  FPRINTF(PostScript, "%d PSToggleRegCanvas\n", rstate) ;
X  FFLUSH(PostScript) ;
X}
SHAR_EOF
echo "File news.c is complete"
chmod 0444 news.c || echo "restore of news.c fails"
set `wc -c news.c`;Sum=$1
if test "$Sum" != "8102"
then echo original size 8102, current size $Sum;fi
echo "x - extracting sunview.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > sunview.c &&
X
X/*  @(#)sunview.c 1.13 89/12/21
X *
X *  These are the SunView dependent graphics routines used by calctool.
X *
X *  Copyright (c) Rich Burridge.
X *                Sun Microsystems, Australia - All rights reserved.
X *
X *  Permission is given to distribute these sources, as long as the
X *  copyright messages are not removed, and no monies are exchanged.
X *
X *  No responsibility is taken for any errors or inaccuracies inherent
X *  either to the comments or the code of this program, but if
X *  reported to me then an attempt will be made to fix them.
X */
X
X#include "calctool.h"
X#include "color.h"
X#include "extern.h"
X#include <suntool/sunview.h>
X#include <suntool/canvas.h>
X#include <suntool/selection_svc.h>
X#include <suntool/selection_attributes.h>
X
X#define  ICON_SET                       (void) icon_set
X#define  MENU_SET                       (void) menu_set
X#define  NOTIFY_INTERPOSE_DESTROY_FUNC  (void) notify_interpose_destroy_func
X#define  PW_SETCMSNAME                  (void) pw_setcmsname
X#define  PW_PUTCOLORMAP                 (void) pw_putcolormap
X#define  PW_TTEXT                       (void) pw_ttext
X#define  PW_VECTOR                      (void) pw_vector
X#define  PW_WRITEBACKGROUND             (void) pw_writebackground
X#define  SELN_QUERY                     (void) seln_query
X#define  WINDOW_DONE                    (void) window_done
X#define  WINDOW_SET                     (void) window_set
X
X#define  SMALLFONT   "/usr/lib/fonts/fixedwidthfonts/screen.r.7"
X#define  NORMALFONT  "/usr/lib/fonts/fixedwidthfonts/screen.b.14"
X#define  BIGFONT     "/usr/lib/fonts/fixedwidthfonts/gallant.r.19"
X
Xvoid func_key_proc() ;
X
XCanvas kcanvas, rcanvas ;
XCursor help_cursor, main_cursor ;
XEvent *cur_event ;
XFrame frame, rframe ;
XIcon calctool_icon ;
XMenu menus[MAXMENUS] ;
XNotify_value destroy_proc() ;
XPixfont *font, *sfont, *nfont, *bfont ;
XPixwin *pw, *cpw, *rcpw ;
XSeln_client sel_client ;
XSeln_holder holder ;
XSeln_rank rank = SELN_PRIMARY ;
XSeln_result get_proc(), reply_proc() ;
X
Xshort help_cursor_array[16] = {
X#include "help.cursor"
X} ;
Xmpr_static(help_cursor_pr, 16, 16, 1, help_cursor_array) ;
X
Xunsigned short icon_image[] = {
X#include "calctool.icon"
X} ;
Xmpr_static(icon_pr, 64, 64, 1, icon_image) ;
X
Xshort cicon_image[] = {
X#include "calctool.color.icon"
X} ;
Xmpr_static(cicon_pr, 64, 64, 8, cicon_image) ;
X
X
X/*ARGSUSED*/
Xvoid
Xcanvas_proc(canvas, event, arg)
XCanvas canvas ;
XEvent *event ;
Xcaddr_t arg ;
X{
X  cur_event = event ;
X  process_event(get_next_event(event)) ;
X}
X
X
Xclear_canvas(window, color)
Xenum can_type window ;
Xint color ;
X{
X  int height, width ;
X  Canvas ctype ;
X
X  if (window == KEYCANVAS)
X    {
X      pw = cpw ;
X      ctype = frame ;
X    }
X  else if (window == REGCANVAS)
X    {
X      pw = rcpw ;
X      ctype = rframe ;
X    }
X  height = (int) window_get(ctype, WIN_HEIGHT) ;
X  width = (int) window_get(ctype, WIN_WIDTH) ;
X  PW_WRITEBACKGROUND(pw, 0, 0, width, height, PIX_SRC | PIX_COLOR(color)) ;
X}
X
X
Xclose_frame()
X{
X  if ((int) window_get(rframe, WIN_SHOW) == TRUE)
X    WINDOW_SET(rframe, WIN_SHOW, FALSE, 0) ;
X  WINDOW_SET(frame, FRAME_CLOSED, TRUE, 0) ;
X  rstate = 0 ;
X}
X
X
Xcolor_area(x, y, width, height, color)
Xint x, y, width, height, color ;
X{
X  PW_WRITEBACKGROUND(cpw, x, y, width, height, PIX_SRC | PIX_COLOR(color)) ;
X}
X
X
Xcreate_menu(mtype)       /* Create popup menu for right button press. */
Xenum menu_type mtype ;
X{
X  int i ;
X
X  menus[(int) mtype] = menu_create(MENU_FONT, nfont, 0) ;
X  for (i = 0; i < MAXREGS; i++)
X    {
X      switch (mtype)
X        {
X          case M_ACC    :                              /* Accuracies. */
X          case M_EXCH   :                              /* Register exchange. */
X          case M_LSHIFT :                              /* Left shift. */
X          case M_RCL    :                              /* Register recall. */
X          case M_RSHIFT :                              /* Right shift. */
X          case M_STO    : MENU_SET(menus[(int) mtype], /* Register store. */
X                                   MENU_STRING_ITEM, num_names[i], i+1, 0) ;
X                          break ;
X          case M_CON    : if (strlen(con_names[i]))    /* Constants. */
X                            MENU_SET(menus[(int) mtype],
X                                     MENU_STRING_ITEM, con_names[i], i+1, 0) ;
X                          break ;
X          case M_FUN    : if (strlen(fun_names[i]))    /* Functions. */
X                            MENU_SET(menus[(int) mtype],
X                                     MENU_STRING_ITEM, fun_names[i], i+1, 0) ;
X        }
X    }
X}
X
X
Xdestroy_frame()
X{
X  WINDOW_DONE(frame) ;
X  exit(0) ;
X}
X
X
Xdestroy_rframe(frame)
XFrame frame ;
X{
X  rstate = 0 ;
X  WINDOW_SET(frame, WIN_SHOW, FALSE, 0) ;
X}
X
X
X/*ARGSUSED*/
XNotify_value
Xdestroy_proc(client, status)
XNotify_client client ;
XDestroy_status status ;
X{
X  exit(0) ;
X}
X
X
Xdo_menu(mtype)          /* Popup appropriate menu and get value. */
Xenum menu_type mtype ;
X{
X  return ((int) menu_show(menus[(int) mtype], kcanvas,
X                          canvas_window_event(kcanvas, cur_event), 0)) ;
X}
X
X
Xdrawline(x1, y1, x2, y2)
Xint x1, y1, x2, y2 ;
X{
X  PW_VECTOR(cpw, x1, y1, x2, y2, PIX_SET, 0) ;
X}
X
X
Xdraw_regs()
X{
X  make_registers() ;
X  WINDOW_SET(rframe, WIN_SHOW, TRUE, 0) ;
X}
X
X
Xdrawtext(x, y, window, fontno, color, str)
Xenum font_type fontno ;
Xenum can_type window ;
Xint x, y, color ;
Xchar *str ;
X{
X       if (fontno == SFONT) font = sfont ;
X  else if (fontno == NFONT) font = nfont ;
X  else if (fontno == BFONT) font = bfont ;
X       if (window == KEYCANVAS) pw = cpw ;
X  else if (window == REGCANVAS) pw = rcpw ;
X  PW_TTEXT(pw, x, y, PIX_SRC | PIX_COLOR(color), font, str) ;
X}
X
X
X/*ARGSUSED*/
Xvoid
Xfunc_key_proc(client_data, args)
Xchar *client_data ;
XSeln_function_buffer *args ;
X{
X  get_display() ;
X}
X
X
Xget_display()     /* The GET function key has been pressed. */
X{
X  if (seln_acquire(sel_client, SELN_SHELF) == SELN_SHELF)
X    {
X      if (shelf != NULL) free(shelf) ;
X      shelf = malloc((unsigned) strlen(display)) ;
X      STRCPY(shelf, display) ;         /* Safely keep copy of display. */
X    }
X}
X
X
XPixfont *
Xget_font(name)
Xchar *name ;
X{
X  Pixfont *font ;
X
X  font = pf_open(name) ;
X  if (font == NULL) font = pf_default() ;
X  if (font == NULL)
X    {
X      perror("couldn't get the default font.") ;
X      exit(1) ;
X    }
X  return font ;
X}
X
X
Xget_next_event(event)
XEvent *event ;
X{
X  static char eb[4] ;      /* Event buffer. */
X  int i ;
X
X#ifdef   SUN4_KEYBOARD
X  char *rpad = "\000\000\000=/*789456123" ;
X  char *akeys = "8264" ;
X  char *sun4keys = "\000\000\000+-\000\0000\000." ;
X#else
X  char *rpad = "\000\000\00078945612301=" ;
X  char *akeys = "5.31" ;
X#endif /*SUN4_KEYBOARD*/
X
X  nextc = event_id(event) ;
X  curx = event_x(event) ;
X  cury = event_y(event) ;
X
X  if (event_is_button(event))
X         if (event_is_down(event) && nextc == MS_LEFT) return(LEFT_DOWN) ;
X    else if (event_is_down(event) && nextc == MS_MIDDLE) return(MIDDLE_DOWN) ;
X    else if (event_is_down(event) && nextc == MS_RIGHT) return(RIGHT_DOWN) ;
X    else if (event_is_up(event) && nextc == MS_LEFT) return(LEFT_UP) ;
X    else if (event_is_up(event) && nextc == MS_MIDDLE) return(MIDDLE_UP) ;
X    else if (event_is_up(event) && nextc == MS_RIGHT) return(RIGHT_UP) ;
X
X/*  The following code attempts to handle a numeric keypad using the right
X *  function keys. This pad differs on the Sun3 and Sun4 keyboards. There
X *  is a compile-time define which determines which keyboard setup is
X *  looked for.
X */
X
X  if (event_is_ascii(event))
X    {
X
X/*  If the last two events were escape and left square bracket.. */
X
X      if (eb[0] && eb[1])
X        {
X          switch (nextc)
X            {
X
X/*  Interpret the arrow keys (if they are set).
X *  R8 = ^[A     R14 = ^[B     R12 = ^[C     R10 = ^[B
X */
X
X              case 'A' :
X              case 'B' :
X              case 'C' :
X              case 'D' : cur_ch = akeys[nextc - 'A'] ;
X                         eb[0] = eb[1] = '\0' ;
X                         return(KEYBOARD) ;
X
X/*  Interpret the extra keys found on Sun4 keyboards.
X *  These have codes of the form: ^[<int>z where <int> is a number
X *  between 247 and 255.  We're only interested in 4 of these keys.
X *  These are:
X *    ^[253z = +     ^[254z = -     ^[257z = 0     ^[259z = .
X */
X#ifdef SUN4_KEYBOARD
X              case '2' : eb[2] = '2' ;
X                         break ;
X
X              case '5' : if (eb[0] && eb[1] && eb[2])
X                           {
X                             eb[3] = '5' ;
X                             break ;
X                           }
X                         else 
X
X/*  Clear event_buf and treat as normal ascii char. */
X
X                           {
X                             eb[0] = eb[1] = '\0' ;
X                             cur_ch = nextc ;
X                             return(KEYBOARD) ;
X                           }
X
X              case '3' :
X              case '4' :
X              case '7' :
X              case '9' : if (eb[0] && eb[1] && eb[2] && eb[3])
X                           {
X                             cur_ch = sun4keys[nextc - '0'] ;
X                             eb[0] = eb[1] = eb[2] = eb[3] = '\0' ;
X                             return(KEYBOARD) ;
X                           }
X                         else if (eb[0] && eb[1] && eb[2] && nextc == '4')
X                           {
X                             eb[3] = nextc ;
X                             break ;
X                           }
X                         else
X
X/*  Clear event_buf and treat as normal ascii char. */
X
X                           {
X                             eb[0] = eb[1] = '\0' ;
X                             cur_ch = nextc ;
X                             return(KEYBOARD) ;
X                           }
X#endif /*SUN4_KEYBOARD*/
X
X               default : eb[0] = eb[1] = eb[2] = eb[3] = '\0' ;
X            }
X        }
X
X/*  If previous events are ^[[ : set buffer   */
X
X      else if (nextc == '[' && eb[0])    /* Check for left square bracket. */
X        eb[1] = '[' ;
X      else if (nextc == '\033')          /* Check for escape char. */
X        eb[0] = '\033' ;
X      else 
X        {
X
X/*  All the rest of the ASCII characters. */
X
X          eb[0] = eb[1] = '\0' ;
X          cur_ch = nextc ;
X          return(KEYBOARD) ;
X        }
X    }
X
X  if (event_is_key_right(event) && event_is_up(event))
X    {
X      for (i = 1; i < 16; i++)
X        if (nextc == KEY_RIGHT(i))
X          {
X            cur_ch = rpad[i-1] ;
X            return(KEYBOARD) ;
X          }
X    }
X  if (nextc == KBD_DONE && down) return(EXIT_WINDOW) ;
X  if (nextc == LOC_WINEXIT || nextc == LOC_RGNEXIT) return(EXIT_WINDOW) ;
X  if (nextc == LOC_WINENTER || nextc == LOC_RGNENTER) return(ENTER_WINDOW) ;
X  if (nextc == WIN_REPAINT) return(CFRAME_REPAINT) ;
X  if ((nextc == KEY_LEFT(6)) & event_is_up(event)) return(PUT_ON_SHELF) ;
X  if ((nextc == KEY_LEFT(8)) && event_is_up(event)) return(TAKE_FROM_SHELF) ;
X  return(LASTEVENTPLUSONE) ;
X}
X
X
XSeln_result
Xget_proc(buffer)
XSeln_request *buffer ;
X{
X  issel = 0 ;
X  if (*buffer->requester.context == 0)
X    {
X      if (buffer == (Seln_request *) NULL ||
X          *((Seln_attribute *) buffer->data) != SELN_REQ_CONTENTS_ASCII)
X        return ;
X      selection = buffer->data + sizeof(Seln_attribute) ;
X      *buffer->requester.context = 1 ;
X    }
X  else selection = buffer->data ;
X  issel = 1 ;
X}
X
X
Xhandle_selection()  /* Handle the GET function key being pressed. */
X{
X  char context = 0 ;
X
X  holder = seln_inquire(rank) ;
X  if (holder.state == SELN_NONE) return ;
X  SELN_QUERY(&holder, get_proc, &context, SELN_REQ_CONTENTS_ASCII, 0, 0) ;
X}
X
X
Xinit_fonts()
X{
X  bfont = get_font(BIGFONT) ;
X  nfont = get_font(NORMALFONT) ;
X  nfont_width = nfont->pf_defaultsize.x ;
X  sfont = get_font(SMALLFONT) ;
X}
X
X
Xinit_ws_type()
X{
X  if (getenv("WINDOW_PARENT") == NULL)
X    {
X      FPRINTF(stderr,"%s: Not a native SunView window\n", progname) ;
X      return -1 ;
X    }
X  gtype = SVIEW ;
X  return 0 ;
X}
X
X
Xload_colors()      /* Create and load calctool color map. */
X{
X  Pixwin *frame_pw ;
X  char colorname[CMS_NAMESIZE] ;
X  u_char red[CALC_COLORSIZE], green[CALC_COLORSIZE], blue[CALC_COLORSIZE] ;
X
X  iscolor = (cpw->pw_pixrect->pr_depth == 8) ? 1 : 0 ;
X  SPRINTF(colorname, "%s%D", CALC_COLOR, getpid()) ;
X  PW_SETCMSNAME(cpw, colorname) ;
X
X  calc_colorsetup(red, green, blue) ;
X  PW_PUTCOLORMAP(cpw, 0, CALC_COLORSIZE, red, green, blue) ;
X  if (inv_video) pw_reversevideo(cpw, 0, CALC_COLORSIZE) ;
X
X  if (iscolor)
X    {
X      frame_pw = (Pixwin *) window_get(frame, WIN_PIXWIN, 0) ;
X      PW_SETCMSNAME(frame_pw, colorname) ;
X      PW_PUTCOLORMAP(frame_pw, 0, CALC_COLORSIZE, red, green, blue) ;
X    }
X}
X
X
Xmake_frames(argc, argv)
Xint argc ;
Xchar *argv[] ;
X{
X  frame = window_create((Window) 0, FRAME,
X                        FRAME_ICON,       calctool_icon,
X                        FRAME_SHOW_LABEL, FALSE,
X                        FRAME_NO_CONFIRM, TRUE,
X                        FRAME_ARGS,       argc, argv,
X                        0) ;
X  sel_client = seln_create(func_key_proc, reply_proc, (char *) 0) ;
X  NOTIFY_INTERPOSE_DESTROY_FUNC(frame, destroy_proc) ;
X  rframe = window_create(frame, FRAME,
X                         FRAME_SHOW_LABEL, FALSE,
X                         FRAME_NO_CONFIRM, TRUE,
X                         FRAME_DONE_PROC,  destroy_rframe,
X                         WIN_X,            TWIDTH+15,
X                         WIN_Y,            0,
X                         WIN_SHOW,         FALSE,
X                         WIN_WIDTH,        TWIDTH,
X                         WIN_HEIGHT,       200,
X                         WIN_FONT,         nfont,
X                         0) ;
X 
X}
X
X
Xmake_icon()
X{
X  calctool_icon = icon_create(ICON_WIDTH, ICONWIDTH,
X                              ICON_IMAGE, &icon_pr,
X                              0) ;
X}
X
X
Xmake_items()
X{
X  main_cursor = window_get(kcanvas, WIN_CURSOR) ;
X
X  if (iscolor)
X    {
X      calctool_icon = (Icon) window_get(frame, FRAME_ICON) ;
X      ICON_SET(calctool_icon, ICON_IMAGE, &cicon_pr, 0) ;
X      WINDOW_SET(frame, FRAME_ICON, calctool_icon, 0) ;
X    }
X
X  help_cursor = cursor_create(CURSOR_XHOT,  0,
X                              CURSOR_YHOT,  0,
X                              CURSOR_OP,    PIX_SRC | PIX_DST,
X                              CURSOR_IMAGE, &help_cursor_pr, 0) ;
X  window_fit(frame) ;
X}
X
X
Xmake_subframes()
X{
X  rcanvas = window_create(rframe, CANVAS, 0) ;
X  kcanvas = window_create(frame, CANVAS,
X                          CANVAS_RETAINED,     FALSE,
X                          WIN_EVENT_PROC,      canvas_proc,
X                          WIN_WIDTH,           TWIDTH,
X                          WIN_HEIGHT,          THEIGHT + DISPLAY,
X                          WIN_FONT,            nfont,
X                          0) ;
X
X  WINDOW_SET(kcanvas, WIN_CONSUME_KBD_EVENTS, WIN_ASCII_EVENTS,
X                      WIN_LEFT_KEYS, WIN_TOP_KEYS, WIN_RIGHT_KEYS,
X                      WIN_UP_EVENTS, 0, 0) ;
X  WINDOW_SET(kcanvas, WIN_IGNORE_PICK_EVENT, LOC_MOVE, 0) ;
X  cpw = canvas_pixwin(kcanvas) ;
X  rcpw = canvas_pixwin(rcanvas) ;
X}
X
X
X/*ARGSUSED*/
XSeln_result
Xreply_proc(item, context, length)
XSeln_attribute item ;
XSeln_replier_data *context ;
Xint length ;
X{
X  int size ;
X  char *destp ;
X
X  switch (item)
X    {
X      case SELN_REQ_CONTENTS_ASCII :
X
X             if (context->context == NULL)
X               {
X                 if (shelf == NULL) return(SELN_DIDNT_HAVE) ;
X                 context->context = shelf ;
X               }
X             size = strlen(context->context) ;
X             destp = (char *) context->response_pointer ;
X             STRCPY(destp, context->context) ;
X             destp += size ;
X             while ((int) destp % 4 != 0) *destp++ = '\0' ;
X             context->response_pointer = (char **) destp ;
X             *context->response_pointer++ = 0 ;
X             return(SELN_SUCCESS) ;
X
X      case SELN_REQ_YIELD :
X
X             *context->response_pointer++ = (char *) SELN_SUCCESS ;
X             return(SELN_SUCCESS) ;
X
X      case SELN_REQ_BYTESIZE :
X
X             if (shelf == NULL) return(SELN_DIDNT_HAVE) ;
X             *context->response_pointer++ = (char *) strlen(shelf) ;
X             return(SELN_SUCCESS) ;
X
X      case SELN_REQ_END_REQUEST : return(SELN_SUCCESS) ;
X
X      default                   : return(SELN_UNRECOGNIZED) ;
X    }
X}
X
X
Xset_cursor(type)
Xint type ;
X{
X  switch (type)
X    {
X      case HELPCURSOR : WINDOW_SET(kcanvas, WIN_CURSOR, help_cursor, 0) ;
X                        break ;
X      case MAINCURSOR : WINDOW_SET(kcanvas, WIN_CURSOR, main_cursor, 0) ;
X    }
X}
X
X
Xstart_tool()
X{
X  window_main_loop(frame) ;
X}
X
X
Xtoggle_reg_canvas()
X{
X  rstate = !rstate ;
X  if (rstate) draw_regs() ;
X  else WINDOW_SET(rframe, WIN_SHOW, FALSE, 0) ;
X}
SHAR_EOF
chmod 0444 sunview.c || echo "restore of sunview.c fails"
set `wc -c sunview.c`;Sum=$1
if test "$Sum" != "16635"
then echo original size 16635, current size $Sum;fi
echo "x - extracting tty.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > tty.c &&
X
X/*  @(#)tty.c 1.12 89/12/21
X *
X *  These are the dumb tty dependent graphics routines used by calctool.
X *
X *  Copyright (c) Rich Burridge.
X *                Sun Microsystems, Australia - All rights reserved.
X *
X *  Permission is given to distribute these sources, as long as the
X *  copyright messages are not removed, and no monies are exchanged.
X *
X *  No responsibility is taken for any errors or inaccuracies inherent
X *  either to the comments or the code of this program, but if
X *  reported to me then an attempt will be made to fix them.
X */
X
X#include "calctool.h"
X#include "color.h"
X#include "extern.h"
X
Xchar *CE, *CL, *CM, *SE, *SO ;
X
Xchar *getenv(), *tgetstr(), *tgoto() ;
Xint destroy_frame(), outc() ;
X
X#ifdef NO_4_3SELECT
Xint fullmask ;               /* Full mask of file descriptors to check on. */
Xint readmask ;               /* Readmask used in select call. */
X#else
Xfd_set fullmask ;            /* Full mask of file descriptors to check on. */
Xfd_set readmask ;            /* Read mask used in select call. */
X#endif /*NO_4_3SELECT*/
X
Xstruct sgttyb in_new, in_old ;
X
X
XSIGRET
Xcleanup()
X{
X  destroy_frame() ;
X}
X
X
X/*ARGSUSED*/
Xclear_canvas(canvas, color)
Xenum can_type canvas ;
Xint color ;
X{
X  int i,j ;
X
X  if (canvas == REGCANVAS)
X    for (i = 0; i < 24; i++)
X      {
X        tputs(tgoto(CM, i, 43), 1, outc) ;
X        do_move(43, i) ;
X        do_clr_eol() ;
X      }
X  else for (i = 0; i < 24; i++)
X    {
X      do_move(0, i) ;
X      for (j = 0; j < 42; j++) outc(' ') ;
X    }
X  do_move(41, 1) ;
X}
X
X
Xclose_frame() {}     /* This option does nothing with termcap. */
X
X
X/*ARGSUSED*/
Xcolor_area(x, y, width, height, color)    /* Color an area - null routine. */
Xint x, y, width, height, color ;
X{}
X
X
X/*ARGSUSED*/
Xcreate_menu(mtype)     /* Create popup menu - null routine. */
Xenum menu_type mtype ;
X{}
X
X
Xdestroy_frame()
X{
X  int i ;
X
X  tputs(CL, 1, outc) ; 
X  for (i = 0; i < 24; i++)
X    {
X      do_move(0, i) ;
X      do_clr_eol() ;
X    }
X  do_move(0, 0) ;
X  SIGNAL(SIGINT, SIG_IGN) ;
X  IOCTL(0, TIOCSETP, &in_old) ;
X  exit(0) ;
X}
X
X
Xdo_clr_eol()                  /* Clear to the end of the line. */
X{
X  tputs(CE, 1, outc) ;
X}
X
X
X/*ARGSUSED*/
Xdo_menu(mtype)                /* Popup appropriate menu (null routine). */
Xenum menu_type mtype ;
X{}
X
X
Xdo_move(x, y)                 /* Move to character position (x, y). */
Xint x, y ;
X{
X  tputs(tgoto(CM, x, y), 1, outc) ;
X}
X
X
Xdo_standend()                 /* Finish inverted area. */
X{
X  tputs(SE, 1, outc) ;
X}
X
X
Xdo_standout()                 /* Start inverted area. */
X{
X  tputs(SO, 1, outc) ;
X}
X
X
Xdrawline(x1, y1, x2, y2)
Xint x1, y1, x2, y2 ;
X{
X  double dx ;
X  int i, offset, x, y ;
X
X  if (x1)
X    {
X      dx = (float) (x1 - BBORDER) / (BWIDTH + BGAP) ;
X      if (dx == (int) dx) offset = 1 ;
X      else offset = 6 ;
X
X      x = ((x1 - BBORDER) / (BWIDTH + BGAP) * 7) + offset ;
X      y = ((y1 - BBORDER) / (BHEIGHT + BGAP) * 3) + 5 ;
X      do_move(x, y) ;
X      if (x1 == x2)
X        {
X          if ((y2 - y1) != BHEIGHT) return ;
X          outc('+') ;
X          for (i = 0; i < 2; i++)
X            {
X              do_move(x, y+i+1) ;
X              outc('|') ;
X            }
X          do_move(x, y+3) ;
X          outc('+') ;
X        }
X      else
X        {
X          if ((x2 - x1) != BWIDTH) return ;
X          outc('+') ;
X          for (i = 0; i < 4; i++)
X            {
X              do_move(x+i+1, y) ;
X              outc('-') ;
X            }
X          do_move(x+5, y) ;
X          outc('+') ;
X        }
X    }
X  else
X    {
X      do_move(0, 4) ;
X      for (i = 0; i < 42; i++) outc('-') ;
X    }
X}
X
X
Xdraw_regs()
X{
X}
X
X
X/*ARGSUSED*/
Xdrawtext(tx, ty, window, fontno, color, str)
Xenum can_type window ;
Xenum font_type fontno ;
Xint tx, ty, color ;
Xchar *str ;
X{
X  char key[5] ;
X  int i, invert, sps ;
X
X  invert = 0 ;
X  if (window == REGCANVAS)                   /* Register window. */
X    {
X      tx = 45 ;
X      ty = ((ty / 15 - 1) * 2) + 1 ;
X    }
X  else if (window == KEYCANVAS && tx == 5)   /* Help screen. */
X    {
X      tx = 1 ;
X      ty = ty / 15 ;
X    }
X  else if (window == KEYCANVAS && ty < DISPLAY)
X    {
X      if (color == WHITE)
X        for (i = 0; i < strlen(str); i++) str[i] = ' ' ;
X
X      if (ty == (DISPLAY-3))              /* Base, trig and op items. */
X        {
X          tx = tx * 42 / (TWIDTH) + 1 ;
X          ty = 3 ;
X        }
X      else                                /* Display item. */
X        {
X          tx = 41 - strlen(str) ;
X          ty = 1 ;
X        }
X    }
X  else                                    /* Button values. */
X    {
X      tx = ((tx - BBORDER) / (BWIDTH + BGAP) * 7) + 2 ;
X      for (sps = 0, i = 0; i < 4; i++)
X        if (str[i] == ' ') sps++ ;
X      ty = (ty - 34) / 30 ;
X      ty = (ty - (ty % 2)) * 3 / 2 + 6 + (ty % 2) ;
X      switch (sps)
X        {
X          case 0 :
X          case 1 :
X          case 4 : STRCPY(key, str) ;
X                   break ;
X          case 2 :
X          case 3 : key[0] = ' ' ;
X                   STRNCPY(&key[1], str, 3) ;
X        }
X      key[5] = '\0' ;
X      STRCPY(str, key) ;
X      if (ty % 3) invert = 1 ;
X    }
X  do_move(tx, ty) ;
X  if (window == REGCANVAS) do_clr_eol() ;
X  if (invert) do_standout() ;
X  outstr(str) ;
X  if (invert) do_standend() ;
X  do_move(41, 1) ;
X}
X
X
Xget_display()            /* No GET key; null routine. */
X{}
X
X
Xget_next_event()         /* Only events possible are keyboard ones. */
X{
X  char c ;
X  int reply ;
X
X  for (;;)
X    {
X      readmask = fullmask ;
X#ifdef NO_4_3SELECT
X      reply = select(32, &readmask, 0, 0, (struct timeval *) 0) ;
X      if (reply == -1) /* do nothing. */
X      else if (readmask && (1 << 0))
X#else
X      reply = select(FD_SETSIZE, &readmask, (fd_set *) 0, (fd_set *) 0,
X                                            (struct timeval *) 0) ;
X      if (reply == -1) /* do nothing. */ ;
X      else if (FD_ISSET(0, &readmask))
X#endif /*NO_4_3SELECT*/
X        {
X          READ(0, &c, 1) ;
X          cur_ch = c ;
X          return(KEYBOARD) ;
X        }
X    }
X}
X
X
Xhandle_selection()       /* There is no PUT function key with termcap. */
X{}
X
X
Xinit_fonts()             /* No fonts with the termcap version. */
X{
X  nfont_width = 8 ;
X}
X
X
Xinit_ws_type()           /* Check if terminal capable of termcap output. */
X{
X  char bp[1024], termtype[MAXLINE] ;
X  int i ;
X  static char buf[100] ;
X  char *area = buf ;
X
X  if (getenv("TERM") != NULL) STRCPY(termtype, getenv("TERM")) ;
X  if (tgetent(bp, termtype) != 1) return 1 ;
X  if ((CL = tgetstr("cl", &area)) == (char *) 0) return 1 ;
X  if ((CM = tgetstr("cm", &area)) == (char *) 0) return 1 ;
X  if ((CE = tgetstr("ce", &area)) == (char *) 0) return 1 ;
X  if ((SO = tgetstr("so", &area)) == (char *) 0) return 1 ;
X  if ((SE = tgetstr("se", &area)) == (char *) 0) return 1 ;
X  for (i = 0; i < 24; i++)
X    {
X      do_move(0, i) ;
X      do_clr_eol() ;
X    }
X  gtype = TTY ;
X  return 0 ;
X}
X
X
Xload_colors()
X{
X  iscolor = 0 ;          /* No colors in the termcap implementation. */
X}
X
X
X/*ARGSUSED*/
Xmake_frames(argc, argv)
Xint argc ;
Xchar *argv[] ;
X{
X  int i ;
X
X  SIGNAL(SIGINT, cleanup) ;
X
X#ifdef NO_4_3SELECT
X  fullmask = 1 ;                       /* Set mask for fd #0. */
X#else
X  FD_ZERO(&fullmask) ;
X  FD_SET(0, &fullmask) ;
X#endif /*NO_4_3SELECT*/
X
X  IOCTL(0, TIOCGETP, &in_old) ;        /* Setup standard input. */
X  in_new = in_old ;
X  in_new.sg_flags |= RAW ;
X  in_new.sg_flags &= ~(ECHO | CRMOD) ;
X  IOCTL(0, TIOCSETP, &in_new) ;
X
X  setbuf(stdout, (char *) NULL) ;
X
X  tputs(CL, 1, outc) ;
X  do_move(0, 4) ;
X  for (i = 0; i < 41; i++) outc('-') ;
X  for (i = 0; i < 24; i++)
X    {
X      do_move(42, i) ;
X      if (i == 4) outc('+') ;
X      else outc('|') ;
X    }
X}
X
X
Xmake_icon() {}          /* There is no icon with termcap. */
X
X
Xmake_items()
X{
X  do_repaint() ;        /* Redraw the calctool canvas[es]. */
X}
X
X
Xmake_subframes() {}     /* There are no subframes with termcap. */
X
X
Xoutc(c)                 /* Output the next character to the screen. */
Xint c ;
X{
X  PUTC(c, stdout) ;
X}
X
X
Xoutstr(str)
Xchar *str ;
X{
X  int i ;
X
X  for (i = 0; i < strlen(str); i++) PUTC(str[i], stdout) ;
X}
X
X
X/*ARGSUSED*/
Xset_cursor(type)        /* There are no cursors with termcap. */
Xint type ;
X{}
X
X
Xstart_tool()
X{
X  while (1)
X    process_event(get_next_event()) ;
X}
X
X
Xtoggle_reg_canvas()      /* Show or clear memory register area. */
X{
X  rstate = !rstate ;
X  clear_canvas(REGCANVAS, WHITE) ;
X  if (rstate) make_registers() ;
X}
SHAR_EOF
chmod 0444 tty.c || echo "restore of tty.c fails"
set `wc -c tty.c`;Sum=$1
if test "$Sum" != "8330"
then echo original size 8330, current size $Sum;fi
echo "x - extracting x11.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > x11.c &&
X
X/*  @(#)x11.c 1.14 89/12/21
X *
X *  These are the X11 dependent graphics routines used by calctool.
X *
X *  Copyright (c) Rich Burridge.
X *                Sun Microsystems, Australia - All rights reserved.
X *
X *  Permission is given to distribute these sources, as long as the
X *  copyright messages are not removed, and no monies are exchanged.
X *
X *  No responsibility is taken for any errors or inaccuracies inherent
X *  either to the comments or the code of this program, but if
X *  reported to me then an attempt will be made to fix them.
X */
X
X#include "calctool.h"
X#include "color.h"
X#include "extern.h"
X#include <X11/Xlib.h>
X#include <X11/Xutil.h>
X#include <X11/Xatom.h>
X#include <X11/cursorfont.h>
X
X#define  XGETSIZEHINTS  (void) XGetSizeHints
X
X#define  BIGFONT               "helvetica-bold-14"
X#define  DEFFONT               "fixed"
X#define  NORMALFONT            "fixed"
X#define  SMALLFONT             "6x10"
X
X#define  CALCTOOL_BORDER_WIDTH  2
X
X#define  FRAME_MASK  (ButtonPressMask | ButtonReleaseMask | KeyPressMask | \
X                      EnterWindowMask | LeaveWindowMask | ExposureMask)
X
Xshort help_cursor_array[16] = {
X#include "help.cursor"
X} ;
X
Xshort icon_image[] = {
X#include "calctool.icon"
X} ;
X
Xshort cicon_image[] = {
X#include "calctool.color.icon"
X} ;
X
XAtom protocol_atom, kill_atom ;
XCursor help_cursor, main_cursor ;
XDisplay *dpy ;
XGC gc ;
XPixmap calctool_icon, help_pixmap ;
XPixmap load_icon() ;
XWindow frame, rframe ;
XXColor BGcolor, FGcolor, current_col ;
XXEvent event ;
XXFontStruct *bfont, *font, *nfont, *sfont ;
XXGCValues gc_val ;
XXSizeHints size ;
XXWMHints wm_hints ;
X
Xunsigned long gc_mask ;
Xint screen ;
Xunsigned int scr_depth ;
Xunsigned long backgnd, foregnd ;
Xunsigned long palette[CALC_COLORSIZE] ;
X
X
Xclear_canvas(ctype, color)
Xenum can_type ctype ;
Xint color ;
X{
X  XSizeHints hints ;
X  Window window ;
X
X       if (ctype == KEYCANVAS) window = frame ;
X  else if (ctype == REGCANVAS) window = rframe ;
X  XGETSIZEHINTS(dpy, window, &hints, XA_WM_NORMAL_HINTS) ;
X  if (iscolor) gc_val.foreground = palette[color] ;
X  else
X    {
X      if (color == WHITE) gc_val.foreground = backgnd ;
X      else gc_val.foreground = foregnd ;
X    }
X  gc_val.function = GXcopy ;
X  XChangeGC(dpy, gc, GCForeground | GCFunction, &gc_val) ;
X  XFillRectangle(dpy, window, gc, 0, 0, hints.width, hints.height) ;
X}
X
X
Xclose_frame()
X{
X  iconic = 1 ;
X  rstate = 0 ;
X  XIconifyWindow(dpy, frame, screen) ;
X}
X
X
Xcolor_area(x, y, width, height, color)
Xint x, y, width, height, color ;
X{
X  if (iscolor) gc_val.foreground = palette[color] ;
X  else
X    {
X      if (color == WHITE) gc_val.foreground = backgnd ;
X      else gc_val.foreground = foregnd ;
X    }
X  gc_val.function = GXcopy ;
X  XChangeGC(dpy, gc, GCForeground | GCFunction, &gc_val) ;
X  XFillRectangle(dpy, frame, gc, x, y,
X                 (unsigned int) width, (unsigned int) height) ;
X}
X
X
Xcreate_menu(mtype)    /* Create popup menu for right button press. */
Xenum menu_type mtype ;
X{
X}
X
X
Xdestroy_frame()
X{
X  XDestroyWindow(dpy, frame) ;
X  XDestroyWindow(dpy, rframe) ;
X  exit(0) ;
X}
X
X
Xdo_menu(mtype)      /* Popup appropriate menu and get value. */
Xenum menu_type mtype ;
X{
X}
X
X
Xdrawline(x1, y1, x2, y2)
Xint x1, y1, x2, y2 ;
X{
X  if (iscolor) gc_val.foreground = palette[BLACK] ;
X  else gc_val.foreground = foregnd ;
X  gc_val.function = GXcopy ;
X  XChangeGC(dpy, gc, GCForeground | GCFunction, &gc_val) ;
X  XDrawLine(dpy, frame, gc, x1, y1, x2, y2) ;
X}
X
X
Xdraw_regs()
X{
X  XMapWindow(dpy, rframe) ;
X}
X
X
Xdrawtext(x, y, ctype, fontno, color, str)
Xenum font_type fontno ;
Xenum can_type ctype ;
Xint x, y, color ;
Xchar *str ;
X{
X  Window window ;
X
X       if (fontno == SFONT) font = sfont ;
X  else if (fontno == NFONT) font = nfont ;
X  else if (fontno == BFONT) font = bfont ;
X       if (ctype == KEYCANVAS) window = frame ;
X  else if (ctype == REGCANVAS) window = rframe ;
X
X  if (ctype == KEYCANVAS && y == items[DISPLAYITEM].y) x += 100 ;
X  if (iscolor) gc_val.foreground = palette[color] ;
X  else
X    {
X      if (color == WHITE) gc_val.foreground = backgnd ;
X      else gc_val.foreground = foregnd ;
X    }
X  gc_val.font = font->fid ;
X  gc_val.function = GXcopy ;
X  XChangeGC(dpy, gc, GCFont | GCForeground | GCFunction, &gc_val) ;
X  XDrawString(dpy, window, gc, x, y, str, strlen(str)) ;
X}
X
X
Xget_display()         /* GET function key was pressed. */
X{
X}
X
X
XXFontStruct *
Xget_font(name)
Xchar *name ;
X{
X  XFontStruct *font ;
X
X  if (!(font = XLoadQueryFont(dpy, name)))
X    if (!(font = XLoadQueryFont(dpy, DEFFONT)))
X      {
X        perror("couldn't get the default font.") ;
X        exit(1) ;
X      }
X  return(font) ;
X}
X
X
Xget_next_event()
X{
X  XClientMessageEvent *ev ;
X  XKeyPressedEvent *key_event ;
X  char chs[2] ;
X
X  if (!XCheckMaskEvent(dpy, ExposureMask, &event))
X    XNextEvent(dpy, &event) ;
X
X  switch (event.type)
X    {
X      case ClientMessage    : /* Catch ICCCM kill from WM. */
X
X                              ev = (XClientMessageEvent *) &event ;
X                              if (ev->message_type == protocol_atom &&
X                                  ev->data.l[0] == kill_atom)
X                                exit(0) ;
X                              return(LASTEVENTPLUSONE) ;
X
X      case Expose           : return(process_expose(&event)) ;
X
X      case EnterNotify      : return(ENTER_WINDOW) ;
X
X      case LeaveNotify      : return(EXIT_WINDOW) ;
X
X      case KeyPress         : key_event = (XKeyPressedEvent *) &event ;
X                              curx = key_event->x ;
X                              cury = key_event->y ;
X                              (void) XLookupString(key_event, chs, 1,
X                                                   (KeySym *)  NULL,
X                                                   (XComposeStatus *) NULL) ;
X                              cur_ch = chs[0] ;
X                              return(KEYBOARD) ;
X
X      case ButtonPress      : curx = event.xbutton.x ;
X                              cury = event.xbutton.y ;
X                              if (event.xbutton.button == Button1)
X                                return(LEFT_DOWN) ;
X                              else if (event.xbutton.button == Button2)
X                                return(MIDDLE_DOWN) ;
X                              else if (event.xbutton.button == Button3)
X                                return(RIGHT_DOWN) ;
X
X      case ButtonRelease    : curx = event.xbutton.x ;
X                              cury = event.xbutton.y ;
X                              if (event.xbutton.button == Button1)
X                                return(LEFT_UP) ;
X                              else if (event.xbutton.button == Button2)
X                                return(MIDDLE_UP) ;
X                              else if (event.xbutton.button == Button3)
X                                return(RIGHT_UP) ;
X
X      default               : return(LASTEVENTPLUSONE) ;
X   }
X/*NOTREACHED*/
X}
X
X
Xhandle_selection()
X{
X}
X
X
Xinit_fonts()
X{
X  bfont = get_font(BIGFONT) ;
X  nfont = get_font(NORMALFONT) ;
X  nfont_width = 6 ;
X  sfont = get_font(SMALLFONT) ;
X}
X
X
Xinit_ws_type()
X{
X  if ((dpy = XOpenDisplay(x11_display)) == NULL)
X    {
X      FPRINTF(stderr,"%s: Couldn't open display %s\n", progname,
X              (getenv ("DISPLAY") ? getenv("DISPLAY") : x11_display)) ;
X      exit(1) ;
X    }
X
X  screen = DefaultScreen(dpy) ;
X
X  if (!geometry)
X    STRCPY(geometry, XGetDefault(dpy, progname, "Geometry")) ;
X
X  foregnd = BlackPixel(dpy, screen) ;
X  backgnd = WhitePixel(dpy, screen) ;
X  scr_depth = DefaultDepth(dpy, screen) ;
X  gtype = X11 ;
X  return 0 ;
X}
X
X
Xload_colors()      /* Create and load calctool color map. */
X{
X  u_char red[CALC_COLORSIZE], green[CALC_COLORSIZE], blue[CALC_COLORSIZE] ;
X  int i, numcolors ;
X
X  iscolor = 0 ;
X  if (DisplayCells(dpy, screen) > 2)
X    {
X      calc_colorsetup(red, green, blue) ;
X      iscolor = 1 ;
X      numcolors = 0 ;
X      for (i = 0; i < CALC_COLORSIZE; i++)
X        {
X          current_col.flags = DoRed | DoGreen | DoBlue ;
X          current_col.red = (unsigned short) (red[i] << 8) ;
X          current_col.green = (unsigned short) (green[i] << 8) ;
X          current_col.blue = (unsigned short) (blue[i] << 8) ;
X          if (XAllocColor(dpy, DefaultColormap(dpy, screen), &current_col) == True)
X            palette[numcolors++] = current_col.pixel ;
X        }
X      if (numcolors < 2)
X        {
X          FPRINTF(stderr, "%s: cannot allocate colors.\n", progname) ;
X          exit(1) ;
X        }
X    }
X}
X
X
XCursor
Xload_cursor(sbuf)
Xshort sbuf[16] ;
X{
X  char cbuf[32] ;
X  int i ;
X
X  for (i = 0; i < 16; i++)
X    {
X      cbuf[i*2+0] = revtable[(sbuf[i] >> 8) & 0xFF] ;
X      cbuf[i*2+1] = revtable[sbuf[i] & 0xFF] ;
X    }
X  help_pixmap = XCreatePixmapFromBitmapData(dpy, RootWindow(dpy, screen), cbuf,
X                                     16, 16, foregnd, backgnd, 1) ;
X  return(XCreatePixmapCursor(dpy, help_pixmap, help_pixmap,
X                                    &FGcolor, &BGcolor, 0, 0)) ;
X}
X
X
XPixmap
Xload_icon(sbuf)
Xshort sbuf[] ;
X{
X  GC pix_gc ;
X  Pixmap pixmap ;
X  XImage *image ;
X  char cbuf[512*8] ;
X  int i ;
X
X  if (iscolor)
X    {
X      for (i = 0; i < (256*8); i++)
X        {
X          cbuf[i*2+0] = palette[(sbuf[i] >> 8) & 0xFF] ;
X          cbuf[i*2+1] = palette[sbuf[i] & 0xFF] ;
X        }
X      pix_gc = DefaultGC(dpy, screen) ;
X      image = XCreateImage(dpy, DefaultVisual(dpy, screen),
X                           scr_depth, ZPixmap, 0, cbuf, 64, 64, 8, 64) ;
X      pixmap = XCreatePixmap(dpy, RootWindow(dpy, screen),
X                             ICONWIDTH, (unsigned) image->height, scr_depth) ;
X      XPutImage(dpy, pixmap, pix_gc, image, 0, 0, 0, 0,
X                ICONWIDTH, (unsigned) image->height) ;
X    }
X  else
X    {
X      for (i = 0; i < 256; i++)
X        {
X          cbuf[i*2+0] = revtable[(sbuf[i] >> 8) & 0xFF] ;
X          cbuf[i*2+1] = revtable[sbuf[i] & 0xFF] ;
X        }
X      pixmap = XCreatePixmapFromBitmapData(dpy, RootWindow(dpy, screen), cbuf,
X                                     64, 64, foregnd, backgnd, scr_depth) ;
X    }
X  return(pixmap) ;
X}
X
X
Xmake_frames(argc, argv)
Xint argc ;
Xchar *argv[] ;
X{
X  unsigned int h, w ;       /* Window dimensions. */
X  int flags ;
X  int x, y ;                /* Window position. */
SHAR_EOF
echo "End of part 4"
echo "File x11.c is continued in part 5"
echo "5" > s2_seq_.tmp
exit 0