#include	<stdio.h>
#include	<X11/IntrinsicP.h>
#include	<X11/StringDefs.h>
#include	<X11/CoreP.h>

#include	<Xaw/AsciiText.h>
#include	<Xaw/TextP.h>
#include	<Xaw/TextSinkP.h>
#include	"xdsc.h"

void		XdscSelectStart();
void		XdscModifySelection();
void		XdscExtendAdjust();
static void	XdscStartAction();
static void	XdscEndAction();

/*
** This includes code stolen from Text.c and TextAction.c.  These functions
** are static to the text widget, but I needed to get ahold of them to
** overload button one for both double-click and mouse motion.
*/
void
XdscSelectStart(w, event, params, num_params)
Widget w;
XEvent *event;
String *params;         /* unused */
Cardinal *num_params;   /* unused */
{
  XdscModifySelection((TextWidget) w, event,
                  XawsmTextSelect, XawactionStart, params, num_params);
}

void
XdscExtendAdjust(w, event, params, num_params)
Widget w;
XEvent *event;
String *params;         /* unused */
Cardinal *num_params;   /* unused */
{
	XdscModifySelection((TextWidget) w, event,
		XawsmTextExtend, XawactionAdjust, params, num_params);
}


void
XdscModifySelection(ctx, event, mode, action, params, num_params)
TextWidget ctx;
XEvent *event;
XawTextSelectionMode mode;
XawTextSelectionAction action;
String *params;         /* unused */
Cardinal *num_params;   /* unused */
{
  XdscStartAction(ctx, event);

/*
**  Begin Xdsc-specific code.
*/

	if (	(abs((long) ctx->text.time - 
		(long) ctx->text.lasttime)) < 
			(long) XtGetMultiClickTime(XtDisplay(ctx))) {
		Update();
	}

	else {
		_XawTextAlterSelection(ctx, mode, action, params, num_params);
	}
/*
**  End Xdsc-specific code.
*/

  XdscEndAction(ctx);
}

static void
XdscStartAction(ctx, event)
TextWidget ctx;
XEvent *event;
{
  _XawTextPrepareToUpdate(ctx);
  if (event != NULL) {
    switch (event->type) {
    case ButtonPress:
    case ButtonRelease:
      ctx->text.time = event->xbutton.time;
      ctx->text.ev_x = event->xbutton.x;
      ctx->text.ev_y = event->xbutton.y;
      break;
    case KeyPress:
    case KeyRelease:
      ctx->text.time = event->xkey.time;
      ctx->text.ev_x = event->xkey.x;
      ctx->text.ev_y = event->xkey.y;
      break;
    case MotionNotify:
      ctx->text.time = event->xmotion.time;
      ctx->text.ev_x = event->xmotion.x;
      ctx->text.ev_y = event->xmotion.y;
      break;
    case EnterNotify:
    case LeaveNotify:
      ctx->text.time = event->xcrossing.time;
      ctx->text.ev_x = event->xcrossing.x;
      ctx->text.ev_y = event->xcrossing.y;
    }
  }
}

static void
XdscEndAction(ctx)
TextWidget ctx;
{
  _XawTextCheckResize(ctx);
  _XawTextExecuteUpdate(ctx);
  ctx->text.mult = 1;
}
