edmoy@OPAL.BERKELEY.EDU (06/24/87)
I've had the need to do yet-another-hack to the Sun server code to allow mapping
the Sun 3/50 keys to simulate a VT100/220 keyboard, for those users who have
Suns and want to talk to VMS (strange but true).
I did it in a more general way, so that the server will look for a
.Xkeybdmap file in the users home directory on startup, or a system-wide
file to replace its default mapping. Since the maps are in binary, I
wrote a simple program in which you muck with the mapping, compile and
run and it will make the appropriate map file.
Following is a shar file that contains the diffs to libsun/events.c and
libsun/vssite.h and the map-creation program, keybd.c.
Edward Moy (I'd rather VaxStation II than Sun anyday)
Academic Computing Services
University of California
Berkeley, CA 94720
edmoy@opal.Berkeley.EDU
ucbvax!opal!edmoy
--------------- cut ----------------------------- cut -----------------------
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
# events.c.diff
# vssite.h.diff
# keybd.c
# libsun.shar - archive created: Wed Jun 24 12:30:16 PDT 1987
if test -f events.c.diff
then
echo shar: will not overwrite existing file "'events.c.diff'"
else
echo 'x - events.c.diff'
cat << \RAZZLE!DAZZLE > events.c.diff
*** events.c.orig Fri Jan 23 18:12:24 1987
--- events.c Fri Jun 12 12:06:07 1987
***************
*** 55,60 ****
--- 55,63 ----
#include <sundev/kbd.h>
#ifdef RAW_KBD
#include <sundev/kbio.h>
+ #include <sys/file.h>
+ #include <pwd.h>
+ #include "vssite.h"
#endif
#include <sunwindow/win_input.h>
***************
*** 93,98 ****
--- 96,102 ----
#ifdef RAW_KBD
extern struct kiockey sunkeymap[];
+ static int init_keybd = 0;
/*
* Convert from a Sun event to an X event
***************
*** 126,131 ****
--- 130,168 ----
kludgekey = 0;
if (key >= 0) {
+ if(!init_keybd) {
+ /*
+ * Do this only once, at the very first. Try to read in
+ * any existing keyboard map files. Try users private
+ * .Xkeybdmap in home directory and if none, try systemwide
+ * one in DEFAULT_KEYBD_MAP_PATH (defined in vssite.h).
+ */
+ register char *cp;
+ register int fd = -1;
+ register struct passwd *pw;
+ char buf[512];
+ char *getenv();
+
+ init_keybd = 1;
+ if((!(cp = getenv("HOME")) || !*cp) &&
+ (pw = getpwuid(getuid())))
+ cp = pw->pw_dir;
+ if(cp && *cp) {
+ strcpy(buf, cp);
+ strcat(buf, "/.Xkeybdmap");
+ if(access(buf, R_OK) >= 0)
+ fd = open(buf, O_RDONLY, 0);
+ }
+ if(fd < 0 && access(DEFAULT_KEYBD_MAP_PATH, R_OK) >= 0)
+ fd = open(DEFAULT_KEYBD_MAP_PATH, O_RDONLY, 0);
+ if(fd >= 0) {
+ read(fd, (char *)TopKeys, sizeof(TopKeys));
+ read(fd, (char *)RightKeys, sizeof(RightKeys));
+ read(fd, (char *)LeftKeys, sizeof(LeftKeys));
+ read(fd, (char *)BotKeys, sizeof(BotKeys));
+ close(fd);
+ }
+ }
xe->vse_device = VSE_DKB;
xe->vse_type = VSE_BUTTON;
***************
*** 206,221 ****
kludgekey = 0206;
break;
case UPARROW:
! kludgekey = 0252;
break;
case DOWNARROW:
! kludgekey = 0251;
break;
case LEFTARROW:
! kludgekey = 0247;
break;
case RIGHTARROW:
! kludgekey = 0250;
break;
}
break;
--- 243,258 ----
kludgekey = 0206;
break;
case UPARROW:
! kludgekey = RightKeys[7];
break;
case DOWNARROW:
! kludgekey = RightKeys[13];
break;
case LEFTARROW:
! kludgekey = RightKeys[9];
break;
case RIGHTARROW:
! kludgekey = RightKeys[11];
break;
}
break;
RAZZLE!DAZZLE
fi # End events.c.diff
if test -f vssite.h.diff
then
echo shar: will not overwrite existing file "'vssite.h.diff'"
else
echo 'x - vssite.h.diff'
cat << \RAZZLE!DAZZLE > vssite.h.diff
*** vssite.h.orig Sun Mar 1 13:55:49 1987
--- vssite.h Fri Jun 12 11:51:03 1987
***************
*** 7,12 ****
** be stored so that different sites can have control over where things live.
**
*/
! #define DEFAULT_FONT_PATH "/usr/new/lib/X/font:~/font"
#define DEFAULT_FONT_SUFFIX ".onx"
--- 7,13 ----
** be stored so that different sites can have control over where things live.
**
*/
! #define DEFAULT_FONT_PATH "/usr/local/lib/X/font:~/font"
#define DEFAULT_FONT_SUFFIX ".onx"
+ #define DEFAULT_KEYBD_MAP_PATH "/usr/local/lib/X/Xkeybdmap"
RAZZLE!DAZZLE
fi # End vssite.h.diff
if test -f keybd.c
then
echo shar: will not overwrite existing file "'keybd.c'"
else
echo 'x - keybd.c'
cat << \RAZZLE!DAZZLE > keybd.c
/*
* The program makes a .Xkeybdmap file, used to change the keyboard map
* of a Sun 3/50 running under X. The configuration of the map in this file
* emulates a VT100/220 keyboard and allows the Sun to use the full screen
* editing capability on VMS, for instance.
*
* After changing the map (as needed), compile the program and run it. The
* map is written to the standard out. Use the modified Sun server and either
* move the map to the home directory as .Xkeybdmap, or install it in the
* system-wide location as DEFAULT_KEYBD_MAP_PATH (defined in vssite.h).
*
* Written by:
* Edward Moy
* Academic Computing Services
* University of California
* Berkeley, CA 94720
*
* edmoy@opal.Berkeley.EDU
* ucbvax!opal!edmoy
*/
#include <stdio.h>
#include <sys/types.h>
static u_short TopKeys[16] = {
0252, /* F1 (UP) */
0251, /* F2 (DOWN) */
0247, /* F3 (LEFT) */
0250, /* F4 (RIGHT) */
0132, /* F5 */
0241, /* F6 (PF1) */
0242, /* F7 (PF2) */
0243, /* F8 (PF3) */
0244, /* F9 (PF4) */
0150, /* F10 */
0161, /* F11/ESC */
0162, /* F12/BS */
0163, /* F13/LF */
0164, /* F14 */
0174, /* F15 */
0175, /* F16 */
};
static u_short RightKeys[16] = {
0235, /* R1 (7) */
0236, /* R2 (8) */
0237, /* R3 (9) */
0231, /* R4 (4) */
0232, /* R5 (5) */
0233, /* R6 (6) */
0226, /* R7 (1) */
0227, /* R8 (2) */
0230, /* R9 (3) */
0222, /* R10 (0) */
0224, /* R11 (PERIOD) */
0240, /* R12 (MINUS) */
0234, /* R13 (COMMA) */
0225, /* R14 (ENTER) */
0225, /* R15 (ENTER) */
0211, /* R16 */
};
static u_short LeftKeys[16] = {
0176, /* L1 */
0177, /* L2 */
0174, /* L3 (F15) */
0175, /* L4 (F16) */
0212, /* L5 (E1) */
0213, /* L6 (E2) */
0214, /* L7 (E3) */
0215, /* L8 (E4) */
0216, /* L9 (E5) */
0217, /* L10(E6) */
0245, /* L11/ALT */
0246, /* L12 */
0253, /* L13 */
0254, /* L14 */
0255, /* L15 */
0262, /* L16 */
};
static u_short BotKeys[16] = {
0220, /* B1 */
0221, /* B2 */
0222, /* B3 (KEYPAD_0) */
0223, /* B4 */
0224, /* B5 (KEYPAD_PERIOD) */
0225, /* B6 (ENTER) */
0226, /* B7 (KEYPAD_1) */
0227, /* B8 (KEYPAD_2) */
0230, /* B9 (KEYPAD_3) */
0231, /* B10 (KEYPAD_4) */
0232, /* B11 (KEYPAD_5) */
0233, /* B12 (KEYPAD_6) */
0234, /* B13 (KEYPAD_COMMA) */
0235, /* B14 (KEYPAD_7) */
0236, /* B15 (KEYPAD_8) */
0237, /* B16 (KEYPAD_9) */
};
main()
{
if(fwrite((char *)TopKeys, 1, sizeof(TopKeys), stdout) !=
sizeof(TopKeys)) {
fputs("write error on TopKeys\n", stderr);
exit(1);
}
if(fwrite((char *)RightKeys, 1, sizeof(RightKeys), stdout) !=
sizeof(RightKeys)) {
fputs("write error on RightKeys\n", stderr);
exit(1);
}
if(fwrite((char *)LeftKeys, 1, sizeof(LeftKeys), stdout) !=
sizeof(LeftKeys)) {
fputs("write error on LeftKeys\n", stderr);
exit(1);
}
if(fwrite((char *)BotKeys, 1, sizeof(BotKeys), stdout) !=
sizeof(BotKeys)) {
fputs("write error on BotKeys\n", stderr);
exit(1);
}
exit(0);
}
RAZZLE!DAZZLE
fi # End keybd.c
echo '***** End of' libsun.shar '*****'
exit