Hello,
My first question :
>We've got about 50 SparcStations with different keyboards.
>Somme are type 5, somme are type 4, somme are qwerty, and some are azerty.
>The probleme is between type 4 and type 5.
>With type 4, the delete key is placed very conveniently on the keyboard
>(up-right), and we all use it to delete the last caracter.
>With type 5 keybord, this convenient place (up-right) is for the backspace
key, >but this key produce a "^H" and erase nothing (eg : in a OpenWindows3's
>shelltool).
>I want to map the keybord in this manner :
> - If my keyboard is a type 4 so the delete key erase the last caracter.
> - If my keyboard is a type 5 so the backspace key erase the last caracter.
>
>I know how to remap a caracter (stty erase ^H), but I don't know how to check
>the keybord type.
>An other solution is to remap both the backspace key and the erase key for
>erasing the last caracter without checking the keyboard, but I don't know how
>to do this.
>
>Many thanks for all your help.
I've got the answer(s).
Thanks to :
Martin Kelly (dsnmkey@guinness.ericsson.se)
Mark Anderson (manderso@mitre.org)
Neal (nrd@lenti.med.umn.edu)
Joel Shandelman (shandelm@jpmorgan.com)
Kai Grossjohann (grossjoh@ls6.informatik.uni-dortmund.de)
Danny Johnson (danny@ews7.dseg.ti.com)
Nora Hermida (nhermida@sun1.wwb.noaa.gov)
There are a few solutions. One's working everytime (without any window manager,
with SunTools, OpenWindows and Motif) , other's working only with OpenWindows.
I prefere the first hand.
The first solutions test the keyboard :
````````````````````````````````````````````````````````````````````````````````
>From : Martin Kelly (dsnmkey@guinness.ericsson.se)
```````````````````
/*
* FILE: kbinfo.c
* AUTHOR: Martin Kelly DSN/D/N dsnmkey@guinness.ericsson.se
* DESCR: Program to query a keyboard type on a Sun
* DATE: 16-Feb-1993
*
* COPYRIGHT:
*
* VERSION: 1.0
*
* USAGE: kbinfo [-v]
* returns the type (number) of the keyboard as defined
* in the keytables.map file. These number directly correlate
* with the files in the /usr/share/lib/keytables directory.
* The verbose flag -v returns the full text name as specified
* in that file.
*/
#include <ctype.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sundev/kbio.h>
#include <sundev/kbd.h>
#define TRUE 1
int kb;
int keyboard = 0;
int verbose_flag = 0;
char *progname;
char *kbd_layout[ ] = {
"US4", "US4", "FranceBelg4", "Canada4", "Denmark4", "Germany4", "Italy4",
"Netherland4", "Norway4", "Portugal4", "SpainLatAm4", "SwedenFin4",
"Switzer_Fr4", "Switzer_Ge4", "UK4", "", "Korea4", "Taiwan4",
"", "US101A_PC", "", "", "", "", "", "", "", "", "", "", "", "",
"Japan4", "US5", "US_UNIX5", "France5", "Denmark5", "Germany5", "Italy5",
"Netherland5", "Norway5", "Portugal5", "Spain5", "Sweden5", "Switzer_Fr5",
"Switzer_Ge5", "UK5", "Korea5", "Taiwan5", "Japan5", "", "",
"", "", "", "", "", "", "", "" };
main(argc,argv)
int argc;
char **argv;
{
progname = *argv;
while (argc > 1)
{
++argv;
--argc;
switch (*(++*argv))
{
case 'v':
verbose_flag = TRUE;
break;
case 'h':
fprintf(stdout,"%s: not very helpful\n",progname);
exit(0);
break;
case 'V':
version();
break;
default:
usage();
break;
}
}
read_kbd();
exit(0);
}
int read_kbd()
{
if ((kb = open("/dev/kbd", O_RDONLY)) < 0)
{
fprintf(stderr,"%s: couldn't open keyboard\n",progname);
exit(-1);
}
if (ioctl(kb, KIOCLAYOUT, &keyboard) < 0)
{
fprintf(stderr,"%s: couldn't get keyboard layout\n",progname);
exit(-1);
}
else
if (verbose_flag)
printf("%s\n",(keyboard < 60) ? kbd_layout[keyboard] :
"unknown" );
else
printf("%d\n",keyboard);
return;
}
int usage()
{
fprintf(stderr,"Usage: %s [-v] \n",progname);
exit(0);
}
int version()
{
fprintf(stdout,"%s: Version 1.0 Release 1\n", progname);
exit(0);
}
````````````````````````````````````````````````````````````````````````````````
>From : Joel Shandelman (shandelm@jpmorgan.com)
```````````
/*
* kbdtype - utility to print out string identifying Sun keyboard type
*
* This program can be used to determine the type and layout of any
* keyboard connected to a Sun system. The information can be useful
* for setting up keyboard mappings and selecting X Window System
* application defaults.
*
* Copyright 1993 by the ASK/Ingres Corporation.
*
* Author: Mike Glendinning, Ingres UK.
*/
#include <stdio.h>
#include <string.h>
#include <sys/fcntl.h>
#include <sundev/kbd.h>
#include <sundev/kbio.h>
char *programname;
usage ()
{
fprintf (stderr, "Usage: %s [-brief][-kbd device]\n",
programname);
exit (1);
}
main (argc, argv)
int argc;
char *argv[];
{
int brief = 0;
char *kbddevice = "/dev/kbd";
int kbdfd;
int kbdtype, kbdlayout;
char *kbdstr = "";
char unknownstr[60];
int i;
char *cp;
programname = argv[0];
cp = strrchr (programname, '/');
if (cp != NULL)
programname = cp+1;
for (i = 1; i < argc; i++) {
char *arg = argv[i];
int arglen = strlen (arg);
if (arg[0] == '-') {
if ((arg[1] == 'b') && !strncmp (arg, "-brief", arglen))
brief = 1;
else if ((arg[1] == 'k') && !strncmp (arg, "-kbd", arglen)) {
if (++i >= argc) usage ();
kbddevice = argv[i];
} else
usage ();
} else
usage ();
}
if ((kbdfd = open (kbddevice, O_RDONLY)) < 0) {
fprintf (stderr, "%s: couldn't open '%s': ", programname, kbddevice);
perror (NULL);
exit (1);
}
if (ioctl (kbdfd, KIOCTYPE, &kbdtype) < 0) {
fprintf (stderr, "%s: unable to get keyboard type: ", programname);
perror (NULL);
close (kbdfd);
exit (1);
}
/*
* I'm not sure how many of these values for 'kbdtype' can actually
* occur. This is the complete list from '/usr/include/sundev/kbd.h'.
* Any redundant values will not do too much harm, however.
*/
switch (kbdtype) {
case KB_KLUNK: /* Micro Switch 103SD32-2 */
kbdstr = (brief ? "klunk" : " Micro Switch 103SD32-2.");
break;
case KB_VT100: /* Keytronics VT100 compatible */
kbdstr = (brief ? "vt100" : " Keytronics VT100 compatible.");
break;
case KB_SUN2: /* Sun-2 custom keyboard */
kbdstr = (brief ? "sun2" : " Type-2 Sun keyboard.");
break;
case KB_SUN3: /* Type 3 Sun keyboard */
kbdstr = (brief ? "sun3" : " Type-3 Sun keyboard.");
break;
case KB_SUN4: /* Type 4 Sun keyboard */
if (ioctl (kbdfd, KIOCLAYOUT, &kbdlayout) < 0) {
fprintf (stderr, "%s: unable to get type 4 keyboard layout: ", programname);
perror (NULL);
close (kbdfd);
exit (1);
}
switch (kbdlayout) {
case 0x00: /* US4 */
case 0x01: /* US4 */
kbdstr = (brief ? "US4" : " Type-4 U.S. keyboard.");
break;
case 0x02: /* FranceBelg4 */
kbdstr = (brief ? "FranceBelg4" : " Type-4 French & Belgian keyboard.");
break;
case 0x03: /* Canada4 */
kbdstr = (brief ? "Canada4" : " Type-4 Canadian keyboard.");
break;
case 0x04: /* Denmark4 */
kbdstr = (brief ? "Denmark4" : " Type-4 Danish keyboard.");
break;
case 0x05: /* Germany4 */
kbdstr = (brief ? "Germany4" : " Type-4 German keyboard.");
break;
case 0x06: /* Italy4 */
kbdstr = (brief ? "Italy4" : " Type-4 Italian keyboard.");
break;
case 0x07: /* Netherland4 */
kbdstr = (brief ? "Netherland4" : " Type-4 Dutch keyboard.");
break;
case 0x08: /* Norway4 */
kbdstr = (brief ? "Norway4" : " Type-4 Norwegian keyboard.");
break;
case 0x09: /* Portugal4 */
kbdstr = (brief ? "Portugal4" : " Type-4 Portuguese keyboard.");
break;
case 0x0a: /* SpainLatAm4 */
kbdstr = (brief ? "SpainLatAm4" : " Type-4 Spanish & Latin American
keyboard.");
break;
case 0x0b: /* SwedenFin4 */
kbdstr = (brief ? "SwedenFin4" : " Type-4 Swedish & Finnish keyboard.");
break;
case 0x0c: /* Switzer_Fr4 */
kbdstr = (brief ? "Switzer_Fr4" : " Type-4 Swiss-French keyboard.");
break;
case 0x0d: /* Switzer_Ge4 */
kbdstr = (brief ? "Switzer_Ge4" : " Type-4 Swiss-German keyboard.");
break;
case 0x0e: /* UK4 */
kbdstr = (brief ? "UK4" : " Type-4 United Kingdom keyboard.");
break;
case 0x10: /* Korea4 */
kbdstr = (brief ? "Korea4" : " Type-4 Korean keyboard.");
break;
case 0x11: /* Taiwan4 */
kbdstr = (brief ? "Taiwan4" : " Type-4 Taiwanese keyboard.");
break;
case 0x13: /* US101A_Sun */
kbdstr = (brief ? "US101A_Sun" : " Type-4 Sun U.S. 101A keyboard.");
break;
case 0x20: /* Japan4 */
kbdstr = (brief ? "Japan4" : " Type-4 Japanese keyboard.");
break;
case 0x21: /* US5 */
kbdstr = (brief ? "US5" : " Type-5 U.S. keyboard.");
break;
case 0x22: /* US_UNIX5 */
kbdstr = (brief ? "US_UNIX5" : " Type-5 U.S. UNIX keyboard.");
break;
case 0x23: /* France5 */
kbdstr = (brief ? "France5" : " Type-5 French keyboard.");
break;
case 0x24: /* Denmark5 */
kbdstr = (brief ? "Denmark5" : " Type-5 Danish keyboard.");
break;
case 0x25: /* Germany5 */
kbdstr = (brief ? "Germany5" : " Type-5 German keyboard.");
break;
case 0x26: /* Italy5 */
kbdstr = (brief ? "Italy5" : " Type-5 Italian keyboard.");
break;
case 0x27: /* Netherland5 */
kbdstr = (brief ? "Netherland5" : " Type-5 Dutch keyboard.");
break;
case 0x28: /* Norway5 */
kbdstr = (brief ? "Norway5" : " Type-5 Norwegian keyboard.");
break;
case 0x29: /* Portugal5 */
kbdstr = (brief ? "Portugal5" : " Type-5 Portuguese keyboard.");
break;
case 0x2a: /* Spain5 */
kbdstr = (brief ? "Spain5" : " Type-5 Spanish keyboard.");
break;
case 0x2b: /* Sweden5 */
kbdstr = (brief ? "Sweden5" : " Type-5 Swedish keyboard.");
break;
case 0x2c: /* Switzer_Fr5 */
kbdstr = (brief ? "Switzer_Fr5" : " Type-5 Swiss-French keyboard.");
break;
case 0x2d: /* Switzer_Ge5 */
kbdstr = (brief ? "Switzer_Ge5" : " Type-5 Swiss-German keyboard.");
break;
case 0x2e: /* UK5 */
kbdstr = (brief ? "UK5" : " Type-5 United Kingdom keyboard.");
break;
case 0x2f: /* Korea5 */
kbdstr = (brief ? "Korea5" : " Type-5 Korean keyboard.");
break;
case 0x30: /* Taiwan5 */
kbdstr = (brief ? "Taiwan5" : " Type-5 Taiwanese keyboard.");
break;
case 0x31: /* Japan5 */
kbdstr = (brief ? "Japan5" : " Type-5 Japanese keyboard.");
break;
default:
if (brief)
kbdstr = "sun4";
else {
sprintf (unknownstr, " Type-4 Sun keyboard (layout %d).", kbdlayout);
kbdstr = unknownstr;
}
break;
}
break;
case KB_VT220: /* Emulation vt220 */
kbdstr = (brief ? "vt220" : " vt220 emulation.");
break;
case KB_VT220I: /* International vt220 Emulation */
kbdstr = (brief ? "vt220i" : " vt220 emulation (international).");
break;
case KB_ASCII: /* Ascii terminal masquerading as kbd */
kbdstr = (brief ? "ascii" : "n ASCII terminal.");
break;
default:
if (brief)
kbdstr = "unknown";
else {
sprintf (unknownstr, "n unknown keyboard type (%d).", kbdtype);
kbdstr = unknownstr;
}
break;
}
if (!brief)
printf ("Keyboard '%s' is a", kbddevice);
printf ("%s\n", kbdstr);
close (kbdfd);
exit (0);
}
The second solutions remap the keybord without testing it :
````````````````````````````````````````````````````````````````````````````````
>From : Neal (nrd@lenti.med.umn.edu)
```````````
In .xinitrc
xmodmap -e "keysym BackSpace = Delete"
In .Xdefaults
XTerm*ttyModes: erase ^?
This maps the backspace key to be the delete key. This way they both
work. If I need to use ^H, I type it. I sometimes have to do this
when telneting or ftping to some sites. Rlogin passes this info.
````````````````````````````````````````````````````````````````````````````````
>From : Kai Grossjohann (grossjoh@ls6.informatik.uni-dortmund.de)
```````````````````````
Use xmodmap:
xmodmap -e 'keycode 50=Delete'
On the Sun4 keyboard, this is the Backspace key, and after this
command the Backspace key behaves just like the Delete key. I think
this works for the Sun5 keyboard, too
This archive was generated by hypermail 2.1.2 : Fri Sep 28 2001 - 23:08:09 CDT