bob@wiley.UUCP (Bob Amstadt) (10/27/87)
In an attempt to make use of the "Alternate" key, I ran into the
following problem. Its possible for me to type faster than my application
can obtain and deal with the key presses. I would like to detect odd
combinations shift keys, i.e. Control and Alternate, pressed in
combination with a normal key such as a letter. Since I need
to buffer the key presses, the GEMDOS input functions would be
convenient to use, however, they don't allow me to obtain information
about what shift keys were depressed when the key was pressed.
I can't use the BIOS calls because key presses would be lost
(the GEMDOS buffering would steal the keys). Also I do not want
to use a solution that would cause auto repeat not to work.
If anyone knows the answer to the problem, please tell me. I thought
about using GEM, but I noticed that the event for a key pressed also
does not return shift key information. Question to Atari: Why is it
easy to get shift key info when a mouse button is pressed, but not
when a key is pressed?
--
---Bob Amstadt
bob@wiley.uucp
{csvax.caltech.edu,uunet.uu.net,trwrb.uucp}!wiley!bobminow@decvax.UUCP (Martin Minow) (10/29/87)
In article <1516@wiley.UUCP>, Bob Amstadt asks how to read the shift, control, and alt keys. Here is a fragment from a much larger program that shows how you can get this information. I have no idea how to do this using the evnt_...(); routines. Martin Minow decvax!minow The following software is in the public domain. It is incomplete as it stands and intended only as an illustration. /* * The keytable structure is is returned by Keytbl(). It "points" * to the keyboard translation tables in the operating system. */ typedef struct { char *unshifted; char *shifted; char *capslock; } KEYTBL; #define RIGHTSHIFT 0x01 #define LEFTSHIFT 0x02 #define CTRLSHIFT 0x04 #define ALTSHIFT 0x08 #define CAPSSHIFT 0x10 KEYTBL *keytbl; main() { ... keytbl = Keytbl(-1L, -1L, -1L); /* keyboard translation table */ ... } int read_keyboard() { register long rawkey; register int scancode; register int c; /* Translated key code */ register int shift; rawkey = Bconin(2); /* Get char from kb: */ scancode = (rawkey >> 16) & 0xFF; /* Raw keyboard code. */ shift = Getshift(-1); /* Need the ALT key */ if (scancode >= 0x78 && scancode <= 0x83) /* Normalize strange */ scancode -= (0x78 - 0x02); /* "ALT" + digit */ if ((c = rawkey & 0xFF) == 0) { /* ALT compose? */ if ((shift & (RIGHTSHIFT | LEFTSHIFT)) != 0) c = keytbl->shifted[scancode]; else if ((shift & CAPSSHIFT) != 0) c = keytbl->capslock[scancode]; else { c = keytbl->unshifted[scancode]; } if ((shift & CTRLSHIFT) != 0) c &= 0x1F; } return (c); }