1998-10-02 06:02:32 -07:00
|
|
|
/***********************************************************************/
|
|
|
|
/* */
|
|
|
|
/* Objective Caml */
|
|
|
|
/* */
|
|
|
|
/* Damien Doligez, projet Para, INRIA Rocquencourt */
|
|
|
|
/* */
|
|
|
|
/* Copyright 1998 Institut National de Recherche en Informatique et */
|
1999-11-17 10:59:06 -08:00
|
|
|
/* en Automatique. All rights reserved. This file is distributed */
|
|
|
|
/* under the terms of the GNU Library General Public License. */
|
1998-10-02 06:02:32 -07:00
|
|
|
/* */
|
|
|
|
/***********************************************************************/
|
|
|
|
|
|
|
|
/* $Id$ */
|
|
|
|
|
|
|
|
#include "main.h"
|
|
|
|
|
|
|
|
/* See ocaml.r before modifying this. */
|
|
|
|
typedef struct {
|
|
|
|
char mod;
|
|
|
|
char chr;
|
|
|
|
char item;
|
|
|
|
char filler;
|
|
|
|
} KeyEquRecord, **KeyEquHandle;
|
|
|
|
|
|
|
|
short modalkeys;
|
|
|
|
ModalFilterUPP myModalFilterUPP;
|
|
|
|
|
|
|
|
/* Before calling ModalDialog with myModalFilter, set the dialog
|
|
|
|
window's refcon to the resource number of the key equivalence
|
|
|
|
list for the dialog.
|
|
|
|
*/
|
|
|
|
static pascal Boolean myModalFilter (DialogPtr d, EventRecord *evt,
|
|
|
|
DialogItemIndex *item)
|
|
|
|
{
|
|
|
|
Boolean result = false;
|
|
|
|
char key;
|
|
|
|
int cmdflag;
|
|
|
|
KeyEquHandle equivlist;
|
|
|
|
int equivcount, i;
|
|
|
|
short itemtype;
|
|
|
|
Handle itemhandle;
|
|
|
|
Rect itemrect;
|
|
|
|
unsigned long ticks;
|
|
|
|
|
|
|
|
switch (evt->what){
|
|
|
|
case updateEvt:
|
|
|
|
if ((WindowPtr) evt->message != d) WinUpdate ((WindowPtr) evt->message);
|
|
|
|
break;
|
|
|
|
case activateEvt:
|
|
|
|
if ((WindowPtr) evt->message != d){
|
|
|
|
WinActivateDeactivate (evt->modifiers & activeFlag,
|
|
|
|
(WindowPtr) evt->message);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case keyDown: case autoKey:
|
|
|
|
key = evt->message & charCodeMask;
|
|
|
|
cmdflag = !!(evt->modifiers & cmdKey);
|
|
|
|
equivlist = (KeyEquHandle) GetResource ('Kequ', modalkeys);
|
|
|
|
if (equivlist != NULL){
|
|
|
|
equivcount = GetHandleSize ((Handle) equivlist) / sizeof (KeyEquRecord);
|
|
|
|
for (i = 0; i < equivcount; i++){
|
|
|
|
if ((*equivlist)[i].chr == key && (!(*equivlist)[i].mod || cmdflag)){
|
|
|
|
result = true;
|
|
|
|
*item = (*equivlist)[i].item;
|
|
|
|
GetDialogItem (d, *item, &itemtype, &itemhandle, &itemrect);
|
|
|
|
HiliteControl ((ControlHandle) itemhandle, kControlButtonPart);
|
|
|
|
Delay (kVisualDelay, &ticks);
|
|
|
|
HiliteControl ((ControlHandle) itemhandle, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default: break;
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
OSErr InitialiseModalFilter (void)
|
|
|
|
{
|
|
|
|
myModalFilterUPP = NewModalFilterProc (myModalFilter);
|
|
|
|
return noErr;
|
|
|
|
}
|