home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / x / xtrapv33.zip / extensions / lib / xtrap / XEKeybCtrl.c < prev    next >
C/C++ Source or Header  |  1992-09-14  |  7KB  |  255 lines

  1. /*****************************************************************************
  2. Copyright 1987, 1988, 1989, 1990, 1991, 1992 by Digital Equipment Corp., 
  3. Maynard, MA
  4.  
  5. Permission to use, copy, modify, and distribute this software and its 
  6. documentation for any purpose and without fee is hereby granted, 
  7. provided that the above copyright notice appear in all copies and that
  8. both that copyright notice and this permission notice appear in 
  9. supporting documentation, and that the name of Digital not be
  10. used in advertising or publicity pertaining to distribution of the
  11. software without specific, written prior permission.  
  12.  
  13. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  14. ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
  15. DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
  16. ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  17. WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
  18. ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  19. SOFTWARE.
  20.  
  21. *****************************************************************************/
  22. /*
  23.  *
  24.  *  CONTRIBUTORS:
  25.  *
  26.  *      Dick Annicchiarico
  27.  *      Robert Chesler
  28.  *      Dan Coutu
  29.  *      Gene Durso
  30.  *      Marc Evans
  31.  *      Alan Jamison
  32.  *      Mark Henry
  33.  *      Ken Miller
  34.  *
  35.  */
  36. #ifndef vms
  37. #include    <signal.h>
  38. #else
  39. #include    <descrip.h>                     /* Character string descriptors */
  40. #include    <dvidef.h>                      /* GETDVI item codes */
  41. #include    <devdef.h>                      /* device independent codes */
  42. #include    <iodef.h>                       /* I/O function codes */
  43. #include    <psldef.h>                      /* PSL definitions */
  44. #include    <ssdef.h>                       /* System service codes */
  45. #include    <stsdef.h>                      /* System status masks and codes */
  46. #include    <ttdef.h>                       /* Terminal specific I/O defs */
  47. #include    <tt2def.h>                      /* Terminal specific I/O defs */
  48. #define CTRL_USER_MODE 3
  49.  
  50. /*----------*
  51.  *  Macros  *
  52.  *----------*/
  53.  
  54. #define     $CheckStatus(status)\
  55.             if (!(status & 1)) return(status);
  56.  
  57.             /*  Allocate a quadword aligned VMS descriptor.
  58.              *  NOTE: This supersedes the $DESCRIPTOR macro in DESCRIP.H.
  59.              *  The only difference is the _align(QUADWORD) term.
  60.              */
  61. #define     $DESCRIPTOR_Q(name, string)\
  62.                 struct dsc$descriptor_s _align (QUADWORD) name = \
  63.                 { sizeof(string)-1, DSC$K_DTYPE_T, DSC$K_CLASS_S, string }
  64.  
  65. /*---------------------*
  66.  *  Data Declarations  *
  67.  *---------------------*/
  68.  
  69. static $DESCRIPTOR_Q (sys_input, "SYS$INPUT:");
  70.  
  71. static unsigned short
  72.                 comm_chan,                      /* Communication channel */
  73.                 comm_iosb[4];                   /* I/O status block */
  74.  
  75. static struct getdvi_itmlst_struct
  76.     {                                           /* $GETDVI item list */
  77.     unsigned short int
  78.                 buflen,
  79.                 item_code;
  80.     unsigned int
  81.                 bufadr,
  82.                 retadr,
  83.                 eol;
  84.     }  _align (LONGWORD) getdvi_itmlst   = { sizeof(int), 
  85.                                              DVI$_DEVCHAR, 
  86.                                              0,0,0 };
  87.  
  88. static unsigned int dvi_characteristics,return_length;
  89.  
  90. static struct exit_handler_blk
  91.     {
  92.     unsigned int    flink;
  93.     void            (*exit_routine)();
  94.     unsigned char   arg_cnt;
  95.     unsigned char   null_byte;
  96.     unsigned short  null_word;
  97.     unsigned int    cond_value;
  98.     } _align (LONGWORD) exit_block;
  99.  
  100. static unsigned int vms_condition;
  101.  
  102. #endif /* vms */
  103.  
  104.  
  105.  
  106. #ifdef FUNCTION_PROTOS
  107. int XEEnableCtrlKeys(void (*rtn)())
  108. #else
  109. int XEEnableCtrlKeys(rtn)
  110.     void (*rtn)();
  111. #endif
  112. {
  113. #ifndef vms
  114.     signal(SIGINT, rtn); /* CTRL-C */
  115.     return(1L);
  116.  
  117. #else /* vms */
  118.  
  119.     int status;
  120.  
  121.     /*  
  122.      *  Provide the addresses of the longword to receive device chars
  123.      *  and the return length of the information.
  124.      */
  125.     getdvi_itmlst.bufadr = &dvi_characteristics;
  126.     getdvi_itmlst.retadr = &return_length;
  127.  
  128.     status = SYS$GETDVIW (0, 0, &sys_input, &getdvi_itmlst, 0, 0, 0, 0);
  129.     $CheckStatus(status);
  130.  
  131.  
  132.     /* If we have a terminal device, enable control-c and control-y */
  133.     if (dvi_characteristics & DEV$M_TRM)
  134.     {
  135.         /* Assign a channel to the communication device. */
  136.         status = SYS$ASSIGN ( &sys_input,    /* Device name */
  137.                               &comm_chan,    /* Channel returned */
  138.                               0, 0 );
  139.         $CheckStatus(status);
  140.  
  141.         status = XEEnableCtrlC(rtn);
  142.         $CheckStatus(status);
  143.  
  144.         status = XEEnableCtrlY(rtn);
  145.         $CheckStatus(status);
  146.     }
  147.     return (SS$_NORMAL);
  148.  
  149. #endif /* vms */
  150. }
  151.  
  152.  
  153. #ifdef FUNCTION_PROTOS
  154. int XEClearCtrlKeys(void)
  155. #else
  156. int XEClearCtrlKeys()
  157. #endif
  158. {
  159. #ifndef vms
  160.     signal(SIGINT,  SIG_DFL); /* CTRL-C */
  161.     return(1L);
  162. #else  /* vms */
  163.     int status;
  164.  
  165.     if (dvi_characteristics & DEV$M_TRM) 
  166.     {                 
  167.         status = SYS$DASSGN(comm_chan);
  168.         $CheckStatus(status);
  169.     }
  170.     return (SS$_NORMAL);
  171. #endif /* vms */
  172. }
  173.  
  174. #ifdef FUNCTION_PROTOS
  175. XEEnableCtrlC(void (*rtn)())
  176. #else
  177. XEEnableCtrlC(rtn)
  178.     void (*rtn)();
  179. #endif
  180. {
  181. #ifndef vms
  182.     signal(SIGINT, rtn); /* CTRL-C */
  183.     return(1);
  184. #else
  185.     int status;
  186.  
  187.     status = SYS$QIOW ( 0,                  /*  Now set the characteristics */
  188.                         comm_chan,              /* Channel */
  189.                         IO$_SETMODE|IO$M_CTRLCAST, /* Set ctrl_c */
  190.                         comm_iosb,              /* iosb address */
  191.                         0, 0,                   /*  */
  192.                         rtn, 0,                 /* AST routine and param */
  193.                         CTRL_USER_MODE, 0, 0, 0 );
  194.     $CheckStatus(status);
  195.  
  196.     return (SS$_NORMAL);
  197. #endif /* vms */
  198. }
  199.  
  200.                                            
  201. #ifdef FUNCTION_PROTOS
  202. XEEnableCtrlY(void (*rtn)())
  203. #else
  204. XEEnableCtrlY(rtn)
  205.     void (*rtn)();
  206. #endif
  207. {
  208. #ifndef vms
  209.     signal(SIGQUIT,rtn); /* CTRL-backslash */
  210.     return(1);
  211. #else /* vms */
  212.     int status;
  213.  
  214.     status = SYS$QIOW ( 0,                      /* Set characteristics */
  215.                         comm_chan,              /* Channel */
  216.                         IO$_SETMODE|IO$M_CTRLYAST, /* Set ctrl_y */
  217.                         comm_iosb,              /* iosb address */
  218.                         0, 0,                   /* */
  219.                         rtn, 0,                 /* AST routine and param */
  220.                         CTRL_USER_MODE, 0, 0, 0 );
  221.     $CheckStatus(status);
  222.  
  223.     return (SS$_NORMAL);
  224. #endif /* vms */
  225. }
  226.  
  227.  
  228. #ifdef FUNCTION_PROTOS
  229. XEDeclExitHndlr(void (*rtn)())   
  230. #else
  231. XEDeclExitHndlr(rtn)   
  232.     void (*rtn)();
  233. #endif
  234. {
  235. #ifndef vms
  236.     return(1);  /* no real way for U*IX to do this */
  237. #else /* vms */
  238.     int status;
  239.  
  240.     /*
  241.      *  The Exit handler routine must accept one argument.
  242.      *  This argument will be the condition that signaled the
  243.      *  the exit handler.
  244.      */
  245.     exit_block.exit_routine = rtn;
  246.     exit_block.arg_cnt    = 1;              /* The condition code is the first argument */
  247.     exit_block.cond_value = &vms_condition; /* Address of condition value written by VMS */
  248.     
  249.     status = SYS$DCLEXH (&exit_block);  /* Set up the condition handler */
  250.     $CheckStatus(status);
  251.  
  252.     return (SS$_NORMAL);
  253. #endif /* vms */
  254. }
  255.