|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T i
Length: 16854 (0x41d6) Types: TextFile Names: »inputlib.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─⟦this⟧ »./X.V10R4/Toolkit/Xr/src/Xrlib/Intrinsic/inputlib.c«
/* * $Source: /u1/Xr/src/Xrlib/Intrinsic/RCS/inputlib.c,v $ * $Header: inputlib.c,v 1.1 86/12/17 09:09:08 swick Exp $ */ #ifndef lint static char *rcsid_inputlib_c = "$Header: inputlib.c,v 1.1 86/12/17 09:09:08 swick Exp $"; #endif lint #include <Xr/xr-copyright.h> /* $Header: inputlib.c,v 1.1 86/12/17 09:09:08 swick Exp $ */ /* Copyright 1986, Hewlett-Packard Company */ /* Copyright 1986, Massachussetts Institute of Technology */ static char rcsid[] = "$Header: inputlib.c,v 1.1 86/12/17 09:09:08 swick Exp $"; /*************************************<+>************************************* ***************************************************************************** ** ** File: inputlib.c ** ** Project: X-ray Toolbox ** ** Description: ** ** ** ------------------------ MODIFICATION RECORD ------------------------ * * $Log: inputlib.c,v $ * Revision 1.1 86/12/17 09:09:08 swick * Initial revision * * Revision 7.0 86/11/13 08:21:32 08:21:32 rick () * Final QA release * * Revision 6.0 86/11/10 15:22:40 15:22:40 rick () * QA #2 release * * Revision 5.1 86/11/07 14:02:27 14:02:27 rick () * Added the copyright message. * * Revision 5.0 86/10/28 08:23:22 08:23:22 rick () * QA #1.1 release * * Revision 4.2 86/10/24 10:19:33 10:19:33 karen * remove display parameter for XrInputInit(), use macro to get display type * * Revision 3.1 86/10/09 11:04:18 11:04:18 rick () * Fixed a couple of bugs. * * Revision 3.0 86/10/02 15:59:11 15:59:11 rick () * Alpha release set to 3.0 * * Revision 1.1 86/10/02 07:17:21 07:17:21 fred () * Initial revision * * ***************************************************************************** *************************************<+>*************************************/ #define TRUE 1 #define FALSE 0 #include <Xr/keycode.h> #include "X/Xlib.h" #include <fcntl.h> static struct kbd_state *k; extern unsigned char * k_alttab[]; extern unsigned char * k_langtab[]; extern unsigned char * k_isotab[]; extern unsigned short k_mute_enable[]; extern unsigned char k_alt_enable[]; extern unsigned char k_16bit_enable[]; extern unsigned short k_code[]; extern char klang_jump[]; extern char * getenv(); extern char * malloc(); /* Initialize input structure */ unsigned char * XrInputInit() { char *home = getenv ("HOME"); k = (struct kbd_state *)malloc (sizeof(struct kbd_state)); if (DisplayType() >= 800 && DisplayType() < 900) { k->type = K_HP; k->language = k->pwr_language = klang_jump[(DisplayType() - 800) & 0x01F]; } else { k->type = K_DEFAULT; k->language = k->pwr_language = K_HP_USASCII; } k->last_char = 0; k->flags = K_ASCII8; if (home) { int homelen = strlen (home); char * keymapstr = "/.Xkeymap"; int keymapstrlen = strlen (keymapstr); char *filename = malloc (homelen + keymapstrlen + 1); int file = -1; strncpy (filename, home, homelen + 1); strncat (filename, keymapstr, keymapstrlen); file = open (filename, O_RDONLY, 0); if (file >= 0) { k->flags |= K_LOCALMAP; close (file); } free (filename); } kbd_language(); return ((unsigned char *) &k->k_iso7to8[0]); } /* Switch to a different keyboard language */ static kbd_language() { register unsigned char *p; register i; /* Point to Language Dependent Keycode Table */ k->langtab = k_langtab[k->language]; k->alttab = k_alttab[k->language]; /* Preload iso translation tables */ for (i = 0; i < 128; i++) k->k_iso7to8[i] = k->k_iso8to7[i] = (unsigned char)i; for (; i < 256; i++) k->k_iso8to7[i] = (unsigned char)i; /* Set up ISO 7 Bit Conversion Routine */ p = k_isotab[k->language]; /* Fill in 7 to 8 bit translations */ k->k_iso8to7[*p] = 35; k->k_iso7to8[35] = *p++; k->k_iso8to7[*p] = 39; k->k_iso7to8[39] = *p++; k->k_iso8to7[*p] = 60; k->k_iso7to8[60] = *p++; k->k_iso8to7[*p] = 62; k->k_iso7to8[62] = *p++; k->k_iso8to7[*p] = 64; k->k_iso7to8[64] = *p++; for (i = 91; i <= 94; i++) { k->k_iso8to7[*p] = i; k->k_iso7to8[i] = *p++; } i++; k->k_iso8to7[*p] = i; k->k_iso7to8[i] = *p++; for (i = 123; i <= 126; i++) { k->k_iso8to7[*p] = i; k->k_iso7to8[i] = *p++; } /* Set the default value for K_MUTE */ k->flags &= ~K_MUTE; k->flags |= k_mute_enable[(int)k->language]; k->flags &= ~K_ALT; k->alt = k_alt_enable[(int)k->language]; k->flags &= ~K_16BITIO; k->i16bit = k_16bit_enable[(int)k->language]; } XrInputMute(c) unsigned char c; { #ifndef CR #define CR 13 #endif unsigned char last; /* Handle ISO 7 Bit */ if (!(k->flags & K_ASCII8)) { last = k->k_iso8to7[c] & 0x07f; return(last); } /* Handle Mutes */ if (k->flags & K_MUTE) { last = k->last_char; /* Handle mutes or non-advancing diacriticals */ k->last_char = c; switch (c) { default: break; case R_BQUOTE: /* Back accent */ case R_FQUOTE: /* Forward accent */ case R_HAT: /* Hat accent */ case R_DDOT: /* Double Dot accent */ case R_TILTA: /* Tilda accent */ return(0+K_s); } switch (last) { default: return(c); case R_BQUOTE: /* Back accent */ switch (c) { default: break; case 'a': c = R_a_BQUOTE; break; case 'A': c = R_A_BQUOTE; break; case 'e': c = R_e_BQUOTE; break; case 'E': c = R_E_BQUOTE; break; case 'i': c = R_i_BQUOTE; break; case 'I': c = R_I_BQUOTE; break; case 'o': c = R_o_BQUOTE; break; case 'O': c = R_O_BQUOTE; break; case 'u': c = R_u_BQUOTE; break; case 'U': c = R_U_BQUOTE; break; case ' ': c = last; break; case CR: /* Send last first then what is there */ return (last); } break; case R_FQUOTE: /* Forward accent */ switch (c) { default: break; case 'a': c = R_a_FQUOTE; break; case 'A': c = R_A_FQUOTE; break; case 'e': c = R_e_FQUOTE; break; case 'E': c = R_E_FQUOTE; break; case 'i': c = R_i_FQUOTE; break; case 'I': c = R_I_FQUOTE; break; case 'o': c = R_o_FQUOTE; break; case 'O': c = R_O_FQUOTE; break; case 'u': c = R_u_FQUOTE; break; case 'U': c = R_U_FQUOTE; break; case ' ': c = last; break; case CR: /* Send last first then what is there */ return (last); } break; case R_HAT: /* Hat accent */ switch (c) { default: break; case 'a': c = R_a_HAT; break; case 'A': c = R_A_HAT; break; case 'e': c = R_e_HAT; break; case 'E': c = R_E_HAT; break; case 'i': c = R_i_HAT; break; case 'I': c = R_I_HAT; break; case 'o': c = R_o_HAT; break; case 'O': c = R_O_HAT; break; case 'u': c = R_u_HAT; break; case 'U': c = R_U_HAT; break; case ' ': c = last; break; case CR: /* Send last first then what is there */ return(last); } break; case R_DDOT: /* Double Dot accent */ switch (c) { default: break; case 'a': c = R_a_DDOT; break; case 'A': c = R_A_DDOT; break; case 'e': c = R_e_DDOT; break; case 'E': c = R_E_DDOT; break; case 'i': c = R_i_DDOT; break; case 'I': c = R_I_DDOT; break; case 'o': c = R_o_DDOT; break; case 'O': c = R_O_DDOT; break; case 'u': c = R_u_DDOT; break; case 'U': c = R_U_DDOT; break; case 'y': c = R_y_DDOT; break; case 'Y': c = R_Y_DDOT; break; case ' ': c = last; break; case CR: /* Send last first then what is there */ return(last); } break; case R_TILTA: /* Tilda accent */ switch (c) { default: break; case 'a': c = R_a_TILTA; break; case 'A': c = R_A_TILTA; break; case 'o': c = R_o_TILTA; break; case 'O': c = R_O_TILTA; break; case 'n': c = R_n_TILTA; break; case 'N': c = R_N_TILTA; break; case ' ': c = last; break; case CR: /* Send last first then what is there */ return(last); } break; } } return(c); } int XrInputConf(param, value) { switch (param) { case K_TYPE: if (value != -1) { if (value >= K_HP && value <= K_DEFAULT) k->type = value; } return (k->type); case K_LANGUAGE: if (value != -1) { if (value < K_HP_USASCII || value > K_HP_KANJI) k->language = k->pwr_language; else k->language = value; kbd_language(); } return(k->language); case K_ALT_ENABLE: if (value != -1) { if (value >= 0 && value <= 4) { k->alt = value; k->flags &= ~K_ALT; } } return (k->alt); case K_16BITIO_ENABLE: if (value != -1) { if (value >= 0 && value <= 4) { k->i16bit = value; k->flags &= ~K_16BITIO; } } return (k->i16bit); case K_ASCII8: case K_MUTE: if (value != -1) { if (value) k->flags |= param; else k->flags &= ~param; } case K_ALT: /* Read only */ case K_16BITIO: /* Read only */ return(((k->flags & param) ? 1 : 0)); default: return(-1); } } unsigned char * XrInputMap (kptr, nbytes) XKeyPressedEvent * kptr; int * nbytes; { register unsigned key; register control, shift, shiftlock, meta; unsigned char * string; register unsigned short s_key; static unsigned char c_key; static unsigned char f_key[2]; if ((k->type == K_DEFAULT) || (k->flags & K_LOCALMAP)) { string = (unsigned char *)XLookupMapping (kptr, nbytes); if (*nbytes != 0) { return (string); } } key = kptr->detail; control = (key & KEYCNTL); shift = (key & KEYSHIFT); meta = (key & KEYMETA); shiftlock = (key & KEYSHIFTLOCK); key &= ValueMask; /* make sure the code is in our tables */ if ((key < FIRST_LK201) || (key >= CODE_SHIFT + FIRST_LK201)) { *nbytes = 0; return (0); } key -= FIRST_LK201; /* subtract off front of unused LK201 codes */ /* Check for the KATAKANA Alternate Keyboard */ if (((k->flags & (K_ASCII8 | K_ALT)) == (K_ASCII8 | K_ALT)) && (key >= FIRST_CHAR)) { c_key = k->alttab[key-FIRST_CHAR+(shift ? CHAR_SHIFT:0)]; *nbytes = 1; return (&c_key); } else if (meta && (k->alt == 0) && (k->flags & K_ASCII8) && (key >= FIRST_CHAR)) { /* Check for the EXTEND Keyboard */ /* Look up ALT SHIFT Set via keycode shifted */ s_key = k->alttab[key-FIRST_CHAR+(shift ? CHAR_SHIFT:0)]; /* Check for CAPS */ if (shiftlock) switch (s_key) { case R_ZERO: s_key = R_zero; break; case R_zero: s_key = R_ZERO; break; case R_IP: s_key = R_ip; break; case R_ip: s_key = R_IP; break; case R_A_DOT: s_key = R_a_DOT; break; case R_a_DOT: s_key = R_A_DOT; break; case R_AE: s_key = R_ae; break; case R_ae: s_key = R_AE; break; case R_D_CROSS: s_key = R_d_CROSS; break; case R_d_CROSS: s_key = R_D_CROSS; break; case R_S_V: s_key = R_s_V; break; case R_s_V: s_key = R_S_V; break; case R_C_BEARD: s_key = R_c_BEARD; break; case R_c_BEARD: s_key = R_C_BEARD; break; default: break; } s_key = XrInputMute (s_key); if (s_key == K_s) { *nbytes = 0; return (0); } else { c_key = s_key; *nbytes = 1; return (&c_key); } } else { s_key = k_code[(shift ? (key+CODE_SHIFT) : key)]; /* Handle Special Keys First */ if (s_key & K_s) { f_key[0] = K_FUNCTION; *nbytes = 2; switch (s_key & 0xFF) { case K_ILLEGAL: *nbytes = 0; return (0); case TO_ROMAN_KEY: /* left extend key */ switch (k->alt) { case 1: k->flags &= ~K_ALT; /* Roman */ f_key[1] = TO_ROMAN_KEY; return (f_key); case 2: k->flags |= K_ALT; /* Alternate */ f_key[1] = TO_ALT_KEY; return (f_key); case 4: k->flags ^= K_ALT; /* Toggle */ f_key[1] = (k->flags & K_ALT) ? TO_ALT_KEY : TO_ROMAN_KEY; return (f_key); } switch (k->i16bit) { case 1: k->flags &= ~K_16BITIO; /* leave 16 bit */ /* later this return of code will be replaced by calls to 16bit input routines */ f_key[1] = LEAVE_16BIT_KEY; return (f_key); case 2: k->flags |= K_16BITIO; /* enter 16 bit */ /* later this return of code will be replaced by calls to 16bit input routines */ f_key[1] = GO_16BIT_KEY; return (f_key); case 4: k->flags ^= K_16BITIO; /* later this return of code will be replaced by calls to 16bit input routines */ f_key[1] = (k->flags & K_16BITIO) ? GO_16BIT_KEY : LEAVE_16BIT_KEY; return (f_key); default: *nbytes = 0; return(0); } case TO_ALT_KEY: /* right extend key */ switch (k->alt) { case 1: k->flags |= K_ALT; /* Alternate */ f_key[1] = TO_ALT_KEY; return (f_key); case 2: k->flags &= ~K_ALT; /* Roman */ f_key[1] = TO_ROMAN_KEY; return (f_key); case 3: k->flags ^= K_ALT; /* Toggle */ f_key[1] = (k->flags & K_ALT) ? TO_ALT_KEY : TO_ROMAN_KEY; return (f_key); } switch (k->i16bit) { case 1: k->flags |= K_16BITIO; /* enter 16 bit */ /* later this return of code will be replaced by calls to 16bit input routines */ f_key[1] = GO_16BIT_KEY; return (f_key); case 2: k->flags &= ~K_16BITIO; /* leave 16 bit */ /* later this return of code will be replaced by calls to 16bit input routines */ f_key[1] = LEAVE_16BIT_KEY; return (f_key); case 3: k->flags ^= K_16BITIO; /* later this return of code will be replaced by calls to 16bit input routines */ f_key[1] = (k->flags & K_16BITIO) ? GO_16BIT_KEY : LEAVE_16BIT_KEY; return (f_key); default: *nbytes = 0; return(0); } default: f_key[1] = (unsigned char) s_key; return (f_key); } } else { /* If it is a language dependent key, look up again. */ if ((s_key >= K_LANG_START) && (s_key <= K_LANG_END)) s_key = k->langtab[s_key-K_LANG_START]; /* Check for caps mode */ if ((shiftlock) && !(k->flags & K_ALT)) { /* Check for keys affected by capitalization. */ if ((s_key >= 'a' && s_key <= 'z') || (s_key >= 'A' && s_key <= 'Z')) { /* Invert Case */ s_key ^= 0x20; } else { /* Check for roman characters */ switch (k->language) { case K_HP_KATAKANA: case K_HP_KANJI: case K_HP_SWISSFRENCH: case K_HP_SWISSGERMAN: case K_HP_SWISSFRENCH2: case K_HP_SWISSGERMAN2: break; /* Nothing */ case K_HP_CANENG: case K_HP_CANFRENCH: /* Check for C_BEARDS */ if (s_key == R_C_BEARD) { s_key = R_c_BEARD; break; } if (s_key == R_c_BEARD) { s_key = R_C_BEARD; break; } case K_HP_FINNISH: case K_HP_SWEDISH: /* Check for E_BQUOTES */ if (s_key == R_E_BQUOTE) { s_key = R_e_BQUOTE; break; } if (s_key == R_e_BQUOTE) { s_key = R_E_BQUOTE; break; } default: switch (s_key) { case R_U_DDOT: s_key = R_u_DDOT; break; case R_u_DDOT: s_key = R_U_DDOT; break; case R_O_DDOT: s_key = R_o_DDOT; break; case R_o_DDOT: s_key = R_O_DDOT; break; case R_A_DDOT: s_key = R_a_DDOT; break; case R_a_DDOT: s_key = R_A_DDOT; break; case R_A_DOT: s_key = R_a_DOT; break; case R_a_DOT: s_key = R_A_DOT; break; case R_N_TILTA: s_key = R_n_TILTA; break; case R_n_TILTA: s_key = R_N_TILTA; break; case R_AE: s_key = R_ae; break; case R_ae: s_key = R_AE; break; case R_ZERO: s_key = R_zero; break; case R_zero: s_key = R_ZERO; break; default: break; } break; } } } if (control) { /* Only convert codes codes 64 to 127 ** as does the 2622 only if enabled */ if (s_key >= 64 && s_key <= 127) s_key &= CNTLKEY_MASK; /* Convert to control */ } s_key = XrInputMute (s_key); if (s_key == K_s) { *nbytes = 0; return (0); } else { c_key = s_key; *nbytes = 1; return (&c_key); } } } }