
/* windDebug.c -
 *
 *	Print out the window package's internal data structures.
 *
 *     *********************************************************************
 *     * 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.    *
 *     *********************************************************************
 */

#ifndef lint
static char rcsid[] __attribute__ ((unused)) = "$Header$";
#endif  /* not lint */

#include <stdio.h>
#include <stdint.h>

#include "utils/magic.h"
#include "utils/geometry.h"
#include "windows/windows.h"
#include "graphics/glyphs.h"
#include "windows/windInt.h"
#include "textio/textio.h"
#include "textio/txcommands.h"



/*
 * ----------------------------------------------------------------------------
 * windPrintWindow --
 *
 *	Print out the window data structure.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Text appears on the text terminal.
 * ----------------------------------------------------------------------------
 */

void
windPrintWindow(w)
    MagWindow *w;
{
    LinkedRect *lr;

    TxPrintf("\nWindow %d: '%s'\n", w->w_wid, w->w_caption);
    TxPrintf("  Client %p  Surface %lx \n", (void *) w->w_client, CD2INT(w->w_surfaceID));

    TxPrintf("  All area (%d, %d) (%d, %d)\n",
	w->w_allArea.r_xbot, w->w_allArea.r_ybot,
	w->w_allArea.r_xtop, w->w_allArea.r_ytop);
    TxPrintf("  Screen area (%d, %d) (%d, %d)\n",
	w->w_screenArea.r_xbot, w->w_screenArea.r_ybot,
	w->w_screenArea.r_xtop, w->w_screenArea.r_ytop);
    TxPrintf("  Frame area (%d, %d) (%d, %d)\n",
	w->w_frameArea.r_xbot, w->w_frameArea.r_ybot,
	w->w_frameArea.r_xtop, w->w_frameArea.r_ytop);

    if (w->w_clipAgainst == NULL)
	TxPrintf("  No areas obscure the window.\n");
    else
	TxPrintf("  These areas obscure the window:\n");
    for (lr = w->w_clipAgainst; lr != NULL; lr = lr->r_next)
    {
	TxPrintf("    (%d, %d) (%d, %d) \n", lr->r_r.r_xbot, lr->r_r.r_ybot,
		lr->r_r.r_xtop, lr->r_r.r_ytop);
    }

    TxPrintf("  Surface area (%d, %d) (%d, %d) \n",
	    w->w_surfaceArea.r_xbot, w->w_surfaceArea.r_ybot,
	    w->w_surfaceArea.r_xtop, w->w_surfaceArea.r_ytop);
    TxPrintf("  Origin (%d, %d)\n", w->w_origin.p_x, w->w_origin.p_y);
    TxPrintf("  Scale %d\n", w->w_scale);
}

/*
 * ----------------------------------------------------------------------------
 * windDump --
 *
 *	Print out all the tables and windows.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Lots of text is dumped to the text terminal.
 * ----------------------------------------------------------------------------
 */

void
windDump()
{
    MagWindow *w;
    clientRec *rc;

    TxPrintf("\n\n------------ Clients ----------\n");
    for (rc = windFirstClientRec; rc != (clientRec * ) NULL;
	rc = rc->w_nextClient)
    {
	TxPrintf("'%10s'  %lx %lx %lx %lx\n", rc->w_clientName,
	    (intmax_t) rc->w_create, (intmax_t) rc->w_delete,
	    (intmax_t) rc->w_redisplay, (intmax_t) rc->w_command);
    }

    TxPrintf("\n");
    for (w = windTopWindow; w != (MagWindow *) NULL; w = w->w_nextWindow)
    {
	windPrintWindow(w);
    }

}


/*
 * ----------------------------------------------------------------------------
 * windPrintCommand --
 *
 *	Print out a command.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Text appears on the text terminal.
 * ----------------------------------------------------------------------------
 */

void
windPrintCommand(cmd)
    TxCommand *cmd;
{
    if (cmd->tx_button == TX_NO_BUTTON)
    {
	int i;

	for (i = 0; i < cmd->tx_argc; i++)
	{
	    TxPrintf(" '%s'", cmd->tx_argv[i]);
	}
    }
    else
    {
	switch (cmd->tx_button)
	{
	    case TX_LEFT_BUTTON:
		TxPrintf("Left");
		break;
	    case TX_RIGHT_BUTTON:
		TxPrintf("Right");
		break;
	    case TX_MIDDLE_BUTTON:
		TxPrintf("Middle");
		break;
	    default:
		TxPrintf("STRANGE");
		break;
	}
	TxPrintf(" button ");
	switch (cmd->tx_buttonAction)
	{
	    case TX_BUTTON_DOWN:
		TxPrintf("down");
		break;
	    case TX_BUTTON_UP:
		TxPrintf("up");
		break;
	}
    }
    TxPrintf(" at (%d, %d)\n", cmd->tx_p.p_x, cmd->tx_p.p_y);
}
