260 lines
7.3 KiB
C
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);
|
|
}
|