defEATING CAPs-lock
Stan Tazuma
bcsaic!sundry!stant at beaver.cs.washington.edu
Fri Jun 1 10:25:11 AEST 1990
In article <8033 at brazos.Rice.edu> zweig at ida.org (Johnny zweig) writes:
>When I run X-windows on any machine I know of, I can change the keyboard
>mappings and render the evil dreaded caps-lock key harmless (it is already
>known to be useless, of course). That is, make it not do anything at all
>no matter how often I accidentally hit it.
>
>Is there a way to do this in SunView, short of twiddling the kernel? What
>I would really like would be a command in my .cshrc that just nukes the
>damn thing for good (if I want to type all caps for awhile, I just have my
>secretary come and hold her finger on the shift-key for me), but a command
>that just fusses SunView's keyboard-processing would be the next best
>thing.
Here's a program that can disable the caps lock key, and just as
importantly, can re-enable it (some people might actually like the key and
you'll want to re-enable it after you've logged out). Works on SunOS
4.0.3, and also on back to 3.2 or so (when I originally wrote the
program).
/*
* fixcapslock - manipulate CAPS LOCK key behavior on a Sun keyboard
*
* Stan Tazuma - 5/20/88
*
* if no arguments, the CAPS LOCK key is disabled in the unshifted mode,
* requiring the use of SHIFT/CAPS or CTRL/CAPS to enter/exit
* CAPS LOCK mode.
* if argv[1] is "reset" or "enable", the CAPS LOCK is fully
* re-enabled ("setkeys reset" also works).
* if argv[1] is "disable" (or anything besides "reset" and "enable"), the
* CAPS LOCK key is completely disabled.
*/
#include <sys/types.h>
#include <sundev/kbd.h>
#include <sundev/kbio.h>
#define streq(a,b) (strcmp(a,b) == 0)
main(argc, argv)
int argc;
char **argv;
{
int fd;
int value;
fd = open("/dev/kbd", 1);
if (fd < 0) {
perror("/dev/kbd");
exit(1);
}
value = NOP;
if (argc > 1) {
if (streq(argv[1], "reset") || streq(argv[1], "enable"))
value = SHIFTKEYS + CAPSLOCK;
}
/* change it in the Unshifted map */
set_capslock_key(fd, 0, value);
/* change it in the Caps Locked map */
set_capslock_key(fd, CAPSMASK, value);
if (argc > 1) {
/* change it in the Shifted map and Ctrl map (results in
* it being changed everywhere) */
set_capslock_key(fd, SHIFTMASK, value);
set_capslock_key(fd, CTRLMASK, value);
}
exit(0);
}
set_capslock_key(fd, tablemask, value)
int fd;
int tablemask;
int value;
{
struct kiockey key;
key.kio_tablemask = tablemask;
key.kio_station = 0x77;
key.kio_entry = value;
if (ioctl(fd, KIOCSETKEY, &key) < 0 ) {
perror("KIOCSETKEY");
}
}
More information about the Comp.sys.sun
mailing list