ocaml/maccaml/modalfilter.c

83 lines
2.7 KiB
C

/***********************************************************************/
/* */
/* Objective Caml */
/* */
/* Damien Doligez, projet Para, INRIA Rocquencourt */
/* */
/* Copyright 1998 Institut National de Recherche en Informatique et */
/* en Automatique. All rights reserved. This file is distributed */
/* under the terms of the GNU Library General Public License. */
/* */
/***********************************************************************/
/* $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;
}