home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
vol_300
/
330_03
/
tskhot.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-10-12
|
4KB
|
157 lines
/*
--- Version 2.2 90-10-12 10:33 ---
TSKHOT.C - CTask - Keyboard Hotkey operations.
CTask - a Multitasking Kernel for C
Public Domain Software written by
Thomas Wagner
Ferrari electronic Gmbh
Beusselstrasse 27
D-1000 Berlin 21
Germany
No rights reserved.
This file is new with 2.1, which added keyboard hotkey support.
This module reduces to nothing if the HOTKEYS flag is clear.
Version 2.2 adds a create function that does not enqueue the created
element. Separate enable and disable routines have been added.
*/
#include "tsk.h"
#include "tsklocal.h"
#if (HOTKEYS)
#include <stdarg.h>
/*
create_hotkey_elem
Creates a hotkey element, but does not activate it.
*/
tlinkptr CGlobalfunc create_hotkey_elem (tlinkptr elem, byte scancode,
byte mask1, byte flag1,
byte mask2, byte flag2,
byte mask3, byte flag3,
farptr strucp, byte kind,
int rept, ...)
{
va_list val;
va_start (val, rept);
elem = tsk_setup_telem (elem, TYP_HOTKEY, strucp, kind, va_arg (val, dword));
va_end (val);
if (elem == LNULL)
return LNULL;
if (rept)
elem->flags |= TFLAG_REPEAT;
elem->elkind = (byte)TELEM_HOTKEY;
elem->elem.key.scancode = scancode;
elem->elem.key.flag1.mask = mask1;
elem->elem.key.flag1.compare = flag1;
elem->elem.key.flag2.mask = mask2;
elem->elem.key.flag2.compare = flag2;
elem->elem.key.flag3.mask = mask3;
elem->elem.key.flag3.compare = flag3;
return elem;
}
/*
create_hotkey_entry
Creates a hotkey element and activates it.
For compatibility with previous versions.
*/
tlinkptr CGlobalfunc create_hotkey_entry (tlinkptr elem, byte scancode,
byte mask1, byte flag1,
byte mask2, byte flag2,
byte mask3, byte flag3,
farptr strucp, byte kind,
int rept, ...)
{
va_list val;
va_start (val, rept);
elem = create_hotkey_elem (elem, scancode, mask1, flag1, mask2, flag2,
mask3, flag3, strucp, kind, rept,
va_arg (val, dword));
va_end (val);
if (elem != LNULL)
enable_hotkey (elem);
return elem;
}
/*
wait_hotkey
Delay current task until hotkey is hit.
*/
int Globalfunc wait_hotkey (byte scancode,
byte mask1, byte flag1,
byte mask2, byte flag2,
byte mask3, byte flag3)
{
tlinkptr elem;
tcbptr task = GLOBDATA current_task;
elem = &task->timerq;
elem->link.kind = TYP_HOTKEY;
elem->struckind = TKIND_WAKE;
elem->elkind = (byte)TELEM_HOTKEY;
elem->flags = 0;
elem->elem.key.scancode = scancode;
elem->elem.key.flag1.mask = mask1;
elem->elem.key.flag1.compare = flag1;
elem->elem.key.flag2.mask = mask2;
elem->elem.key.flag2.compare = flag2;
elem->elem.key.flag3.mask = mask3;
elem->elem.key.flag3.compare = flag3;
tsk_cli ();
task->state = ST_DELAYED;
task->qhead = LNULL;
if (scancode)
tsk_putqueue (&GLOBDATA hotkey_scan, &elem->link);
else
tsk_putqueue (&GLOBDATA hotkey_noscan, &elem->link);
schedule ();
return (int)((dword)task->retptr);
}
/*
enable_hotkey
Enables a hotkey entry by enqueueing into the appropriate hotkey queue.
*/
void Globalfunc enable_hotkey (tlinkptr elem)
{
CRITICAL;
CHECK_TELPTR (elem, TYP_HOTKEY, "Enable Hotkey");
if (elem->link.next)
return;
C_ENTER;
if (elem->elem.key.scancode)
tsk_putqueue (&GLOBDATA hotkey_scan, &elem->link);
else
tsk_putqueue (&GLOBDATA hotkey_noscan, &elem->link);
C_LEAVE;
}
#endif