ftp.nice.ch/pub/next/tools/frontends/Emacs.2.1.N.bs.tar.gz#/Emacs-2.1/keycode.c

This is keycode.c in view mode; [Download] [Up]

/*
 * 1990, John G. Myers
 * This file is in the public domain.
 */

/*
 * Grab a copy of the keyboard translation table so we can find the
 * charCode for a given keyCode, ignoring the Alternate key.
 */

#include <stdio.h>
#include <stdlib.h>
#include <libc.h>
#include <limits.h>
#include <sys/file.h>
#include <sys/types.h>
#include <nextdev/evsio.h>
#include <nextdev/keycodes.h>
#include <dpsclient/dpsclient.h>

static char keycode[256][4];
static havekeymap = 0;

static
int mask_skip(char mask)	/* Given a char mask for a key, */
{				/* this computes the number */
  int i, skip;			/* of chars generated by the */
				/* key. */
  if (mask == -1) return 0;

  for (i = CHAR_BIT, skip = 1; i > 0; i--, mask >>=1)
    if (mask&01) skip <<=1;
  return skip;
}

void kc_init()
{
    int evs_fd;
    struct evsioKeymapping map;
    char evfs, nks, km;
    int mask, skip;
    int kc, kcs;
    int i;
    char *mapping;

    if ((evs_fd = open("/dev/evs0", O_RDWR, 0)) < 0) {
	perror("Emacs: /dev/evs0");
	return;
    }
    if (ioctl(evs_fd, EVSIOCKML, &map.size) < 0) {
	perror("Emacs: ioctl EVSIOCKML");
	return;
    }
    map.mapping = (char*) malloc(map.size);
    if (ioctl(evs_fd, EVSIOCKM, &map) < 0) {
	perror("Emacs: ioctl EVSIOCKM");
	return;
    }				/* Check mapping format. */
    if (map.mapping[0] || map.mapping[1]) {
	fprintf(stderr, "Emacs: unknown keyboard map format.\n");
	return;
    }


    mapping = map.mapping + 2;

    for (evfs = *mapping++; evfs > 0; evfs--) { /* Skip event flags. */
	mapping++;			/* Skip bit number. */
	nks = *mapping++;		/* Number of keys assigned to bit. */
	mapping += nks;		/* Skip key codes. */
    }

    kcs = (unsigned char) *mapping++;	/* kcs = number of key defs. */

    for (kc = 0; kc < kcs; kc++) {
	mask = *mapping++;		/* Get mask */
	skip = mask_skip(mask);

	keycode[kc][0] = mapping[1];
	if (mask & 3) {		/* Shift key */
	    /* Assumes only one bit will be set */
	    keycode[kc][1] = mapping[3];

	    if (mask & 4) {	/* Control key */
		keycode[kc][2] = mapping[5];
		keycode[kc][3] = mapping[7];
	    }
	    else {
		keycode[kc][2] = keycode[kc][0];
		keycode[kc][3] = keycode[kc][1];
	    }
	}
	else {
	    keycode[kc][1] = keycode[kc][0];

	    if (mask & 4) {
		keycode[kc][2] = keycode[kc][3] = mapping[3];
	    }
	    else {
		keycode[kc][2] = keycode[kc][3] = keycode[kc][0];
	    }
	}

	mapping += 2*skip;		/* Skip defs. */
    }

    havekeymap=1;
}

int kc_keyforcode(code, flags)
int code, flags;
{
    int modifier = 0;

    if (!havekeymap) return -1;

    if (flags & NX_CONTROLMASK) modifier += 2;
    if (flags & NX_SHIFTMASK) modifier++;

    return keycode[code][modifier];
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.