/*
 * XFANCY.H
 *
 * $Id: xfancy.h,v 1.1 1993/08/27 17:08:43 munro Exp $
 *
 * Declare the fancy X windows engine for GIST.
 *
 */
/*    Copyright (c) 1994.  The Regents of the University of California.
                    All rights reserved.  */

#ifndef XFANCY_H
#define XFANCY_H

#include "xbasic.h"

typedef struct FXEngine FXEngine;
struct FXEngine {
  XEngine xe;

  /* --------------- Specific to FXEngine ------------------- */

  Window button;   /* to unlock/cycle coordinate display */
  Window message;  /* place to display coordinates, other messages */
  int baseline;    /* y coordinate for text in button and message windows */
  int heightButton, widthButton;  /* shape of button */
  /* height of both button and message windows is xe.topMargin */
  GC gc;           /* for button and message windows */
  XFontStruct *font;  /* font in gc -- DO NOT FREE */
  Cursor cursor;   /* cursor for xe.graphics window */

  int buttonState;  /* 0 -  button inactive
		       1 -  pointer in button, button ready
		       2 -  button pressed, button armed  */
  int iSystem;      /* <0 for unlocked, else locked system number */
  char msgText[64]; /* current text displayed in message window */
  int msgWidth;     /* width in pixels of msgText when last displayed */
  int zoomState;    /* button number if zoom or pan in progress, else 0 */
  int zoomSystem;   /* system number in xe.drawing */
  int zoomAxis;     /* 1 for x-axis, 2 for y-axis, 3 for both */
  GpReal zoomX, zoomY; /* initial coordinates for zoom/pan operation */
};

/* zoom factor for point-and-click zooming */
extern GpReal gxZoomFactor;

/* The GxPointClick function initiates an interactive point-and-click
   session with the window -- it will not return until a button has
   been pressed, then released.  It returns non-zero if the operation
   was aborted by pressing a second button before releasing the first.
     engine --   an X engine whose display is to be used
     style --    1 to draw a rubber box, 2 to draw a rubber line,
                 otherwise, no visible indication of operation
     system --   system number to which the world coordinates should
                 be transformed, or -1 to use the system under the
		 pointer -- the release coordinates are always in the
		 same system as the press coordinates
     CallBack -- function to be called twice, first when the button is
                 pressed, next when it is released -- operation will
		 be aborted if CallBack returns non-zero
		 Arguments passed to CallBack:
		   engine  -- in which press/release occurred
		   system  -- system under pointer, if above system -1
		   release -- 0 on press, 1 on release
		   x, y    -- coordinates of pointer relative to system
		   butmod  -- 1 - 5 on press to tell which button
		              mask to tell which modifiers on release:
			      1 shift, 2 lock, 4 control, 8 - 128 mod1-5
		   xn, yn  -- NDC coordinates of pointer
 */
extern int GxPointClick(Engine *engine, int style, int system,
			int (*CallBack)(Engine *engine, int system,
					int release, GpReal x, GpReal y,
					int butmod, GpReal xn, GpReal yn));

#endif
