[comp.unix.sysv386] The X11R4 and KDQUEMODE Challenge!

petej@ssg0.pharmacia.com (Peter M. Jansson) (11/09/90)

After a lot of frustration and experimentation, I have been able to
figure out most of how the KDQUEMODE works  in AT&T SysV/386r3.2, but I
continue to have a problem.  The following test program works
correctly when invoked as:

	test -

but when invoked as:

	test

fails to see mouse input.  The program takes a single optional argument which
is the name of a file to use as the controlling terminal.  If you
supply "-" as the name of the file, the program uses stdin.  If you
supply no argument, the program allocates a new virtual terminal to
use.

This program reports the keyboard and mouse events as supplied by the
KDQUEMODE queue.  It exits upon the release of the "Q" key, or 30
seconds.

As long as the program is invoked as "test -", keyboard and mouse
events are reported as I expect.  When the program must open another
virtual terminal, the keyboard events are properly reported, but not
the mouse events.

Can someone PLEASE PLEASE PLEASE tell me the magic to make the mouse
events always happen?

The motivation for figuring this out is to get the X11R4 server
working on Intel and AT&T *Xes.

Replies via email welcomed.

	Pete. (petej@pharmacia.com)

-----------------Program test.c (Creative name, eh?) follows:-----------
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/at_ansi.h>
#include <sys/kd.h>
#include <sys/vt.h>
#include <sys/xque.h>
#include <fcntl.h>

#define KD_QSIZE	100
#define KB_SIG	SIGPOLL

int fd;
int mouse_fd;
int done = 0;

struct kd_quemode myq;
xqEventQueue *eq_ptr;

int alarm_handler();
int sig_handler();

main(argc, argv)
int argc;
char *argv[];
{
    int n;
    int ttyno;
    char vtname[20];
    int tmp_fd;

    if ((mouse_fd = open("/dev/mouse", O_RDWR)) < 0)
    {
	perror("/dev/mouse");
	exit(-1);
    }
    if (argc == 2)
	if (strcmp(argv[1], "-"))
	    fd = open(argv[1], O_RDWR);
	else
	    fd = 0;
    else
    {
	tmp_fd = open("/dev/console", O_RDWR);
	ioctl(tmp_fd, VT_OPENQRY, &ttyno);
	close(tmp_fd);
	sprintf(vtname, "/dev/vt%02d", ttyno);
	fd = open(vtname, O_RDWR);
	if (fd < 0)
	{
	    perror(vtname);
	    exit(-1);
	}
	printf("%s open on %d\n", vtname, fd);
    }
    myq.qsize = KD_QSIZE;
    myq.signo = KB_SIG;
    signal(SIGALRM, alarm_handler);
    alarm(30);
    signal(KB_SIG, sig_handler);
    ioctl(fd, KDQUEMODE, NULL);
    n = ioctl(fd, KDQUEMODE, &myq);
    if (n < 0)
    {
	perror("KDQUEMODE");
	exit(-1);
    }
    eq_ptr = (xqEventQueue *) myq.qaddr;
    while (!done)
    {
	prq(eq_ptr);
	if (!done)
	{
	    eq_ptr->xq_sigenable = 1;
	    pause();
	    eq_ptr->xq_sigenable = 0;
	}
    }
    ioctl(fd, KDQUEMODE, NULL);
}

prq(qaddr)
xqEventQueue *qaddr;
{
    xqEvent *ev_ptr;
    int i;
    
    ev_ptr = &qaddr->xq_events[0] + qaddr->xq_head;
    while (qaddr->xq_head != qaddr->xq_tail)
    {
	switch (ev_ptr->xq_type)
	{
	  case XQ_BUTTON:
	    printf("%03d: Mouse button: %d\n", qaddr->xq_head,
		   ev_ptr->xq_code);
	    break;
	  case XQ_MOTION:
	    printf("%03d: Mouse motion: x=%d, y=%d, button=%d\n",
		   qaddr->xq_head, ev_ptr->xq_x, ev_ptr->xq_y,
		   ev_ptr->xq_code);
	    break;
	  case XQ_KEY:
	    done = ev_ptr->xq_code == 0x90;
	    printf("%03d: Key %s: %02x\n", qaddr->xq_head,
		   ev_ptr->xq_code & 0x80 ? "Up" : "Dn",
		   ev_ptr->xq_code );
	    break;
	}
	ev_ptr++;
	qaddr->xq_head++;
	if (qaddr->xq_head >= qaddr->xq_size)
	{
	    ev_ptr = &qaddr->xq_events[0];
	    qaddr->xq_head = 0;
	}
    }
}

alarm_handler()
{
    ioctl(fd, KDQUEMODE, NULL);
    close(mouse_fd);
    close(0);
    exit(-1);
}

sig_handler()
{
    signal(KB_SIG, sig_handler);
}

withrow@vino.enet.dec.com (Robert Withrow) (11/09/90)

For anyone who cares, I have a (very) preliminary version of
the X11R4 server for SYSV386r3.2 that uses this KDQUEMODE
for the mouse and keyboard (i.e. written from scratch without
the using any of the rhoell stuff).  I had to write a mouse driver for
the microsoft bus mouse.  I am not equiped to distribute the
patches for the server, but I am willing to send portions of the
code that give examples of the KDQUEMODE stuff working
properly, along with the mouse driver.  If you want this please
send me mail at the reply-to address above, describing what
you need, and have a little patience.