kbd.c (51658) | kbd.c (54382) |
---|---|
1/*- 2 * Copyright (c) 1999 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * | 1/*- 2 * Copyright (c) 1999 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * |
26 * $FreeBSD: head/sys/dev/kbd/kbd.c 51658 1999-09-25 18:24:47Z phk $ | 26 * $FreeBSD: head/sys/dev/kbd/kbd.c 54382 1999-12-10 04:31:33Z yokota $ |
27 */ 28 29#include "kbd.h" 30#include "opt_kbd.h" 31 32#include <sys/param.h> 33#include <sys/systm.h> 34#include <sys/kernel.h> --- 96 unchanged lines hidden (view full) --- 131 kbd->kb_io_size = port_size; 132 kbd->kb_data = NULL; 133 kbd->kb_keymap = NULL; 134 kbd->kb_accentmap = NULL; 135 kbd->kb_fkeytab = NULL; 136 kbd->kb_fkeytab_size = 0; 137 kbd->kb_delay1 = KB_DELAY1; /* these values are advisory only */ 138 kbd->kb_delay2 = KB_DELAY2; | 27 */ 28 29#include "kbd.h" 30#include "opt_kbd.h" 31 32#include <sys/param.h> 33#include <sys/systm.h> 34#include <sys/kernel.h> --- 96 unchanged lines hidden (view full) --- 131 kbd->kb_io_size = port_size; 132 kbd->kb_data = NULL; 133 kbd->kb_keymap = NULL; 134 kbd->kb_accentmap = NULL; 135 kbd->kb_fkeytab = NULL; 136 kbd->kb_fkeytab_size = 0; 137 kbd->kb_delay1 = KB_DELAY1; /* these values are advisory only */ 138 kbd->kb_delay2 = KB_DELAY2; |
139 kbd->kb_prev_key = 0; 140 kbd->kb_count = 0L; |
|
139} 140 141void 142kbd_set_maps(keyboard_t *kbd, keymap_t *keymap, accentmap_t *accmap, 143 fkeytab_t *fkeymap, int fkeymap_size) 144{ 145 kbd->kb_keymap = keymap; 146 kbd->kb_accentmap = accmap; --- 521 unchanged lines hidden (view full) --- 668 669 /* K_XLATE */ 670 if (c & RELKEY) /* key release is ignored */ 671 continue; 672 673 /* process special keys; most of them are just ignored... */ 674 if (c & SPCLKEY) { 675 switch (KEYCHAR(c)) { | 141} 142 143void 144kbd_set_maps(keyboard_t *kbd, keymap_t *keymap, accentmap_t *accmap, 145 fkeytab_t *fkeymap, int fkeymap_size) 146{ 147 kbd->kb_keymap = keymap; 148 kbd->kb_accentmap = accmap; --- 521 unchanged lines hidden (view full) --- 670 671 /* K_XLATE */ 672 if (c & RELKEY) /* key release is ignored */ 673 continue; 674 675 /* process special keys; most of them are just ignored... */ 676 if (c & SPCLKEY) { 677 switch (KEYCHAR(c)) { |
676 /* locking keys */ 677 case NLK: case CLK: case SLK: case ALK: 678 /* shift keys */ 679 case LSH: case RSH: case LCTR: case RCTR: 680 case LALT: case RALT: case ASH: case META: 681 /* other special keys */ 682 case NOP: case SPSC: case RBT: case SUSP: 683 case STBY: case DBG: case NEXT: | 678 default: |
684 /* ignore them... */ 685 continue; 686 case BTAB: /* a backtab: ESC [ Z */ 687 putc(0x1b, &sc->gkb_q); 688 putc('[', &sc->gkb_q); 689 putc('Z', &sc->gkb_q); 690 continue; 691 } --- 270 unchanged lines hidden (view full) --- 962 int *accents) 963{ 964 struct keyent_t *key; 965 int state = *shiftstate; 966 int action; 967 int f; 968 int i; 969 | 679 /* ignore them... */ 680 continue; 681 case BTAB: /* a backtab: ESC [ Z */ 682 putc(0x1b, &sc->gkb_q); 683 putc('[', &sc->gkb_q); 684 putc('Z', &sc->gkb_q); 685 continue; 686 } --- 270 unchanged lines hidden (view full) --- 957 int *accents) 958{ 959 struct keyent_t *key; 960 int state = *shiftstate; 961 int action; 962 int f; 963 int i; 964 |
965 i = keycode; |
|
970 f = state & (AGRS | ALKED); 971 if ((f == AGRS1) || (f == AGRS2) || (f == ALKED)) | 966 f = state & (AGRS | ALKED); 967 if ((f == AGRS1) || (f == AGRS2) || (f == ALKED)) |
972 keycode += ALTGR_OFFSET; 973 key = &kbd->kb_keymap->key[keycode]; | 968 i += ALTGR_OFFSET; 969 key = &kbd->kb_keymap->key[i]; |
974 i = ((state & SHIFTS) ? 1 : 0) 975 | ((state & CTLS) ? 2 : 0) 976 | ((state & ALTS) ? 4 : 0); 977 if (((key->flgs & FLAG_LOCK_C) && (state & CLKED)) 978 || ((key->flgs & FLAG_LOCK_N) && (state & NLKED)) ) 979 i ^= 1; 980 981 action = key->map[i]; 982 if (up) { /* break: key released */ 983 if (key->spcl & (0x80 >> i)) { 984 /* special keys */ 985 switch (action) { | 970 i = ((state & SHIFTS) ? 1 : 0) 971 | ((state & CTLS) ? 2 : 0) 972 | ((state & ALTS) ? 4 : 0); 973 if (((key->flgs & FLAG_LOCK_C) && (state & CLKED)) 974 || ((key->flgs & FLAG_LOCK_N) && (state & NLKED)) ) 975 i ^= 1; 976 977 action = key->map[i]; 978 if (up) { /* break: key released */ 979 if (key->spcl & (0x80 >> i)) { 980 /* special keys */ 981 switch (action) { |
982 case LSHA: 983 if (kbd->kb_prev_key == keycode) { 984 set_lockkey_state(kbd, state, ALK); 985 state &= ~ALKDOWN; 986 } 987 action = LSH; 988 /* FALL THROUGH */ |
|
986 case LSH: 987 state &= ~SHIFTS1; 988 break; | 989 case LSH: 990 state &= ~SHIFTS1; 991 break; |
992 case RSHA: 993 if (kbd->kb_prev_key == keycode) { 994 set_lockkey_state(kbd, state, ALK); 995 state &= ~ALKDOWN; 996 } 997 action = RSH; 998 /* FALL THROUGH */ |
|
989 case RSH: 990 state &= ~SHIFTS2; 991 break; | 999 case RSH: 1000 state &= ~SHIFTS2; 1001 break; |
1002 case LCTRA: 1003 if (kbd->kb_prev_key == keycode) { 1004 set_lockkey_state(kbd, state, ALK); 1005 state &= ~ALKDOWN; 1006 } 1007 action = LCTR; 1008 /* FALL THROUGH */ |
|
992 case LCTR: 993 state &= ~CTLS1; 994 break; | 1009 case LCTR: 1010 state &= ~CTLS1; 1011 break; |
1012 case RCTRA: 1013 if (kbd->kb_prev_key == keycode) { 1014 set_lockkey_state(kbd, state, ALK); 1015 state &= ~ALKDOWN; 1016 } 1017 action = RCTR; 1018 /* FALL THROUGH */ |
|
995 case RCTR: 996 state &= ~CTLS2; 997 break; | 1019 case RCTR: 1020 state &= ~CTLS2; 1021 break; |
1022 case LALTA: 1023 if (kbd->kb_prev_key == keycode) { 1024 set_lockkey_state(kbd, state, ALK); 1025 state &= ~ALKDOWN; 1026 } 1027 action = LALT; 1028 /* FALL THROUGH */ |
|
998 case LALT: 999 state &= ~ALTS1; 1000 break; | 1029 case LALT: 1030 state &= ~ALTS1; 1031 break; |
1032 case RALTA: 1033 if (kbd->kb_prev_key == keycode) { 1034 set_lockkey_state(kbd, state, ALK); 1035 state &= ~ALKDOWN; 1036 } 1037 action = RALT; 1038 /* FALL THROUGH */ |
|
1001 case RALT: 1002 state &= ~ALTS2; 1003 break; 1004 case ASH: 1005 state &= ~AGRS1; 1006 break; 1007 case META: 1008 state &= ~METAS1; --- 44 unchanged lines hidden (view full) --- 1053 case SLK: 1054 set_lockkey_state(kbd, state, SLK); 1055 break; 1056 case ALK: 1057 set_lockkey_state(kbd, state, ALK); 1058 break; 1059 /* NON-LOCKING KEYS */ 1060 case SPSC: case RBT: case SUSP: case STBY: | 1039 case RALT: 1040 state &= ~ALTS2; 1041 break; 1042 case ASH: 1043 state &= ~AGRS1; 1044 break; 1045 case META: 1046 state &= ~METAS1; --- 44 unchanged lines hidden (view full) --- 1091 case SLK: 1092 set_lockkey_state(kbd, state, SLK); 1093 break; 1094 case ALK: 1095 set_lockkey_state(kbd, state, ALK); 1096 break; 1097 /* NON-LOCKING KEYS */ 1098 case SPSC: case RBT: case SUSP: case STBY: |
1061 case DBG: case NEXT: | 1099 case DBG: case NEXT: case PREV: case PNC: |
1062 *accents = 0; 1063 break; 1064 case BTAB: 1065 *accents = 0; 1066 action |= BKEY; 1067 break; | 1100 *accents = 0; 1101 break; 1102 case BTAB: 1103 *accents = 0; 1104 action |= BKEY; 1105 break; |
1106 case LSHA: 1107 action = LSH; 1108 /* FALL THROUGH */ |
|
1068 case LSH: 1069 state |= SHIFTS1; 1070 break; | 1109 case LSH: 1110 state |= SHIFTS1; 1111 break; |
1112 case RSHA: 1113 action = RSH; 1114 /* FALL THROUGH */ |
|
1071 case RSH: 1072 state |= SHIFTS2; 1073 break; | 1115 case RSH: 1116 state |= SHIFTS2; 1117 break; |
1118 case LCTRA: 1119 action = LCTR; 1120 /* FALL THROUGH */ |
|
1074 case LCTR: 1075 state |= CTLS1; 1076 break; | 1121 case LCTR: 1122 state |= CTLS1; 1123 break; |
1124 case RCTRA: 1125 action = RCTR; 1126 /* FALL THROUGH */ |
|
1077 case RCTR: 1078 state |= CTLS2; 1079 break; | 1127 case RCTR: 1128 state |= CTLS2; 1129 break; |
1130 case LALTA: 1131 action = LALT; 1132 /* FALL THROUGH */ |
|
1080 case LALT: 1081 state |= ALTS1; 1082 break; | 1133 case LALT: 1134 state |= ALTS1; 1135 break; |
1136 case RALTA: 1137 action = RALT; 1138 /* FALL THROUGH */ |
|
1083 case RALT: 1084 state |= ALTS2; 1085 break; 1086 case ASH: 1087 state |= AGRS1; 1088 break; 1089 case META: 1090 state |= METAS1; --- 18 unchanged lines hidden (view full) --- 1109 /* other special keys */ 1110 if (*accents > 0) { 1111 *accents = 0; 1112 return ERRKEY; 1113 } 1114 if (action >= F_FN && action <= L_FN) 1115 action |= FKEY; 1116 /* XXX: return fkey string for the FKEY? */ | 1139 case RALT: 1140 state |= ALTS2; 1141 break; 1142 case ASH: 1143 state |= AGRS1; 1144 break; 1145 case META: 1146 state |= METAS1; --- 18 unchanged lines hidden (view full) --- 1165 /* other special keys */ 1166 if (*accents > 0) { 1167 *accents = 0; 1168 return ERRKEY; 1169 } 1170 if (action >= F_FN && action <= L_FN) 1171 action |= FKEY; 1172 /* XXX: return fkey string for the FKEY? */ |
1173 break; |
|
1117 } 1118 *shiftstate = state; 1119 return (SPCLKEY | action); 1120 } else { 1121 /* regular keys */ 1122 if (*accents > 0) { 1123 /* make an accented char */ 1124 action = make_accent_char(kbd, action, accents); 1125 if (action == ERRKEY) 1126 return action; 1127 } 1128 if (state & METAS) 1129 action |= MKEY; 1130 return action; 1131 } 1132 } 1133 /* NOT REACHED */ 1134} | 1174 } 1175 *shiftstate = state; 1176 return (SPCLKEY | action); 1177 } else { 1178 /* regular keys */ 1179 if (*accents > 0) { 1180 /* make an accented char */ 1181 action = make_accent_char(kbd, action, accents); 1182 if (action == ERRKEY) 1183 return action; 1184 } 1185 if (state & METAS) 1186 action |= MKEY; 1187 return action; 1188 } 1189 } 1190 /* NOT REACHED */ 1191} |