|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T e
Length: 11785 (0x2e09)
Types: TextFile
Names: »events.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z«
└─⟦2109abc41⟧
└─⟦this⟧ »./X.V10R4/libapollo/events.c«
/*
Copyright 1986 by the University of Utah
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 the University of Utah
not be used in advertising or publicity pertaining to
distribution of the software without specific, written
prior permission. The University of Utah makes no
representations about the suitability of this software for
any purpose. It is provided "as is" without express or
implied warranty.
*/
/*
Copyright (C) 1986, Leonard N. Zubkoff All Rights Reserved */
/*
* ToDo:
* Up events
* Shiftlock support
*/
#include <stdio.h>
#include <sys/time.h>
#include <sys/errno.h>
#include <sys/wait.h>
#define do
#define hidden static
#define visible
#define procedure void
#include "Xapollo.h"
#include "/sys/ins/ios.ins.c"
#include "/sys/ins/io_traits.ins.c"
#include "/sys/ins/trait.ins.c"
#include "/sys/ins/kbd.ins.c"
#include "/sys/ins/smdu.ins.c"
#include "/sys/ins/tone.ins.c"
#include "/sys/ins/ec2.ins.c"
/* Should be qevent.h */
#define VSE_LEFT_BUTTON 0
#define VSE_MIDDLE_BUTTON 1
#define VSE_RIGHT_BUTTON 2
#define ShiftKeyCode 0256
#define ControlKeyCode 0257
#define LockKeyCode 0260
#define MetaKeyCode 0261
#define SETSIZE (short)256
extern int errno;
unsigned state_mask;
extern DEVICE *CurrentDevice;
extern int borrow_flag;
static vsEvent xes, *xe;
static status_$t stp;
static ec2_$ptr_t ecs[2];
static long ec_vlist[2];
static gpr_$keyset_t KeySet;
static boolean not_in_window;
static gpr_$event_t EventType;
static unsigned char EventData[1];
static gpr_$position_t EventPosition;
static boolean HavePreviewedData;
static gpr_io_get_calls = 0;
static ec2_$ptr_t GPREc;
#include "lk201.h"
ProcessInput()
{
}
/*
This should be replaced by a tabular implementation of some kind.
*/
int
ApolloToXKey(c)
unsigned char c;
{
register int ret;
state_mask = 0;
switch (c) {
case KBD_$R1:
case KBD_$R1U:
return(MetaKeyCode);
case KBD_$LD:
case KBD_$LDU:
return(ControlKeyCode);
case KBD_$LE:
case KBD_$LEU:
return(MetaKeyCode);
case KBD_$LF:
case KBD_$LFU:
return(ShiftKeyCode);
case KBD_$CR:
c = '\015';
break;
case KBD_$BS:
c = '\010';
break;
case KBD_$TAB:
case KBD_$STAB:
case KBD_$CTAB:
c = '\011';
break;
}
ret = LK201[c&0177];
state_mask = (state_mask & ~(ControlMask|MetaMask|ShiftMask|ShiftLockMask))
| (ret & (ControlMask|MetaMask|ShiftMask|ShiftLockMask));
return(ret);
}
InputReader()
{
gpr_$event_t prior_event;
int i;
boolean flag;
HavePreviewedData = false;
prior_event = gpr_$no_event;
while (1) {
if (!borrow_flag)
flag = gpr_$acquire_display( stp );
/* this needs to be replaced with a "real" timestamp */
xe->vse_time += 1;
if (EventType != gpr_$no_event) {
xe->vse_x = EventPosition.x_coord;
xe->vse_y = EventPosition.y_coord;
}
switch (EventType) {
case gpr_$no_event:
if ((prior_event == gpr_$locator_stop) ||
(prior_event == gpr_$locator)) {
Deal_with_movement(xe);
SetCursorPosition((vsCursor *) xe);
gpr_$set_cursor_position( EventPosition, stp);
}
if (!borrow_flag)
gpr_$release_display( stp );
return;
case gpr_$keystroke:
SetCursorPosition((vsCursor *) xe);
xe->vse_device = VSE_DKB;
xe->vse_type = VSE_BUTTON;
if ((EventData[0] == KBD_$R1U) ||
(EventData[0] == KBD_$LDU) ||
(EventData[0] == KBD_$LEU) ||
(EventData[0] == KBD_$LFU))
xe->vse_direction = VSE_KBTUP;
else
xe->vse_direction = VSE_KBTDOWN;
xe->vse_key = ApolloToXKey(EventData[0]);
handle_mask_down();
Deal_with_input(xe);
handle_mask_up();
break;
case gpr_$buttons:
xe->vse_device = VSE_MOUSE;
xe->vse_type = VSE_BUTTON;
SetCursorPosition((vsCursor *) xe);
switch (EventData[0]) {
case 'a':
xe->vse_key = VSE_LEFT_BUTTON;
xe->vse_direction = VSE_KBTDOWN;
break;
case 'b':
xe->vse_key = VSE_MIDDLE_BUTTON;
xe->vse_direction = VSE_KBTDOWN;
break;
case 'c':
xe->vse_key = VSE_RIGHT_BUTTON;
xe->vse_direction = VSE_KBTDOWN;
break;
case 'A':
xe->vse_key = VSE_LEFT_BUTTON;
xe->vse_direction = VSE_KBTUP;
break;
case 'B':
xe->vse_key = VSE_MIDDLE_BUTTON;
xe->vse_direction = VSE_KBTUP;
break;
case 'C':
xe->vse_key = VSE_RIGHT_BUTTON;
xe->vse_direction = VSE_KBTUP;
break;
}
Deal_with_input(xe);
break;
case gpr_$left_window:
gpr_$disable_input(gpr_$buttons, stp);
gpr_$disable_input(gpr_$keystroke, stp);
if (!borrow_flag)
gpr_$disable_input(gpr_$left_window, stp);
gpr_$disable_input(gpr_$locator_stop, stp);
gpr_$disable_input(gpr_$locator, stp);
if (!borrow_flag)
gpr_$force_release(i, stp);
break;
case gpr_$entered_window:
if (!borrow_flag)
flag = gpr_$acquire_display(stp);
gpr_$enable_input(gpr_$buttons, KeySet, stp);
gpr_$enable_input(gpr_$keystroke, KeySet, stp);
if (!borrow_flag) {
gpr_$enable_input(gpr_$left_window, 0L, stp);
gpr_$enable_input(gpr_$entered_window, 0L, stp);
}
gpr_$enable_input(gpr_$locator_stop, 0L, stp);
gpr_$enable_input(gpr_$locator, 0L, stp);
break;
case gpr_$locator:
xe->vse_device = VSE_MOUSE;
xe->vse_type = VSE_MMOTION;
break;
case gpr_$locator_stop:
xe->vse_device = VSE_MOUSE;
xe->vse_type = VSE_MMOTION;
break;
default:
fprintf(stderr,"Unrecognizable event--yecccch!!!!\n");
break;
}
prior_event = EventType;
gpr_$cond_event_wait(EventType, EventData[0], EventPosition, stp);
}
}
/* Turn off pseudo-shift/control keys
* --destroys data field of event
*/
handle_mask_up()
{
if (state_mask & ControlMask) {
xe->vse_key = ControlKeyCode;
xe->vse_direction = VSE_KBTUP;
Deal_with_input(xe);
}
if (state_mask & ShiftMask) {
xe->vse_key = ShiftKeyCode;
xe->vse_direction = VSE_KBTUP;
Deal_with_input(xe);
}
};
/* Turn on pseudo-shift/control keys
* --preserves data field of event
*/
handle_mask_down()
{
unsigned char data;
data = xe->vse_key;
if (state_mask & ControlMask) {
xe->vse_key = ControlKeyCode;
xe->vse_direction = VSE_KBTDOWN;
Deal_with_input(xe);
}
if (state_mask & ShiftMask) {
xe->vse_key = ShiftKeyCode;
xe->vse_direction = VSE_KBTDOWN;
Deal_with_input(xe);
}
xe->vse_key = data;
};
/* A rudimentary stream interface/type mgr for the keyboard and mouse
*/
hidden int gpr_io_$get(hpp, optp, bp, buf_lenp, stp)
char **hpp;
ios_$put_get_opts_t *optp;
char *bp;
long *buf_lenp;
status_$t *stp;
{
static char Buff[10];
static int BuffLen;
static boolean HaveBuff = false;
boolean NoWait = ((ios_$cond_opt & *optp) != 0);
boolean Preview = ((ios_$preview_opt & *optp) != 0);
status_$t Status;
boolean flag;
if (! Preview) {
fprintf(stderr, "Gack! Not preview in gpr_io_$get\n");
abort();
}
if (HavePreviewedData) {
stp->all = status_$ok;
return(1);
}
HavePreviewedData = false;
#ifdef PRE_SR9_5
if (NoWait) {
long ECValue = (long)ec2_$read(*GPREc);
static long PrevECValue = -1;
if (PrevECValue == ECValue)
stp->all = ios_$get_conditional_failed;
else {
if (!borrow_flag)
flag = gpr_$acquire_display(Status);
gpr_$cond_event_wait(EventType, EventData[0], EventPosition, *stp);
if (!borrow_flag)
gpr_$release_display( Status );
if (EventType == gpr_$no_event) {
stp->all = ios_$get_conditional_failed;
PrevECValue = ECValue;
}
else
PrevECValue = -1;
}
}
else {
if (!borrow_flag)
flag = gpr_$acquire_display(Status);
gpr_$event_wait(EventType, EventData[0], EventPosition, *stp);
if (!borrow_flag)
gpr_$release_display( Status );
}
#else
if (NoWait) {
gpr_$cond_event_wait(EventType, EventData[0], EventPosition, *stp);
if (EventType == gpr_$no_event)
stp->all = ios_$get_conditional_failed;
}
else
gpr_$event_wait(EventType, EventData[0], EventPosition, *stp);
#endif
if (stp->all != status_$ok)
return(0);
HavePreviewedData = true;
return(1);
}
int
InitInput()
{
boolean flag;
short i;
short KeyClass[256];
for (i=0; i<255; i++) do KeyClass[i] = 0;
KeyClass[KBD_$L_BOX_ARROW] = 1;
KeyClass[KBD_$L9] = 1;
KeyClass[KBD_$L9S] = 1;
KeyClass[KBD_$L9U] = 1;
KeyClass[KBD_$CMD] = 1;
lib_$init_set(KeySet,256);
for (i=0; i<256; i++) do
if (KeyClass[i] != 1)
lib_$add_to_set(KeySet,256,i);
gpr_$enable_input(gpr_$keystroke,KeySet, stp);
gpr_$enable_input(gpr_$buttons, KeySet, stp);
if (!borrow_flag) {
gpr_$enable_input(gpr_$left_window, 0L, stp);
gpr_$enable_input(gpr_$entered_window, 0L, stp);
}
gpr_$enable_input(gpr_$locator_stop, 0L, stp);
gpr_$enable_input(gpr_$locator, 0L, stp);
smd_$set_quit_char( (char)KBD_$F8S, stp );
check_status(stp, "InitInput (Set quit char): ");
xe = &xes;
}
hidden boolean gpr_io_$close(hpp, stp)
char **hpp;
status_$t *stp;
{
stp->all = status_$ok;
return(false);
}
hidden ios_$conn_flag_set gpr_io_$inq_conn_flags(hpp, stp)
char **hpp;
status_$t *stp;
{
stp->all = status_$ok;
return(ios_$cf_tty_mask | ios_$cf_vt_mask);
}
hidden procedure gpr_io_$get_ec(hpp, keyp, ecpp, stp)
char **hpp;
ios_$ec_key_t *keyp;
ec2_$ptr_t *ecpp;
status_$t *stp;
{
long foo;
foo = (long) ec2_$read( *GPREc );
*ecpp = GPREc;
stp->all = status_$ok;
}
#ifdef PRE_SR9_5
hidden long nilp[2] = {0, 0};
#else
#define nilp 0
#endif
io_$epv gpr_io_$epv = {
nilp,
nilp,
nilp,
nilp,
gpr_io_$close,
gpr_io_$get_ec,
nilp,
nilp,
nilp,
gpr_io_$inq_conn_flags,
nilp,
gpr_io_$get,
nilp,
nilp,
nilp,
nilp,
nilp,
nilp,
nilp,
nilp,
nilp,
nilp,
nilp,
nilp,
nilp,
nilp,
nilp,
nilp,
nilp,
nilp,
nilp,
};
int
MakeGPRStream()
{
status_$t Status;
static uid_$t gpr_io_$uid = {0x2f3e1e7a, 0x10003166};
boolean flag;
#ifdef PRE_SR9_5
flag = gpr_$acquire_display(stp);
#endif
gpr_$get_ec(gpr_$input_ec,GPREc,Status);
check_status(Status, "MakeGPRStream");
#ifdef PRE_SR9_5
gpr_$release_display( stp );
#endif
trait_$mgr_dcl(gpr_io_$uid, io_$trait, trait_$kind_local, &gpr_io_$epv, Status);
return (ios_$connect("", (short) 0, gpr_io_$uid, (long) 0, &gpr_io_$epv, Status));
}
/*
Universally used; returns -1 if an status is abnormal/error
*/
int
check_status(status, name)
status_$t status;
char *name;
{
if (status.all != status_$ok) {
fprintf(stderr, "%s", name);
error_$print(status);
return(-1);
}
return(0);
}