This is keycode.c in view mode; [Download] [Up]
/* Grab a copy of the keyboard translation table so we can find the charCode for a given keyCode, ignoring the Alternate key. For legal stuff see the file COPYRIGHT. */ #include <dpsclient/dpsclient.h> #include <drivers/event_status_driver.h> #include <libc.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> #include <sys/file.h> #include <sys/types.h> static char keycode[256][4]; static havekeymap = 0; /* Given the char mask MASK for a key return the number of chars generated by that key. */ static int mask_skip (char mask) { int i, skip; if (mask == -1) return 0; for (i = CHAR_BIT, skip = 1; i > 0; i--, mask >>=1) if (mask & 01) skip <<= 1; return skip; } /* mask_skip */ /* Get the current system keymap and put it into an understandable array KEYCODE. */ void kc_init (void) { int kc, kcs, mask, skip; NXEventHandle handle; NXKeyMapping map; char evfs, nks; char *mapping; /* Get the current keymap from the Event Status Driver. */ handle = NXOpenEventStatus (); if (!handle) { perror ("Emacs: NXOpenEventStatus"); return; } map.size = NXKeyMappingLength (handle); map.mapping = malloc (map.size); if (!NXGetKeyMapping (handle, &map)) { perror ("Emacs: NXGetKeyMapping"); return; } NXCloseEventStatus (handle); /* Check mapping format. */ if (map.mapping[0] || map.mapping[1]) { fprintf(stderr, "Emacs: unknown keyboard map format.\n"); return; } mapping = map.mapping + 2; /* Skip event flags. */ for (evfs = *mapping++; evfs > 0; evfs--) { /* Skip bit number. */ mapping++; /* Number of keys assigned to bit. */ nks = *mapping++; /* Skip key codes. */ mapping += nks; } /* kcs = number of key defs. */ kcs = (unsigned char) *mapping++; for (kc = 0; kc < kcs; kc++) { /* Get mask */ mask = *mapping++; skip = mask_skip (mask); keycode[kc][0] = mapping[1]; /* Shift key */ if (mask & 3) { /* Assumes only one bit will be set */ keycode[kc][1] = mapping[3]; /* Shift key & Control key */ if (mask & 4) { 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]; /* Control key */ if (mask & 4) { keycode[kc][2] = keycode[kc][3] = mapping[3]; } else { keycode[kc][2] = keycode[kc][3] = keycode[kc][0]; } } /* Skip defs. */ mapping += 2 * skip; } havekeymap = 1; } /* kc_init */ int kc_keyforcode (int code, int flags) { int modifier = 0; if (!havekeymap) return -1; if (flags & NX_CONTROLMASK) modifier += 2; if (flags & NX_SHIFTMASK) modifier++; return keycode[code][modifier]; } /* kc_keyforcode */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.