2021-10-11 18:37:13 -03:00

260 lines
7.3 KiB
C

#ifndef lint
static char sccsid[] = "@(#)input2.c 1.1 94/10/31 Copyr 1985-9 Sun Micro";
#endif
/*
* Copyright (c) 1985, 1986, 1987, 1988, 1989 by Sun Microsystems, Inc.
* Permission to use, copy, modify, and distribute this software 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 are retained, and that the name
* of Sun Microsystems, Inc., not be used in advertising or publicity
* pertaining to this software without specific, written prior permission.
* Sun Microsystems, Inc., makes no representations about the suitability
* of this software or the interface defined in this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/*
associate
set_default_trigger_associations
dissociate
_cgi_err_check_86
*/
#include "cgipriv.h"
View_surface *_cgi_vws; /* current view surface */
View_surface *_cgi_view_surfaces[MAXVWS]; /* view surface information */
int _cgi_vwsurf_count; /* number of view surfaces */
int _cgi_trigger[MAXTRIG][MAXASSOC + 1]; /* association list */
/****************************************************************************/
/* */
/* FUNCTION: associate */
/* */
/* Links a trigger to a specific device */
/****************************************************************************/
Cerror associate(trigger, devclass, devnum)
Cint trigger; /* trigger number */
Cdevoff devclass;
Cint devnum; /* device type, device number */
{
register View_surface *vwsP;
int i, terr, tpt;
struct inputmask imask;
int designee;
terr = _cgi_err_check_481(devclass, devnum);
if (!terr)
terr = _cgi_err_check_86(trigger);
if (!terr)
terr = _cgi_err_is_trig_assoc(devclass, devnum, trigger);
if (!terr)
{
for (i = 0; i < _cgi_vwsurf_count; i++)
{
vwsP = _cgi_view_surfaces[i];
win_getinputmask(vwsP->sunview.windowfd, &imask, &designee);
switch (devclass)
{
case IC_STRING:
switch (trigger)
{
case (1):
imask.im_flags |= IM_ASCII;
/* win_setinputcodebit (&imask, IM_ASCII); */
break;
default:
terr = 84;
break;
}
break;
case IC_STROKE:
case IC_PICK:
switch (trigger)
{
case (2):
win_setinputcodebit(&imask, MS_LEFT);
break;
case (3):
win_setinputcodebit(&imask, MS_MIDDLE);
break;
case (4):
win_setinputcodebit(&imask, MS_RIGHT);
break;
default:
terr = 84;
break;
}
break;
case IC_LOCATOR:
case IC_VALUATOR:
case IC_CHOICE:
switch (trigger)
{
case (2):
win_setinputcodebit(&imask, MS_LEFT);
break;
case (3):
win_setinputcodebit(&imask, MS_MIDDLE);
break;
case (4):
win_setinputcodebit(&imask, MS_RIGHT);
break;
case (5):
win_setinputcodebit(&imask, LOC_MOVE);
break;
case (6):
win_setinputcodebit(&imask, LOC_STILL);
break;
default:
terr = 84;
break;
}
break;
}
if (!terr)
{
win_setinputmask(vwsP->sunview.windowfd, &imask,
(struct inputmask *) 0, designee);
}
}
if (!terr)
{
tpt = ++_cgi_trigger[trigger - 1][0];
_cgi_trigger[trigger - 1][tpt] =
_cgi_int_dev_conv(devclass, devnum);
}
}
return (_cgi_errhand(terr));
}
/****************************************************************************/
/* */
/* FUNCTION: set_default_trigger_associations */
/* */
/* Links a trigger to a specific device */
/****************************************************************************/
Cerror set_default_trigger_associations(devclass, devnum)
Cdevoff devclass; /* device type */
Cint devnum; /* device number */
{
int err;
switch (devclass)
{
case IC_STRING:
err = associate(1, devclass, devnum);
break;
case IC_STROKE:
err = associate(4, devclass, devnum);
break;
case IC_LOCATOR:
err = associate(5, devclass, devnum);
break;
case IC_VALUATOR:
err = associate(3, devclass, devnum);
break;
case IC_CHOICE:
err = associate(2, devclass, devnum);
break;
}
return (_cgi_errhand(err));
}
/****************************************************************************/
/* */
/* FUNCTION: dissociate */
/* */
/* Removes a trigger from a specific device */
/****************************************************************************/
Cerror dissociate(trigger, devclass, devnum)
Cint trigger; /* trigger number */
Cdevoff devclass;
Cint devnum; /* device type, device number */
{
register View_surface *vwsP;
int terr, i, tpt, tp2;
struct inputmask imask;
int designee;
terr = _cgi_err_check_481(devclass, devnum);
if (!terr)
terr = _cgi_err_check_86(trigger);
if (!terr)
{
terr = _cgi_err_is_trig_assoc(devclass, devnum, trigger);
if (terr)
terr = NO_ERROR; /* no error because assoc. exists */
else
terr = 85;
}
if (!terr)
{
tpt = _cgi_trigger[trigger - 1][0];
i = 1;
tp2 = _cgi_int_dev_conv(devclass, devnum);
while (_cgi_trigger[trigger - 1][i] != tp2 && i < tpt)
i++;
_cgi_trigger[trigger - 1][i] = 0;
while (i < tpt)
_cgi_trigger[trigger - 1][i] = _cgi_trigger[trigger - 1][i + 1];
_cgi_trigger[trigger - 1][0] = tpt - 1;
(void) selective_flush_of_event_queue(devclass, devnum);
/* dequeue events */
if (tpt <= 1)
{
for (i = 0; i < _cgi_vwsurf_count; i++)
{
vwsP = _cgi_view_surfaces[i];
win_getinputmask(vwsP->sunview.windowfd, &imask, &designee);
switch (trigger)
{
case (1):
imask.im_flags |= ~IM_ASCII;
/* win_unsetinputcodebit (&imask, IM_ASCII); */
break;
case (2):
win_unsetinputcodebit(&imask, MS_LEFT);
break;
case (3):
win_unsetinputcodebit(&imask, MS_MIDDLE);
break;
case (4):
win_unsetinputcodebit(&imask, MS_RIGHT);
break;
case (5):
win_unsetinputcodebit(&imask, LOC_MOVE);
break;
case (6):
win_unsetinputcodebit(&imask, LOC_STILL);
break;
}
win_setinputmask(vwsP->sunview.windowfd, &imask,
(struct inputmask *) 0, designee);
}
}
}
return (_cgi_errhand(terr));
}
/****************************************************************************/
/* */
/* FUNCTION: _cgi_check_86 */
/* */
/* */
/****************************************************************************/
int _cgi_err_check_86(trigger)
int trigger;
{
int err = NO_ERROR;
if (trigger < 1 || trigger > MAXTRIG)
err = EINTRNEX;
return (err);
}