Dvorak keyboard software on a Sun (source included)

Alan Dewar dewar at cpsc.ucalgary.ca
Tue Feb 28 20:46:15 AEST 1989


In article <890201-093010-10574 at Xerox>, SBartlett.OsbuSouth at xerox.com writes:
> Does anyone out there in net-land know of a way I can configure a Sun to
> treat its standard keyboard as having a Dvorak layout?

I put together a Dvorak keyboard for the Sun 3 some time ago, mostly just
to see if it could be done.  What I wrote was actually a little more
general than that--it can be used to set any keyboard mapping you like.
The user interface is somewhat unfriendly, I'm afraid.  You have to edit
binary files by hand if you want anything new.  (I started with the
standard QWERTY mapping, obtained by my "getkbd.c", and edited it to get a
Dvorak layout.) In any event, it works, and I did get a Dvorak keyboard.
Any enhancements to the programs would be welcome.

The following programs, getkbd.c and setkbd.c, respectively get and set
the keyboard mapping, writing to stdout or reading from stdin.  Two
mappings (uuencoded) are also included:  qwerty.kbd and dvorak.kbd.

Alan Dewar	Computer Science Dept.	University of Calgary
dewar at cpsc.UCalgary.CA		..!alberta!calgary!dewar
- - - - - - - - - - - - - - - - - cut here - - - - - - - - - - - - - - - - -
/* getkbd.c								*/
/* write the current Sun 3 keyboard layout to stdout (for setkbd)	*/
/*									*/
/* Written:	88-04-20 Alan Dewar (dewar at cpsc.UCalgary.CA)		*/

#include <stdio.h>
#include <sys/file.h>
#include <sys/ioctl.h>
#include <sundev/kbd.h>
#include <sys/types.h>
#include <sundev/kbio.h>

static int	TABLEMASKS[] = {0, CAPSMASK, SHIFTMASK, CTRLMASK, UPMASK};
#define NMASKS	( sizeof(TABLEMASKS) / sizeof(int) )

main ()
{
    int			fd;
    struct kbd_data {
	struct keyboard	kbd;
	struct keymap	map[NMASKS];
	char		string[16][KTAB_STRLEN];
    }			data;
    struct kiockey	key;
    int			mask, station;
    int			m, n;
    int			err;

    fd = open ("/dev/kbd", O_RDWR);
    if (fd < 0) {
	fprintf (stderr, "Cannot open /dev/kbd\n");
	exit (-1);
    }
    for (m = 0; m < 16; m++) {
	for (n = 0; n < KTAB_STRLEN; n++) {
	    data.string[m][n] = '\0';
	}
    }

    for (mask = 0; mask < NMASKS; mask++) {
	((struct keymap **)(&data.kbd))[mask] = &data.map[mask];
	key.kio_tablemask = TABLEMASKS[mask];
	for (station = 0; station < 128; station++) {
	    key.kio_station = station;
	    err = ioctl (fd, KIOCGETKEY, &key);
	    if (err != 0) {
		fprintf ("Error %d encountered\n", err);
	    }
	    data.map[mask].keymap[station] = key.kio_entry;
	    if (key.kio_entry >= STRING && key.kio_entry < STRING+16) {
		m = key.kio_entry & 0x0F;
		for (n = 0; n < KTAB_STRLEN; n++) {
		    data.string[m][n] = key.kio_string[n];
		}
	    }
	}
    }
    key.kio_tablemask = -1;
    err = ioctl (fd, KIOCGETKEY, &key);
    if (err != 0) {
	fprintf ("Error %d encountered\n", err);
    }
    data.kbd.k_abort1 = key.kio_station;
    key.kio_tablemask = -2;
    err = ioctl (fd, KIOCGETKEY, &key);
    if (err != 0) {
	fprintf ("Error %d encountered\n", err);
    }
    data.kbd.k_abort2 = key.kio_station;

    for (mask = 0; mask < NMASKS; mask++) {
	(long) (((struct keymap **)(&data.kbd))[mask]) =
		(char *) (((struct keymap **)(&data.kbd))[mask])
		- (char *) (&data);
    }
    fwrite (&data, sizeof(data), 1, stdout);
}
- - - - - - - - - - - - - - - - - cut here - - - - - - - - - - - - - - - - -
/* setkbd.c								*/
/* set the Sun 3 keyboard layout as specified by stdin (from getkbd)	*/
/*									*/
/* Written:	88-04-20 Alan Dewar (dewar at cpsc.UCalgary.CA)		*/

#include <stdio.h>
#include <sys/file.h>
#include <sys/ioctl.h>
#include <sundev/kbd.h>
#include <sys/types.h>
#include <sundev/kbio.h>

static int	TABLEMASKS[] = {0, CAPSMASK, SHIFTMASK, CTRLMASK, UPMASK};
#define NMASKS	( sizeof(TABLEMASKS) / sizeof(int) )

main ()
{
    int			fd;
    struct kbd_data {
	struct keyboard	kbd;
	struct keymap	map[NMASKS];
	char		string[16][KTAB_STRLEN];
    }			data;
    struct kiockey	key;
    int			mask, station;
    int			m, n;
    int			err;

    fd = open ("/dev/kbd", O_RDWR);
    if (fd < 0) {
	fprintf (stderr, "Cannot open /dev/kbd\n");
	exit (-1);
    }
    if (fread (&data, sizeof(data), 1, stdin) != 1) {
	fprintf (stderr, "Cannot read keyboard data\n");
	exit (-2);
    }
    for (mask = 0; mask < NMASKS; mask++) {
	(char *) (((struct keymap **)(&data.kbd))[mask]) =
		(char *) (&data)
		+ (long) (((struct keymap **)(&data.kbd))[mask]);
    }

    for (mask = 0; mask < NMASKS; mask++) {
	key.kio_tablemask = TABLEMASKS[mask];
	for (station = 0; station < 128; station++) {
	    key.kio_station = station;
	    key.kio_entry = data.map[mask].keymap[station];
	    if (key.kio_entry >= STRING && key.kio_entry < STRING+16) {
		m = key.kio_entry & 0x0F;
		for (n = 0; n < KTAB_STRLEN; n++) {
		    key.kio_string[n] = data.string[m][n];
		}
	    }
	    err = ioctl (fd, KIOCSETKEY, &key);
	    if (err != 0) {
		fprintf ("Error %d encountered\n", err);
	    }
	}
    }
    key.kio_tablemask = -1;
    key.kio_station = data.kbd.k_abort1;
    err = ioctl (fd, KIOCSETKEY, &key);
    if (err != 0) {
	fprintf ("Error %d encountered\n", err);
    }
    key.kio_tablemask = -2;
    key.kio_station = data.kbd.k_abort2;
    err = ioctl (fd, KIOCSETKEY, &key);
    if (err != 0) {
	fprintf ("Error %d encountered\n", err);
    }
}
- - - - - - - - - - - - - - - - - cut here - - - - - - - - - - - - - - - - -
begin 644 qwerty.kbd
M    (@   *(   $B   !H@   B(           %-     **1HL&BX.&BXJ+C
MHN2BY:+FY^@&HM#1TJ+"PZ*B&S$R,S0U-C<X.3 M/6 (HM/4U:+$HL6B"7%W
M97)T>75I;W!;77^BUK'8HL;'S:*$87-D9F=H:FML.R=<#:*SVK2BR,[)HH)Z
M>&-V8FYM+"XO at PK<LMZBHJ*B@) @D**BHJ>HHI&BP:+ at X:+BHN.BY*+EHN;G
MZ :BT-'2HL+#HJ(;,3(S-#4V-S at Y,"T]8 BBT]35HL2BQ:()45=%4E1954E/
M4%M=?Z+6L=BBQL>BHH1!4T1&1TA*2TP[)UP-HK/:M*+(SLFB at EI80U9"3DTL
M+B^#"MRRWJ*BHJ* D""0HJ*BIZBBD:+!HN#AHN*BXZ+DHN6BYN?H!J+0T=*B
MPL.BHALA0",D)5XF*B at I7RM^"*+3U-6BQ*+%H at E15T525%E524]0>WU_HM:Q
MV*+&QZ*BA$%31$9'2$I+3#HB? VBL]JTHLC.R:*"6EA#5D).33P^/X,*W++>
MHJ*BHH"0()"BHJ*GJ**1HL&BX.&BXJ+CHN2BY:+FY^@&HM#1TJ+"PZ*B&S$ 
M,S0U'C<X.3 ?/1X(HM/4U:+$HL6B"1$7!1(4&14)#Q ;'7^BUK'8HL;'HJ*$
M 1,$!@<("@L,.R<<#:*SVK2BR,[)HH(:& ,6 @X-+"X?@PK<LMZBHJ*B@)  
MD**BHJ>HHI&BH:*AH:*AHJ&BH:*AHJ&AH:&BH:&@HJ&AHJ*@H*"@H*"@H*"@
MH*"@H*"BH:&@HJ&BH:*@H*"@H*"@H*"@H*"@H**AH:"BH:&BHH2 at H*"@H*"@
MH*"@H*"@HJ&AH**AH:&B at J"@H*"@H*"@H*"#H*&AH**BHJ*@D*"0HJ*BHJ8 
M            &UM!         !M;0@         ;6T0         &UM#    
M                                                            
M                                                            
8                                

end
- - - - - - - - - - - - - - - - - cut here - - - - - - - - - - - - - - - - -
begin 644 dvorak.kbd
M    (@   *(   $B   !H@   B(           %-     **1HL&BX.&BXJ+C
MHN2BY:+FY^@&HM#1TJ+"PZ*B&S$R,S0U-C<X.3!;76 (HM/4U:+$HL6B"2\L
M+G!Y9F=C<FPG/7^BUK'8HL;'S:*$86]E=6ED:'1N<RU<#:*SVK2BR,[)HH([
M<6IK>&)M=W9Z at PK<LMZBHJ*B@) @D**BHJ>HHI&BP:+ at X:+BHN.BY*+EHN;G
MZ :BT-'2HL+#HJ(;,3(S-#4V-S at Y,%M=8 BBT]35HL2BQ:()+RPN4%E&1T-2
M3"<]?Z+6L=BBQL>BHH1!3T55241(5$Y3+5P-HK/:M*+(SLFB at CM12DM80DU7
M5EJ#"MRRWJ*BHJ* D""0HJ*BIZBBD:+!HN#AHN*BXZ+DHN6BYN?H!J+0T=*B
MPL.BHALA0",D)5XF*B at I>WU^"*+3U-6BQ*+%H at D_/#Y0649'0U),(BM_HM:Q
MV*+&QZ*BA$%/155)1$A43E-?? VBL]JTHLC.R:*".E%*2UA"35=66H,*W++>
MHJ*BHH"0()"BHJ*GJ**1HL&BX.&BXJ+CHN2BY:+FY^@&HM#1TJ+"PZ*B&S$ 
M,S0U'C<X.3 ;'1X(HM/4U:+$HL6B"1\L+A 9!@<#$@PG/7^BUK'8HL;'HJ*$
M 0\%%0D$"!0.$Q\<#:*SVK2BR,[)HH([$0H+& (-%Q8:@PK<LMZBHJ*B@)  
MD**BHJ>HHI&BH:*AH:*AHJ&BH:*AHJ&AH:&BH:&@HJ&AHJ*@H*"@H*"@H*"@
MH*"@H*"BH:&@HJ&BH:*@H*"@H*"@H*"@H*"@H**AH:"BH:&BHH2 at H*"@H*"@
MH*"@H*"@HJ&AH**AH:&B at J"@H*"@H*"@H*"#H*&AH**BHJ*@D*"0HJ*BHJ8 
M            &UM!         !M;0@         ;6T0         &UM#    
M                                                            
M                                                            
8                                

end
- - - - - - - - - - - - - - - - - cut here - - - - - - - - - - - - - - - - -



More information about the Comp.sys.sun mailing list