executor/src/windMouse.c

191 lines
5.0 KiB
C

/* Copyright 1986, 1989, 1990, 1995 by Abacus Research and
* Development, Inc. All rights reserved.
*/
#if !defined (OMIT_RCSID_STRINGS)
char ROMlib_rcsid_windMouse[] =
"$Id: windMouse.c 63 2004-12-24 18:19:43Z ctm $";
#endif
/* Forward declarations in WindowMgr.h (DO NOT DELETE THIS LINE) */
#include "rsys/common.h"
#include "WindowMgr.h"
#include "EventMgr.h"
#include "OSEvent.h"
#include "MemoryMgr.h"
#include "MenuMgr.h"
#include "rsys/cquick.h"
#include "rsys/wind.h"
#include "rsys/menu.h"
#if !defined (No_STEF_zoommods)
/* WINDOW_ZOOMED returns TRUE if w is currently in stdState (big) */
#define WINDOW_ZOOMED(w) (ROMlib_window_zoomed(w))
#endif
P2(PUBLIC pascal trap, INTEGER, FindWindow, Point, p, HIDDEN_WindowPtr *, wpp)
{
WindowPeek wp;
LONGINT pointaslong, val;
INTEGER retval;
pointaslong = ((LONGINT)p.v << 16)|(unsigned short)p.h;
(*wpp).p = 0;
if (MBDFCALL(mbHit, 0, pointaslong) != -1)
return inMenuBar;
for (wp = MR (WindowList); wp ; wp = WINDOW_NEXT_WINDOW (wp))
{
if (WINDOW_VISIBLE_X (wp) && PtInRgn (p, WINDOW_STRUCT_REGION (wp)))
{
wpp->p = RM ((WindowPtr) wp);
if (WINDOW_KIND (wp) < 0)
{
retval = inSysWindow;
goto DONE;
}
val = WINDCALL((WindowPtr) wp, wHit, pointaslong);
if (val == wNoHit)
retval = DeskHook ? inSysWindow : inDesk;
else
retval = val + 2; /* datadesk showed us that this is how it's
done */
goto DONE;
}
}
retval = inDesk;
DONE:
return retval;
}
A3(PRIVATE, BOOLEAN, xTrackBox, WindowPtr, wp, Point, pt,
INTEGER, part) /* IMIV-50 */
{
BOOLEAN inpart = TRUE, inp;
EventRecord ev;
THEPORT_SAVE_EXCURSION
(MR (wmgr_port),
{
SetClip(MR(GrayRgn));
WINDCALL(wp, wDraw, part);
while (!GetOSEvent(mUpMask, &ev))
{
ev.where.h = CW(ev.where.h);
ev.where.v = CW(ev.where.v);
CALLDRAGHOOK();
if (pt.h != ev.where.h || pt.v != ev.where.v)
{
pt.h = ev.where.h;
pt.v = ev.where.v;
inp =
(WINDCALL
(wp, wHit, ((LONGINT)pt.v << 16)|(unsigned short) pt.h) == part);
if (inpart != inp)
{
WINDCALL(wp, wDraw, part);
inpart = inp;
}
}
}
});
return inpart;
}
P3(PUBLIC pascal trap, BOOLEAN, TrackBox, WindowPtr, wp, /* IMIV-50 */
Point, pt, INTEGER, part)
{
if (part)
part -= 2;
return xTrackBox(wp, pt, part);
}
P2(PUBLIC pascal trap, BOOLEAN, TrackGoAway, WindowPtr, w, Point, p)
{
return xTrackBox(w, p, wInGoAway);
}
P3(PUBLIC pascal trap, void, ZoomWindow, WindowPtr, wp, /* IMIV-50 */
INTEGER, part, BOOLEAN, front)
{
RgnHandle behind;
#if !defined (No_STEF_zoommods)
Boolean instdstate;
Rect *u;
#if !defined (THEPORTNEEDNTBEWMGRPORT)
GrafPtr gp;
#endif /* THEPORTNEEDNTBEWMGRPORT */
instdstate = WINDOW_ZOOMED((WindowPeek) wp);
if ((part == inZoomIn && instdstate)
|| (part == inZoomOut && !instdstate))
#else /* No_STEF_zoommods */
if ((part == inZoomIn && WINDOW_SPARE_FLAG (wp) == inZoomOut)
|| (part == inZoomOut && (WINDOW_SPARE_FLAG (wp) == inZoomIn)))
#endif /* No_STEF_zoommods */
{
#if !defined (No_STEF_zoommods)
/* Save userState if not in stdstate */
if (!instdstate)
{
u = &((WStateData *) STARH (WINDOW_DATA (wp)))->userState;
u->top
= CW (CW (PORT_RECT (wp).top) - CW (PORT_BOUNDS (wp).top));
u->left
= CW (CW (PORT_RECT (wp).left) - CW (PORT_BOUNDS (wp).left));
u->bottom
= CW (CW (PORT_RECT (wp).bottom) - CW(PORT_BOUNDS (wp).top));
u->right
= CW (CW (PORT_RECT (wp).right) - CW (PORT_BOUNDS (wp).left));
}
#endif
behind = NewRgn();
CopyRgn (WINDOW_STRUCT_REGION (wp), behind);
if (part == inZoomIn)
PORT_RECT (wp) =
MR(*(WStateData **) WINDOW_DATA (wp))->userState;
else
PORT_RECT (wp) =
MR (*(WStateData **) WINDOW_DATA (wp))->stdState;
OffsetRect (&PORT_BOUNDS (wp),
-CW(PORT_RECT (wp).left) - CW(PORT_BOUNDS (wp).left),
-CW(PORT_RECT (wp).top) - CW(PORT_BOUNDS (wp).top));
OffsetRect (&PORT_RECT (wp),
-CW (PORT_RECT (wp).left), -CW (PORT_RECT (wp).top));
WINDCALL(wp, wCalcRgns, 0);
UnionRgn(behind, WINDOW_STRUCT_REGION (wp), behind);
CalcVisBehind((WindowPeek) wp, behind);
PaintBehind (WINDOW_NEXT_WINDOW (wp), behind);
#if !defined (THEPORTNEEDNTBEWMGRPORT)
gp = thePort;
SetPort (MR (wmgr_port));
#endif /* THEPORTNEEDNTBEWMGRPORT */
SetClip (WINDOW_STRUCT_REGION (wp));
ClipAbove((WindowPeek)wp);
WINDCALL((WindowPtr) wp, wDraw, 0);
EraseRgn (WINDOW_CONT_REGION (wp));
CopyRgn (WINDOW_CONT_REGION (wp), WINDOW_UPDATE_REGION (wp));
#if !defined (THEPORTNEEDNTBEWMGRPORT)
SetPort(gp);
#endif /* THEPORTNEEDNTBEWMGRPORT */
#if !defined (No_STEF_zoommods)
#else
WINDOW_SPARE_FLAG_X (wp) = part;
#endif /* No_STEF_zoommods */
DisposeRgn (behind);
if (front)
SelectWindow(wp);
}
}