home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / CPROG / CTASK22.ZIP / TSKHOT.C < prev    next >
C/C++ Source or Header  |  1990-10-12  |  4KB  |  157 lines

  1. /*
  2.    --- Version 2.2 90-10-12 10:33 ---
  3.  
  4.    TSKHOT.C - CTask - Keyboard Hotkey operations.
  5.  
  6.    CTask - a Multitasking Kernel for C
  7.  
  8.    Public Domain Software written by
  9.       Thomas Wagner
  10.       Ferrari electronic Gmbh
  11.       Beusselstrasse 27
  12.       D-1000 Berlin 21
  13.       Germany
  14.  
  15.    No rights reserved.
  16.  
  17.    This file is new with 2.1, which added keyboard hotkey support.
  18.    This module reduces to nothing if the HOTKEYS flag is clear.
  19.  
  20.    Version 2.2 adds a create function that does not enqueue the created
  21.    element. Separate enable and disable routines have been added.
  22. */
  23.  
  24. #include "tsk.h"
  25. #include "tsklocal.h"
  26.  
  27. #if (HOTKEYS)
  28.  
  29. #include <stdarg.h>
  30.  
  31. /*
  32.    create_hotkey_elem
  33.       Creates a hotkey element, but does not activate it.
  34. */
  35.  
  36. tlinkptr CGlobalfunc create_hotkey_elem (tlinkptr elem, byte scancode,
  37.                                          byte mask1, byte flag1,
  38.                                          byte mask2, byte flag2,
  39.                                          byte mask3, byte flag3,
  40.                                          farptr strucp, byte kind, 
  41.                                          int rept, ...)
  42. {
  43.    va_list val;
  44.  
  45.    va_start (val, rept);
  46.    elem = tsk_setup_telem (elem, TYP_HOTKEY, strucp, kind, va_arg (val, dword));
  47.    va_end (val);
  48.    if (elem == LNULL)
  49.       return LNULL;
  50.  
  51.    if (rept)
  52.       elem->flags |= TFLAG_REPEAT;
  53.    elem->elkind = (byte)TELEM_HOTKEY;
  54.    elem->elem.key.scancode = scancode;
  55.    elem->elem.key.flag1.mask = mask1;
  56.    elem->elem.key.flag1.compare = flag1;
  57.    elem->elem.key.flag2.mask = mask2;
  58.    elem->elem.key.flag2.compare = flag2;
  59.    elem->elem.key.flag3.mask = mask3;
  60.    elem->elem.key.flag3.compare = flag3;
  61.  
  62.    return elem;
  63. }
  64.  
  65.  
  66. /*
  67.    create_hotkey_entry
  68.       Creates a hotkey element and activates it.
  69.       For compatibility with previous versions.
  70. */
  71.  
  72. tlinkptr CGlobalfunc create_hotkey_entry (tlinkptr elem, byte scancode,
  73.                                           byte mask1, byte flag1,
  74.                                           byte mask2, byte flag2,
  75.                                           byte mask3, byte flag3,
  76.                                           farptr strucp, byte kind, 
  77.                                           int rept, ...)
  78. {
  79.    va_list val;
  80.  
  81.    va_start (val, rept);
  82.    elem = create_hotkey_elem (elem, scancode, mask1, flag1, mask2, flag2, 
  83.                               mask3, flag3, strucp, kind, rept, 
  84.                               va_arg (val, dword));
  85.    va_end (val);
  86.    if (elem != LNULL)
  87.       enable_hotkey (elem);
  88.  
  89.    return elem;
  90. }
  91.  
  92.  
  93. /*
  94.    wait_hotkey
  95.       Delay current task until hotkey is hit.
  96. */
  97.  
  98. int Globalfunc wait_hotkey (byte scancode,
  99.                             byte mask1, byte flag1,
  100.                             byte mask2, byte flag2,
  101.                             byte mask3, byte flag3)
  102. {
  103.    tlinkptr elem;
  104.    tcbptr task = GLOBDATA current_task;
  105.  
  106.    elem = &task->timerq;
  107.    elem->link.kind = TYP_HOTKEY;
  108.    elem->struckind = TKIND_WAKE;
  109.    elem->elkind = (byte)TELEM_HOTKEY;
  110.    elem->flags = 0;
  111.    elem->elem.key.scancode = scancode;
  112.    elem->elem.key.flag1.mask = mask1;
  113.    elem->elem.key.flag1.compare = flag1;
  114.    elem->elem.key.flag2.mask = mask2;
  115.    elem->elem.key.flag2.compare = flag2;
  116.    elem->elem.key.flag3.mask = mask3;
  117.    elem->elem.key.flag3.compare = flag3;
  118.  
  119.    tsk_cli ();
  120.    task->state = ST_DELAYED;
  121.    task->qhead = LNULL;
  122.  
  123.    if (scancode)
  124.       tsk_putqueue (&GLOBDATA hotkey_scan, &elem->link);
  125.    else
  126.       tsk_putqueue (&GLOBDATA hotkey_noscan, &elem->link);
  127.  
  128.    schedule ();
  129.    return (int)((dword)task->retptr);
  130. }
  131.  
  132.  
  133. /*
  134.    enable_hotkey
  135.       Enables a hotkey entry by enqueueing into the appropriate hotkey queue.
  136. */
  137.  
  138. void Globalfunc enable_hotkey (tlinkptr elem)
  139. {
  140.    CRITICAL;
  141.  
  142.    CHECK_TELPTR (elem, TYP_HOTKEY, "Enable Hotkey");
  143.  
  144.    if (elem->link.next)
  145.       return;
  146.    C_ENTER;
  147.    if (elem->elem.key.scancode)
  148.       tsk_putqueue (&GLOBDATA hotkey_scan, &elem->link);
  149.    else
  150.       tsk_putqueue (&GLOBDATA hotkey_noscan, &elem->link);
  151.    C_LEAVE;
  152. }
  153.  
  154.  
  155. #endif
  156.  
  157.