Files
Arquivotheca.SunOS-4.1.4/usr.lib/libsunwindow/win/win_input.c
seta75D ff309bfe1c Init
2021-10-11 18:37:13 -03:00

398 lines
7.3 KiB
C

#ifndef lint
#ifdef sccs
static char sccsid[] = "@(#)win_input.c 1.1 94/10/31 Copyr 1986 Sun Micro";
#endif
#endif
/*
* Copyright (c) 1986 by Sun Microsystems, Inc.
*/
/*
* Win_input.c: Implement the input functions of the win_struct.h interface.
*/
#include <sys/types.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <sunwindow/rect.h>
#include <sunwindow/cms.h>
#include <sunwindow/win_screen.h>
#ifdef KEYMAP_DEBUG
#include <sunwindow/win_input.h>
#else
#include <sunwindow/win_input.h>
#endif
#include <sunwindow/win_struct.h>
#include <sunwindow/win_ioctl.h>
extern errno;
/*
* Most of the functions below return the value
* returned by ioctl. Zero (0) denotes success.
* Currently, the return values are being ignored
* (in most cases).
*/
/*
* Input control.
*/
win_getinputmask(windowfd, im, nextwindownumber)
int windowfd, *nextwindownumber;
struct inputmask *im;
{
int err;
struct inputmaskdata ims;
(void)werror(err = ioctl(windowfd, WINGETINPUTMASK, &ims), WINGETINPUTMASK);
if (!err) {
if (im)
*im = ims.ims_set;
if (nextwindownumber)
*nextwindownumber = ims.ims_nextwindow;
}
return (err);
}
win_setinputmask(windowfd, im_set, im_flush, nextwindownumber)
int windowfd, nextwindownumber;
struct inputmask *im_set, *im_flush;
{
int err;
struct inputmaskdata ims;
if (im_set)
ims.ims_set = *im_set;
else
(void)input_imnull(&ims.ims_set);
if (im_flush)
ims.ims_flush = *im_flush;
else
(void)input_imnull(&ims.ims_flush);
ims.ims_nextwindow = nextwindownumber;
(void)werror(err = ioctl(windowfd, WINSETINPUTMASK, &ims), WINSETINPUTMASK);
return (err);
}
/*
* Utilities
*/
input_imnull(im)
struct inputmask *im;
{
int i;
im->im_flags = 0;
im->im_shifts = 0;
for (i=0;i<IM_CODEARRAYSIZE;i++)
im->im_inputcode[i] = 0;
for (i=0;i<IM_SHIFTARRAYSIZE;i++)
im->im_shiftcodes[i] = 0;
}
input_imall(im)
struct inputmask *im;
{
int i;
(void)input_imnull(im);
im->im_flags = IM_ASCII|IM_META;
for (i=0;i<IM_CODEARRAYSIZE;i++)
im->im_inputcode[i] = 1;
}
/* Keymap debugging variable; can be removed after debugging is done */
extern int keymap_blockio;
input_readevent(windowfd, event)
int windowfd;
struct inputevent *event;
{
int n;
int bufsize = sizeof(struct inputevent);
char str[32];
n = read(windowfd, (caddr_t)event, bufsize);
if (n == -1)
return(-1);
if (n != bufsize) {
errno = EIO;
return(-1);
}
#ifdef KEYMAP_DEBUG
if ((keymap_debug_mask & KEYMAP_SHOW_EVENT_STREAM) && !keymap_blockio)
printf("input_readevent: read %d '%s'\n", windowfd,
win_keymap_event_decode(event, str));
#endif
(void)win_keymap_map(windowfd, event);
#ifdef KEYMAP_DEBUG
if ((keymap_debug_mask & KEYMAP_SHOW_EVENT_STREAM) && !keymap_blockio)
printf("input_readevent: posted '%s'\n",
win_keymap_event_decode(event,str));
#endif
return(0);
}
/*
* Input focus and synchronization routines.
*/
win_get_kbd_mask(windowfd, im)
int windowfd;
struct inputmask *im;
{
int err;
(void)werror(err = ioctl(windowfd, WINGETKBDMASK, im), WINGETKBDMASK);
return (err);
}
win_set_kbd_mask(windowfd, im)
int windowfd;
struct inputmask *im;
{
int err;
(void)werror(err = ioctl(windowfd, WINSETKBDMASK, im), WINSETKBDMASK);
return (err);
}
win_get_pick_mask(windowfd, im)
int windowfd;
struct inputmask *im;
{
int err;
(void)werror(err = ioctl(windowfd, WINGETPICKMASK, im), WINGETPICKMASK);
return (err);
}
win_set_pick_mask(windowfd, im)
int windowfd;
struct inputmask *im;
{
int err;
(void)werror(err = ioctl(windowfd, WINSETPICKMASK, im), WINSETPICKMASK);
return (err);
}
win_get_designee(windowfd, nextwindownumber)
int windowfd, *nextwindownumber;
{
struct inputmask im;
(void)win_getinputmask(windowfd, &im, nextwindownumber);
}
win_set_designee(windowfd, nextwindownumber)
int windowfd, nextwindownumber;
{
struct inputmask im;
(void)win_getinputmask(windowfd, &im, (int *)0);
(void)win_setinputmask(windowfd, &im, (struct inputmask *)0, nextwindownumber);
}
win_get_focus_event(windowfd, fe, shifts)
int windowfd;
Firm_event *fe;
int *shifts;
{
Focus_event foe;
int err;
(void)werror(err = ioctl(windowfd, WINGETFOCUSEVENT, &foe), WINGETFOCUSEVENT);
if (!err) {
if (fe) {
fe->id = foe.id;
fe->value = foe.value;
}
if (shifts)
*shifts = foe.shifts;
}
return (err);
}
win_set_focus_event(windowfd, fe, shifts)
int windowfd;
Firm_event *fe;
int shifts;
{
int err;
Focus_event foe;
foe.id = fe->id;
foe.value = fe->value;
foe.shifts = shifts;
(void)werror(err = ioctl(windowfd, WINSETFOCUSEVENT, &foe), WINSETFOCUSEVENT);
return (err);
}
win_get_swallow_event(windowfd, fe, shifts)
int windowfd;
Firm_event *fe;
int *shifts;
{
int err;
Focus_event foe;
(void)werror(err = ioctl(windowfd, WINGETSWALLOWEVENT, &foe), WINGETSWALLOWEVENT);
if (!err) {
if (fe) {
fe->id = foe.id;
fe->value = foe.value;
}
if (shifts)
*shifts = foe.shifts;
}
return (err);
}
win_set_swallow_event(windowfd, fe, shifts)
int windowfd;
Firm_event *fe;
int shifts;
{
int err;
Focus_event foe;
foe.id = fe->id;
foe.value = fe->value;
foe.shifts = shifts;
(void)werror(err = ioctl(windowfd, WINSETSWALLOWEVENT, &foe), WINSETSWALLOWEVENT);
return (err);
}
win_get_event_timeout(windowfd, tv)
int windowfd;
struct timeval *tv;
{
int err;
(void)werror(err = ioctl(windowfd, WINGETEVENTTIMEOUT, tv), WINGETEVENTTIMEOUT);
return (err);
}
win_set_event_timeout(windowfd, tv)
int windowfd;
struct timeval *tv;
{
int err;
(void)werror(err = ioctl(windowfd, WINSETEVENTTIMEOUT, tv), WINSETEVENTTIMEOUT);
return (err);
}
win_get_vuid_value(windowfd, id)
unsigned short id;
{
int err;
Firm_event fe;
fe.id = fe.pair_type = fe.pair = fe.value = fe.time.tv_sec = fe.time.tv_usec = 0;
fe.id = id;
(void)werror(err = ioctl(windowfd, WINGETVUIDVALUE, &fe), WINGETVUIDVALUE);
if (!err)
return (fe.value);
else
return (err);
}
win_refuse_kbd_focus(windowfd)
int windowfd;
{
int err;
(void)werror(err = ioctl(windowfd, WINREFUSEKBDFOCUS, 0), WINREFUSEKBDFOCUS);
return (err);
}
win_release_event_lock(windowfd)
int windowfd;
{
int err;
(void)werror(err = ioctl(windowfd, WINUNLOCKEVENT, 0), WINUNLOCKEVENT);
return (err);
}
int
win_set_kbd_focus(windowfd, number)
int windowfd;
int number;
{
int err;
(void)werror(err = ioctl(windowfd, WINSETKBDFOCUS, &number), WINSETKBDFOCUS);
return (err);
}
int
win_get_kbd_focus(windowfd)
int windowfd;
{
int number;
(void)werror(ioctl(windowfd, WINGETKBDFOCUS, &number), WINGETKBDFOCUS);
return (number);
}
/*
* Mouse control functions -- button order & scaling
*/
int
win_get_button_order(windowfd)
int windowfd;
{
int number;
(void)werror(ioctl(windowfd, WINGETBUTTONORDER, &number), WINGETBUTTONORDER);
return (number);
}
int
win_set_button_order(windowfd, number)
int windowfd;
int number;
{
int err;
err = ioctl(windowfd, WINSETBUTTONORDER, &number);
(void)werror(err, WINSETBUTTONORDER);
return (err);
}
int
win_get_scaling(windowfd, buffer)
int windowfd;
Ws_scale_list *buffer;
{
int err;
err = ioctl(windowfd, WINGETSCALING, buffer);
(void)werror(err, WINGETSCALING);
return (err);
}
int
win_set_scaling(windowfd, buffer)
int windowfd;
Ws_scale_list *buffer;
{
int err;
err = ioctl(windowfd, WINSETSCALING, buffer);
(void)werror(err, WINSETSCALING);
return (err);
}