/*
 * txcommands.h --
 *
 * 	Declarations for textio command routines.
 *
 *     *********************************************************************
 *     * Copyright (C) 1985, 1990 Regents of the University of California. *
 *     * Permission to use, copy, modify, and distribute this              *
 *     * software and its documentation for any purpose and without        *
 *     * fee is hereby granted, provided that the above copyright          *
 *     * notice appear in all copies.  The University of California        *
 *     * makes no representations about the suitability of this            *
 *     * software for any purpose.  It is provided "as is" without         *
 *     * express or implied warranty.  Export of this software outside     *
 *     * of the United States of America may require an export license.    *
 *     *********************************************************************
 *
 * rcsid $Header: /usr/cvsroot/magic-8.0/textio/txcommands.h,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $
 */

#ifndef _MAGIC__TEXTIO__TXCOMMANDS_H
#define _MAGIC__TEXTIO__TXCOMMANDS_H

#include "utils/magic.h"
#include "utils/geometry.h"
#include "windows/windows.h"	/* MagWindow */

/* Structure of one Magic command.  All commands are in the same format.
 * Commands are tagged with the point and window at which the command was
 * invoked.
 */

/* The definitions below should be made variable.  Especially with the
 * Tcl/Tk version of magic, it is possible to auto-generate very long
 * commands such as, for example, "polygon"
 */

#define	TX_MAXARGS	200
#define TX_MAX_CMDLEN	2048

typedef struct TxCommand_ {	/* A command -- either a button push or
				 * a textual command.
				 */
    Point tx_p;			/* The location of the pointing device
				 * when this command was invoked.
				 */
    int tx_button;		/* The event type (button number).
				 * See below.
				 */
    int tx_buttonAction;	/* The action of the button (if any), such as
				 * TX_BUTTON_UP, DOWN
				 */
    int tx_argc;		/* The number of textual command words,
				 * including the command itself.  0 means
				 * no textual command.
				 */
    char *tx_argv[TX_MAXARGS];	/* An array of pointers to the words (if any)
				 * that make up the command.
				 */
    int tx_wid;			/* The ID of the window that this command
				 * is destined for.  The point 'tx_p' is
				 * in this window's coordinate system.
				 * (See windows.h for window IDs.)
				 */
    char tx_argstring[TX_MAX_CMDLEN];
		 		/* The storage used for the command line.
				 * Tx_argv[] points into this.
				 */
} TxCommand;

/* Structure of one low-level input event.  This can be either a button event
 * (such as a button down or a button up) or a keyboard event (such as a
 * character typed.
 */

typedef struct {
    Point txe_p;		/* The point at which this action took place.*/
    int txe_wid;		/* The window that the event occured in (see
				 * windows.h for details, may be defaulted to
				 * WIND_UNKNOWN_WINDOW by some low-level
				 * device drivers).
				 */
    int txe_button;		/* The event type. */
    int txe_buttonAction;	/* The button action, if a button. */
    int txe_ch;			/* The character typed, if a character. */
} TxInputEvent;

/* Event types (button numbers) in the above structures, carefully chosen so
 * there is 1 bit per event (as they are used elsewhere in masks).
 */
#define TX_CHARACTER		0x00
#define TX_NO_BUTTON		0x00	/* for backward compat. only */
#define TX_LEFT_BUTTON		0x01
#define TX_MIDDLE_BUTTON 	0x02
#define TX_RIGHT_BUTTON		0x04
#define TX_EXPOSE		0x08	/* graphics commands for separate */
#define TX_CONFIGURE		0x10	/* graphics event loops.	  */
#define TX_CREATE		0x20
#define TX_BYPASS		0x40	/* Input line is ready, but needs
					 * and event to trigger the callback
					 */
#define TX_EOF			0x80	/* Never leaves this module, it is
					 * filtered out.
					 */
#define TX_BUTTON_4		0x100	/* For scroll wheels and such */
#define TX_BUTTON_5		0x200	/* For scroll wheels and such */

#ifdef MAGIC_WRAPPER
extern TxCommand TxCurCommand;
#endif

/* Button actions for the above structures.
 */
#define TX_BUTTON_DOWN	0
#define TX_BUTTON_UP	1
#define TX_KEY_DOWN	2

/* procedures to help in making device command routines */
typedef void (*cb_textio_input_t)(int fd, ClientData cdata);
extern void TxAddInputDevice(const fd_set *fdmask, const cb_textio_input_t inputProc, ClientData cdata);		/* Can read multiple file desc. */
extern void TxAdd1InputDevice(int fd, const cb_textio_input_t inputProc, ClientData cdata);	/* Can read only 1 file desc. */
extern void TxDeleteInputDevice(const fd_set *fdmask);
extern void TxDelete1InputDevice(int fd);

/* Routines to manipulate the current point.  Only really used for command
 * scripts.
 */
extern void TxSetPoint(int x, int y, int wid);
extern int TxGetPoint(Point *tx_p);
extern void TxClearPoint(void);

/* Routines to handle command logging.
 */
extern void TxLogStart(const char *fileName, MagWindow *mw);
extern void TxLogStop(void);
extern void TxLogUpdate(void);
extern void TxLogSuspend(void);
extern void TxLogResume(void);


/* Routines for handling input events.  A typical device driver in the
 * graphics module will get one or more free events via TxNewEvent() and
 * then put them in the input queue via TxAddEvent().
 */

extern TxInputEvent *TxNewEvent(void);
extern void TxAddEvent(TxInputEvent *event);
extern void TxPrintEvent(TxInputEvent *event);
extern void TxFreeEvent(TxInputEvent *event);
extern void TxReleaseButton(int but);

/* Routines for dealing with commands.  Usually only used within this
 * module, although they may be used elsewhere.
 */
extern void TxPrintCommand(TxCommand *cmd);
extern TxCommand *TxNewCommand(void);
extern void TxFreeCommand(TxCommand *command);
extern void TxParseString(const char *str);
extern void TxDispatch(FILE *f);
extern void TxRebuildCommand(TxCommand *cmd);
extern int TxCommandNumber;	/* Serial number of current command. */

#ifdef MAGIC_WRAPPER
extern int TxTclDispatch(ClientData clientData, int argc, char *argv[], bool quiet);
#endif

#endif /* _MAGIC__TEXTIO__TXCOMMANDS_H */
