Initial import of the CDE 2.1.30 sources from the Open Group.
This commit is contained in:
911
cde/programs/dticon/event.c
Normal file
911
cde/programs/dticon/event.c
Normal file
@@ -0,0 +1,911 @@
|
||||
/* $XConsortium: event.c /main/6 1996/10/21 15:28:00 mgreess $ */
|
||||
/*********************************************************************
|
||||
* (c) Copyright 1993, 1994 Hewlett-Packard Company
|
||||
* (c) Copyright 1993, 1994 International Business Machines Corp.
|
||||
* (c) Copyright 1993, 1994 Sun Microsystems, Inc.
|
||||
* (c) Copyright 1993, 1994 Unix System Labs, Inc., a subsidiary of
|
||||
* Novell, Inc.
|
||||
**********************************************************************/
|
||||
/******************************************************************************
|
||||
** Program: dticon
|
||||
**
|
||||
** Description: X11-based multi-color icon editor
|
||||
**
|
||||
** File: event.c, which contains the following subroutines or
|
||||
** functions:
|
||||
** Clear_ClickCount()
|
||||
** ProcessTabletEvent()
|
||||
** Do_ButtonOp()
|
||||
** iLine()
|
||||
** iRectangle()
|
||||
** iArc()
|
||||
** iPolygon()
|
||||
**
|
||||
******************************************************************************
|
||||
**
|
||||
** Copyright Hewlett-Packard Company, 1990, 1991, 1992.
|
||||
** All rights are reserved. Copying or reproduction of this program,
|
||||
** except for archival purposes, is prohibited without prior written
|
||||
** consent of Hewlett-Packard Company.
|
||||
**
|
||||
** Hewlett-Packard makes no representations about the suitibility of this
|
||||
** software for any purpose. It is provided "as is" without express or
|
||||
** implied warranty.
|
||||
**
|
||||
******************************************************************************/
|
||||
#include <Xm/Xm.h>
|
||||
#include "externals.h"
|
||||
#include "main.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
extern Widget iconForm;
|
||||
#endif
|
||||
|
||||
static Boolean DoingHotBox=False;
|
||||
static XtIntervalId polyTimerID;
|
||||
Widget coordinateText;
|
||||
static int Prev_x, Prev_y;
|
||||
|
||||
static void
|
||||
Clear_ClickCount( void )
|
||||
{
|
||||
#ifdef DEBUG
|
||||
if (debug)
|
||||
stat_out(" - CLICK-COUNT ZEROED.\n");
|
||||
#endif
|
||||
ClickCount = 0;
|
||||
}
|
||||
|
||||
/* Forward declarations */
|
||||
|
||||
void iArc(
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height,
|
||||
Boolean backupFlag);
|
||||
void iLine(
|
||||
int x1,
|
||||
int y1,
|
||||
int x2,
|
||||
int y2,
|
||||
Boolean backupFlag);
|
||||
void iRectangle(
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height,
|
||||
Boolean backupFlag);
|
||||
void iPolygon(void);
|
||||
void Do_ButtonOp(XEvent *);
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* Routine: ProcessTabletEvent *
|
||||
* *
|
||||
* Purpose: Global event-handling routine for user input on the tablet. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
void
|
||||
ProcessTabletEvent(
|
||||
Widget w,
|
||||
XEvent *xptr,
|
||||
String *params,
|
||||
Cardinal num_params )
|
||||
{
|
||||
#ifdef DEBUG
|
||||
Arg args[10];
|
||||
Dimension db_width, db_height;
|
||||
#endif
|
||||
int x, y, width, height, i, n, xGrid, yGrid;
|
||||
char tmpstr[20];
|
||||
XmString str;
|
||||
|
||||
if (num_params == 3)
|
||||
ClickCount = atoi(params[2]);
|
||||
#ifdef DEBUG
|
||||
if (debug)
|
||||
printf("Event - ");
|
||||
#endif
|
||||
switch(xptr->type) {
|
||||
case ButtonPress : x = xptr->xbutton.x;
|
||||
y = xptr->xbutton.y;
|
||||
#ifdef DEBUG
|
||||
if (debug)
|
||||
printf("Btn Press at [%d,%d]\n", x, y);
|
||||
#endif
|
||||
if (xptr->xbutton.window == tablet_win)
|
||||
Do_ButtonOp(xptr);
|
||||
break;
|
||||
case MotionNotify : x = xptr->xmotion.x;
|
||||
y = xptr->xmotion.y;
|
||||
|
||||
/* Adjust for the Magnification Factor */
|
||||
xGrid = x/MagFactor + 1;
|
||||
yGrid = y/MagFactor + 1;
|
||||
|
||||
/*
|
||||
if coordinates are different then
|
||||
update Previous x & y
|
||||
Display new coordinates, but first...
|
||||
If the ERASER is ON then
|
||||
redraw the contents of the previous Rect.
|
||||
Draw the bounding Rect.
|
||||
*/
|
||||
if (xGrid!=Prev_x || yGrid!=Prev_y){
|
||||
if (GraphicsOp == ERASER)
|
||||
{
|
||||
Transfer_Back_Image(Prev_x-2, Prev_y-2,
|
||||
(Prev_x+1), (Prev_y+1), HOLLOW);
|
||||
XDrawRectangle(dpy, tablet_win, Erase_gc,
|
||||
xGrid*MagFactor-(2*MagFactor),
|
||||
yGrid*MagFactor-(2*MagFactor),
|
||||
(3*MagFactor), (3*MagFactor) );
|
||||
}
|
||||
Prev_x = xGrid;
|
||||
Prev_y = yGrid;
|
||||
tmpstr[0] = '\0';
|
||||
sprintf(tmpstr, "%dx%d", xGrid, yGrid);
|
||||
str= XmStringCreateLocalized (tmpstr);
|
||||
XtVaSetValues (coordinateText, XmNlabelString, str, NULL);
|
||||
XmStringFree(str);
|
||||
}
|
||||
#ifdef DEBUG
|
||||
if (debug)
|
||||
printf("Btn Motion at [%d,%d]\n", x, y);
|
||||
#endif
|
||||
if (xptr->xmotion.window == tablet_win)
|
||||
Do_ButtonOp(xptr);
|
||||
break;
|
||||
case ButtonRelease : x = xptr->xbutton.x;
|
||||
y = xptr->xbutton.y;
|
||||
#ifdef DEBUG
|
||||
if (debug) {
|
||||
printf("Btn Release at [%d,%d]", x, y);
|
||||
if (ClickCount)
|
||||
printf(", CLICK COUNT = %d", ClickCount);
|
||||
printf("\n");
|
||||
}
|
||||
#endif
|
||||
if (xptr->xbutton.window == tablet_win)
|
||||
Do_ButtonOp(xptr);
|
||||
break;
|
||||
case Expose : if (!tablet_win) {
|
||||
tablet_win = XtWindow(tablet_wid);
|
||||
}
|
||||
if (xptr->xexpose.window == tablet_win) {
|
||||
x = xptr->xexpose.x;
|
||||
y = xptr->xexpose.y;
|
||||
width = xptr->xexpose.width;
|
||||
height = xptr->xexpose.height;
|
||||
#ifdef DEBUG
|
||||
if (debug)
|
||||
printf("Exposure at [%d,%d] of %dx%d\n", x, y, width, height);
|
||||
#endif
|
||||
Repaint_Tablet(xptr->xexpose.window, x, y,
|
||||
width, height);
|
||||
}
|
||||
else if (xptr->xexpose.window ==
|
||||
XtWindow(iconImage)) {
|
||||
XCopyArea(dpy, color_icon,
|
||||
XtWindow(iconImage),
|
||||
Color_gc, 0, 0, icon_width, icon_height, 0, 0);
|
||||
#ifdef DEBUG
|
||||
if (debug)
|
||||
printf("Exposure on iconImage: REPAINTING\n");
|
||||
#endif
|
||||
}
|
||||
else if (xptr->xexpose.window ==
|
||||
XtWindow(monoImage)) {
|
||||
XCopyArea(dpy, mono_icon,
|
||||
XtWindow(monoImage),
|
||||
Color_gc, 0, 0, icon_width, icon_height, 0, 0);
|
||||
#ifdef DEBUG
|
||||
if (debug)
|
||||
printf("Exposure on monoImage: REPAINTING\n");
|
||||
#endif
|
||||
}
|
||||
if (argsNeedProcessed)
|
||||
ProcessAppArgs();
|
||||
break;
|
||||
case EnterNotify : x = xptr->xcrossing.x;
|
||||
y = xptr->xcrossing.y;
|
||||
#ifdef DEBUG
|
||||
if (debug)
|
||||
printf("Enter window at [%d,%d]\n", x, y);
|
||||
#endif
|
||||
break;
|
||||
case LeaveNotify : x = xptr->xcrossing.x;
|
||||
y = xptr->xcrossing.y;
|
||||
|
||||
/* if in ERASER mode
|
||||
restore contents of bounding Rect when
|
||||
leaving the tablet */
|
||||
if (GraphicsOp == ERASER )
|
||||
Transfer_Back_Image(Prev_x-2, Prev_y-2,
|
||||
(Prev_x+1), (Prev_y+1), HOLLOW);
|
||||
if (xptr->xcrossing.window == tablet_win)
|
||||
Do_ButtonOp(xptr);
|
||||
#ifdef DEBUG
|
||||
if (debug) {
|
||||
printf("Leave window at [%d,%d]\n", x, y);
|
||||
i = 0;
|
||||
XtSetArg(args[i], XmNwidth, &db_width); i++;
|
||||
XtSetArg(args[i], XmNheight, &db_height); i++;
|
||||
XtGetValues(iconForm, args, i);
|
||||
stat_out(" - iconForm dimensions: [%dx%d]\n", db_width, db_height);
|
||||
i = 0;
|
||||
XtSetArg(args[i], XmNwidth, &db_width); i++;
|
||||
XtGetValues(iconImage, args, i);
|
||||
stat_out(" - icon widths: %d\n", db_width);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case FocusIn :
|
||||
case FocusOut :
|
||||
#ifdef DEBUG
|
||||
if (debug)
|
||||
printf("Focus change\n");
|
||||
#endif
|
||||
break;
|
||||
default :
|
||||
#ifdef DEBUG
|
||||
if (debug)
|
||||
printf("UNKNOWN type: %d\n", xptr->type);
|
||||
#endif
|
||||
break;
|
||||
break;
|
||||
} /* switch */
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* Routine: Do_ButtonOp *
|
||||
* *
|
||||
* Purpose: Process ButtonPress/ButtonMotion/ButtonRelease events *
|
||||
* generated by the user on the tablet. Switch between correct *
|
||||
* behaviors depending on the current GraphicsOp tool selected. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
static int Pressed = False, First = False;
|
||||
|
||||
void
|
||||
Do_ButtonOp(
|
||||
XEvent *xptr )
|
||||
{
|
||||
Window lwin;
|
||||
int e_type, x, y, i, j;
|
||||
XRectangle box;
|
||||
char tmpstr[20];
|
||||
XmString str;
|
||||
|
||||
e_type = xptr->type;
|
||||
switch (e_type) {
|
||||
case ButtonPress :
|
||||
case ButtonRelease : x = xptr->xbutton.x;
|
||||
y = xptr->xbutton.y;
|
||||
lwin = xptr->xbutton.window;
|
||||
break;
|
||||
case MotionNotify : x = xptr->xmotion.x;
|
||||
y = xptr->xmotion.y;
|
||||
lwin = xptr->xmotion.window;
|
||||
break;
|
||||
} /* switch */
|
||||
|
||||
switch (e_type) {
|
||||
case ButtonPress :
|
||||
switch (GraphicsOp) {
|
||||
case S_HOTSPOT : if (xptr->xbutton.window == tablet_win) {
|
||||
tx = x;
|
||||
ty = y;
|
||||
Icon_Coords(tx, ty, &ix, &iy);
|
||||
X_Hot = ix;
|
||||
Y_Hot = iy;
|
||||
hotSpot = True;
|
||||
#ifdef DEBUG
|
||||
if (debug)
|
||||
stat_out(" - HOTSPOT selected at [%d,%d]\n", ix, iy);
|
||||
#endif
|
||||
Repaint_Exposed_Tablet();
|
||||
}
|
||||
break;
|
||||
case S_PASTE :
|
||||
case S_ROTATE :
|
||||
case S_SCALE_2 : tx = x;
|
||||
ty = y;
|
||||
if (GraphicsOp == S_PASTE)
|
||||
XDrawRectangle(dpy, tablet_win,
|
||||
Flicker_gc, last_tx, last_ty,
|
||||
CutCopy->width*MagFactor - MagFactor,
|
||||
CutCopy->height*MagFactor - MagFactor);
|
||||
else if (GraphicsOp == S_ROTATE)
|
||||
XDrawRectangle(dpy, tablet_win,
|
||||
Flicker_gc, last_tx, last_ty,
|
||||
Rotate->width*MagFactor - MagFactor,
|
||||
Rotate->height*MagFactor - MagFactor);
|
||||
else
|
||||
XDrawRectangle(dpy, tablet_win,
|
||||
Flicker_gc, last_tx, last_ty,
|
||||
Scale->width*MagFactor - MagFactor,
|
||||
Scale->height*MagFactor - MagFactor);
|
||||
Icon_Coords(tx, ty, &ix, &iy);
|
||||
Do_Paste(ix, iy);
|
||||
break;
|
||||
case ERASER :
|
||||
case POINT : Pressed = True;
|
||||
last_tx = tx;
|
||||
last_ty = ty;
|
||||
tx = x;
|
||||
ty = y;
|
||||
Icon_Coords(tx, ty, &ix, &iy);
|
||||
Backup_Icons();
|
||||
if (GraphicsOp == ERASER) {
|
||||
for (i=ix-1; i<=ix+1; i++)
|
||||
for (j=iy-1; j<=iy+1; j++) {
|
||||
XDrawPoint(dpy, color_icon, Erase_gc, i, j);
|
||||
XDrawPoint(dpy,
|
||||
XtWindow(iconImage),
|
||||
Erase_gc, i, j);
|
||||
XDrawPoint(dpy, mono_icon, Erase_gc, i, j);
|
||||
XDrawPoint(dpy,
|
||||
XtWindow(monoImage),
|
||||
Erase_gc, i, j);
|
||||
Paint_Tile(i, j, Erase_gc);
|
||||
}
|
||||
}
|
||||
else {
|
||||
XDrawPoint(dpy, color_icon, Color_gc, ix, iy);
|
||||
XDrawPoint(dpy, XtWindow(iconImage),
|
||||
Color_gc, ix, iy);
|
||||
XDrawPoint(dpy, mono_icon, Mono_gc, ix, iy);
|
||||
XDrawPoint(dpy, XtWindow(monoImage),
|
||||
Mono_gc, ix, iy);
|
||||
Paint_Tile(ix, iy, Color_gc);
|
||||
}
|
||||
case FLOOD : break;
|
||||
case SELECT : if (DoingHotBox) {
|
||||
DoingHotBox = False;
|
||||
Selected = False;
|
||||
Stop_HotBox();
|
||||
}
|
||||
case LINE :
|
||||
case CIRCLE :
|
||||
case ELLIPSE :
|
||||
case S_SCALE_1 :
|
||||
case RECTANGLE : Quantize(&x, &y, True);
|
||||
Pressed = True;
|
||||
tx = x;
|
||||
ty = y;
|
||||
last_tx = tx;
|
||||
last_ty = ty;
|
||||
First = True;
|
||||
#ifdef DEBUG
|
||||
if (debug)
|
||||
stat_out(" - Quantized to [%d,%d]\n", x, y);
|
||||
#endif
|
||||
break;
|
||||
case S_GRAB : XGrabServer(dpy);
|
||||
XSync(dpy, False);
|
||||
Pressed = True;
|
||||
tx = x;
|
||||
ty = y;
|
||||
last_tx = tx;
|
||||
last_ty = ty;
|
||||
First = True;
|
||||
break;
|
||||
case POLYLINE :
|
||||
case POLYGON :
|
||||
Quantize(&x, &y, True);
|
||||
tx = x;
|
||||
ty = y;
|
||||
First = True;
|
||||
Icon_Coords(tx, ty, &ix, &iy);
|
||||
pointList[pointCount].x = ix;
|
||||
pointList[pointCount].y = iy;
|
||||
if (pointCount < MAX_PTS) {
|
||||
pointCount++;
|
||||
#ifdef DEBUG
|
||||
if (debug)
|
||||
stat_out(" - pointCount++ [%d]\n", pointCount);
|
||||
#endif
|
||||
}
|
||||
if (!Anchored) {
|
||||
Anchored = True;
|
||||
pointCount = 1;
|
||||
Backup_Icons();
|
||||
}
|
||||
else {
|
||||
if (ClickCount) {
|
||||
Anchored = False;
|
||||
ClickCount = 0;
|
||||
if (GraphicsOp == POLYGON)
|
||||
iPolygon();
|
||||
pointCount = 0;
|
||||
}
|
||||
Icon_Coords(last_tx, last_ty, &last_ix, &last_iy);
|
||||
iLine(ix, iy, last_ix, last_iy, False);
|
||||
}
|
||||
last_tx = tx;
|
||||
last_ty = ty;
|
||||
ClickCount++;
|
||||
polyTimerID = XtAppAddTimeOut( AppContext,
|
||||
multiClickTime,
|
||||
(XtTimerCallbackProc)
|
||||
Clear_ClickCount,
|
||||
NULL);
|
||||
break;
|
||||
} /* switch(GraphicsOp) */
|
||||
break;
|
||||
case ButtonRelease :
|
||||
switch (GraphicsOp) {
|
||||
case ERASER :
|
||||
case POINT : if (Pressed) {
|
||||
last_tx = tx;
|
||||
last_ty = ty;
|
||||
tx = x;
|
||||
ty = y;
|
||||
Icon_Coords(tx, ty, &ix, &iy);
|
||||
if (GraphicsOp == ERASER) {
|
||||
for (i=ix-1; i<=ix+1; i++)
|
||||
for (j=iy-1; j<=iy+1; j++) {
|
||||
XDrawPoint(dpy, color_icon, Erase_gc, i, j);
|
||||
XDrawPoint(dpy,
|
||||
XtWindow(iconImage),
|
||||
Erase_gc, i, j);
|
||||
XDrawPoint(dpy, mono_icon, Erase_gc, i, j);
|
||||
XDrawPoint(dpy,
|
||||
XtWindow(monoImage),
|
||||
Erase_gc, i, j);
|
||||
Paint_Tile(i, j, Erase_gc);
|
||||
} /* for */
|
||||
} /* if(GraphicsOp...) */
|
||||
else {
|
||||
XDrawPoint(dpy, color_icon, Color_gc, ix, iy);
|
||||
XDrawPoint(dpy, XtWindow(iconImage),
|
||||
Color_gc, ix, iy);
|
||||
XDrawPoint(dpy, mono_icon, Mono_gc, ix, iy);
|
||||
XDrawPoint(dpy, XtWindow(monoImage),
|
||||
Mono_gc, ix, iy);
|
||||
Paint_Tile(ix, iy, Color_gc);
|
||||
} /* else */
|
||||
Pressed = False;
|
||||
} /* if(Pressed) */
|
||||
break;
|
||||
case FLOOD : tx = x;
|
||||
ty = y;
|
||||
Icon_Coords(tx, ty, &ix, &iy);
|
||||
Flood_Region(ix, iy);
|
||||
break;
|
||||
case LINE : if (Pressed) {
|
||||
Quantize(&x, &y, True);
|
||||
#ifdef DEBUG
|
||||
if (debug)
|
||||
stat_out(" - Quantized to [%d,%d]\n", x, y);
|
||||
#endif
|
||||
XDrawLine(dpy, tablet_win,
|
||||
Flicker_gc, tx, ty, last_tx, last_ty);
|
||||
tx = x;
|
||||
ty = y;
|
||||
Pressed = False;
|
||||
Icon_Coords(tx, ty, &ix, &iy);
|
||||
Icon_Coords(last_tx, last_ty, &last_ix, &last_iy);
|
||||
iLine(ix, iy, last_ix, last_iy, True);
|
||||
}
|
||||
break;
|
||||
case S_SCALE_1 :
|
||||
case SELECT : if (Pressed) {
|
||||
Quantize(&x, &y, True);
|
||||
XDrawRectangle(dpy, tablet_win,
|
||||
Flicker_gc, min(tx, last_tx), min(ty, last_ty),
|
||||
abs(tx-last_tx), abs(ty-last_ty));
|
||||
tx = x;
|
||||
ty = y;
|
||||
Pressed = False;
|
||||
Icon_Coords(tx, ty, &ix, &iy);
|
||||
Icon_Coords(last_tx, last_ty, &last_ix, &last_iy);
|
||||
if (GraphicsOp == SELECT) {
|
||||
DoingHotBox = True;
|
||||
Start_HotBox(INITIAL);
|
||||
}
|
||||
else {
|
||||
Scale_Image(); /***TAG***/
|
||||
GraphicsOp = S_SCALE_2;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case S_GRAB : if (Pressed) {
|
||||
XDrawRectangle(dpy, lwin,
|
||||
Flicker_gc, min(tx, last_tx), min(ty, last_ty),
|
||||
abs(tx-last_tx), abs(ty-last_ty));
|
||||
if (mag(last_tx, x) <= xrdb.maxIconWidth)
|
||||
tx = x;
|
||||
if (mag(last_ty, y) <= xrdb.maxIconHeight)
|
||||
ty = y;
|
||||
LoadGrabbedImage(
|
||||
min(tx, last_tx), min(ty, last_ty),
|
||||
abs(tx-last_tx), abs(ty-last_ty));
|
||||
GraphicsOp = Backup_G_Op;
|
||||
Backup_G_Op = NULL;
|
||||
Pressed = False;
|
||||
}
|
||||
break;
|
||||
case RECTANGLE : if (Pressed) {
|
||||
Quantize(&x, &y, True);
|
||||
XDrawRectangle(dpy, tablet_win,
|
||||
Flicker_gc, min(tx, last_tx), min(ty, last_ty),
|
||||
abs(tx-last_tx), abs(ty-last_ty));
|
||||
tx = x;
|
||||
ty = y;
|
||||
Pressed = False;
|
||||
Icon_Coords(tx, ty, &ix, &iy);
|
||||
Icon_Coords(last_tx, last_ty, &last_ix, &last_iy);
|
||||
iRectangle(min(ix, last_ix), min(iy, last_iy),
|
||||
abs(ix-last_ix), abs(iy-last_iy), True);
|
||||
}
|
||||
break;
|
||||
case S_HOTSPOT :
|
||||
case S_WAIT_RELEASE :
|
||||
GraphicsOp = Backup_G_Op;
|
||||
Backup_G_Op = NULL;
|
||||
break;
|
||||
case S_ROTATE :
|
||||
case S_SCALE_2 :
|
||||
case POLYLINE :
|
||||
case POLYGON :
|
||||
break;
|
||||
case CIRCLE : if (Pressed) {
|
||||
Quantize(&x, &y, True);
|
||||
Circle_Box(tablet_win,
|
||||
last_tx, last_ty, tx, ty, &box);
|
||||
tx = x;
|
||||
ty = y;
|
||||
Pressed = False;
|
||||
box.x /= MagFactor;
|
||||
box.y /= MagFactor;
|
||||
box.width =
|
||||
((short)(box.width - 1) / MagFactor) + 1;
|
||||
box.height =
|
||||
((short)(box.height - 1) / MagFactor) + 1;
|
||||
iArc(box.x, box.y, box.width, box.height, True);
|
||||
}
|
||||
break;
|
||||
case ELLIPSE : if (Pressed) {
|
||||
Quantize(&x, &y, True);
|
||||
XDrawArc(dpy, tablet_win,
|
||||
Flicker_gc, min(tx, last_tx), min(ty, last_ty),
|
||||
abs(tx-last_tx), abs(ty-last_ty), 0, 360*64);
|
||||
tx = x;
|
||||
ty = y;
|
||||
Pressed = False;
|
||||
Icon_Coords(tx, ty, &ix, &iy);
|
||||
Icon_Coords(last_tx, last_ty, &last_ix, &last_iy);
|
||||
iArc( min(ix, last_ix), min(iy, last_iy),
|
||||
abs(ix-last_ix)+1, abs(iy-last_iy)+1, True);
|
||||
}
|
||||
break;
|
||||
} /* switch(GraphicsOp) */
|
||||
break;
|
||||
case MotionNotify :
|
||||
switch (GraphicsOp) {
|
||||
case S_PASTE :
|
||||
case S_ROTATE :
|
||||
case S_SCALE_2 : last_tx = tx;
|
||||
last_ty = ty;
|
||||
tx = x;
|
||||
ty = y;
|
||||
if (!FirstRigid) {
|
||||
if (GraphicsOp == S_PASTE)
|
||||
XDrawRectangle(dpy, tablet_win,
|
||||
Flicker_gc, last_tx, last_ty,
|
||||
CutCopy->width*MagFactor - MagFactor,
|
||||
CutCopy->height*MagFactor - MagFactor);
|
||||
else if (GraphicsOp == S_ROTATE)
|
||||
XDrawRectangle(dpy, tablet_win,
|
||||
Flicker_gc, last_tx, last_ty,
|
||||
Rotate->width*MagFactor - MagFactor,
|
||||
Rotate->height*MagFactor - MagFactor);
|
||||
else
|
||||
XDrawRectangle(dpy, tablet_win,
|
||||
Flicker_gc, last_tx, last_ty,
|
||||
Scale->width*MagFactor - MagFactor,
|
||||
Scale->height*MagFactor - MagFactor);
|
||||
}
|
||||
if (GraphicsOp == S_PASTE)
|
||||
XDrawRectangle(dpy, tablet_win,
|
||||
Flicker_gc, tx, ty,
|
||||
CutCopy->width*MagFactor - MagFactor,
|
||||
CutCopy->height*MagFactor - MagFactor);
|
||||
else if (GraphicsOp == S_ROTATE)
|
||||
XDrawRectangle(dpy, tablet_win,
|
||||
Flicker_gc, tx, ty,
|
||||
Rotate->width*MagFactor - MagFactor,
|
||||
Rotate->height*MagFactor - MagFactor);
|
||||
else
|
||||
XDrawRectangle(dpy, tablet_win,
|
||||
Flicker_gc, tx, ty,
|
||||
Scale->width*MagFactor - MagFactor,
|
||||
Scale->height*MagFactor - MagFactor);
|
||||
FirstRigid = False;
|
||||
case S_HOTSPOT : break;
|
||||
case ERASER :
|
||||
case POINT : if (Pressed) {
|
||||
last_tx = tx;
|
||||
last_ty = ty;
|
||||
tx = x;
|
||||
ty = y;
|
||||
Icon_Coords(tx, ty, &ix, &iy);
|
||||
if (GraphicsOp == ERASER) {
|
||||
for (i=ix-1; i<=ix+1; i++)
|
||||
for (j=iy-1; j<=iy+1; j++) {
|
||||
XDrawPoint(dpy, color_icon, Erase_gc, i, j);
|
||||
XDrawPoint(dpy,
|
||||
XtWindow(iconImage),
|
||||
Erase_gc, i, j);
|
||||
XDrawPoint(dpy, mono_icon, Erase_gc, i, j);
|
||||
XDrawPoint(dpy,
|
||||
XtWindow(monoImage),
|
||||
Erase_gc, i, j);
|
||||
Paint_Tile(i, j, Erase_gc);
|
||||
} /* for */
|
||||
} /* if(GraphicsOp...) */
|
||||
else {
|
||||
XDrawPoint(dpy, color_icon, Color_gc, ix, iy);
|
||||
XDrawPoint(dpy, XtWindow(iconImage),
|
||||
Color_gc, ix, iy);
|
||||
XDrawPoint(dpy, mono_icon, Mono_gc, ix, iy);
|
||||
XDrawPoint(dpy, XtWindow(monoImage),
|
||||
Mono_gc, ix, iy);
|
||||
Paint_Tile(ix, iy, Color_gc);
|
||||
} /* else */
|
||||
}
|
||||
case FLOOD : break;
|
||||
case POLYLINE :
|
||||
case POLYGON : if (Anchored) {
|
||||
Quantize(&x, &y, True);
|
||||
if (!First)
|
||||
XDrawLine(dpy, tablet_win,
|
||||
Flicker_gc, tx, ty, last_tx, last_ty);
|
||||
tx = x;
|
||||
ty = y;
|
||||
XDrawLine(dpy, tablet_win,
|
||||
Flicker_gc, tx, ty, last_tx, last_ty);
|
||||
First = False;
|
||||
}
|
||||
break;
|
||||
case LINE : if (Pressed) {
|
||||
Quantize(&x, &y, True);
|
||||
if (!First)
|
||||
XDrawLine(dpy, tablet_win,
|
||||
Flicker_gc, tx, ty, last_tx, last_ty);
|
||||
tx = x;
|
||||
ty = y;
|
||||
XDrawLine(dpy, tablet_win,
|
||||
Flicker_gc, tx, ty, last_tx, last_ty);
|
||||
First = False;
|
||||
}
|
||||
break;
|
||||
case ELLIPSE :
|
||||
case SELECT :
|
||||
case S_SCALE_1 :
|
||||
case RECTANGLE : if (Pressed) {
|
||||
Quantize(&x, &y, True);
|
||||
if (!First) {
|
||||
if (GraphicsOp != ELLIPSE)
|
||||
XDrawRectangle(dpy, tablet_win, Flicker_gc,
|
||||
min(tx, last_tx), min(ty, last_ty),
|
||||
abs(tx-last_tx), abs(ty-last_ty));
|
||||
else
|
||||
XDrawArc(dpy, tablet_win, Flicker_gc,
|
||||
min(tx, last_tx), min(ty, last_ty),
|
||||
abs(tx-last_tx), abs(ty-last_ty),
|
||||
0, 360*64);
|
||||
}
|
||||
tx = x;
|
||||
ty = y;
|
||||
if (GraphicsOp != ELLIPSE)
|
||||
XDrawRectangle(dpy, tablet_win,
|
||||
Flicker_gc, min(tx, last_tx), min(ty, last_ty),
|
||||
abs(tx-last_tx), abs(ty-last_ty));
|
||||
else
|
||||
XDrawArc(dpy, tablet_win,
|
||||
Flicker_gc, min(tx, last_tx), min(ty, last_ty),
|
||||
abs(tx-last_tx), abs(ty-last_ty), 0, 360*64);
|
||||
First = False;
|
||||
}
|
||||
break;
|
||||
case S_GRAB : if (Pressed) {
|
||||
if (!First)
|
||||
XDrawRectangle(dpy, lwin, Flicker_gc,
|
||||
min(tx, last_tx), min(ty, last_ty),
|
||||
abs(tx-last_tx), abs(ty-last_ty));
|
||||
if (mag(last_tx, x) <= xrdb.maxIconWidth)
|
||||
tx = x;
|
||||
if (mag(last_ty, y) <= xrdb.maxIconHeight)
|
||||
ty = y;
|
||||
XDrawRectangle(dpy, lwin,
|
||||
Flicker_gc, min(tx, last_tx), min(ty, last_ty),
|
||||
abs(tx-last_tx), abs(ty-last_ty));
|
||||
First = False;
|
||||
/* Tell the user the size of the grabbed image
|
||||
*/
|
||||
sprintf(tmpstr,
|
||||
GETSTR(18,2,"Grabbed Image Size = %dx%d"),
|
||||
abs(tx-last_tx), abs(ty-last_ty));
|
||||
str= XmStringCreateLocalized (tmpstr);
|
||||
XtVaSetValues (coordinateText, XmNlabelString, str, NULL);
|
||||
XmStringFree(str);
|
||||
}
|
||||
break;
|
||||
case CIRCLE : if (Pressed) {
|
||||
Quantize(&x, &y, True);
|
||||
if (!First)
|
||||
Circle_Box(tablet_win,
|
||||
last_tx, last_ty, tx, ty, &box);
|
||||
tx = x;
|
||||
ty = y;
|
||||
Circle_Box(tablet_win,
|
||||
last_tx, last_ty, tx, ty, &box);
|
||||
First = False;
|
||||
}
|
||||
break;
|
||||
} /* switch(GraphicsOp) */
|
||||
break;
|
||||
case LeaveNotify :
|
||||
switch (GraphicsOp) {
|
||||
case POLYLINE :
|
||||
case POLYGON : if (Anchored) {
|
||||
if (!First)
|
||||
XDrawLine(dpy, tablet_win, Flicker_gc, tx, ty,
|
||||
last_tx, last_ty);
|
||||
First = True;
|
||||
}
|
||||
break;
|
||||
} /* switch(GraphicsOp) */
|
||||
break;
|
||||
} /* switch(e_type) */
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Routine: EndPolyOp *
|
||||
* Purpose: When user does a mouse action outside of the drawing window, *
|
||||
* this implicitly ends the poly* operation. This means that *
|
||||
* things like drawing circles and changing pen color while in *
|
||||
* the middle of a polyline or polygon is no longer allowed. *
|
||||
***************************************************************************/
|
||||
void
|
||||
EndPolyOp()
|
||||
{
|
||||
Anchored = False;
|
||||
Clear_ClickCount();
|
||||
pointCount = 0;
|
||||
}
|
||||
|
||||
void
|
||||
iLine(
|
||||
int x1,
|
||||
int y1,
|
||||
int x2,
|
||||
int y2,
|
||||
Boolean backupFlag )
|
||||
{
|
||||
if (backupFlag)
|
||||
Backup_Icons();
|
||||
XDrawLine(dpy, color_icon, Color_gc, x1, y1, x2, y2);
|
||||
XDrawLine(dpy, mono_icon, Mono_gc, x1, y1, x2, y2);
|
||||
XDrawLine(dpy, XtWindow(iconImage), Color_gc, x1, y1, x2, y2);
|
||||
XDrawLine(dpy, XtWindow(monoImage), Mono_gc, x1, y1, x2, y2);
|
||||
#ifdef DEBUG
|
||||
if (debug)
|
||||
stat_out("Transferring from [%d,%d] to [%d,%d]\n", tx, ty,
|
||||
last_tx, last_ty);
|
||||
#endif
|
||||
Transfer_Back_Image(x1, y1, x2, y2, FILL);
|
||||
}
|
||||
|
||||
void
|
||||
iRectangle(
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height,
|
||||
Boolean backupFlag )
|
||||
{
|
||||
if (backupFlag)
|
||||
Backup_Icons();
|
||||
if (FillSolids) {
|
||||
XFillRectangle(dpy, color_icon, Color_gc, x, y, width+1, height+1);
|
||||
XFillRectangle(dpy, mono_icon, Mono_gc, x, y, width+1, height+1);
|
||||
XFillRectangle(dpy, XtWindow(iconImage), Color_gc,
|
||||
x, y, width+1, height+1);
|
||||
XFillRectangle(dpy, XtWindow(monoImage), Mono_gc,
|
||||
x, y, width+1, height+1);
|
||||
}
|
||||
else {
|
||||
XDrawRectangle(dpy, color_icon, Color_gc, x, y, width, height);
|
||||
XDrawRectangle(dpy, mono_icon, Mono_gc, x, y, width, height);
|
||||
XDrawRectangle(dpy, XtWindow(iconImage), Color_gc,
|
||||
x, y, width, height);
|
||||
XDrawRectangle(dpy, XtWindow(monoImage), Mono_gc,
|
||||
x, y, width, height);
|
||||
}
|
||||
Transfer_Back_Image(x, y, x+width, y+height, FILL);
|
||||
}
|
||||
|
||||
void
|
||||
iArc(
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height,
|
||||
Boolean backupFlag )
|
||||
{
|
||||
if (backupFlag)
|
||||
Backup_Icons();
|
||||
if (FillSolids) {
|
||||
XFillArc(dpy, color_icon, Color_gc, x, y, width, height, 0, 360*64);
|
||||
XFillArc(dpy, mono_icon, Mono_gc, x, y, width, height, 0, 360*64);
|
||||
XFillArc(dpy, XtWindow(iconImage),
|
||||
Color_gc, x, y, width, height, 0, 360*64);
|
||||
XFillArc(dpy, XtWindow(monoImage),
|
||||
Mono_gc, x, y, width, height, 0, 360*64);
|
||||
}
|
||||
else {
|
||||
XDrawArc(dpy, color_icon, Color_gc, x, y, width, height, 0, 360*64);
|
||||
XDrawArc(dpy, mono_icon, Mono_gc, x, y, width, height, 0, 360*64);
|
||||
XDrawArc(dpy, XtWindow(iconImage),
|
||||
Color_gc, x, y, width, height, 0, 360*64);
|
||||
XDrawArc(dpy, XtWindow(monoImage),
|
||||
Mono_gc, x, y, width, height, 0, 360*64);
|
||||
}
|
||||
Transfer_Back_Image(x, y, x+width, y+height, FILL);
|
||||
}
|
||||
|
||||
void
|
||||
iPolygon( void )
|
||||
{
|
||||
int min_x, min_y, max_x, max_y, i;
|
||||
|
||||
#ifdef DEBUG
|
||||
if (debug)
|
||||
stat_out("iPolygon: pointCount = %d\n", pointCount);
|
||||
#endif
|
||||
|
||||
if (FillSolids) {
|
||||
XFillPolygon(dpy, color_icon, Color_gc, pointList, pointCount,
|
||||
Complex, CoordModeOrigin);
|
||||
XFillPolygon(dpy, mono_icon, Mono_gc, pointList, pointCount,
|
||||
Complex, CoordModeOrigin);
|
||||
XFillPolygon(dpy, XtWindow(iconImage),
|
||||
Color_gc, pointList, pointCount, Complex, CoordModeOrigin);
|
||||
XFillPolygon(dpy, XtWindow(monoImage),
|
||||
Mono_gc, pointList, pointCount, Complex, CoordModeOrigin);
|
||||
}
|
||||
else {
|
||||
if (pointCount < MAX_PTS) {
|
||||
pointList[pointCount].x = pointList[0].x;
|
||||
pointList[pointCount].y = pointList[0].y;
|
||||
pointCount++;
|
||||
}
|
||||
XDrawLines(dpy, color_icon, Color_gc, pointList, pointCount, Complex);
|
||||
XDrawLines(dpy, mono_icon, Mono_gc, pointList, pointCount, Complex);
|
||||
XDrawLines(dpy, XtWindow(iconImage), Color_gc, pointList,
|
||||
pointCount, Complex);
|
||||
XDrawLines(dpy, XtWindow(monoImage), Mono_gc, pointList,
|
||||
pointCount, Complex);
|
||||
}
|
||||
min_x = pointList[0].x;
|
||||
min_y = pointList[0].y;
|
||||
max_x = min_x;
|
||||
max_y = min_y;
|
||||
for (i=1; i<pointCount; i++) {
|
||||
if (pointList[i].x < min_x) min_x = pointList[i].x;
|
||||
if (pointList[i].y < min_y) min_y = pointList[i].y;
|
||||
if (pointList[i].x > max_x) max_x = pointList[i].x;
|
||||
if (pointList[i].y > max_y) max_y = pointList[i].y;
|
||||
}
|
||||
Transfer_Back_Image(min_x, min_y, max_x, max_y, FILL);
|
||||
}
|
||||
Reference in New Issue
Block a user