237 lines
7.1 KiB
C
237 lines
7.1 KiB
C
|
/* $XFree86$ */
|
|||
|
/*****************************************************************************
|
|||
|
Copyright 1987, 1988, 1989, 1990, 1991, 1992 by Digital Equipment Corp.,
|
|||
|
Maynard, MA
|
|||
|
|
|||
|
Permission to use, copy, modify, and distribute this software and its
|
|||
|
documentation for any purpose and without fee is hereby granted,
|
|||
|
provided that the above copyright notice appear in all copies and that
|
|||
|
both that copyright notice and this permission notice appear in
|
|||
|
supporting documentation, and that the name of Digital not be
|
|||
|
used in advertising or publicity pertaining to distribution of the
|
|||
|
software without specific, written prior permission.
|
|||
|
|
|||
|
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|||
|
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|||
|
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|||
|
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|||
|
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|||
|
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|||
|
SOFTWARE.
|
|||
|
|
|||
|
*****************************************************************************/
|
|||
|
/*
|
|||
|
*
|
|||
|
* CONTRIBUTORS:
|
|||
|
*
|
|||
|
* Dick Annicchiarico
|
|||
|
* Robert Chesler
|
|||
|
* Dan Coutu
|
|||
|
* Gene Durso
|
|||
|
* Marc Evans
|
|||
|
* Alan Jamison
|
|||
|
* Mark Henry
|
|||
|
* Ken Miller
|
|||
|
*
|
|||
|
*/
|
|||
|
#ifndef vms
|
|||
|
#include <signal.h>
|
|||
|
#else
|
|||
|
#include <descrip.h> /* Character string descriptors */
|
|||
|
#include <dvidef.h> /* GETDVI item codes */
|
|||
|
#include <devdef.h> /* device independent codes */
|
|||
|
#include <iodef.h> /* I/O function codes */
|
|||
|
#include <psldef.h> /* PSL definitions */
|
|||
|
#include <ssdef.h> /* System service codes */
|
|||
|
#include <stsdef.h> /* System status masks and codes */
|
|||
|
#include <ttdef.h> /* Terminal specific I/O defs */
|
|||
|
#include <tt2def.h> /* Terminal specific I/O defs */
|
|||
|
#define CTRL_USER_MODE 3
|
|||
|
|
|||
|
/*----------*
|
|||
|
* Macros *
|
|||
|
*----------*/
|
|||
|
|
|||
|
#define $CheckStatus(status)\
|
|||
|
if (!(status & 1)) return(status);
|
|||
|
|
|||
|
/* Allocate a quadword aligned VMS descriptor.
|
|||
|
* NOTE: This supersedes the $DESCRIPTOR macro in DESCRIP.H.
|
|||
|
* The only difference is the _align(QUADWORD) term.
|
|||
|
*/
|
|||
|
#define $DESCRIPTOR_Q(name, string)\
|
|||
|
struct dsc$descriptor_s _align (QUADWORD) name = \
|
|||
|
{ sizeof(string)-1, DSC$K_DTYPE_T, DSC$K_CLASS_S, string }
|
|||
|
|
|||
|
/*---------------------*
|
|||
|
* Data Declarations *
|
|||
|
*---------------------*/
|
|||
|
|
|||
|
static $DESCRIPTOR_Q (sys_input, "SYS$INPUT:");
|
|||
|
|
|||
|
static unsigned short
|
|||
|
comm_chan, /* Communication channel */
|
|||
|
comm_iosb[4]; /* I/O status block */
|
|||
|
|
|||
|
static struct getdvi_itmlst_struct
|
|||
|
{ /* $GETDVI item list */
|
|||
|
unsigned short int
|
|||
|
buflen,
|
|||
|
item_code;
|
|||
|
unsigned int
|
|||
|
bufadr,
|
|||
|
retadr,
|
|||
|
eol;
|
|||
|
} _align (LONGWORD) getdvi_itmlst = { sizeof(int),
|
|||
|
DVI$_DEVCHAR,
|
|||
|
0,0,0 };
|
|||
|
|
|||
|
static unsigned int dvi_characteristics,return_length;
|
|||
|
|
|||
|
static struct exit_handler_blk
|
|||
|
{
|
|||
|
unsigned int flink;
|
|||
|
void (*exit_routine)();
|
|||
|
unsigned char arg_cnt;
|
|||
|
unsigned char null_byte;
|
|||
|
unsigned short null_word;
|
|||
|
unsigned int cond_value;
|
|||
|
} _align (LONGWORD) exit_block;
|
|||
|
|
|||
|
static unsigned int vms_condition;
|
|||
|
|
|||
|
#endif /* vms */
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#include <X11/extensions/xtraplib.h>
|
|||
|
#include <X11/extensions/xtraplibp.h>
|
|||
|
|
|||
|
#include "XEKeybCtrl.h"
|
|||
|
|
|||
|
int XEEnableCtrlKeys(void (*rtn)(int))
|
|||
|
{
|
|||
|
#ifndef vms
|
|||
|
signal(SIGINT, rtn); /* CTRL-C */
|
|||
|
return(1L);
|
|||
|
|
|||
|
#else /* vms */
|
|||
|
|
|||
|
int status;
|
|||
|
|
|||
|
/*
|
|||
|
* Provide the addresses of the longword to receive device chars
|
|||
|
* and the return length of the information.
|
|||
|
*/
|
|||
|
getdvi_itmlst.bufadr = &dvi_characteristics;
|
|||
|
getdvi_itmlst.retadr = &return_length;
|
|||
|
|
|||
|
status = SYS$GETDVIW (0, 0, &sys_input, &getdvi_itmlst, 0, 0, 0, 0);
|
|||
|
$CheckStatus(status);
|
|||
|
|
|||
|
|
|||
|
/* If we have a terminal device, enable control-c and control-y */
|
|||
|
if (dvi_characteristics & DEV$M_TRM)
|
|||
|
{
|
|||
|
/* Assign a channel to the communication device. */
|
|||
|
status = SYS$ASSIGN ( &sys_input, /* Device name */
|
|||
|
&comm_chan, /* Channel returned */
|
|||
|
0, 0 );
|
|||
|
$CheckStatus(status);
|
|||
|
|
|||
|
status = XEEnableCtrlC(rtn);
|
|||
|
$CheckStatus(status);
|
|||
|
|
|||
|
status = XEEnableCtrlY(rtn);
|
|||
|
$CheckStatus(status);
|
|||
|
}
|
|||
|
return (SS$_NORMAL);
|
|||
|
|
|||
|
#endif /* vms */
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int XEClearCtrlKeys(void)
|
|||
|
{
|
|||
|
#ifndef vms
|
|||
|
signal(SIGINT, SIG_DFL); /* CTRL-C */
|
|||
|
return(1L);
|
|||
|
#else /* vms */
|
|||
|
int status;
|
|||
|
|
|||
|
if (dvi_characteristics & DEV$M_TRM)
|
|||
|
{
|
|||
|
status = SYS$DASSGN(comm_chan);
|
|||
|
$CheckStatus(status);
|
|||
|
}
|
|||
|
return (SS$_NORMAL);
|
|||
|
#endif /* vms */
|
|||
|
}
|
|||
|
|
|||
|
int XEEnableCtrlC(void (*rtn)(int))
|
|||
|
{
|
|||
|
#ifndef vms
|
|||
|
signal(SIGINT, rtn); /* CTRL-C */
|
|||
|
return(1);
|
|||
|
#else
|
|||
|
int status;
|
|||
|
|
|||
|
status = SYS$QIOW ( 0, /* Now set the characteristics */
|
|||
|
comm_chan, /* Channel */
|
|||
|
IO$_SETMODE|IO$M_CTRLCAST, /* Set ctrl_c */
|
|||
|
comm_iosb, /* iosb address */
|
|||
|
0, 0, /* */
|
|||
|
rtn, 0, /* AST routine and param */
|
|||
|
CTRL_USER_MODE, 0, 0, 0 );
|
|||
|
$CheckStatus(status);
|
|||
|
|
|||
|
return (SS$_NORMAL);
|
|||
|
#endif /* vms */
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int XEEnableCtrlY(void (*rtn)(int))
|
|||
|
{
|
|||
|
#ifndef vms
|
|||
|
signal(SIGQUIT,rtn); /* CTRL-backslash */
|
|||
|
return(1);
|
|||
|
#else /* vms */
|
|||
|
int status;
|
|||
|
|
|||
|
status = SYS$QIOW ( 0, /* Set characteristics */
|
|||
|
comm_chan, /* Channel */
|
|||
|
IO$_SETMODE|IO$M_CTRLYAST, /* Set ctrl_y */
|
|||
|
comm_iosb, /* iosb address */
|
|||
|
0, 0, /* */
|
|||
|
rtn, 0, /* AST routine and param */
|
|||
|
CTRL_USER_MODE, 0, 0, 0 );
|
|||
|
$CheckStatus(status);
|
|||
|
|
|||
|
return (SS$_NORMAL);
|
|||
|
#endif /* vms */
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int XEDeclExitHndlr(void (*rtn)(int))
|
|||
|
{
|
|||
|
#ifndef vms
|
|||
|
return(1); /* no real way for U*IX to do this */
|
|||
|
#else /* vms */
|
|||
|
int status;
|
|||
|
|
|||
|
/*
|
|||
|
* The Exit handler routine must accept one argument.
|
|||
|
* This argument will be the condition that signaled the
|
|||
|
* the exit handler.
|
|||
|
*/
|
|||
|
exit_block.exit_routine = rtn;
|
|||
|
exit_block.arg_cnt = 1; /* The condition code is the first argument */
|
|||
|
exit_block.cond_value = &vms_condition; /* Address of condition value written by VMS */
|
|||
|
|
|||
|
status = SYS$DCLEXH (&exit_block); /* Set up the condition handler */
|
|||
|
$CheckStatus(status);
|
|||
|
|
|||
|
return (SS$_NORMAL);
|
|||
|
#endif /* vms */
|
|||
|
}
|