mirror of
https://github.com/ctm/executor.git
synced 2024-09-29 18:58:01 +00:00
136 lines
3.7 KiB
C
136 lines
3.7 KiB
C
|
/* Copyright 1990, 1995 by Abacus Research and
|
||
|
* Development, Inc. All rights reserved.
|
||
|
*/
|
||
|
|
||
|
#if !defined (OMIT_RCSID_STRINGS)
|
||
|
char ROMlib_rcsid_menuV[] =
|
||
|
"$Id: menuV.c 63 2004-12-24 18:19:43Z ctm $";
|
||
|
#endif
|
||
|
|
||
|
/* Forward declarations in MenuMgr.h (DO NOT DELETE THIS LINE) */
|
||
|
|
||
|
#include "rsys/common.h"
|
||
|
#include "QuickDraw.h"
|
||
|
#include "MenuMgr.h"
|
||
|
#include "WindowMgr.h"
|
||
|
#include "ResourceMgr.h"
|
||
|
#include "MemoryMgr.h"
|
||
|
|
||
|
#include "rsys/file.h"
|
||
|
#include "rsys/cquick.h"
|
||
|
#include "rsys/menu.h"
|
||
|
#include "rsys/wind.h"
|
||
|
#include "rsys/prefs.h"
|
||
|
|
||
|
P1(PUBLIC pascal trap, void, InitProcMenu, INTEGER, mbid)
|
||
|
{
|
||
|
if (!MenuList)
|
||
|
InitMenus();
|
||
|
|
||
|
#if 0
|
||
|
/* NOTE: We don't dispose this guy because it is a phoney resource */
|
||
|
if (MBDFHndl)
|
||
|
DisposHandle(Cx(MBDFHndl));
|
||
|
#endif
|
||
|
|
||
|
/* NOTE: even though the docs imply that the low three bits of the
|
||
|
* mbid should be masked off, Microsoft PowerPoint showed that
|
||
|
* this is not the case. They try to get mbid 300, and there is a
|
||
|
* 300 in the resource file but not a 296, so masking causes the
|
||
|
* GetResource to fail. A small test program then confirmed that
|
||
|
* the bits are not masked off.
|
||
|
*/
|
||
|
MBDFHndl = RM(GetResource(TICK("MBDF"), mbid));
|
||
|
HxX(MENULIST, mufu) = CW(mbid);
|
||
|
MBDFCALL(mbInit, 0, 0L);
|
||
|
}
|
||
|
|
||
|
P0(PUBLIC pascal trap, LONGINT, MenuChoice)
|
||
|
{
|
||
|
return Cx(MenuDisable);
|
||
|
}
|
||
|
|
||
|
P3(PUBLIC pascal trap, void, GetItemCmd, MenuHandle, mh, INTEGER, item,
|
||
|
CHAR *, cmdp)
|
||
|
{
|
||
|
mextp mep;
|
||
|
|
||
|
if ((mep = ROMlib_mitemtop(mh, item, (StringPtr *) 0)))
|
||
|
*cmdp = CW((unsigned short) (unsigned char) mep->mkeyeq);
|
||
|
}
|
||
|
|
||
|
P3(PUBLIC pascal trap, void, SetItemCmd, MenuHandle, mh, INTEGER, item,
|
||
|
CHAR, cmd)
|
||
|
{
|
||
|
mextp mep;
|
||
|
|
||
|
if ((mep = ROMlib_mitemtop(mh, item, (StringPtr *) 0))) {
|
||
|
mep->mkeyeq = cmd;
|
||
|
CalcMenuSize(mh);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
P4(PUBLIC pascal trap, LONGINT, PopUpMenuSelect, MenuHandle, mh, INTEGER, top,
|
||
|
INTEGER, left, INTEGER, item)
|
||
|
{
|
||
|
Point p;
|
||
|
Rect saver;
|
||
|
INTEGER tempi;
|
||
|
LONGINT where;
|
||
|
RgnHandle saveclip;
|
||
|
int count;
|
||
|
|
||
|
/*
|
||
|
* The following call to ROMlib_destroy_blocks is only here because
|
||
|
* CompuServe Information Manager creates code on the fly right before
|
||
|
* calling PopUpMenuSelect. How does this work on a Quadra? I suspect
|
||
|
* that the particular code in question isn't hit if color QuickDraw is
|
||
|
* present (they call Gestalt for "qd " before doing this goofy stuff).
|
||
|
*/
|
||
|
if (ROMlib_flushoften)
|
||
|
ROMlib_destroy_blocks(0, ~0, TRUE); /* For CIM 2.1.4 */
|
||
|
p.h = top; /* MacWriteII seems to use these in this fashion */
|
||
|
p.v = left;
|
||
|
|
||
|
/* ### what to do if `mh' is empty -- is this correct? */
|
||
|
count = CountMItems (mh);
|
||
|
|
||
|
#if 0
|
||
|
/* if we blow off empty menus, then ClarisImpact custom
|
||
|
pulldown/popup menus don't come up */
|
||
|
if (! count)
|
||
|
return (int32) Hx (mh, menuID) << 16;
|
||
|
#endif
|
||
|
|
||
|
/* if item is zero, it means no menu item was previously selected,
|
||
|
and a `default' should be chosen */
|
||
|
if (! item)
|
||
|
item = 1;
|
||
|
else if (item > count)
|
||
|
{
|
||
|
warning_unexpected ("menu item exceeds number of items in menu");
|
||
|
item = count;
|
||
|
}
|
||
|
|
||
|
tempi = item;
|
||
|
THEPORT_SAVE_EXCURSION
|
||
|
(MR (wmgr_port),
|
||
|
{
|
||
|
tempi = CW (tempi);
|
||
|
MENUCALL (mPopUpRect, mh, &saver, p, &tempi);
|
||
|
TopMenuItem = tempi;
|
||
|
where = ROMlib_mentosix (Hx (mh, menuID));
|
||
|
|
||
|
MBDFCALL (mbSave, where, (LONGINT) (long) &saver);
|
||
|
|
||
|
saveclip = PORT_CLIP_REGION_X (thePort); /* ick */
|
||
|
PORT_CLIP_REGION_X (thePort) = RM (NewRgn ());
|
||
|
RectRgn (PORT_CLIP_REGION (thePort), &saver);
|
||
|
MENUCALL (mDrawMsg, mh, &saver, p, (INTEGER *) 0);
|
||
|
DisposeRgn (PORT_CLIP_REGION (thePort));
|
||
|
PORT_CLIP_REGION_X (thePort) = saveclip;
|
||
|
MBDFCALL (mbSaveAlt, 0, where);
|
||
|
});
|
||
|
return ROMlib_menuhelper (mh, &saver, where, TRUE, 1);
|
||
|
}
|