diff options
author | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2006-11-26 10:49:38 +0000 |
---|---|---|
committer | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2006-11-26 10:49:38 +0000 |
commit | 841f8331c93ff96bd798e9a74ba10fab155da5c5 (patch) | |
tree | 36661fb122f858a2f14b585a304bad58a2142628 /app/xtrap/XEKeybCtrl.c | |
parent | 8f41c760916495ea26d3c59795487ac6dfc77d75 (diff) |
Importing from X.Org 7.2RC2
Diffstat (limited to 'app/xtrap/XEKeybCtrl.c')
-rw-r--r-- | app/xtrap/XEKeybCtrl.c | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/app/xtrap/XEKeybCtrl.c b/app/xtrap/XEKeybCtrl.c new file mode 100644 index 000000000..300078346 --- /dev/null +++ b/app/xtrap/XEKeybCtrl.c @@ -0,0 +1,236 @@ +/* $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 */ +} |